西门子PLC数据采集上MES:综科智控网关配置与Lua脚本实战
2026/9/7 10:56:01 网站建设 项目流程

我刚做完一个项目,客户现场15台西门子PLC要统一采集上MES,设备倒是不算多,但槽点很集中:三台S7-200 SMART、六台S7-1200、还有几台老掉牙的S7-300,通讯协议、IP网段、寄存器地址风格全不统一。最后我用综科智控网关把这三种场景收编了,配合Lua脚本做了不少边缘处理,省掉了原本打算部署的中间件上位机。这篇就从头讲一遍完整配置流程:PLC侧怎么开权限、网关这边怎么建通道、Lua脚本怎么写才不返工,以及我在现场踩过的几个最隐蔽的坑。如果你正在看综科智控网关,或者手头有类似的数采项目但不知道从哪里下手,这篇基本可以当作业指导书用:先讲原理和规划,再给可复制的配置步骤,最后是Lua脚本实例和故障排查清单。我不预设你已经摸透了西门子的通讯细节,但有自动化基础的话,上手会快很多。

1. 先想明白:网关到底在替你解决什么问题

1.1 工业现场的数据采集困局很现实

做设备数采的人基本都遇过这么几种情况:第一种,现场PLC品牌型号五花八门,三菱、西门子、欧姆龙、台达都有,上位机软件要装一堆驱动,每个驱动还要单独配授权;第二种,有些老设备只剩下一个RS485串口,没有以太网,数据要往MES送就得有人守在旁边用U盘拷;第三种,数据量不大但逻辑绕,比如温度传感器采集上来的原始值要乘系数、滤掉毛刺、超过阈值要报警,这些逻辑在上位机做,程序工程师要陪着改来改去,周期拖得很长。

综科智控网关解决的正是这三类问题。它在硬件上提供了以太网口和串口,能同时对接多台PLC,把各种协议采集上来的数据统一转换成MQTT、HTTP、Modbus TCP这类标准协议往上送;同时它内置了Lua脚本引擎,数据从PLC出来、还没上传之前,可以在网关里先做一轮清洗、计算、判断,相当于把一个"轻量级边缘计算节点"直接放在现场机柜里。

1.2 综科智控网关在整套系统里的角色定位

从系统架构上看,这台网关处在设备层和平台层之间的位置。设备层是西门子PLC,通过以太网走S7协议,或者通过RS485走Modbus RTU,网关是客户端,去主动读PLC里的数据;平台层是MES、SCADA或者云平台,网关通过MQTT把数据推上去。

这意味着网关配置有两个方向要打通:下行要能成功连上PLC并读到寄存器数据,上行要能把数据送到目标平台。很多人配置半天发现数据出不来,往往是只盯着下行,忽略了上行链路;反过来也有,上行MQTT配通了但一直收不到设备数据,因为下行点位地址根本写错了。所以整个配置过程,本质上是在做一条完整数据链路的联调,任何一个环节断开,最终表现都是"没数据"。

1.3 Lua在其中的位置

Lua在网关里的作用,相当于在这条数据链路上加了一个"可编程的处理站"。数据从PLC读上来之后,不是直接转发,而是经过你写的Lua脚本处理一遍再发出。这个设计最大的价值不是炫技,而是把原本属于上位机工程师、PLC程序员的很多活,下沉到了一个统一的地方处理。后面第五章我会专门讲脚本怎么写,这里先记住一个原则:凡是原始数据到最终数据之间存在"计算、转换、判断、拼接"逻辑的,都应该考虑用Lua在网关里处理,而不是丢给上层平台再开发。

2. 动手前必须做好的规划:硬件接线与网络参数

2.1 确认网关硬件接口和供电方式

综科智控网关的硬件形态比较常规,常见的版本一般有双网口和四网口之分,另外标配RS485/RS232串口、DI/DO接口。选型时第一件事不是看网口数量,而是确认你现场PLC的通讯方式:如果PLC自带以太网口(S7-200 SMART、S7-1200、S7-1500基本都有),那用网线直连或过交换机就行;如果PLC是老款只有串口,那网关的RS485口就是救命稻草,但要注意RS485是半双工总线,A/B端子不能接反,屏蔽层要做单端接地,这个在工业现场特别容易踩。

供电方面,网关一般支持DC 9~36V宽压输入,现场常见的24V开关电源可以直接带,但要注意电源功率别和负载共用一个劣质开关电源。我遇到过一台网关频繁重启,排查半天发现是和接触器线圈共用了电源,接触器一吸合压降就往下掉,网关直接掉电复位。工业现场做低压供电,最关键的就是"隔离"两个字:电源隔离、通讯隔离、信号隔离,位置不多花几十块钱,后面省心不是一点半点。

2.2 IP地址规划表:跳过这一步后续全是坑

接入网关之前,强烈建议你先把整个网络的IP地址规划写清楚,不要到了现场再临时随便填。规划的原则很简单:网关、PLC、上位机必须在一个二层网络内(同一网段)才能直接通讯。比如PLC的网段是192.168.2.x,网关的网口IP就要配到192.168.2.xxx,子网掩码用255.255.255.0。

下面这个表格是我的项目里常用的规划模板,你直接照抄改数字就行:

设备IP地址子网掩码备注
综科智控网关LAN1192.168.2.200255.255.255.0接PLC网段,地址避开PLC占用
综科智控网关LAN210.10.3.50255.255.255.0接上层网络(MES/云平台)
西门子PLC-1192.168.2.1255.255.255.0S7-200 SMART,固定IP
西门子PLC-2192.168.2.2255.255.255.0S7-1200,固定IP
调试笔记本192.168.2.100255.255.255.0临时调试用

需要注意,网关的双网口如果支持路由/跨网段转发,通常LAN1和LAN2可以划分成工业网段和管理网段,让PLC数据在工业网段内采集,再由网关通过另一个网口把数据带上层网络。这样做的好处是避免MES的广播流量干扰到PLC的实时通讯,也防止外部设备误操作访问到PLC编程口。具体到综科智控网关,不同固件版本对双网口的转发策略有差异,有些默认LAN1和LAN2是隔离的,只允许通过策略路由或者NAT转发,配置前先确认固件版本,不要想当然。

2.3 物理连接:直连还是走交换机

如果现场只有一台PLC,网线从PLC直接插到网关LAN1口即可,前提是PLC和网关IP在同网段。如果现场有多台PLC,那就需要加一个工业交换机,网关上联交换机,PLC各自下联。这里我建议用带VLAN功能的交换机,每台PLC划一个独立VLAN也行,但更通用的做法是不做VLAN,因为综科智控网关在采集多个PLC时,本质上是作为一个客户端轮询每个IP的端口,只要IP不冲突、交换机没有做端口隔离,都能正常通讯。

物理连接有一个容易被忽略的小细节:网线质量。工业现场电磁环境差,跳线最好用工业级超五类或六类屏蔽网线,水晶头要金属壳的,并且保证接地。我见过因为用了普通家用网线,导致PLC通讯时通时断,换了屏蔽线后问题直接消失。所以如果后续排查数据不稳定,先怀疑网线、接地,再怀疑协议配置。

3. 西门子PLC侧配置:S7协议背后的"隐形开关"

3.1 协议选型:S7 TCP与Modbus TCP怎么选

综科智控网关对接西门子PLC,最常见的有两条路:一是用S7协议直接读,二是用Modbus TCP。我的建议是:能用S7协议尽量用S7协议。原因很简单——不需要在PLC程序里额外调用通讯指令库,只要PLC侧放开访问权限,网关就可以通过S7通讯直接读写I、Q、M、DB块,对原程序的侵入几乎为零。而Modbus TCP在S7-200 SMART里需要调用MB_SERVER指令,在S7-1200/1500里要组态Modbus从站地址区,相当于为了数采额外改了PLC程序,维护成本高,出了问题还要两头排查。

但是有两种情况你不得不考虑Modbus TCP:第一种,项目要求网关同时采集西门子和第三方设备,而第三方设备只支持Modbus,你希望两台设备的寄存器地址能统一管理;第二种,PLC的程序是由设备原厂封死的,版权保护,不允许你往里加任何指令块。遇到这两种情况,就老老实实走Modbus TCP。本章说的S7协议配置,是默认网关用S7客户端方式直连。

3.2 S7-200 SMART的配置要点

S7-200 SMART默认的IP是192.168.2.1,如果你电脑和它不在同一网段,是PING不通的。现场第一次连接,可以先把电脑IP手动改成192.168.2.100,然后在STEP 7-Micro/WIN SMART里找到CPU,修改实际工作中的IP,再下载到PLC。

S7-200 SMART要能被网关用S7协议读取,并不需要像S7-1200那样单独勾选PUT/GET通信,它基本上只要确保两点:一是CPU的IP和网关LAN1在同一个网段,二是PLC的程序里不要启用过强的访问保护。S7-200 SMART的"系统块"里有一项"密码保护",如果设置了完全访问保护,外部S7客户端很可能连不上。我建议给数采网关单独建一个用户级别,或者干脆只在调试时开启保护,日常运行选择"最低保护"级别。

寄存器映射方面,S7-200 SMART的V区是最常被数据采集的区域,对应S7协议里的DB1。这个细节特别坑:很多从三菱PLC转过来的人习惯性地以为V区是数据块DB1,而实际上在S7协议抓取时,V区确实是靠DB1来访问的,但物理地址要偏移。比如你要读VB100,网关侧点位地址就要写成DB1.DBX100.0,或者简化成DB1,偏移地址100。我第一次配置的时候就是这里卡了半天,读出来的数据全是0,后来用仿真器抓包才搞明白。

3.3 S7-1200/1500:必须打开PUT/GET开关

S7-1200和S7-1500的S7通讯和200 SMART最大的不同,在于它们在TIA Portal里默认是禁止外部客户端通过S7协议访问的。如果你在博图里组态完程序下载下去,用网关去连,大概率连不上。需要在CPU属性里打开一个开关。

具体步骤:在TIA Portal中选中CPU,右键进入"属性",找到"防护与安全"选项卡,在"连接机制"里勾选"允许来自远程对象的PUT/GET通信访问"。注意,这是S7-1200/1500能被网关作为S7客户端读取的基础条件,不开这个,你后面在网关里填再多寄存器地址都白搭。

另外,S7-1500还有一个细节,就是访问级别。TIA V15及以后的版本里,CPU的访问级别分为"完全访问""读访问""HMI访问"等,如果选择了"完全访问(无保护)",那PUT/GET开关通常就可以生效;如果选了"读访问",某些写操作会被拦截。网关数采通常只需要读,问题不大,但如果你的Lua脚本里有写PLC寄存器的需求,一定要确认CPU允许外部写访问。

3.4 机架号与槽号:S7连接里最容易被忽略的坑

S7协议建立连接时,客户端需要知道目标PLC的机架号(Rack)和槽号(Slot)。这组参数在S7-1200/1500上基本是固定的:S7-1200的Rack=0,Slot=1;S7-1500的Rack=0,Slot=0或1,具体看CPU型号。而S7-300/400的机架号和槽号就千奇百怪了,有的在0号机架2号槽,有的是1号机架4号槽,配置错了,客户端触发连接建立,但TSAP对不上,通讯就挂了。

我在网关配置界面上填S7通道参数时,一般会先用西门子官方工具或第三方S7客户端测一遍,确认Rack和Slot再填入。如果你手头没有工具,最笨也最有效的方法:看博图组态里CPU实际插的槽位,通常UR机架从0开始,电源占1号槽,CPU占2号槽。S7-1200固件版本不同,槽号有1和0的差异,实在不确定就两个都试,一般不会烧设备。

4. 综科智控网关配置台实操:从登录到点位映射

4.1 登录网关与网络初始化

网关通电后,第一步是找到它的管理地址。综科智控网关一般默认LAN1口地址是192.168.1.1或通过DHCP自动获取,具体看包装标签。第一次使用建议把电脑网口改成和网关默认IP同网段,然后在浏览器里输入网关IP,用管理员账号登录。不同固件的初始密码不一样,一般在说明书里有,登录后第一件事是改密码,同时把时间时区设成Asia/Shanghai,原因后面讲Lua上报的时候会提。

进入配置界面后,先把LAN1、LAN2的IP地址按第二章的规划表设好。改IP时要注意顺序:先改LAN2(上层网络),再改LAN1(PLC网络),避免改完后你电脑和网关断开连接。改完IP后网关会重启,等30秒左右重新用新IP登录。

4.2 新建通道与设备:理清三个层级的包含关系

综科智控网关的配置模型一般是"通道(Channel)→ 设备(Device)→ 点位(Tag)"三级结构。通道决定通讯协议和链路参数(比如S7 TCP、端口号、超时时间),设备挂在通道下面,代表一台PLC,包含IP、机架号、槽号等设备参数,点位则是具体要读的寄存器地址和数据类型。

有个容易混淆的点:一条S7通道下可以挂多台设备,前提是这些PLC型号一致或者至少协议一致。你不需要给每台S7-1200建一个通道,把所有S7-TCP设备挂在同一个通道下轮询即可。但是,如果现场同时有S7协议和Modbus RTU协议,就一定要分开建通道,因为底层协议栈完全不同。我习惯的命名规范是:"CH-S7-1200区"、"CH-Modbus-老车间",这样后期维护看名称就知道数据从哪来。

4.3 点位表配置:地址映射是数据准不准的命门

点位表是整个配置过程里最耗时、也最容易出错的部分。你在网关界面上新建一个点位,要填三个关键要素:寄存器区域、偏移地址、数据类型。

以S7协议为例,M区(位存储区)、DB块、I区、Q区都支持读取,但多数项目实际采的是DB块里的数据。填DB块时,要指定DB号和数据偏移,比如DB10.DBD0表示DB10里的双字偏移0。注意西门子的数据存储是大端模式,即高字节在前、低字节在后,而Modbus协议的数据序正好相反。所以同样的一个32位浮点数,从S7协议读出来和从Modbus读出来,在网关里要选不同的字节序。综科智控网关的点位配置里有字节序选项(ABCD、CDAB等),这个必须跟PLC里的实际存储方式对应,选错了读出来的数就是天文数字。

下面是一张我常用的数据映射参考表:

点位含义PLC地址(西门子表述)网关S7点位配置数据类型备注
设备启停状态M0.0M0.0Bool位读取
主轴电流DB10.DBD4DB10.DBD4Float32位浮点
温度设定值DB11.DBW0DB11.DBW0Word16位无符号
累计产量DB12.DBD8DB12.DBD8DInt32位整型

我给你的建议是:点位表先在Excel里做好,每一条都标注来源PLC程序里的符号名(比如"DB10.DBD4对应HMI画面里的温度PV"),让PLC工程师帮忙过一遍。因为网关里的地址一旦配置成百上千个点,排查一个地址错误非常痛苦。我自己会定期导出点位列表和PLC源程序做比对,比对工具可以是TIA的"交叉引用",也可以直接用Excel的VLOOKUP,成功率非常高。

4.4 数据上报配置:MQTT是首选

数据上报通道,综科智控网关一般支持MQTT、HTTP、Modbus TCP从站等方式。如果是接MES系统,我强烈建议用MQTT,理由有三个:一是MQTT基于发布订阅,网关断线重连后能自动续传,适合工厂不稳定的网络环境;二是MQTT的Topic可以按设备维度组织,方便MES端订阅和处理;三是MQTT的QoS机制能保证消息至少送达一次,对于产量统计这种不能丢的数据非常有用。

配置MQTT时,需要填Broker地址、端口、用户名密码、Topic前缀、发布周期等。周期设置要根据数据变化频率来定,温度、压力这类慢变量5秒一报足够了,产量计数这类累积量最好每秒钟刷新一次,否则线上大屏的数据会看着"卡顿"。还有一个细节,就是MQTT的KeepAlive时间,不要设太短,现场有些无线网络不稳定,设太短会导致客户端频繁掉线重连,反而增加网关负载。

5. Lua脚本:把"重新开发"变成"改几行代码"

5.1 网关为什么会选择Lua而不是Python

综科智控网关里的边缘计算脚本引擎用的是Lua,这个问题很多人的第一反应是:为什么不用Python?Python生态确实好,但工业网关的芯片往往很弱,运行内存也就几十MB,Python解释器占用的资源太大,启动也慢。Lua的解释器非常轻量,整个虚拟机编译下来不到300KB,启动时间在毫秒级,非常适合嵌入式环境下做轻量级业务逻辑。而且Lua和C语言结合紧密,网关固件里把Modbus读取函数、MQTT发布函数、时间函数都封装成了内置API,脚本里直接调用就行。

学习成本方面,Lua的语法比Python还简单,没有class、没有lambda那种复杂特性,核心就几个基本类型:nil、boolean、number、string、table、function。对自动化工程师来说,只要会写梯形图,再花半小时看看Lua的table用法,基本就能上手写脚本。我带的几个实施小哥,都是现场临阵磨枪,一天内就能独立写数据上报脚本了。

5.2 第一个Lua脚本:把原始数据变成可用数据

我先说一个最常见的场景:PLC里存的是温度传感器原始采集值,比如0~27648对应0~100℃,上位机要显示实际摄氏温度。在网关的Lua脚本里,你可以先通过点位表把原始值读上来,然后写一个换算函数,在数据上报前把原始值转成工程量。

-- 温度换算脚本:原始值27648对应满量程100℃ local TAG_RAW = "temp_raw" function on_scan() local raw = read_tag(TAG_RAW) if raw == nil then return end local temp = (raw / 27648.0) * 100.0 temp = math.floor(temp * 10) / 10 -- 保留一位小数 write_tag("temp_actual", temp) end

这段脚本的逻辑是:网关每轮扫描触发一次on_scan,先把点位表里的temp_raw原始值读出来,除以满量程再乘以量程上限,得到实际温度,最后写入另一个计算点位temp_actual,后续MQTT上报就发布这个计算后的点位。注意我用了math.floor保留一位小数,因为温度传感器原始值可能有微小抖动,上报到MES里小数点后七八位纯粹浪费流量,还会造成趋势图毛刺。

5.3 用Lua做协议转换:把西门子数据变成JSON上报

第二个实战场景是协议转换。假设MES平台只接受指定的JSON格式,字段名和PLC点位名完全不一样,而且需要把PLC的数据打成一个包一次性上报。这在网关里用Lua处理非常顺手。

-- 上报JSON拼接:多台设备数据打包 local function build_payload() local data = {} data.machine = "CNC-01" data.status = read_tag("sta") or 0 data.current = read_tag("cur") or 0.0 data.temp = read_tag("temp_actual") or 0.0 data.ts = os.time() return data end function on_report() local payload = build_payload() local json_str = '{"machine":"' .. payload.machine .. '","status":' .. payload.status .. ',"current":' .. payload.current .. ',"temp":' .. payload.temp .. ',"ts":' .. payload.ts .. '}' mqtt_publish("factory/cnc01/data", json_str, 1) end

这里我用Lua的字符串拼接手工构造JSON,没有依赖JSON库,是为了展示在资源受限环境下的通用写法。如果你手里的固件有cjson库,可以直接用cjson.encode,代码更简洁。关键在于mqtt_publish函数里最后一个参数1,代表QoS=1,这条数据会至少送达一次,对于产量、状态这类关键数据非常必要。

5.4 Lua调试:print不够用怎么办

Lua脚本调试,新手最容易犯的错是写完脚本直接部署,然后发现没数据,又不知道问题在哪。我建议分三步:第一步,在脚本里加print调试日志,综科智控网关的管理界面一般能看到实时日志输出,print函数会打到这里;第二步,把每一步中间结果写到独立点位,比如把换算前的原始值写到temp_raw_snap,用网关的点位监控页面看看中间值是否合理;第三步,如果涉及字符串处理,特别留意string.char和string.byte的边界,Lua的字符串索引从1开始,不像C语言从0开始,截取Modbus报文时这里最容易越界。

调试时我还会用PC上的Lua环境做离线验证。举个实际例子:我曾经在写一个设备状态判断逻辑时,PLC传来的状态字是16位整数,每一位代表一个故障位。我在PC上用Lua先模拟了一个状态字,然后写了一个按位解析函数,用Lua的bit库或者简单的取模运算逐位拆解,验证无误之后再贴到网关里。这样避免在真机上反复试错,效率高很多。

6. 现场调试方法论:从"不通"到"稳定"的完整排查链路

6.1 三层定位法:先把问题锁定在某一层

我在现场调试时,一定会遵循一个三层定位法,这三层分别是物理层、协议层、应用层。物理层指网线是否插好、指示灯是否正常、IP是否能PING通;协议层指TCP连接是否能建立、S7协议是否能正确握手;应用层指寄存器地址是否填对、数据解析是否正确。

遇到数据不通,我第一件事是PING测试:在电脑上PING网关的LAN1地址和PLC的IP地址。如果PING不通,直接去查物理层,网线、交换机、IP网段,别浪费时间看协议配置。如果PING通了但网关采集不到数据,就要查协议层:在网关的诊断页面看通道连接状态,S7通道是否提示握手失败。如果连接正常但数据为0,那就是应用层的问题,重点查点位地址和字节序。

下面是一个我经常会在项目文档里贴给客户的故障对照表:

现象可能原因排查动作
PING不通PLCIP不在同网段;网线故障检查IP规划,换屏蔽网线
网关显示S7连接失败S7-1200/1500未开PUT/GET;Rack/Slot填错博图里开PUT/GET,核对机架槽号
连接正常但数据为0DB块地址偏移错误;数据类型不匹配对照PLC源程序交叉引用查点位
数据值异常巨大/乱码字节序选错(大端小端)切换点位字节序选项
数据偶尔断断续续网线屏蔽不良;轮询周期太短换屏蔽线,加大轮询周期

6.2 一次真实的S7-1200连接失败定位过程

有一次客户反馈网关连不上S7-1200,我在远程排查,先看网关诊断日志,发现TCP端口102是可以连接的,但S7层面握手失败。第一反应是PUT/GET没开,让客户在博图里检查,结果客户说开了。随后我看连接参数,发现机架号写的是0,槽号写的是2,当场就猜问题在这。S7-1200的槽号是1,不是2,很多从S7-300转过来的人习惯填2,导致TSAP不匹配,握手被PLC拒绝。让客户改成Rack=0、Slot=1后,问题立刻解决。

这个案例说明:现场排查一定要按协议层次逐层排除,不要一上来就怀疑点位地址。很多工程师习惯性把问题归结为"采集不到数据",但实际上连接都没建立,数据和点位根本不相关。

6.3 通讯稳定性的几个经验

项目跑稳定之后,还有几个细节值得注意。第一,轮询周期不要一味求快,S7协议单次请求能读的字节数是有限制的(取决于PDU大小协商,一般240字节左右),如果点位特别多,建议拆成多个数据块,每个块控制在200字节以内,然后把轮询周期设在1~2秒,避免网关CPU占用过高。第二,网关的固件和Lua脚本升级要留版本记录,我遇到过现场网关固件自动升级后,原来写的Lua API函数失效,数据全断了,后来养成了每次升级前先备份脚本和配置文件,升级后跑一遍冒烟测试的习惯。第三,工业现场要定期重启网关?不是,恰恰相反,稳定运行时不要频繁重启,只要电源质量可靠,网关能连续跑几个月不用管,频繁重启反而会导致MQTT断连、时序数据出现空洞。

关于Lua脚本的后期扩展,我再分享一个方向:如果你的现场有视觉相机或者第三方设备(比如康耐视InSight相机、ABB变频器),很多设备自带以太网TCP/IP Server或Modbus TCP从站,你可以在综科智控网关的Lua脚本里写一个TCP客户端,主动去读取相机的检测结果,然后以Modbus TCP或S7协议写入PLC的DB块,实现"视觉结果直接参与设备控制"的闭环。这样一来,网关就不光是数据采集上云的通道,还是一个真正的边缘控制节点。我在相机和PLC之间加过这种逻辑,配合Lua的定时器,完全能跑出稳定的节拍,相比专门配一台工控机,成本低得多,调试也灵活得多。

最后说一个个人经验:很多人总觉得网关配置是"一锤子买卖",配完能出数据就完事了。实际上,一套好的数采系统是需要持续微调的。PLC程序版本更新之后,DB块的偏移地址可能整体变化,如果MES那边突然发现某些字段数据不对,优先怀疑是不是PLC程序改过、网关点位没同步更新。把点位表纳入项目变更管理,每次改PLC程序都同步检查网关点位,这个习惯能帮你省掉无数个半夜被叫醒的麻烦。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询