@@ -247,6 +247,7 @@ class SolarmanBase(Message):
|
|||||||
class SolarmanV5(SolarmanBase):
|
class SolarmanV5(SolarmanBase):
|
||||||
AT_CMD = 1
|
AT_CMD = 1
|
||||||
MB_RTU_CMD = 2
|
MB_RTU_CMD = 2
|
||||||
|
AT_CMD_RSP = 8
|
||||||
MB_CLIENT_DATA_UP = 30
|
MB_CLIENT_DATA_UP = 30
|
||||||
'''Data up time in client mode'''
|
'''Data up time in client mode'''
|
||||||
HDR_FMT = '<BLLL'
|
HDR_FMT = '<BLLL'
|
||||||
@@ -292,7 +293,7 @@ class SolarmanV5(SolarmanBase):
|
|||||||
# MODbus or AT cmd
|
# MODbus or AT cmd
|
||||||
0x4510: self.msg_command_req, # from server
|
0x4510: self.msg_command_req, # from server
|
||||||
0x1510: self.msg_command_rsp, # from inverter
|
0x1510: self.msg_command_rsp, # from inverter
|
||||||
# 0x0510: self.msg_command_rsp, # from inverter
|
0x0510: self.msg_command_rsp, # from inverter
|
||||||
}
|
}
|
||||||
|
|
||||||
self.log_lvl = {
|
self.log_lvl = {
|
||||||
@@ -677,7 +678,8 @@ class SolarmanV5(SolarmanBase):
|
|||||||
data = self.ifc.rx_peek()[self.header_len:
|
data = self.ifc.rx_peek()[self.header_len:
|
||||||
self.header_len+self.data_len]
|
self.header_len+self.data_len]
|
||||||
ftype = data[0]
|
ftype = data[0]
|
||||||
if ftype == self.AT_CMD:
|
if ftype == self.AT_CMD or \
|
||||||
|
ftype == self.AT_CMD_RSP:
|
||||||
if not self.forward_at_cmd_resp:
|
if not self.forward_at_cmd_resp:
|
||||||
data_json = data[14:].decode("utf-8")
|
data_json = data[14:].decode("utf-8")
|
||||||
node_id = self.node_id
|
node_id = self.node_id
|
||||||
|
|||||||
@@ -567,6 +567,17 @@ def at_command_rsp_msg(): # 0x1510
|
|||||||
msg += b'\x15'
|
msg += b'\x15'
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def at_command_interim_rsp_msg(): # 0x0510
|
||||||
|
msg = b'\xa5\x25\x00\x10\x05\x03\x03' +get_sn() +b'\x08\x01'
|
||||||
|
msg += total()
|
||||||
|
msg += hb()
|
||||||
|
msg += b'\x00\x00\x00\x00+ok=10\x2c'
|
||||||
|
msg += b'start download\x0d\x0a'
|
||||||
|
msg += correct_checksum(msg)
|
||||||
|
msg += b'\x15'
|
||||||
|
return msg
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def heartbeat_ind_msg(): # 0x4710
|
def heartbeat_ind_msg(): # 0x4710
|
||||||
msg = b'\xa5\x01\x00\x10\x47\x10\x84' +get_sn()
|
msg = b'\xa5\x01\x00\x10\x47\x10\x84' +get_sn()
|
||||||
@@ -1652,6 +1663,29 @@ def test_msg_at_command_rsp2(config_tsun_inv1, at_command_rsp_msg):
|
|||||||
assert m.db.stat['proxy']['Modbus_Command'] == 0
|
assert m.db.stat['proxy']['Modbus_Command'] == 0
|
||||||
m.close()
|
m.close()
|
||||||
|
|
||||||
|
def test_msg_at_command_rsp3(config_tsun_inv1, at_command_interim_rsp_msg):
|
||||||
|
_ = config_tsun_inv1
|
||||||
|
m = MemoryStream(at_command_interim_rsp_msg)
|
||||||
|
m.db.stat['proxy']['Unknown_Ctrl'] = 0
|
||||||
|
m.db.stat['proxy']['Modbus_Command'] = 0
|
||||||
|
m.db.stat['proxy']['Invalid_Msg_Format'] = 0
|
||||||
|
m.db.stat['proxy']['Unknown_Msg'] = 0
|
||||||
|
m.forward_at_cmd_resp = True
|
||||||
|
m.read() # read complete msg, and dispatch msg
|
||||||
|
assert not m.header_valid # must be invalid, since msg was handled and buffer flushed
|
||||||
|
assert m.msg_count == 1
|
||||||
|
assert m.control == 0x0510
|
||||||
|
assert str(m.seq) == '03:03'
|
||||||
|
assert m.header_len==11
|
||||||
|
assert m.data_len==37
|
||||||
|
assert m.ifc.fwd_fifo.get()==at_command_interim_rsp_msg
|
||||||
|
assert m.ifc.tx_fifo.get()==b''
|
||||||
|
assert m.db.stat['proxy']['Unknown_Ctrl'] == 0
|
||||||
|
assert m.db.stat['proxy']['Modbus_Command'] == 0
|
||||||
|
assert m.db.stat['proxy']['Invalid_Msg_Format'] == 0
|
||||||
|
assert m.db.stat['proxy']['Unknown_Msg'] == 0
|
||||||
|
m.close()
|
||||||
|
|
||||||
def test_msg_modbus_req(config_tsun_inv1, msg_modbus_cmd, msg_modbus_cmd_fwd):
|
def test_msg_modbus_req(config_tsun_inv1, msg_modbus_cmd, msg_modbus_cmd_fwd):
|
||||||
_ = config_tsun_inv1
|
_ = config_tsun_inv1
|
||||||
m = MemoryStream(b'')
|
m = MemoryStream(b'')
|
||||||
|
|||||||
Reference in New Issue
Block a user