S7 1500PLC使用ModbusTCP协议与Quantum PLC通讯交换数据总结

时间:2024-02-24 16:43:49

       现场有一套S7 1500 PLC,与三套quantum PLC有一定量的数据需要交换。由于S7 1500与quantum PLC均支持MobusTCP协议,于是考虑通过此协议来实现功能。由于以前没有做过这两个品牌PLC的通讯,心里也不是很有底,与施工方日昊公司许工合作,还得到了热心网友小皮无私的帮助,这里一并表示感谢。把要点记录如下。

      一 设置S7 1500 CPU的IP地址

        现场三套quantum PLC地址分别为10.10.10.2,10.10.10.3,10.10.10.4,新加入的S7 1500需要处于同一网段,将其设置为10.10.10.100.

      二 启用S7 1500 CPU的时钟寄存器

记下用于通讯的接口编号64

三 quantum一侧通讯处理

在三套quantum PLC程序上,将传递给S7 1500PLC的ebool变量通过bit_to_word打包成一个字,确保打包后的字寄存器地址连续,留有一定余量便于今后扩展。将S7 1500传递来的变量使用word_to_bit解包。

 

四 S7 1500新建一个共享数据块,设置通讯参数。DB块内新建6个TCON_IP_V4数据类型,用于和三套quantum PLC读和写数据。

Conn_PLC2变量用于读取二期quantum PLC数据,详细结构如下

参数interfaceid为前面看到的CPU通讯接口的硬件接口编号。

ID为任务编号,每一个读写任务ID编号不同,这里是1。

RemoteAddress为quantumPLC的IP地址,这里是10.10.10.2

remotePort是modbustcp的端口号,这里是标准的502

 

conn_PLC3变量用于读取三期quantum PLC数据,详细如下

参数interfaceid为前面看到的CPU通讯接口的硬件接口编号。

ID为任务编号,每一个读写任务ID编号不同,这里是2。

RemoteAddress为quantumPLC的IP地址,这里是10.10.10.3

remotePort是modbustcp的端口号,这里是标准的502

 

conn_PLC4变量用于读取四期quantum PLC数据,详细结构如下

参数interfaceid为前面看到的CPU通讯接口的硬件接口编号。

ID为任务编号,每一个读写任务ID编号不同,这里是3。

RemoteAddress为quantumPLC的IP地址,这里是10.10.10.4

remotePort是modbustcp的端口号,这里是标准的502

 

变量conn_PLC2_2用于向二期quantum PLC写数据,详细如下

参数interfaceid为前面看到的CPU通讯接口的硬件接口编号。

ID为任务编号,每一个读写任务ID编号不同,这里是4。

RemoteAddress为quantumPLC的IP地址,这里是10.10.10.2

remotePort是modbustcp的端口号,这里是标准的502

 

变量conn_PLC3_2用于向三期quantum PLC写数据,详细如下

参数interfaceid为前面看到的CPU通讯接口的硬件接口编号。

ID为任务编号,每一个读写任务ID编号不同,这里是5。

RemoteAddress为quantumPLC的IP地址,这里是10.10.10.3

remotePort是modbustcp的端口号,这里是标准的502

 

变量conn_PLC3_2用于向四期quantum PLC写数据,详细如下

参数interfaceid为前面看到的CPU通讯接口的硬件接口编号。

ID为任务编号,每一个读写任务ID编号不同,这里是6。

RemoteAddress为quantumPLC的IP地址,这里是10.10.10.4

remotePort是modbustcp的端口号,这里是标准的502

至此,通讯参数定义完毕。

 

五 定义一个存储通讯状态的共享数据块

 

六  由于通讯时需要地址连续,定义3个共享数据块,与三套quantum PLC数据传递,取消“优化的快访问”选项。

与二期quantumPLC交换数据的共享数据块如下

 

 

与三期、四期quantum PLC数据交换的共享数据块就不截图了,大同小异。数据块里面预留了很多位用于今后扩展

七 将传递给quantum PLC的变量赋值到前面定义的DB块里面,这样就使变量处在连续的地址范围了,方法就不介绍了。

 

八 新建一个FC,用于和二期quantumPLC通讯,1500PLC为主,quantum PLC为从。

程序段1是读取二期quantum PLC数据,使用了MB_Client功能块

输入端:

REQ是通讯请求,需要上升沿来触发,这里使用了系统时钟的脉冲M0.4,也可以改变请求的频率。

DISCONNECT是中断连接,这里使用了DB45.DBX24.3,DB45就是前面建立的通讯状态的共享数据块。作用是通讯出现错误就断开连接,让错误复位。

MB_MODE是通讯模式,这里写0,标识读取对方数据,如果是1,就是写数据给对方。

MB_DATA_ADDR表示对方的寄存器起始地址,这里就是从quantumPPLC什么寄存器地址开始读取数据,这里是41216表示从quantum PLC的%MW1216地址开始读数。

MB_DATA_LEN,这里表示读取寄存器长度,这里是3表示3个字的长度,如果前面写的是1****,那么长度就是多少个bit,以此类推。这里就是前面建立的通讯参数共享数据块的成员。

MB_DATA_PTR表示读取过来的数据存放在什么地方,这里是P#DB34.DBX0.0 WORD 3,表示存放在DB34 DBX0.0开始3个字的长度,长度和前面MB_DATA_LEN对应。

CONNECT

表示连接参数,主要是1500PLC需要知道对方的IP地址、端口号,任务ID编号,用于通讯的硬件接口编号。这里是前面建立的通讯参数共享数据块成员。

 

输出端:

DONE表示本次通讯结束

BUSY表示本次通讯繁忙

ERROR表示本次通讯出错

STATUS表示本次通讯状态,这是一个16禁止数据,可以查询帮助文件看具体含义。

 

程序段1读取数据介绍完毕。

程序段2用于写数据给对方

写数据给对方同样使用MB_CLIENT功能块。

输入端

REQ为通讯请求,由于和一个PLC同时只能做一个通讯,因此不能同时读写二期quantum PLC,这是用前面程序段1读数据结束标志位,或者程序段1中读数据出错标志位来触发写数据的请求。

DISCONNECT参数表示断开连接,一样的使用写数据通讯出错来中断连接。

MB_MODE表示通讯模式,这里是1,表示写数据给对方。

MB_DATA_ADDR表示对方寄存器地址,这里是41206表示写数据到二期quantum PLC的%MW1206地址。

MB_DATA_LEN表示写数据的长度,这里是3,表示写3个字长度数据给对方。如果前面的MB_DATA_ADDR是1****这样的格式,那么这里的3就表示3个bit

MB_DATA_PTR表示1500PLC的什么地址的数据传输过去,这里是p#DB。DBX6.0 WORD 3。由于与二期quantum PLC通讯的S7 1500PLC数据存放在一个DB块中,前面1500读数据长度是3个word,因此写数据给quantum PLC就是DB34.DBX6.0开始。

CONNECT表示连接参数,主要是1500PLC需要知道对方的IP地址、端口号,任务ID编号,用于通讯的硬件接口编号。这里是前面建立的通讯参数共享数据块成员。

 

输出端:

DONE表示本次通讯结束

BUSY表示本次通讯繁忙

ERROR表示本次通讯出错

STATUS表示本次通讯状态,这是一个16禁止数据,可以查询帮助文件看具体含义。

 

成都段3和程序段4用于判断是否有通讯故障,有故障就发出断开连接的脉冲,将故障复位。

程序段5和程序段6设计了一个计数器,用于通讯失败的技术,这是为了观察通讯是否稳定而做的

程序段7是用于判断通讯是否中断。在现场调试时做过测试,拔掉网线,只有MB_CLIENT的背景数据块的ACTIVE响应及时,其他参数都会延时一段时间,应该是为了再做尝试连接吧

 

到这里,与二期quantumPLC的通讯连接读写数据就介绍完了。

 

与三期四期quantum plc通讯读写数据的方法类似。需要说明的是,与三期、四期PLC通讯,并不需要等到其他PLC通讯结束才能做,也就是说与各个PLC通讯可以同时进行,只是同一个PLC通讯,读和写分开进行。我没有测试与更多PLC通讯的效果,估计会有通讯数量的上限,但本项目通讯量相对较小,还是比较好弄的。

 

quantum PLC里面的编程较为简单,就是bit_to_word和word_to_bit使用。暂时没有用到的寄存器,只定义了变量,没在quantum PLC程序引用的话,1500这边通讯也会有问题,需要引用一下,可以在一个空的bit_to_word和word_to_bit输出输入端赋值一下即可。