做PLC相关项目的人,早晚都会遇到同一个需求:把PLC里的数据弄出来,交给上位机、MES、数据库或者大屏去用。但真到选型的时候,很多人会发现市面上的方案五花八门,有人喊OPC UA是标准答案,有人说用网关最省事,还有老师傅坚持走串口轮询最可靠。其实这些说法都对,只是适用场景不一样。这篇横评我不会给你推荐什么“万能方案”,而是把现在主流的几条采集路径从头到尾梳理一遍,讲清楚每种方案的原理、边界、坑点,以及我自己在项目里实际验证过的判断标准。适合刚接手数据采集项目的工程师,也适合被设备联网改造折腾到头大的老手参考。
1. 采集方案的本质差异:先搞清楚你要采集的是什么
很多人把“PLC采集方案”简单理解为“上位机读PLC寄存器”,这个理解太窄了。实际项目里,所谓的采集方案,是围绕“数据从哪里来、到哪里去、以什么节奏流动、丢了怎么办”这一整套链路设计出来的。如果一上来就选工具、选驱动,大概率会在现场翻车。
1.1 三种需求层次,决定了方案的复杂度天花板
我习惯把采集需求先分成三个层次,再谈选型。
第一层是展示型采集。典型的场景是触摸屏、SCADA画面或者简单的数据看板,只需要把设备的运行状态、产量、关键温度压力等几十个点位读上来,刷新周期在1秒到几秒之间。这个层次对实时性、可靠性要求都不高,中间断几秒数据也没太大影响,重点是“能连通、能显示”。
第二层是归档型采集。典型场景是MES系统、质量追溯系统、能耗管理系统。这种需求往往要采集几百甚至上千个点位,按秒级或分钟级写入数据库,数据要连续、要带时间戳、要能追溯。这类项目真正的难点不在通信,而在点位管理:地址映射、单位换算、报警状态、值域检查,一套搞下来,点位表比通信代码复杂得多。
第三层是控制型采集。典型场景是上位机配方下发、设备联动、工艺参数自动调整。这种需求对实时性和可靠性要求极高,通常要求毫秒级到百毫秒级的响应,而且通信中断时要有明确的安全策略。这个层次已经不能用普通采集思路来做了,基本都是走PLC原生协议或工业总线,配合冗余设计。
1.2 “采集”不只是读寄存器,还有语义层的转换
我见过太多项目,通信明明已经通了,数据也对上了,但最后系统还是没法用。原因很简单:PLC里的原始数据是“半成品”。
举个例子,某个温度传感器的量程是0到150摄氏度,PLC模拟量模块采回来的原始值可能是0到27648的整数,PLC程序里做完量程转换后,存在数据块里的才是有工程单位的浮点数。有些工程师采集时直接把原始整数读上来,然后在上位机里二次换算,这就埋了一个雷:一旦PLC侧修改了量程或转换逻辑,上位机这边就跟着错。
所以我的建议是,采集方案除了搞定“读”,还必须包含一层语义映射。你得明确每个点位的数据类型是BOOL、INT还是REAL,物理含义是什么,单位是什么,有没有数据质量标志位。这个映射最好以点表的形式统一管理,不管底层走什么协议,上层看到的都应该是“设备名-变量名-工程值”。
另外,滤波和消抖也不只是PLC程序里的功夫。采集侧同样要处理抖动数据。比如一个接近开关的信号在临界状态会反复跳动,如果你每秒采集一次,可能刚好采到抖动瞬间,造成生产数据不准确。比较稳妥的做法是:采集程序里对布尔量设置最小持续时间判定,对模拟量设置变化死区,变化量小于阈值就不更新。热词里有“PLC使用的滤波消抖的方法”,说明不少人在这块吃过亏,值得提前注意。
2. 五大采集路径的原理、优缺点和适用边界
聊完了需求分层,再看具体的技术路线。我把目前工业现场最常用的采集路径归成五类,每一类都有自己的生存空间。
2.1 原生PLC协议直采:效率和深度的首选
所谓原生协议,就是西门子的S7协议、三菱的MC协议、欧姆龙的FINS协议、倍福的ADS协议这类由PLC厂商定义的私有通信协议。
走原生协议最大的优势是效率高、能访问PLC内部几乎所有资源,包括DB块、M区、I/O区甚至程序里的符号变量。比如西门子S7-1200/1500,用S7协议可以直接按符号名读写DB块里的变量,根本不用关心物理地址偏移,改程序导致地址变化也不会影响上位机。三菱Q系列走MC协议3E帧的时候,以二进制帧格式读写D区、M区也相当高效。
但原生协议也有短板。一是协议文档不公开或者只对合作方开放,你要自己抓包逆向开发,还是得依赖官方库或第三方SDK。二是每换一个品牌,就要重新开发一套通信逻辑,代码复用率不高。所以原生协议直采,更适合单品牌PLC数量多、点位密度高、实时性要求也高的项目。
我自己用C#调过西门子S7通信,用过S7-1200的官方库也用过网上的开源库,实际体验下来,只要搞清楚TSAP、机架号和槽号这些参数,稳定性和响应速度都比走Modbus中转好很多。三菱MC协议同理,FX5U甚至原生支持SLMP协议,可以直接用MC协议3E帧通信,不需要额外的通信模块。
2.2 标准Modbus协议采集:多品牌设备联通的“通用语言”
Modbus是Modicon搞出来的老协议,却是目前为止工业界兼容性最好的采集方式。几乎所有的PLC、仪表、变频器、温控器都支持Modbus RTU或者Modbus TCP,哪怕不支持,花几十块钱加个模块也能支持。
Modbus方案有一个非常大的优势:程序开发简单。因为协议是公开的,不管你用什么语言,几百行代码就能写出一个稳定的采集器,而且网上参考代码一抓一大把。像台达PLC、汇川PLC,出厂默认就支持Modbus地址映射,你把数据映射到保持寄存器,上位机用Modbus TCP一读就能拿到。
但这个方案最大的问题在于数据结构不直观。PLC里的D区、M区,映射到Modbus寄存器地址之后,地址是离散的,含义全靠点表解释。还有寄存器长度限制,Modbus TCP单次最多读125个寄存器,如果点位多,要拆成多帧。所以Modbus适合点位数量不大、跨品牌设备多、各设备数据点分散的场景。
热词里有“台达plc 485 从站”,其实就是典型的Modbus RTU从站用法。台达PLC做从站,上位机通过485总线轮询,逻辑上很简单,但要特别注意站号、波特率、数据格式保持一致,而且485链路对线缆和接地要求比较高。
2.3 网关/协议转换器采集:改造项目的“省心丸”
第三种路径是网关。网关的本质是用一台专门硬件做协议翻译,比如把三菱MC协议转成Modbus TCP,把Modbus RTU从站采集上来再以Modbus TCP对外发布。这样上位机永远只面对一种协议,不用关心底下接的是什么PLC。
这种方案在老旧设备改造项目里特别香。很多老设备PLC程序是加密的,你没法动,也找不到原厂支持,但只要PLC上还有个空闲的通信口,就能挂一个网关在外面做“旁路采集”。相当于用硬件在外部强行翻译设备协议,完全不干涉PLC运行。
选网关的时候有几个指标必须问清楚:支持的PLC协议列表、最大可采集点位数量、采集周期、是否支持边缘缓存(断网时先把数据暂存,恢复后补传)。别只看网关便宜,点位一多、周期一短,便宜网关的性能直接拉胯。我也踩过这种坑,买了一台号称“高速采集”的网关,接三菱FX5U的CC-Link IE Basic控制伺服时,发现网关转发周期根本跟不上伺服状态变化的速度,最后只能换更高阶的型号。
2.4 OPC UA/DA:从OT到IT的“标准桥梁”
OPC UA是目前行业内公认的工业通信标准方向。它不只是读PLC数据,还自带信息建模、数据加密、身份认证、订阅推送机制,对IT系统非常友好。MES、云平台、AI分析系统对接PLC数据,走OPC UA是最省心、最规范的一条路。
不过很多人对OPC UA有误解,以为“只要上了OPC UA就万事大吉”。实际上OPC UA解决的是“数据统一对外”的问题,不解决“怎么从PLC取数”的问题。你依然需要先通过原厂驱动或网关把PLC数据采集到OPC UA服务器,再由客户端去订阅。
这就涉及一个现实问题:OPC UA服务器跑在哪?有两类做法。一类是纯软件,直接在工控机上装西门子SIMATIC NET或第三方OPC服务器,服务器通过S7协议连PLC,然后对外提供OPC UA。另一类是硬件网关,网关内嵌OPC UA服务器,直接对外提供服务。前者优点是点位容量大、和PLC生态集成好,缺点是对工控机性能和授权有要求;后者部署灵活、即插即用,适合点位较少的分站场景。
我的建议是,如果项目未来有上云、上MES、跨系统集成的计划,那么即便现在只做一个简单的数据展示,也应该优先考虑OPC UA方案,省得以后二次改造。这也是我在做“S7-1200超市储藏环境控制系统”这类毕业设计或样机演示时,默认选OPC UA的原因——它能让数据链路从PLC到数据库再到云端全部打通,扩展性最好。
2.5 绕过PLC直采仪表传感器的方案
最后一种路径比较“野”,但实际使用频率不低:直接用传感器或仪表的通信口采集数据,完全不经过PLC。比如一个温度变送器支持Modbus RTU输出,你可以直接把485线接到上位机或网关,温度数据就绕过了PLC的扫描周期和程序逻辑。
这种方案适用于:只关心某几个关键模拟量值,不关心PLC程序内部状态;或者PLC代际太老、程序被人锁死,实在没法从PLC侧取数。又比如热词里的“plc和川崎机器人走总线通讯”,有时候你只是想单独获取机器人的位置状态,与其折腾PLC程序,不如直接从机器人的总线接口分一路采集数据。
但这条路径有个重大风险:通信冲突。如果仪表原本就挂在PLC的Modbus总线上,你再挂一个采集器去读同一个从站,有可能因为双方同时发送请求引发总线冲突。所以用这个方案之前,要么把仪表从原总线上解挂,要么确认仪表支持多主站轮询,否则会惹出不少麻烦。
3. 通信链路的细节决定成败:串口、以太网和总线差异
横评采集方案,不能只看协议层,还要看物理通信链路。同一套协议跑在RS485和跑在以太网上,表现完全是两个样子。
3.1 RS485串口链路:老设备最稳妥也最慢的路径
RS485至今仍在大量使用,尤其是台达、三菱FX系列老款、松下PLC这类设备,标配串口是最常见的情况。485链路的好处是简单、抗干扰能力强(差分信号)、传输距离远,不加中继理论上能到1200米。
但485最头疼的是轮询延迟。假设一条总线上挂了16个从站,波特率9600,每个从站读10个寄存器,单次通信指令按10个字节算,一帧下来大概10毫秒,再加上从站响应时间和主站轮询间隙,一轮巡检下来就是几百毫秒。如果点位再多一些,刷新周期轻松超过1秒。所以热词里有“labview与松下plc串口通讯”,做完的人基本都会发现,串口采集的瓶颈不在编程,而在链路速度。
做485采集的几条硬经验:通信线用屏蔽双绞线,屏蔽层单端接地;终端电阻在总线两端各加一个120欧姆;每个从站的地址不能重复;注意A/B线极性不能反,很多从站模块上标注的A、B和你实际接法可能不一致,读不到数据时先把这两根线调换试试。还有一个很多人忽略的点:部分品牌的从站模块上电后需要时间初始化,主站上电后立刻发请求,大概率超时,建议程序里加上电后延时重试机制。
3.2 以太网链路:快和慢的两面性
以太网采集是目前的新项目主流,西门子S7-1200/1500、三菱FX5U/Q系列、欧姆龙NJ/NX系列,基本都标配以太网口。以太网的好处是速度快、数据吞吐量大、不用关心复杂的布线和终端电阻。
但以太网有个坑:局域网广播风暴和IP冲突。有些工厂项目里,设备网和管理网没做物理隔离,视频监控的数据流、办公网的广播包全跑在一个交换机里,PLC的通信响应就会变得时快时慢。所以做以太网采集方案时,我建议把PLC采集链路单独划一个VLAN,或者在交换机上做端口隔离。
另一个和以太网相关的经典问题,就是热词里“tia 用vmware连plc用什么网络连接模式”。很多人用VMware虚拟机跑TIA博途或者模拟上位机软件,发现连不上实体PLC。这里直接说结论:除非你有非常特殊的原因,否则虚拟机网卡请设为桥接模式,让虚拟网卡和物理网卡在同一二层网络内,相当于虚拟机直接插在了交换机上。用NAT模式的话,虚拟机和PLC不在同一网段,S7协议、Modbus TCP这类广播或定向广播机制都没法正常工作。在我自己的测试环境里,桥接模式下TIA下载程序和PLC通信从未出过问题,NAT模式100%不通。
3.3 现场总线和工业实时以太网:适合PLC之间,不适合MES直采
CC-Link IE、Profinet、EtherCAT这类总线,定位是PLC到远程IO、PLC到伺服驱动器、PLC到PLC的实时控制网络。它们的实时性极强,但语义和普通以太网不一样,普通上位机网卡直接接入是读不到数据的。
如果你的需求是上位机采集伺服状态、位置等数据,最合理的做法不是直接去抓总线上报文,而是让PLC把需要共享的数据放到通信区,再由上位机通过OPC UA或Modbus读取。换句话说,总线是生产系统内部的事情,采集方案要做的是在PLC侧搭一座“桥”,把数据从总线上搬到IT系统够得着的通道里。
这个思路在处理“三菱FX5U通过CC-Link IE Basic控制伺服”这类场景时尤其重要。CC-Link IE Basic从名字上就能看出,它用的是以太网物理层,但它依然是设备控制级协议,不是给上位机做数据采集用的。想要高效、安全地把伺服状态数据采集出来,后期也方便做预测性维护,建议在PLC里把伺服的报警码、当前位置、速度等状态汇总到特定寄存器块,然后开放Modbus TCP或MC协议给上位机。
4. 品牌和代际差异对采集方案的影响
热词里西门子、三菱、欧姆龙、台达、汇川、倍福这些品牌全占了,说明大家是真被不同品牌的“脾气”折腾过。我特意把品牌差异单独拿出来说,因为同样叫“采集”,不同PLC的坑点完全不在一个频道上。
4.1 西门子:S7-200 SMART、S7-1200/1500大不同
西门子家族内部差异就很大。S7-200 SMART是老经典了,它没有原生S7协议的完整实现,用户最常用的采集方式是Modbus TCP从站,在编程软件里调用MB_SERVER指令,把V区映射到Modbus保持寄存器。这个方案成熟稳定,但有一个特点:只要PLC程序里没有调用MB_SERVER,外部就永远连不上。所以做S7-200 SMART采集时,第一件事是检查PLC程序里有没有Modbus服务器功能块。
S7-1200和S7-1500就不一样了。它们原生支持S7通信,上位机可以用S7协议直接读写,也可以通过FB块方式组态为Modbus TCP服务器。如果只是采集少量数据,直接用S7协议最快;如果点位多而且有OPC UA需求,S7-1500和较新固件的S7-1200还支持单机运行OPC UA服务器,非常方便。
项目里比较烦的是“S7-1200程序加密”的场景,如果程序文件被Know How Protect保护,你就算拿到程序也看不到逻辑结构,但对外通信口通常还是开放的。这时走S7协议照样能读DB块数据,相当于物理上能取数,只是没法从源码层面理解每个地址的含义,点位表就得靠现场对设备来反推。
4.2 三菱:MC协议里藏着3E帧和4E帧的学问
三菱是日系PLC里采集方案最灵活也最容易搞混的。FX系列老款通过编程口走FX编程协议,速度慢但实现简单;Q系列、L系列、FX5U走MC协议,有3E帧、4E帧两种主要帧格式。
MC协议3E帧是无连接通信,上位机直接发二进制请求帧,不需要提前建立TCP连接,实现起来最简单。4E帧则是先建立连接,再基于连接号来发送请求。实战里绝大多数选择3E帧就够用了,因为它无状态、并发也好处理,丢包重发逻辑也简单。
但如果用三菱自带软件GX Works的仿真模式,你得注意仿真环境下MC协议可能不开放。热词里“三菱plc如何自整定pid参数”“三菱plc写入需要转换编译写入三步吗”这类问题其实反映了一个共同逻辑:三菱的采集和调试高度依赖工程文件与PLC联机的模式,写程序要转换、编译、写入三步走。采集方案要接入这种PLC时,如果能获得PLC程序工程,直接通过GX Works手自动调试找到数据存储地址,比对着手册翻地址表高效得多。
4.3 欧姆龙、台达、汇川、倍福:各有各的脾气
欧姆龙CJ/NJ系列采集首选FINS协议,UDP方式实现简单,一个命令帧就能读写多个地址。欧姆龙的地址区非常多,CIO区、WR区、DM区、HR区,映射关系要搞明白。仿真软件也能模拟大部分指令,但和实际PLC联动时,注意1.58注册码这种破解类问题就别碰了,正版授权和试用版更稳妥。
台达和汇川因为主要定位OEM市场,对Modbus支持得极其友好,很多时候你甚至都不用写PLC程序,只要配置好从站地址映射,上位机就能直接读。这类PLC做采集方案的难度是最低的,唯一要留意的是寄存器映射可能分保持寄存器和输入寄存器,别搞混。
倍福是软PLC架构,TwinCAT运行时本质上是个Windows服务。采集倍福PLC数据最直接的方式是用ADS协议,倍福还提供了免费ADS库,支持C/C++/C#等语言。如果点位比较多,也可以直接跑一个倍福的OPC UA服务器。热词里的“倍福plc el6022”,是倍福的串口通讯端子模块,实际调试中最常见的问题是线序接法和模块固件版本不匹配导致通信失败,排查时要先看模块的LED诊断指示灯状态。
4.4 老设备锁机、报警代码这类“意外情况”怎么处理
做采集项目,逃不过老设备锁机问题。热词里“plc定期锁机程序”说明很多设备被厂商加了定时锁,到期后PLC直接停机。遇到这种情况,采集系统不仅要“取数”,更建议在PLC外部单独采集关键状态量(比如主接触器反馈、伺服使能信号),一旦发现设备非法停机,能在第一时间给出告警。
另外,“plc报警link-100”这种错误在三菱系统中很常见,一般表示通信链路异常。排查思路很简单:物理层先看485线是否正常、终端电阻是否跳线、站号是否有冲突、波特率是否一致;网络层再看是否有其他设备占用同一IP,最后看协议帧格式是否匹配。记住一个原则:链路层问题远比协议层问题多,先查线,再查设置。
西门子的通讯模块报8180错误,也是采集现场的高频问题。这个错误代码通常指向模块组态与硬件不一致,或者模块通道被占用。只要把硬件配置重新下装一次,或者在组态里把模块在线分配的参数和实际模块版本对齐,一般就能恢复。
5. 选型判断:一张表看透五种方案的性价比
方案对比不能只停留在“各有优势”,还得落到量化指标上。
| 方案 | 实施难度 | 实时性 | 跨品牌能力 | 点位容量 | 成本 | 典型场景 |
|---|---|---|---|---|---|---|
| 原生协议直采 | 中 | 高(毫秒级) | 低 | 高 | 低(仅开发成本) | 单品牌新项目、SCADA/上位机直连 |
| Modbus TCP/RTU | 低 | 中(百毫秒级) | 高 | 中 | 低 | 多品牌设备、老设备改造 |
| 硬件网关 | 低 | 中 | 高(看网关支持列表) | 中 | 中 | 程序锁死的老设备、现场不便改动 |
| OPC UA协议 | 中 | 中高 | 高 | 高 | 中(授权成本) | MES、云平台、跨系统集成 |
| 直采仪表/传感器 | 低 | 高 | 不涉及 | 低 | 低 | 单点监测、旁路采集 |
从这个表能直接得出结论:没有“最好的方案”,只有“当前场景下最合适的方案”。
再给三个具体的推荐组合。
小型单设备项目,比如毕业设计或者实验室样机(像“西门子1200plc超市储藏环境自动控制系统仿真设计自动发货plc程序”那种),直接用S7协议或Modbus TCP把数据读到C#或LabVIEW界面就够,没必要上重型中间件。因为在这种场景下,你真正需要的是快速跑通逻辑,并有足够余量做界面展示。
中型多设备改造项目,目标是把10台不同品牌的PLC数据汇总到统一平台,我建议统一采集Modbus TCP,设备侧要么本身支持Modbus,要么挂网关转Modbus,汇总侧用现成组态软件或自己写个采集服务。注意轮询周期和点位上限的匹配,避免单台设备点位过多把周期拖长。
大型产线数字化项目,最终要对接MES、ERP、工业互联网平台,那不用犹豫,直接上OPC UA。每台PLC或每个车间用一个OPC UA服务器,向上游系统提供统一接口。虽然在初期部署阶段配置会繁琐一些,比如要处理证书、配置用户权限、开放端口,但后续任何新系统要接数据,都只需要对接这一套标准接口,长期收益非常明显。
还有一个容易被忽略的选型因素:后续维护团队的技术栈。如果现场电工只会用GX Works也不会写C#,那你在选型时就要避免做一套非常复杂的自研采集器,否则维护成本会吃掉所有灵活性上的收益。这种情况下,带网页配置界面的网关或者成熟组态软件反而是最优解。
6. 从模拟器到真实环境:验证采集方案的完整思路
横评到最后,我想把验证和排错的流程单独列一节。因为我在不同项目里反复确认过一件事:仿真环境跑得再完美,都不代表现场能一次通过。提前把验证方法列好,能免去大量现场救火的时间。
6.1 采集测试不是“能读到值”就行,而要测边界
有些工程师验证采集是否成功,只看上位机上能不能显示数值。这是远远不够的。一份完整的采集功能测试,至少包含以下内容:
- 数据类型正确性:每个点位按INT、REAL、BOOL分别验证,确认读到的值不越界、不做类型错配解释。热词里“plc int real”就是这类问题的典型表现,读出来一个巨大天文数字,多半是数据类型按错了。
- 字节序正确性:有些PLC默认为大端序,采集软件按小端解析,会导致16位数据高低字节对调、32位浮点数完全错乱。我用Modbus TCP从台达PLC读32位浮点数时,就被字节顺序坑过两次,最后在配置里把交换寄存器字节序打开才解决。
- 通信异常行为:手动拔掉网线、屏蔽PLC端口、关掉PLC电源,观察采集系统报警是否正确、数据是否标记为质量坏、恢复后是否自动续采。这比正常跑100次数据都重要。
- 数据量极限测试:把点位逐步增加到设计上限,看通信周期是否还能满足要求。一台网关标称支持1000点位,实际接500个时轮询可能已经超过3秒,一定提前测。
6.2 仿真环境与实际PLC的差异
现在有大量的仿真工具,比如TIA PLCSIM、欧姆龙仿真、三菱GX Works仿真,这些在程序开发初期能节省很多时间。我自己的习惯是先用仿真环境把上位机软件的通信逻辑跑通,确认报文收发、超时重试、数据解析这些通用模块没问题,再去现场联调真机。
但仿真永远替代不了真机验证。仿真软件模拟的是PLC内部逻辑执行,但模拟不了通信端口的电气特性、网线质量和现场电磁干扰。热词里“plc仿真软件下载s7-1200”搜的人特别多,但如果你只是拿仿真做采集实验,要注意仿真软件的网络接口不一定对虚拟机开放,VMware里跑TIA和仿真时也可能出现网络适配器模式不兼容的情况——和之前连实体PLC一样,虚拟机尽量用桥接模式,才能在仿真和真实网络切换时少踩坑。
6.3 高频故障的排查思路清单
最后,把我在各种“PLC采集方案”项目里实际遇到的高频故障和排查链路汇总一下,建议收藏备用。
- Modbus通信超时。先ping设备IP确认在网络层通不通,再检查端口502是否被防火墙拦截,然后用ModScan这类工具手动读一次寄存器,如果工具能读到而自己的程序读不到,那就是协议帧格式或字节序配置问题。
- 读取的数据和PLC程序里的实际值对不上。先核对地址映射关系,再核对数据类型,最后检查PLC侧数据是否做了工程换算。如果PLC里显示25摄氏度,上位机读到500,基本是量程换算没有做,或者把原始码当成了工程值。
- 数据时断时续。优先怀疑网络广播风暴、交换机端口协商问题、串口接地不良,其次检查采集程序是否采用短连接反复握手。长连接稳定性明显好于短连接。
- 报警信息(如Link-100、8180)不断刷屏。这类问题往往指向“通信对象本身状态异常”,排查顺序是:物理连接、设备供电、通信参数、对方设备程序是否修改过。报警代码本身只是告诉你“有人没来上班”,具体什么原因旷工,还是得逐层查。
还有一个很实用的经验:采集程序和PLC通信时,尽量支持“连续失败N次后重新初始化链路”的机制。我见过不少系统在PLC侧短暂断电重启后,采集程序因为链路状态没有及时重建,就永久卡死,必须人工重启采集服务。加了链路自愈逻辑之后,这种问题基本就绝迹了。
关于采集周期和PLC扫描周期叠加的问题,也值得提醒一句。有些工程师在PLC程序里把数据的刷新频率设置得很高,比如每10毫秒刷新一次,然后上位机又是每50毫秒读取一次。这样一来,上位机读到的数据实际上是很“跳”的,因为两次读取之间PLC内部数据可能已经变化了好几次,而你并不知道中间的过程值。如果你需要的是平滑的曲线数据,更合理的做法是在PLC里做平均值处理或者用一定周期的采样保持,而不是一味地加大通信频率。这个取舍在写PLC程序的时候就要想清楚,别等采集系统上线了再去调。
最后再分享一个我在实际项目里的操作习惯:不管用哪种采集方案,我都会在PLC里单独划出一个“数据交换区”,把上位机需要的数据统一映射到一个连续的地址块里,并在交换区里放一个心跳计数器和数据有效性标志。上位机每次读取先看标志位,再读数据,这样即便PLC程序后续被修改优化,只要交换区对应关系不变,上位机代码就可以完全不动。这个做法让我在多个改造项目里省下了大量联调时间,也算是“数据接口与业务逻辑分离”思想在PLC采集层的一种落地吧。