最近一个项目需要把用户现场控制柜接入到云端,控制柜使用西门子PLC Smart 200 SR40型号,已经运行多年,PLC通过以太网接口对接一个触摸屏。
按照我以往的经验,觉得触摸屏以太网接口已经被占用,那么只能通过剩余的RS485接口进行对接。因此,我原本有如下计划:拿到PLC已有的程序,对现有空闲RS485端口添加Modbus Slave程序。更新之后使用4G DTU-转RS485透明传输直接接入云端的IOT-Tree Server程序——当然通道使用Modbus相关驱动。
中控室我们直接使用了IOT-Tree这个开源软件,你如果对这个软件不了解,可以github上查看下载。如果你对类似的物联网项目不怎么了解,可以参考我之前的一个“手把手”系列文章——机房自动化监控手把手分享给你。里面也有使用IOT-Tree的详细解决现场问题的过程,这个系列文章你就算没有任何物联网项目经验,基本都可以掌握。
在测试使用过程中,发现这是个蠢方法,一大堆的坑。然后,查了资料发现smart200 RS485接口支持PPI协议,只要此RS485接口没有被内部程序占用即可使用——IOT-Tree好像直接有这个驱动支持呢,很快就搞定了!
再后来,发现smart200以太网还支持S7协议——IOT-Tree好像也支持,虽然连了一个触摸屏,但还可以支持其他设备接入(估计有个接入数量限制)。早知道的话,我专门制作的RS485电缆都可以省了(这个电缆一端使用9针串口接口,内部3 8端子对应RS485的A和B)。下面我就说明一下对接过程吧,希望对你有帮助。
1 使用Modbus方案
使用Modbus方案在测试实现过程中, 遇到种种坑,不仅需要配置修改PLC程序——特别需要注意PLC V存储区的冲突调整,才能够让PLC正确的支持RS485 Modbus Slave。这个过程网络上说明一大堆,就不重复了。
关键的是,PLC提供位操作限定于Modbus的4个位功能码,只能对应I Q两个区。而V区读写只能使用Modbus功能码03,这个都是基于字(word/2byte/16bit)操作,由此产生一个很大的问题,如果plc对内部V地址进行bit操作,而就会让modbus显得很尴尬。同时,还有更多的PLC内部地址区域Modbus无法访问——这个只能通过对PLC程序进行大改动,才能使得上位系统适应PLC的运行。总之,这个方案局限太大,并且坑也太多了。
2 使用RS485接口的PPI协议对接
写了一些,发现我过去已经使用PPI协议对接过S7-200 PLC。并且整个过程好像完全一样。就把链接整过来了。
使用IOT-Tree Server通过PPI(RS485)连接西门子PLC S7-200
我的测试是PLC上的那个RS485口并没有被占用,那么这个接口直接支持PPI协议。你需要注意的是使用专门的电缆。下面是我测试PPI基于RS485口对接。
其实,使用这个PPI接口,我就可以轻松完成用户要求了。
1)PLC程序不需要任何修改,我只需要根据远端控制需要,在IOT-Tree中把相关的地址配置成对应的标签Tag即可。
2)只需要在PLC到远端中控室拉一根RS485 2芯屏蔽电缆就行。
不过,我又发现还可以基于PLC的以太网接口,IOT-Tree照样可以轻松对接,也不需要修改PLC程序,除了配置接入和驱动的差别,后续点位标签Tag配置,可以和PPI完全兼容(其实就是标签地址和西门子PLC兼容)。
3 使用以太网接口的S7协议对接
smart200 plc以太网接口,如果没有专门修改过ip地址,那么缺省地址是192.168.2.1,端口是102.
我这个用户的PLC现场直接连接了一个触摸屏,使用笔记本网口和一根网线直接对接,然后用西门子的软件 STEP 7-Micro/WIN SMART软件就可以获取PLC的IP地址。
为了不影响触摸屏运行,我在测试中加了一个4口网络交换机,PLC和触摸屏都接入其中,然后我的笔记本也用一根网线接入这个交换机,修改本地ip地址为192.168.2.xx,使得笔记本和PLC在同一个网段。使用 命令 ping 192.168.2.1 确保能够访问plc。
接下来就是在我笔记本上的IOT-Tree全部配置过程。请在github下载打包好的release最新版本,电脑安装配置过程可以参考:
IOT-Tree快速开始
3.1 启动IOT-Tree新建测试项目
启动IOT-Tree Server之后,使用浏览器访问 http://localhost:9090/admin/进入管理界面。在“本地项目”区域,点击“新增”图标,填写项目名称和标题:
名称=smart200test
标题=smart200测试
在新增的项目列表中,点击这个项目进入了项目管理界面。
3.2 新增Tcp Client接入
由于通过Tcp Client方式访问PLC,点击左上角“接入”,在下拉菜单中,选择“Tcp 客户端”,在弹出的菜单中填写如下内容:
名称=plc1
标题=PLC1
主机=192.168.2.1
端口=102
点击“确认”按钮之后,就可以在左边看到这个接入项。
3.3 新增通道和PLC设备
在界面"浏览树"下面的根节点"smart200test",鼠标右键,选择“新增通道”,在弹出的对话框中,填写如下内容:
名称=plc_tcp
标题=PLC Tcp
驱动=Siemens TCP/IP Ethernet
其中,驱动点击之后选择即可。
点击“确认”之后, 可以看到项目根节点下面出现了这个通道节点"plc_tcp"。
还是一样操作,鼠标右键此通道,选择“新增设备”。在弹出窗口中,填写如下:
名称=sr40
标题=SR40
Model=S7-200 SMART
点击确定之后,可以看到通道下面增加了这个设备,并且设备前方有个接入点,可以对接左边的接入,鼠标左键点击左边plc1节点右边的正方形不松开,移动到sr40左边圆形点,松开之后就可以建立左边tcp接入和设备sr40之间的关系:
此时,我们可以查看sr40这个设备的属性参数,鼠标点击选中此节点,点击右边主内容“属性”选项卡,可以看到这个设备的一些参数,请注意S7通信参数TSAP必须是201(smart200就这样,具体为啥我也不清楚)
接下来,我们就可以配置设备下的标签数据点了。
3.4 配置点位标签Tags
鼠标点击选中设备节点sr40,点击右边主内容“[标签]”选项卡。点击按钮“新增标签”,在弹出的对话框中,填写内容如下:
名称=out1
地址=Q0.1
数据类型=bool
读或写=读写
其中,你可以先填写地址,然后点击右边“验证”按钮,数据类型会自动配置。
同样的,我们可以新增一些节点:
名称=in0
地址=I0.0
数据类型=bool
读或写=只读
名称=mw1
地址=MW1
数据类型=uint16
读或写=只读
...
最终测试的标签点如下:
3.5 启动项目测试
确保PLC已经通电,并且和运行IOT-Tree的设备能够正常通信。点击项目管理上方的“Start Project”图标,启动项目。如果一切正常,你会看到所有的标签出现数据,并且有效这列都打勾。说明已经正常获取数据。你可以在写入列填写一些数据,点击写入图标,查看数据写回到PLC的效果。
4 后续使用IOT-Tree相关内容
设备接入成功之后,IOT-Tree对你现场设备的对接统一成了一棵树和节点下的标签。当然,你可以通过其他接入或驱动整合更多的数据。
1 接下来你可以为现场的系统定义监控画面,完整的实现一个现场自动化监控系统。详细请参考我之前的一个“手把手”系列文章——机房自动化监控手把手分享给你。
2 你也可以鼠标右键浏览树的节点,选择“访问”,在弹出的新窗口中,可以看到以节点路径形成的RESTFul访问路径,输出的是JSON结构的当前数据。如果你有其他IT系统要读取你配置好的实时数据,直接访问相关的URL即可。
如我测试环境鼠标右键sr40节点,选择访问之后,弹出页面内容如下:
3 你可以使用IOT-Tree的消息流功能,实现更复杂的功能:如设备间的控制调度,数据推送,存储等。
点击项目管理界面左下角的消息处理流程添加按钮,输入f1,确定之后点击新增的这个f1流程。可以在右边看到消息流定制管理功能。和IBM的Node Red类似,你可以在里面使用提供的功能块,快速搭建你的业务控制逻辑,向云端通过MQTT推送数据;或使用存储功能块记录标签数据到数据库中。