Python 基于modbus tcp 协议 实现与plc通信

        仅作为本人学习记录分享;学习是一层窗户纸,没实现之前什么都会觉得困难。前后找了许多教程,c++、java等,最后选择了python来实现,希望本文可以让读者少走弯路。

        实现结果:python程序作为client;仿真软件Modbus Slave作为server,程序访问plc寄存器,实现读、写功能。                 

        Modbus是一种串行通信协议,是工业领域通信协议的业界标准,是工业电子设备之间常用的连接方式。

一、实验前的准备

1、安装 modbus_tk 包

pip install modbus_tk

2、仿真软件安装

参考文章中《Modbus调试软件安装》那篇,有下载链接以及详细的使用过程。

二、python实现步骤(完整程序在文章末尾)

1、导入包

import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp

2、与sever建立连接

# 仿真调试可以使用本机地址: 127.0.0.1
# 实际使用PLC地址,将 client 的地址设置在于 server 同一频段下,host填写 server 的地址
master = modbus_tcp.TcpMaster(host="127.0.0.1")
master.set_timeout(5.0)
print("connected")

3、读写整数

# 写整数
master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 1, output_value=[1, 2, 3, 4])
# 读整数
result_int = master.execute(1, cst.READ_HOLDING_REGISTERS, 1, 4)
print(result_int)

4、读写小数

# 写小数
master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 5, output_value=[3.14, -6.28], data_format='<ff')
# 读小数
result_float = master.execute(1, cst.READ_HOLDING_REGISTERS, 5, 4, data_format='<ff')
print(result_float)

5、此处仅以多个寄存器读写为示例,实际还可以调用 cst 的其他方法,对线圈、寄存器等实现读写操作

读取方法

写入方法

 三、仿真过程展示

 1、设置连接

2、右击表格空白处,点击Slave Defination,指定Function

3、运行python程序,可见数据已经写入 

4、程序读取到的结果

 

四、完整代码

import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus_tcp as modbus_tcp

if __name__ == "__main__":
    try:
        # 仿真调试可以使用本机地址: 127.0.0.1
        # 实际使用PLC地址,将 client 的地址设置在于 server 同一频段下,host填写 server 的地址
        master = modbus_tcp.TcpMaster(host="127.0.0.1")
        master.set_timeout(5.0)
        print("connected")

        # 写整数
        master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 1, output_value=[1, 2, 3, 4])
        # 读整数
        result_int = master.execute(1, cst.READ_HOLDING_REGISTERS, 1, 4)
        print(result_int)

        # 写小数
        master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 5, output_value=[3.14, -6.28], data_format='<ff')
        # 读小数
        result_float = master.execute(1, cst.READ_HOLDING_REGISTERS, 5, 4, data_format='<ff')
        print(result_float)

    except modbus_tk.modbus.ModbusError as e:
        print("%s- Code=%d" % (e, e.get_exception_code()))

五、参考文章: 

python modbus 实现TCP 通信 by Man呦        

Modbus调试软件–ModbusPoll、ModbusSlave使用详解 by Z小旋       

来源:炘宸

物联沃分享整理
物联沃-IOTWORD物联网 » Python 基于modbus tcp 协议 实现与plc通信

发表评论