<>调试代码
a='00 23 00 00 00 05 01 03 02 00 64 ' a=a.replace(" ","") a=len(a) print(a) b=
'3d650000000b011000570002044203a800' print(len(b)) c='01 10 00 57 00 02 04 42
03 68 00' c=c.replace(" ","") c=len(c) print(c)
<>运行结果:
E:\software\python\python.exe E:/projects/Forklift/Server/t1.py 22 34 22
Process finishedwith exit code 0
<>解析

<>Client

这是使用网络调试助手,采用Modbus-TCP的方式,主动读取寄存器地址的问询指令:
c='01 10 00 57 00 02 04 42 03 68 00'
这是主动问询得到的回复,其中程序充当Client,PLC一体机充当Server:
a='00 23 00 00 00 05 01 03 02 00 64 '
网络调试助手:
[2023-07-17 14:37:57.526]# SEND HEX> 00 3F 00 00 00 06 01 03 00 45 00 01 [2023-
07-17 14:37:57.731]# RECV HEX> 00 3F 00 00 00 05 01 03 02 00 00
<>Server

这是被动接受得到的数据,其中程序充当Server,PLC一体机充当Server:
b='3d650000000b011000570002044203a800'
<>结论

<>b=‘3d650000000b011000570002044203a800’

①前面6个字节是报文格式,不需要解析,即从“0110”开始解析
②0110 :其中01是从设备ID号;10是功能号,表示写多个寄存器
③0057 :表示寄存器地址
④0002 :表示寄存器的数量为2
⑤04:表示占用4个字节
⑥4203a800:寄存器的数据内容,这里需要转成单精度浮点型,用来表示电流、电压等信息

<>函数

<>需求:

数据解析:hex_data: 559f0000000b0110005f0002044110a000,
将数据解析后得到以下结果:
005f0002044110a000,其中005f为寄存器地址,
0002表示占用2个寄存器,
04表示占用4个字节,
剩下的4110a000表示数据,
设计一个函数,根据输入信息,得到寄存器地址、寄存器数据。
注意,有时候占用的寄存器数量是1,相应占用的字节数为2。

<>代码

根据要求进行修正的代码:
def parse_hex_data(hex_data): start_index = hex_data.index("0110") + 4 #
获取数据起始位置 register_address = hex_data[start_index:start_index+4] data = hex_data[
start_index+10:] return register_address, data # 示例用法 hex_data =
"559f0000000b0110005f0002044110a000" register_address, data = parse_hex_data(
hex_data) print("Register Address:", register_address) print("Data:", data)
<>运行结果
"D:\Program Files (x86)\Python310\python310.exe" E:/文档/Projects/Pycharm/
forklift/data_address.py Register Address: 005f Data: 4110a000 Process finished
with exit code 0
这个函数会先找到 “0110” 的索引,然后根据索引位置提取寄存器地址和数据。
地址部分占用 4 个字符,数据部分从索引位置的第 10 个字符开始直到字符串的结束。

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信