Доработка. Протокол JSON-Modbus обновлён (1 из 2)

This commit is contained in:
sasha80
2024-11-15 09:54:11 +03:00
parent e19a3b7d19
commit 0fcafe18c1
3 changed files with 17 additions and 14 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)