新闻中心
PRESS CENTER
本章主要实现一个流程:EG8200采集西门子S7-200smart的数据,并将数据存储在Modbus寄存器中,等待外部主机通过Modbus TCP协议来读取。
要采集的PLC的IP及端口:
PLC | S7-200smart | ||
IP | 192.168.0.34/102 | ||
地址 | 数据类型 | 属性 | 名称 |
I0.0 | Boolean | 只读 | bitSignal1 |
I0.1 | Boolean | 只读 | itSignal2 |
I0.2 | Boolean | 只读 | itSignal3 |
I0.3 | Boolean | 只读 | itSignal4 |
I0.4 | Boolean | 只读 | itSignal5 |
I0.5 | Boolean | 只读 | itSignal6 |
I0.6 | Boolean | 只读 | itSignal7 |
I0.7 | Boolean | 只读 | itSignal8 |
VD20 | Float | 只读 | floatSignal1 |
VD24 | Float | 只读 | floatSignal2 |
VD28 | Float | 只读 | floatSignal3 |
VD32 | Float | 只读 | floatSignal4 |
VW36 | Usint16 | 只读 | uintSignal1 |
VW38 | Usint16 | 只读 | uintSignal2 |
VW40 | Usint16 | 只读 | uintSignal3 |
VW42 | Usint16 | 只读 | uintSignal4 |
在制作流程时,基础的逻辑是根据功能实现来制作流程。该需求经过分析可以得出,主要分为PLC数据读取与存储、Modbus TCP通信两个部分。
1.通过西门子S7协议读取PLC的数据,得到的数据存储在内存中(西门子节点)
2.将数据进行格式化(函数节点)
3.将格式化后的数据存储到寄存器中(Modbus Server节点)
4.外部主机连接主动读取

1.采集PLC数据
从节点库拖入一个S7读数据节点,以及一个调试节点,调试节点用于查看读取到的PLC的数据,方便定位问题:

双击西门子节点,根据需求概述的内容填写对应的设置参数,如下图所示:
如果是连续地址,可配置起始地址并填写读取长度即可
IP:PLC的IP 端口:102(S7协议通信默认端口102) 采集周期:1000ms(默认2000ms,可自定义) 超时周期:2000ms(默认2000ms,可自定义) 数据点配置(根据帮助文档可以找到对应关系) V0.0 V0.6 V1.6 V2.5 I0.0 I0.1 VD4 VD8 VD12 VD16 VD20 VD24 VD28 VD32 VW36 VW38 VW40 VW42 如果是连续地址,可配置起始地址并填写读取长度即可 |
如果设置正确,调试窗口会有日志打印,显示的是读取到的数据内容:

有的时候PLC数据点比较多,手动依次录入比较繁琐。节点支持数据点的导入导出或者参数传递的方式来读取:

本例程用到的传参代码如下:
msg.payload = [ { func: "ReadBoolArray", body: { name: "", address: "I0", length: 8 } }, { func: "ReadFloatArray", body: { name: "", address: "VD20", length: 4 } }, { func: "ReadUInt16Array", body: { name: "", address: "VW36", length: 4 } } ] return msg; |
2.数据进行格式化
使用函数节点将PLC数据处理成对应格式:

数据格式化参考代码如下:
var discretes = [] var holdings = [] var data = msg.payload discretes = data.I0 holdings[0] = data.VD20[0] holdings[2] = data.VD20[1] holdings[4] = data.VD20[2] holdings[6] = data.VD20[3] holdings[8] = data.VW36[0] holdings[9] = data.VW36[1] holdings[10] = data.VW36[2] holdings[11] = data.VW36[3] msg.discretes = discretes msg.holdings = holdings return msg; |
3.存储到Modbus寄存器
使用Modbus服务节点,将格式化的数据传入,并配置存储方式:

使用TCP IN节点和TCP OUT节点搭配实现TCP 服务端:

使用上位机(Modbus Poll软件)通过Modbus TCP来读取映射的数据:

源码
[{"id":"ac557854c44a5144","type":"Siemens","z":"a73a8f4565433249","name":"","protocol":"iplink_SiemensS7","IPAddress":"192.168.0.34","DestPort":"102","IPLinkTimeout":"2000","IPCommTimeout":"2000","Spname":"COM10","Baudrate":"9600","Databits":"8","Stopbit":"1","Paritybit":"0","RTSEnable":false,"SpLinktimeout":"2000","SpIntertimeout":"-1","workMode":"read","readMode":"trigger","readCyc":"2000","vartable":[],"SiemensS7Model":"5","SiemensS7ConnectionType":"1","SiemensS7Rack":"0","SiemensS7Slot":"0","SiemensS7LocalTSAP":"0","SiemensS7DestTSAP":"0","SiemensPPIStation":"2","stringvar":[],"customName":"Siemens:S7-S200Smart","x":670,"y":1080,"wires":[["416b9e28dcbaffa9"]]},{"id":"06b785ae918b8f6a","type":"debug","z":"a73a8f4565433249","name":"调试 278","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1260,"y":1140,"wires":[]},{"id":"db188f4ed1966c88","type":"function","z":"a73a8f4565433249","name":"函数计算 31","func":"msg.payload = [
{ func: "ReadBoolArray", body: { name: "", address: "I0", length: 8 } },
{ func: "ReadFloatArray", body: { name: "", address: "VD20", length: 4 } },
{ func: "ReadUInt16Array", body: { name: "", address: "VW36", length: 4 } }
]
return msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":430,"y":1080,"wires":[["ac557854c44a5144"]]},{"id":"425a932dfda4e617","type":"inject","z":"a73a8f4565433249","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":230,"y":1080,"wires":[["db188f4ed1966c88"]]},{"id":"416b9e28dcbaffa9","type":"function","z":"a73a8f4565433249","name":"函数计算 33","func":"var discretes = []
var holdings = []
var data = msg.payload
discretes = data.I0
holdings[0] = data.VD20[0]
holdings[2] = data.VD20[1]
holdings[4] = data.VD20[2]
holdings[6] = data.VD20[3]
holdings[8] = data.VW36[0]
holdings[9] = data.VW36[1]
holdings[10] = data.VW36[2]
holdings[11] = data.VW36[3]
msg.discretes = discretes
msg.holdings = holdings
return msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":870,"y":1080,"wires":[["539601edce2e5927"]]},{"id":"539601edce2e5927","type":"modbusServer","z":"a73a8f4565433249","name":"","uid":1,"model":"2","coils":100,"discretes":100,"holdings":100,"input":100,"columns":[{"Type":"3","Address":"0","Method":"7"},{"Type":"3","Address":"2","Method":"7"},{"Type":"3","Address":"4","Method":"7"},{"Type":"3","Address":"6","Method":"7"}],"x":1100,"y":1080,"wires":[["815f45a3a40a372a"],["06b785ae918b8f6a"]]},{"id":"fbadcb99655853f9","type":"tcp in","z":"a73a8f4565433249","name":"","server":"server","host":"","port":"502","datamode":"stream","datatype":"buffer","newline":"","topic":"","trim":false,"base64":false,"tls":"","x":870,"y":1040,"wires":[["539601edce2e5927"]]},{"id":"815f45a3a40a372a","type":"tcp out","z":"a73a8f4565433249","name":"","host":"","port":"","beserver":"reply","base64":false,"end":false,"tls":"","x":1270,"y":1060,"wires":[]}]西门子S7协议与Modbus协议之间的转换,是工业自动化领域常见的需求之一。通过硬件纵横智控公司的产品EG8200可以确保设备之间的数据通信顺畅。在实施过程中,合理配置地址映射和通信参数,能有效提升系统的可靠性和实时性,为工业自动化系统的优化和扩展提供坚实的基础。