赞
踩
python通过pymodbus模块和施耐德TM251 PLC进行ModbusTCP通信,读写PLC数据,主要通过简单样例展示两侧如何设置
中间遇到了各种坑,花了两天的时间才把通信搞通,本章节主要通过一段程序来说明两者直接是如何通信的
##1.PLC通信参数设置,编程软件:somachine V4.3 我用的PLC是TM251双网口PLC选用一号网口作为和笔记本的通信端口,双击Ethernet_1打开设置界面,设置地址如下,(注意笔记本的的IPV4的端口也设置为固定IP,IP地址为192.168.1.**(**值不能是12和1)
pip install pymodbus
代码如下(示例):
# 我的笔记本上的IP-V4 网址设置的为 192.168.1.10 255.255.255.0 19.168.1.1 (根据自己的需要自行设置本机电脑,保证和PLC在同一个网段192.168.1.***) # 施耐德TM251 PLC的IP地址设置为192.168.1.12 电脑win+R 弹出运行框输入cmd 然后输入 ping 192.168.1.12 看看能否ping通,可以看下速率,必须小于64ms 如果是大于这个值查看plc是否设置的有问题, from pymodbus.client import ModbusTcpClient # 请注意次数的Client 表示的不是从站设备而是希望链接的设备,开始我就以为是把PLC设置为从站模式,后来看官网文档才知道是要链接的下位机设备, host = "192.168.1.12" # 施耐德PLC IP 地址 import time # PLC的端口号默认为502,注意也偶尔也有不是的,我这就碰到了查看发现端口号是139,后再重新下载程序时改了下IP地址,断电重启,然后打开施耐德网关托盘程序中 网关管理控制台 # 点开Static Remote Connections选项卡 在Remote IP address 栏输入PLC的IP地址然后点击add.再断电重启PLC然后使用端口号502就正常了 port = 502 client = ModbusTcpClient(host,port) # 下位机(PLC)建立链接端口, client.connect() # 连接PLC # 读取施耐德TM251 PLC的输入模块TM3DI16TG模块输入信号数据(输入模块只是可读不可写) 起始位为%IX0.0 读取整个模块16位数据 对应Modbus OX02功能码 io_in = client.read_discrete_inputs(0,16)# 读取输入模块起始地址为0的bit字节数据 ,读取16位数据 将结果存入io_in print(io_in.bits[0]) # 打印第4位数据 对应PLC的%IX0.0的值, 如果有输出则打印结果为 True 如果没有输出 则打印结果为 False print(io_in.bits[4]) # 打印第4位数据 对应PLC的%IX0.4的值, 如果有输出则打印结果为 True 如果没有输出 则打印结果为 False # 读取施耐德TM251 PLC的输出模块TM3DQ16TG模块输出线圈数据 起始位为%QW0:包含个%QX0.0到%QX0.7七个数据 对应Modbus OX01功能码 io_out = client.read_coils(0,1) # 读取输出模块起始地址为0的int字节数据 ,True:读取1个字节的数据,如果读取2个字节就写2(整个16点输出模块的状态) 将结果存入io_out print(io_out.bits[0]) # 打印0字节数据的第0位 对应PLC的%QX0.0的值,如果有输出则打印结果为 True 如果没有输出 则打印结果为 False print(io_out.bits[1]) # 打印0字节数据的第0位 对应PLC的%QX0.1的值,如果有输出则打印结果为 True 如果没有输出 则打印结果为 False # 读取PLC的保持性寄存器的数据 result1 = client.read_holding_registers(1000, 3) # 施耐德PLC的保持型寄存器的起始地址为设置的为%WM1000 数据类型INT, 读取三个字节地址为%WM1000,%WM1001,%WM1002 对应Modbus OX03功能码 print(result1.registers[0]) # 打印[0,1,2]中的0位的字节数据 %WM1000 测试程序用的20 print(result1.registers[1]) # 打印[0,1,2]中的1位的字节数据 %WM1001 测试程序用的50 print(result1.registers[2]) # 打印[0,1,2]中的2位的字节数据 %WM1002 测试程序用的0 # 施耐德TM251 PLC的保持型寄存器1002 写收数值(PLC侧程序当数值大于20,Q0.1输出高电平置1,模块上指示灯亮起,小于等于20 Q0.1输出低电平置0 模块指示灯熄灭 对应Modbus OX06功能码 io_out_write = client.write_register(1002,21)# 读取输入模块起始地址为0的bit字节数据 ,读取16位数据 将结果存入io_in print(io_out_write.value) # 打印输出值, time.sleep(0.5) # 这个可以删除, client.close()
通过简单的测试程序理解如何进行python和施耐德PLC程序之间的modbusTCP 通信方式,以及数据的读写方式,数据写入只能使用保持性寄存器,其他写入模式不适合施耐德PLC。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。