@@ -41,6 +41,13 @@ class ModbusMessageParser:
4141 支持 Modbus TCP (含 MBAP 头) 和 Modbus RTU 帧格式。
4242 """
4343
44+ @staticmethod
45+ def _format_addr_range (start : int , end : int ) -> str :
46+ """格式化地址范围,地址相同时只显示单个地址"""
47+ if start == end :
48+ return f"0x{ start :04X} "
49+ return f"0x{ start :04X} -0x{ end :04X} "
50+
4451 @staticmethod
4552 def parse_tcp (raw_hex : str , last_request_info : Optional [dict ] = None ) -> str :
4653 """解析 Modbus TCP 报文
@@ -131,14 +138,16 @@ def _parse_pdu(pdu: bytes, slave_id: int, last_request_info: Optional[dict] = No
131138 start_addr = (pdu [1 ] << 8 ) | pdu [2 ]
132139 quantity = (pdu [3 ] << 8 ) | pdu [4 ]
133140 end_addr = start_addr + quantity - 1
134- return f"{ fc_name } 0x{ start_addr :04X} -0x{ end_addr :04X} (从站 { slave_id } )"
141+ addr_range = ModbusMessageParser ._format_addr_range (start_addr , end_addr )
142+ return f"{ fc_name } { addr_range } (从站 { slave_id } )"
135143 else :
136144 # 这是一个响应: FC(1) + ByteCount(1) + Data(N)
137145 # 需要关联请求来获取地址范围
138146 if last_request_info and last_request_info .get ("func_code" ) == func_code :
139147 start = last_request_info ["start_addr" ]
140148 end = last_request_info ["end_addr" ]
141- return f"{ fc_name } 0x{ start :04X} -0x{ end :04X} 响应 (从站 { slave_id } )"
149+ addr_range = ModbusMessageParser ._format_addr_range (start , end )
150+ return f"{ fc_name } { addr_range } 响应 (从站 { slave_id } )"
142151 else :
143152 # 无法关联请求,使用字节数描述
144153 if len (pdu ) >= 2 :
@@ -179,11 +188,13 @@ def _parse_pdu(pdu: bytes, slave_id: int, last_request_info: Optional[dict] = No
179188 # 请求: 有 ByteCount + Data (len > 5)
180189 # 响应: 只有 StartAddr + Quantity (len == 5)
181190 if len (pdu ) == 5 :
182- # 这是响应
183- return f"{ fc_name } 0x{ start_addr :04X} -0x{ end_addr :04X} 响应 (从站 { slave_id } )"
191+ # 响应
192+ addr_range = ModbusMessageParser ._format_addr_range (start_addr , end_addr )
193+ return f"{ fc_name } { addr_range } 响应 (从站 { slave_id } )"
184194 else :
185- # 这是请求
186- return f"{ fc_name } 0x{ start_addr :04X} -0x{ end_addr :04X} (从站 { slave_id } )"
195+ # 请求
196+ addr_range = ModbusMessageParser ._format_addr_range (start_addr , end_addr )
197+ return f"{ fc_name } { addr_range } (从站 { slave_id } )"
187198 return f"{ fc_name } (从站 { slave_id } )"
188199
189200 return f"{ fc_name } (从站 { slave_id } )"
0 commit comments