前言
现代工业产线,与以往的技术方向发生了很大变化,更多的互联网元素(REST,HTTP,H5,WEB),更多的编程语言(JAVASCRIPT,PYTHON,GO,Node.js)融入了工业生成的应用中,为工业互联网添砖加瓦;但随之产生的问题就是,老旧的PLC和PC开发方法,无法快速,简便的将数据流与上位系统,如SCADA、MES、HIM快速互联;
传统的模式是,通过C#针对不同的PLC开发对应的接口程序,然后将数据采集和控制,使用自定义协议,与上位系统对接,这种方法开发难度困难,而且维护和稳定性都有缺陷。
为了解决这个问题,近些年国内也有很多企业研发了通过单片机将PLC协议转译为HTTP,MQTT,MODBUS的通讯硬件,俗称PLC云网关;这种解决方案优势是显而易见的,首先解决了第一种方法的开发难度问题,其次稳定性也得到了很大的提升,但问题还是有的,就是成本,一般的云网关,一个大概在1-2k人民币左右,其次就是配置,由于是独立硬件,因此对于一个PLC就需要独立配置一次,现场数量少的话还好,如果现场PLC上几十台,配置本身成本也是个巨大的开销。
方案
目前还有一种比较前沿的做法,就是通过一个工控机或服务器,通过网口或者串口,直接与PLC进行挂接,然后将PLC的点位信息转存到上位系统,代表软件是付费的KepServer和免费的LECPServer。
软件中间件通讯框架图
我们这里选免费的LECPServer来做演示,需要说明的是,KepServer使用的是OPCUA和MQTT进行上位转译,具体的可以查看KepServer的使用说明。
配置说明
LECPServer的使用和配置还是比较简单的
首先是LECPServer的运行环境,.NET和VC2013是必须前置安装的
Microsoft .NET Framework 4.6.1 Download .NET Framework 4.6.1 Web Installer
Visual C++ Redistributable Packages for Visual Studio 2013 Download Visual C++ Redistributable Packages for Visual Studio 2013 from Official Microsoft Download Center
打开LECPServer图标,就是主界面
我们选用欧姆龙的PLC作为例子,在设备选项上点击“新加设备”,并且填入设备名称,这里我们填写 OFINS ,在设备栏的PLC_DEVICE里面选中OmronFinsNet,则使用欧姆龙的FinsTCP协议进行通讯,配置好PLC端的IP和端口,还有SA1、DA2值(SA1代表本机IP地址的最后部分,如本机IP地址是192.168.123.203,那SA1就填写203,DA2一般填写0或者1,这个根据PLC的UNIT号设置),点击设备配置的“应用”按钮,则提示保存成功,这样我们就成功添加了一个欧姆龙的PLC进去了。
接下来我们开始配置需要控制的PLC地址(则点位)
点击“+”号,添加一个节点,输入节点名称,如D100,在地址栏目填写D100,则这个地址栏定位到PLC的D100,选择节点的类型,这里我们选择FLOAT,浮点类型(32bit);长度,他们设置为5,则表明D100开始,由5个元素长度构成的FLOAT数组,实际使用到的32bit*5地址长度作为存储空间;配置完成后,点击“应用”,则可以看到连接标记的绿色色条亮起,并且值上有数据,则表明连接成功。
读写说明
接下来就是SCADA,MES通过HTTP协议去读写PLC点位的说明。
在LECPServer 1.0.9版本之后,提供了一个HTTP调试器工具,这个工具可以很方便的调试点位的读写,当然,你也可以使用第三方工具,如POSTMAN这种,甚至使用原生JS,Python程序达到同样的效果。
URL输入默认服务器地址 http://127.0.0.1:8088
发送内容写入
{
"action":"plc_read_node",
"node":"NODES.OFINS.D100"
}
点击发送,你可以看到返回值即是D100的点位数据
{
"errcode":"0",
"errmsg":"",
"rtval":[0, 34.3, 33.1, 0, 0]
}
当然你也可以批量的对点位进行读写操作,这里就不再赘诉了,具体操作可以参考LECPServer的使用说明。
关于效率
解决方案是否合适,读写效率可能是大家重点关心的话题,由于LECPServer使用的JLean框架编写,对于单个LECPServer读写效率,可以达到ms级别,官方做过一个基准测试,测试方法如下
- 给PLC设置一个BOOL点位C0000和一个WORD点位H0000,开启50个读线程和50个写线程,运行 plc_read_node 和 plc_write_node 命令,测试两个命令的响应速度
- 给PLC设置一个BOOL点位C0000和一个WORD点位H0000,开启50个读线程和50个写线程,运行 plc_read_nodes 和 plc_write_nodes 命令,测试两个命令的响应速度
结论,第一组测试结果,50个读线程和50个写线程,针对单个线程的读写返回时间在10ms-13ms,第二组测试结果,50个读线程和50个写线程,针对单个读写返回时间在20ms-24ms
后话:由于LECPServer是开源项目,你可以很轻松的在Github找到他的资料,并对他进行二次开发。