西门子S7-200Smart PLC因其稳定性和易用性而广泛应用。通过使用S7协议,可以实现对PLC数据的高效读取和控制。本文将详细介绍如何使用S7协议读取西门子S7-200Smart PLC的数据。
西门子 S7协议
适配PLC:S7-200 Smart
S7-300
S7-400
S7-1200
S7-1500
西门子目前在售的PLC一般都支持S7协议通信,以下主要讲解EG8200Mini使用S7协议读取西门子S7-200Smart PLC的数据。
1.硬件连接
S7协议采用网口通信的方式,只需要保证网关的LAN口IP和西门子PLC的IP在一个网段即可(注意:特殊情况下可以不在一个网段,需要设置路由,详询技术支持)。本例程IP地址分配如下:
2.PLC通信参数
2.1.查看机架/槽号
a.如果PLC型号是S7-200 Smart,无需设置机架号和槽号
b.如果PLC型号是S7-300/S7-400/S7-1200/S7-1500,在设备组态页面下,选择常规,项目信息,查看机架号和槽号:
2.2.打开访问权限
如果PLC型号是S7-1200/S7-1500,需打开访问权限,才能读取到数据,具体操作如下:
a.右键单击要使用的DB快,在弹出的会话框中选择属性,在弹出的会话框中,取消勾选优化的块访问:
右键单击设备名称,在弹出的会话框中选择属性,如图设置访问级别和连接机制:
3.网关设置
3.1. PLC连接设置
3.2.数据点位设置
在Siemens节点的参数列表内填写要读取的数据点,数据点填写完成后,会按照设定的频率自动读取PLC的数据。
数据点一般PLC工程师会提供,拿到点位表后,按照网关要求的格式填写数据点,具体对应关系可以参考:
本例程读取VD20地址的数据,通过STEP7软件可以看到VD20存储的浮点数是:415.64,在参数列表,依次填写地址/名称/数据类型/数据长度,定时2秒循环读取,如图所示:
3.3.测试
a.如果PLC型号是S7-200 Smart,无需设置机架号和槽号
4.将两者连起来
将画布的注入节点和调试节点连接在一起,具体方法是:鼠标移动到注入节点的输出口,按住鼠标左键不放,拖拽到调试节点的输入口,松开鼠标即可
5.部署
此时,节点和流程仅存在于工作区中。如果需要流程执行,必须点击部署按钮将程序固化到网关内
6.测试
选中调试区的日志窗口,单击注入节点的左侧按钮,日志窗口会打印时间戳
7.添加一个函数节点
你可以在函数节点里面通过JavaScript代码对消息进行处理
删除现有的连线(选择连线,在键盘上按Delete键)
在注入节点和调试节点之间连接函数节点
双击函数节点打开编辑对话框,将以下代码复制到对话框中,点击完成按钮关闭对话框,单击部署按钮
现在,单击注入节点按钮时,日志窗口的消息已经被函数节点格式化为可读的时间戳
本章节介绍了创建流程的基本概念,展示了如何使用注入节点手动触发流程,以及调试节点如何在日志窗口查看信息,还展示了如何使用函数节点对消息进行处理,S7协议为读取和控制西门子S7-200Smart PLC提供了高效可靠的解决方案。通过合理配置和编写读取程序,可以轻松实现对PLC数据的获取和应用。
源码
所有的流程支持以json格式导入导出,方便与其他人分享做好的流程。本章节的流程json文件如下,复制后在菜单栏右上角选择导入粘贴即可,导出同理
[{"id":"783c29e7b877e75e","type":"inject","z":"265cd2b9785ecf45","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":200,"wires":[["948ded5b0cd90f27"]]},{"id":"013be0bcfbabf68b","type":"debug","z":"265cd2b9785ecf45","name":"调试1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":550,"y":200,"wires":[]},{"id":"948ded5b0cd90f27","type":"function","z":"265cd2b9785ecf45","name":"函数计算1","func":"// Create a Date object from the payloadnvar date = newDate(msg.payload);n// Change the payload to be a formatted Datestringnmsg.payload = date.toString();n// Return the message so itcan be sent onnreturnmsg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":200,"wires":[["013be0bcfbabf68b"]]}]
注意
其他的节点都可以理解为封装好的函数节点。
a