Merge remote-tracking branch 'MaD_CaT/master'
This commit is contained in:
@@ -2,7 +2,6 @@ class_name mod_bus extends Node
|
||||
|
||||
const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды.
|
||||
|
||||
|
||||
class ModbusClient:
|
||||
|
||||
## Состояние автомата выполнения команды.
|
||||
@@ -24,13 +23,12 @@ class ModbusClient:
|
||||
static var json_conv: = JSON.new()
|
||||
|
||||
signal command_done() ## Вызывается при успешном выполнении команды.
|
||||
signal command_fail() ## Вызывается при возникновении ошибки во время выполнения команды.
|
||||
signal line_changed() ## Вызывается при смене состояния связи с ячейкой.
|
||||
signal command_fail(unit: ModbusClient) ## Вызывается при возникновении ошибки во время выполнения команды.
|
||||
signal line_changed(unit: ModbusClient) ## Вызывается при смене состояния связи с ячейкой.
|
||||
signal data_received() ## Вызывается при приёме сообщения, до его разбора.
|
||||
signal parse_failed(msg: String) ## Вызывается при возникновении ошибки во время разбора пакета. Передаёт сообщение об ошибке.
|
||||
|
||||
signal holding_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
|
||||
signal input_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров входов.
|
||||
signal responce_received(addr: int, data: Array) ## Вызывается при получении сообщения c данными из регистров хранения.
|
||||
signal info_received(msg: String) ## Вызывается при получении информационного сообщения.
|
||||
signal except_received(msg: String) ## Вызывается при получении сообщения об исключительной ситуации.
|
||||
|
||||
@@ -43,10 +41,10 @@ class ModbusClient:
|
||||
func process(tick: int):
|
||||
if online and ((tick - tick_rx) > ONLINE_TIMEOUT):
|
||||
online = false
|
||||
emit_signal('line_changed')
|
||||
emit_signal('line_changed', self)
|
||||
if (cmd_state == CmdState.WAIT) or (cmd_state == CmdState.SEND):
|
||||
#cmd_state = CmdState.FAIL
|
||||
emit_signal('command_fail')
|
||||
cmd_state = CmdState.FAIL
|
||||
emit_signal('command_fail', self)
|
||||
var rc = Error.ERR_BUSY
|
||||
if cmd_state == CmdState.SEND:
|
||||
rc = Error.OK
|
||||
@@ -61,7 +59,7 @@ class ModbusClient:
|
||||
tick_rx = tick
|
||||
if not online:
|
||||
online = true
|
||||
emit_signal('line_changed')
|
||||
emit_signal('line_changed', self)
|
||||
var utf8_data = data.get_string_from_utf8()
|
||||
if Error.OK == json_conv.parse(utf8_data):
|
||||
emit_signal('data_received')
|
||||
@@ -71,14 +69,10 @@ class ModbusClient:
|
||||
var message_code = message['code']
|
||||
var message_data = message['data']
|
||||
match message_code:
|
||||
'read_input':
|
||||
'response':
|
||||
var addr = message_data[0]
|
||||
var regs = message_data.slice(1)
|
||||
emit_signal('input_received', addr, regs)
|
||||
'read_holding':
|
||||
var addr = message_data[0]
|
||||
var regs = message_data.slice(1)
|
||||
emit_signal('holding_received', addr, regs)
|
||||
emit_signal('responce_received', addr, regs)
|
||||
'info':
|
||||
var msg = message['data']
|
||||
emit_signal('info_received', msg)
|
||||
@@ -95,7 +89,7 @@ class ModbusClient:
|
||||
emit_signal('command_done')
|
||||
elif (cmd_state == CmdState.WAIT) and (not rc):
|
||||
cmd_state = CmdState.FAIL
|
||||
emit_signal('command_fail')
|
||||
emit_signal('command_fail', self)
|
||||
else:
|
||||
var message = json_conv.get_error_message()
|
||||
emit_signal('parse_failed', message)
|
||||
@@ -115,7 +109,7 @@ class ModbusClient:
|
||||
## [param addr] - Начальный адрес регистров.[br]
|
||||
## [param count] - Количество регистров от начального адреса.[br]
|
||||
func read_holdind(addr: int, count: int = 1) -> bool:
|
||||
#if cmd_state != CmdState.DONE: return false
|
||||
if cmd_state != CmdState.DONE: return false
|
||||
var json_dict = {'code': 'read_holding', 'data': [addr, count]}
|
||||
tx_data = JSON.stringify(json_dict).to_utf8_buffer()
|
||||
cmd_state = CmdState.SEND
|
||||
|
||||
@@ -67,6 +67,7 @@ func _ready() -> void:
|
||||
poll_sockets.append(create_socket('уарэп-яу07-частный'))
|
||||
poll_sockets.append(create_socket('уарэп-яу07-общий'))
|
||||
poll_sockets.append(create_socket('уарэп-капсрпб'))
|
||||
poll_sockets.append(create_socket('уарэп-щ3'))
|
||||
sock_unicast = poll_sockets[0]
|
||||
sock_capsrpb = poll_sockets[2]
|
||||
|
||||
|
||||
@@ -1,13 +1,27 @@
|
||||
extends Node
|
||||
|
||||
var cnt: int = 0
|
||||
var rw: bool = true
|
||||
|
||||
func _ready():
|
||||
var unit_key = repsettings.get_unit_key('уарэп-щ3')
|
||||
var unit = repnetwork.units[unit_key]
|
||||
var timer = Timer.new()
|
||||
add_child(timer)
|
||||
unit.connect('command_fail', Callable(self, 'on_command_fail'))
|
||||
timer.connect('timeout', Callable(self, 'on_timer').bind(unit))
|
||||
timer.start(1.0)
|
||||
|
||||
|
||||
func on_timer(unit):
|
||||
unit.read_holdind(0x0000)
|
||||
cnt +=1
|
||||
if rw:
|
||||
unit.write(0x0000, [cnt])
|
||||
else:
|
||||
unit.read_holdind(0x0000)
|
||||
rw = not rw
|
||||
|
||||
|
||||
func on_command_fail(unit):
|
||||
unit.cmd_state = unit.CmdState.DONE
|
||||
print_debug('on_command_fail')
|
||||
|
||||
Reference in New Issue
Block a user