此后如竟没有炬火,我便是唯一的光
一、 前言
此前我写了的两篇关于LabVIEW进行TCP通信的文章,主体的编写思路是LabVEIW在同一台主机上与网络调试助手进行TCP通信,看数据能否顺利收发。然而在实际的项目开发中,我们往往是用LabVIEW开发上位机软件,并与PLC或者单片机等下位机进行数据通信,进而采集数据并下发控制命令,形成一个完备的测控系统。
刚好我之前完成了一个测控项目,主要结构就是:LabVIEW开发上位机,西门子S7-1200作为下位机硬件,二者之间通过TCP协议进行数据收发。这个项目的主要难点是1200PLC通信程序的编写,玩过西门子PLC的都知道,与西门子自家的触摸屏HMI或者组态王进行通信都比较简单,而与其他平台的软件进行通信特别是LabVIEW就比较困难。
为此我在西门子官网还有其他网站查询了很多资料,然后自己归纳总结,并不断进行试验验证,最后解决了1200与LabVIEW进行TCP通信的问题。顺便提一下,主流的通用协议,像是UDP、Modbus等都可以用于S7-1200与LabVIEW通信。
二、 西门子S7-1200实战
1、开发环境
软件:Windows10(64位)、LabVIEW2017(32位)、博图V14
硬件:西门子S7-1200、网线
2、开发思路
本文的重点是讲上位机与下位机进行TCP通信,至于不知道如何使用博图进行硬件组态及梯形图程序编写的萌新请自行百度。
主体思路就是用博图编写Client程序并下载到S7-1200中,上位机用LabVIEW编写Server端程序,通过一根网线连接PC和PLC,双端设置好IP和端口,就可以进行数据的收发。
上位机程序此次就不费笔墨了,直接用我之间写过的文章基于LabVIEW的TCP通信进阶之断线重连中所用到的程序,感兴趣的可以去翻翻。今天我重点介绍PLC通信程序的编写,之前项目上用的PLC已经交付给甲方,我手头只剩一块调试用的1211C,就是下面这块:
后面的程序都将在这块PLC上进行演示,并通过PLC的监视功能验证其与上位机之间的数据收发是否正常。
3、实现过程
①打开博图V14软件,首先进行硬件组态,选中1211C AC/DC/RLY,版本选4.1,使用PLC默认的IP地址,也可以自己设置自己想要的IP地址,如下图所示:
②在main中添加TCP通信指令,首先添加发送部分的模块“TSEND_C”,如下图所示:
添加完“TSEND_C”模块后,暂时先不设置该模块的参数,直接点击上图中数字标签3指向的图标,进入到到该函数模块的连接参数设置界面,如下图所示,图中给出了详细的设置说明:下图左侧主要设置PLC作为Client的参数,连接数据直接选新建;右侧部分设置的是远程Server端的参数,伙伴选未指定,需要注意一点的是,设置完Server端的IP后,要将运行Server软件的主机IP设置为同一数值。还有,能使用默认设置的,就尽量使用默认设置。
③在mian中添加TCP的接收模块“TRCV”,暂不设置该模块的参数,如下图所示:
④为方便后期收发数据的观察,新建两个DB块,均取消优化块的访问,这两个DB块分别用于发送和接收数据,所有数据都使用简单的byte型数据,方便后面在Server端观察数据,发送DB块设置一下起始值,如下图所示:
⑤设置“TSEND_C”模块和“TRCV”模块的参数,如下图所示,参数设置好以后,就可以下载到PLC硬件中了。
⑥Server端则是我之前TCP断线重连文章中用到的用LabVIEW开发的上位机软件,经过稍微改造就可以直接用了,上位机界面如下图所示:
4、运行结果
①用网线将PLC与电脑连接起来,然后给PLC上电;
②打开电脑上的Server端程序,点击运行按钮;这个时候可以在博图上看到通信已经连接,如下图所示:
然后在上位机软件前面板的字符串输入框中输入16进制字符串,由于PLC的接收数据DB块只有6个字节,所以在字符串输入框中输入6个字节的16进制字符串:1122 3344 5566;博图软件中发送DB块的起始值有7个字节:01 02 03 04 05 ab cd。
③在博图上监视接收DB块中的数据,可以看到接收DB块中的数据与上位机中发送的字符串一致;同时上位机软件前面板的字符串显示框中显示的数据与PLC数据发送DB块的起始值一致,如下图所示:
三、小结
1、细心的人可能已经发现,PLC只发送了7个字节的数据,而上位机前面板字符串显示框中接收到的数据却是8个字节,在数据的末尾多了一个字节的“00”。经过多次试验,我发现S7-1200PLC在进行TCP通信的时候,只能发送偶数个字节的字符串,如果发送的DB块只有奇数个字节的数据,PLC会自动的在数据末尾添加一个字节的0。
也就是说,你以为PLC发送了7个字节的数据,实际上它发送了8个字节,这一点在上位机解析数据的时候要注意一下,防止解析数据的时候出现数据错位问题。如果我把上位机中读取TCP数据模块的读取的字节由8改为7,如下图所示:
那么接收的数据就会不停地滚动,进而无法对数据进行解析。这一点需要特别注意。
2、当S7-1200作为Client端时,调用并下载TSEND_C模块后CPU会自动周期性地发送TCP连接请求直到被服务器侦听到从而建立TCP连接,连接建立后开始收发数据,周期大概在100ms左右。
3、S7-1200PLC同样可以作为Server端来使用,用法与作为Client端有一点参数设置上的区别,感兴趣的可以自己尝试一下。
本人已开通VX公号,后期写的关于LabVIEW的文章会第一时间发布在该号上,感兴趣的可以关注一下!
VX搜索: 智疑
本文为原创文章,转载请注明出处!!!