add Modbus response forwarding
This commit is contained in:
@@ -42,7 +42,6 @@ class Talent(Message):
|
|||||||
self.contact_name = b''
|
self.contact_name = b''
|
||||||
self.contact_mail = b''
|
self.contact_mail = b''
|
||||||
self.db = InfosG3()
|
self.db = InfosG3()
|
||||||
self.forward_modbus_resp = False
|
|
||||||
self.switch = {
|
self.switch = {
|
||||||
0x00: self.msg_contact_info,
|
0x00: self.msg_contact_info,
|
||||||
0x13: self.msg_ota_update,
|
0x13: self.msg_ota_update,
|
||||||
@@ -124,7 +123,6 @@ class Talent(Message):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def send_modbus_cb(self, modbus_pdu: bytearray):
|
def send_modbus_cb(self, modbus_pdu: bytearray):
|
||||||
self.forward_modbus_resp = False
|
|
||||||
self.__build_header(0x70, 0x77)
|
self.__build_header(0x70, 0x77)
|
||||||
self._send_buffer += b'\x00\x01\xa3\x28' # fixme
|
self._send_buffer += b'\x00\x01\xa3\x28' # fixme
|
||||||
self._send_buffer += struct.pack('!B', len(modbus_pdu))
|
self._send_buffer += struct.pack('!B', len(modbus_pdu))
|
||||||
@@ -394,11 +392,11 @@ class Talent(Message):
|
|||||||
self.header_len+self.data_len]
|
self.header_len+self.data_len]
|
||||||
|
|
||||||
if self.ctrl.is_req():
|
if self.ctrl.is_req():
|
||||||
if not self.remoteStream.mb.recv_req(data[hdr_len:]):
|
if not self.remoteStream.mb.recv_req(data[hdr_len:],
|
||||||
|
self.msg_forward):
|
||||||
self.inc_counter('Invalid_Msg_Format')
|
self.inc_counter('Invalid_Msg_Format')
|
||||||
else:
|
else:
|
||||||
self.inc_counter('Modbus_Command')
|
self.inc_counter('Modbus_Command')
|
||||||
self.remoteStream.forward_modbus_resp = True
|
|
||||||
elif self.ctrl.is_ind():
|
elif self.ctrl.is_ind():
|
||||||
# logger.debug(f'Modbus Ind MsgLen: {modbus_len}')
|
# logger.debug(f'Modbus Ind MsgLen: {modbus_len}')
|
||||||
self.modbus_elms = 0
|
self.modbus_elms = 0
|
||||||
@@ -408,14 +406,15 @@ class Talent(Message):
|
|||||||
if update:
|
if update:
|
||||||
self.new_data[key] = True
|
self.new_data[key] = True
|
||||||
self.modbus_elms += 1 # count for unit tests
|
self.modbus_elms += 1 # count for unit tests
|
||||||
|
return
|
||||||
if not self.forward_modbus_resp:
|
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
logger.warning('Unknown Ctrl')
|
logger.warning('Unknown Ctrl')
|
||||||
self.inc_counter('Unknown_Ctrl')
|
self.inc_counter('Unknown_Ctrl')
|
||||||
self.forward(self._recv_buffer, self.header_len+self.data_len)
|
self.forward(self._recv_buffer, self.header_len+self.data_len)
|
||||||
|
|
||||||
|
def msg_forward(self):
|
||||||
|
self.forward(self._recv_buffer, self.header_len+self.data_len)
|
||||||
|
|
||||||
def msg_unknown(self):
|
def msg_unknown(self):
|
||||||
logger.warning(f"Unknow Msg: ID:{self.msg_id}")
|
logger.warning(f"Unknow Msg: ID:{self.msg_id}")
|
||||||
self.inc_counter('Unknown_Msg')
|
self.inc_counter('Unknown_Msg')
|
||||||
|
|||||||
@@ -60,7 +60,6 @@ class SolarmanV5(Message):
|
|||||||
self.snr = 0
|
self.snr = 0
|
||||||
self.db = InfosG3P()
|
self.db = InfosG3P()
|
||||||
self.time_ofs = 0
|
self.time_ofs = 0
|
||||||
self.forward_modbus_resp = False
|
|
||||||
self.forward_at_cmd_resp = False
|
self.forward_at_cmd_resp = False
|
||||||
self.switch = {
|
self.switch = {
|
||||||
|
|
||||||
@@ -303,7 +302,6 @@ class SolarmanV5(Message):
|
|||||||
self.__finish_send_msg()
|
self.__finish_send_msg()
|
||||||
|
|
||||||
def send_modbus_cb(self, pdu: bytearray):
|
def send_modbus_cb(self, pdu: bytearray):
|
||||||
self.forward_modbus_resp = False
|
|
||||||
self.__build_header(0x4510)
|
self.__build_header(0x4510)
|
||||||
self._send_buffer += struct.pack('<BHLLL', self.MB_RTU_CMD,
|
self._send_buffer += struct.pack('<BHLLL', self.MB_RTU_CMD,
|
||||||
0x2b0, 0, 0, 0)
|
0x2b0, 0, 0, 0)
|
||||||
@@ -432,14 +430,14 @@ class SolarmanV5(Message):
|
|||||||
self.inc_counter('AT_Command')
|
self.inc_counter('AT_Command')
|
||||||
self.forward_at_cmd_resp = True
|
self.forward_at_cmd_resp = True
|
||||||
elif ftype == self.MB_RTU_CMD:
|
elif ftype == self.MB_RTU_CMD:
|
||||||
if not self.remoteStream.mb.recv_req(data[15:]):
|
if not self.remoteStream.mb.recv_req(data[15:],
|
||||||
|
self.__forward_msg()):
|
||||||
self.inc_counter('Invalid_Msg_Format')
|
self.inc_counter('Invalid_Msg_Format')
|
||||||
else:
|
else:
|
||||||
self.inc_counter('Modbus_Command')
|
self.inc_counter('Modbus_Command')
|
||||||
self.remoteStream.forward_modbus_resp = True
|
return
|
||||||
|
|
||||||
self.__forward_msg()
|
self.__forward_msg()
|
||||||
# self.__send_ack_rsp(0x1510, ftype)
|
|
||||||
|
|
||||||
def msg_command_rsp(self):
|
def msg_command_rsp(self):
|
||||||
data = self._recv_buffer[self.header_len:
|
data = self._recv_buffer[self.header_len:
|
||||||
@@ -467,9 +465,7 @@ class SolarmanV5(Message):
|
|||||||
|
|
||||||
if inv_update:
|
if inv_update:
|
||||||
self.__build_model_name()
|
self.__build_model_name()
|
||||||
|
return
|
||||||
if not self.forward_modbus_resp:
|
|
||||||
return
|
|
||||||
self.__forward_msg()
|
self.__forward_msg()
|
||||||
|
|
||||||
def msg_hbeat_ind(self):
|
def msg_hbeat_ind(self):
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ class Modbus():
|
|||||||
self.__build_crc_tab(CRC_POLY)
|
self.__build_crc_tab(CRC_POLY)
|
||||||
self.que = asyncio.Queue(100)
|
self.que = asyncio.Queue(100)
|
||||||
self.snd_handler = snd_handler
|
self.snd_handler = snd_handler
|
||||||
|
self.rsp_handler = None
|
||||||
self.timeout = timeout
|
self.timeout = timeout
|
||||||
self.last_addr = 0
|
self.last_addr = 0
|
||||||
self.last_fcode = 0
|
self.last_fcode = 0
|
||||||
@@ -93,7 +94,6 @@ class Modbus():
|
|||||||
# logging.debug(f'Modbus stop timer {self}')
|
# logging.debug(f'Modbus stop timer {self}')
|
||||||
if self.tim:
|
if self.tim:
|
||||||
self.tim.cancel()
|
self.tim.cancel()
|
||||||
self.get_next_req()
|
|
||||||
|
|
||||||
def timeout_cb(self):
|
def timeout_cb(self):
|
||||||
self.req_pend = False
|
self.req_pend = False
|
||||||
@@ -167,6 +167,7 @@ class Modbus():
|
|||||||
return
|
return
|
||||||
first_reg = self.last_reg # save last_reg before sending next pdu
|
first_reg = self.last_reg # save last_reg before sending next pdu
|
||||||
self.stop_timer() # stop timer and send next pdu
|
self.stop_timer() # stop timer and send next pdu
|
||||||
|
|
||||||
for i in range(0, elmlen):
|
for i in range(0, elmlen):
|
||||||
addr = first_reg+i
|
addr = first_reg+i
|
||||||
if addr in self.map:
|
if addr in self.map:
|
||||||
@@ -194,6 +195,10 @@ class Modbus():
|
|||||||
else:
|
else:
|
||||||
self.stop_timer()
|
self.stop_timer()
|
||||||
|
|
||||||
|
if self.rsp_handler:
|
||||||
|
self.rsp_handler()
|
||||||
|
self.get_next_req()
|
||||||
|
|
||||||
def check_crc(self, msg) -> bool:
|
def check_crc(self, msg) -> bool:
|
||||||
return 0 == self.__calc_crc(msg)
|
return 0 == self.__calc_crc(msg)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user