现场有一套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输出输入端赋值一下即可。