Доработка. Протокол JSON-Modbus обновлён (1 из 2)
This commit is contained in:
@@ -83,21 +83,21 @@ def run_sync_client(udp_addr, udp_port_rx, udp_port_tx, serial_port, serial_baud
|
||||
rq = client.write_registers(data[0], data[1:], unit=unit_num)
|
||||
rc = rq.isError()
|
||||
if not rc:
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': ''})
|
||||
tx_data = json_encoder.encode({'code': 'resp_write', 'data': ''})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), (udp_addr, udp_port_tx))
|
||||
elif message['code'] == 'read_holding':
|
||||
data = message['data']
|
||||
rq = client.read_holding_registers(data[0], data[1], unit=unit_num)
|
||||
rc = rq.isError()
|
||||
if not rc:
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': [data[0]] + rq.registers})
|
||||
tx_data = json_encoder.encode({'code': 'resp_holding', 'data': [data[0]] + rq.registers})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), (udp_addr, udp_port_tx))
|
||||
elif message['code'] == 'read_input':
|
||||
data = message['data']
|
||||
rq = client.read_input_registers(data[0], data[1], unit=unit_num)
|
||||
rc = rq.isError()
|
||||
if not rc:
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': [data[0]] + rq.registers})
|
||||
tx_data = json_encoder.encode({'code': 'resp_input', 'data': [data[0]] + rq.registers})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), (udp_addr, udp_port_tx))
|
||||
elif message['code'] == '<unknown>':
|
||||
rc = False
|
||||
|
||||
@@ -55,24 +55,24 @@ def on_rcv(*args):
|
||||
if message['code'] == 'write':
|
||||
data = message['data']
|
||||
store.setValues(3, data[0], data[1:])
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': ''})
|
||||
tx_data = json_encoder.encode({'code': 'resp_write', 'data': ''})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), dst_addr)
|
||||
elif message['code'] == 'write_input':
|
||||
data = message['data']
|
||||
store.setValues(4, data[0], data[1:])
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': ''})
|
||||
tx_data = json_encoder.encode({'code': 'resp_write', 'data': ''})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), dst_addr)
|
||||
elif message['code'] == 'read_holding':
|
||||
data = message['data']
|
||||
read_data = store.getValues(3, data[0], data[1])
|
||||
read_data.insert(0, data[0])
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': read_data})
|
||||
tx_data = json_encoder.encode({'code': 'resp_holding', 'data': read_data})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), dst_addr)
|
||||
elif message['code'] == 'read_input':
|
||||
data = message['data']
|
||||
read_data = store.getValues(4, data[0], data[1])
|
||||
read_data.insert(0, data[0])
|
||||
tx_data = json_encoder.encode({'code': 'response', 'data': read_data})
|
||||
tx_data = json_encoder.encode({'code': 'resp_input', 'data': read_data})
|
||||
sock.sendto(bytes(tx_data, 'utf-8'), dst_addr)
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ def main():
|
||||
print_opts_error(opts_unk)
|
||||
store = CallbackModbusSlaveContext()
|
||||
context = ModbusServerContext(slaves=store, single=True)
|
||||
log.info("серевер-заглушка Modbus serial работает: %s:%d" % (opts.serial_port, opts.serial_baud))
|
||||
log.info('серевер-заглушка Modbus serial работает: %s:%d' % (opts.serial_port, opts.serial_baud))
|
||||
t = Thread(target=on_rcv, args=[store], daemon=True)
|
||||
t.start()
|
||||
StartSerialServer(context=context, framer=ModbusRtuFramer, port=opts.serial_port, timeout=opts.timeout, baudrate=opts.serial_baud)
|
||||
|
||||
@@ -19,9 +19,11 @@ class Sch3 extends unit.Unit:
|
||||
var tick_tx: = 0 ## Время отправки крайнего сообщения.
|
||||
|
||||
static var json_conv: = JSON.new()
|
||||
signal responce_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
|
||||
signal info_received(msg: String) ## Вызывается при получении информационного сообщения.
|
||||
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации.
|
||||
signal resp_input(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов.
|
||||
signal resp_holding(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
|
||||
signal resp_write() ## Вызывается при получении подтверждения, что команда записи выполнена
|
||||
signal info_received(msg: String) ## Вызывается при получении информационного сообщения.
|
||||
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации.
|
||||
|
||||
func _init(nm: String, u: int = 1):
|
||||
unit = u
|
||||
@@ -62,11 +64,12 @@ class Sch3 extends unit.Unit:
|
||||
var message_code = message['code']
|
||||
var message_data = message['data']
|
||||
match message_code:
|
||||
'response':
|
||||
'resp_holding', 'resp_input':
|
||||
var addr = message_data[0]
|
||||
var regs = message_data.slice(1)
|
||||
emit_signal('responce_received', addr, regs)
|
||||
rc = true
|
||||
emit_signal(message_code, addr, regs)
|
||||
'resp_write':
|
||||
emit_signal(message_code)
|
||||
'info':
|
||||
var msg = message['data']
|
||||
emit_signal('info_received', msg)
|
||||
|
||||
Reference in New Issue
Block a user