自己学习python的过程中,偶然接触到 modbus_tk 这个库,以前学习过modbus,在新的python语言环境下学习,权当复习了,记录下过程,感谢各位道友的分享,让我也少走了很多弯路。
modbus_tk 搭建modbu_rtu 主站 :https://blog.csdn.net/xukai871105/article/details/21884065
pyhon3 支持的浮点数处理:https://blog.csdn.net/u010161190/article/details/84730035
python struct 学习:https://blog.csdn.net/qq_30638831/article/details/80421019
modbusSlave (分配com7)
vspd (虚拟com2 <==> com7 )
modbu_rtu.py ( 分配com2)
0> 配置modbus slave , 端口、通讯参数等
1> 打开modbus slave, 模拟出各个寄存器区,设置好寄存器的数据方式,signed? float ABCD?float DCBA?
2> 参照网友xukai871105例子,操作各数据区,观察从站数据区;在其基础上测试了 对浮点数、双精度浮点数和负数的读写
# 这是一个modbus Rtu 主站
# 使用vspd 做互联工具
# 使用modbus slave 工具 模拟 Rtu 从站
# 对于浮点数的处理
# 方案一:通过将你所得到的带小数的放大一定的倍数,都变成整数进行处理,例如:3.24 --放大100 变成 324 ,然后上位机知道我放大了100 倍就好
# 方案二:头铁,我就是要读
import serial
import struct
import logging
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus_rtu as modbus_rtu
logger = modbus_tk.utils.create_logger("console")
if __name__ == '__main__':
try:
serial = serial.Serial(port="COM2",baudrate=9600,bytesize=8,parity='N',stopbits=1)
master = modbus_rtu.RtuMaster(serial)
master.set_timeout(5.0)
master.set_verbose(True)
logger.info("connected!")
# 写单个寄存器
logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 0, output_value=99))
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1))
# 写单个寄存器 负数
logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 1, output_value=-123))
logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 1, 1))
# 写多个寄存器 起始地址为4的保持寄存器,操作寄存器个数为4 ,根据列表长度来判断写入个数
logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 4, output_value=[3,-13, 6,24]))
# 读也读4个寄存器
read_data = master.execute(1, cst.READ_HOLDING_REGISTERS, 4, 4)
# 写寄存器 起始地址为8的保持寄存器,操作寄存器个数为 4 ,一个浮点数float 占两个寄存器;
# 写浮点数时一定要加 data_format 参数,两个ff 表示要写入两个浮点数,以此类推
# 我这里模拟的是小端模式,具体可参考 struct 用法。和数据源保持一致即可。
logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 8, output_value=[3.3,-6.4],data_format='
1 > modbus_rtu和tcp 对数据的操作是统一的;
2> python 中struct 的理解有待提高,对于做工控这一块,和底层数据打交道的回合还是少不了的。