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小旋
来源:炘宸