当前位置:   article > 正文

python通过pymodbus模块和施耐德TM251 PLC进行ModbusTCP通信,读写PLC数据_pycharm 通过modbus控制plc

pycharm 通过modbus控制plc

python通过pymodbus模块和施耐德TM251 PLC进行ModbusTCP通信,读写PLC数据,主要通过简单样例展示两侧如何设置
中间遇到了各种坑,花了两天的时间才把通信搞通,本章节主要通过一段程序来说明两者直接是如何通信的

一、PLC侧的相关说明

##1.PLC通信参数设置,编程软件:somachine V4.3 我用的PLC是TM251双网口PLC选用一号网口作为和笔记本的通信端口,双击Ethernet_1打开设置界面,设置地址如下,(注意笔记本的的IPV4的端口也设置为固定IP,IP地址为192.168.1.**(**值不能是12和1)
在这里插入图片描述

2.使用梯形图写了一段PLC侧的测试程序

在这里插入图片描述

二、使用pycharm 编写的上位机侧测试程序,编写pymodbus通信程序,本例子通过分别通过读写输入模块(只适合读取),输出模块(只适合读取),保持性寄存器数据(可读可写)对常用模块进行测试。

1.模块安装 按住笔记本键盘的WIN+R键,在运行框中输入cmd 点击enter按键,在弹出窗口输入

pip install pymodbus

2.测试代码

代码如下(示例):

# 我的笔记本上的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)  # 读取输出模块起始地址为0int字节数据 ,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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

总结

通过简单的测试程序理解如何进行python和施耐德PLC程序之间的modbusTCP 通信方式,以及数据的读写方式,数据写入只能使用保持性寄存器,其他写入模式不适合施耐德PLC。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/791246
推荐阅读
相关标签
  

闽ICP备14008679号