python中使用modbut_tk操作浮点数

前言:

自己学习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?

python中使用modbut_tk操作浮点数_第1张图片

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='

 

python中使用modbut_tk操作浮点数_第2张图片

总结:

1 > modbus_rtu和tcp 对数据的操作是统一的;

2> python 中struct 的理解有待提高,对于做工控这一块,和底层数据打交道的回合还是少不了的。

你可能感兴趣的:(python中使用modbut_tk操作浮点数)