资讯动态

PLC与MES的SECS/GEM通讯实战:从协议原理到联调排错

发布时间:2026/10/5 11:26:54 来源:尧图企业网站定制
做了这么多年自动化集成真正把PLC和MES之间的SECS/GEM链路玩明白是在一条半导体后道封装线上。当时设备商说“支持SECS”结果联调时连基本的S1F13握手都过不去两边工程师现场翻标准文档翻了一天。从那以后我就意识到搞这套东西光知道协议名没用得把消息结构、状态机、时序参数全部吃透才能真正在现场把链路拉通。这篇文章就把PLC与MES通过SECS/GEM通讯这件事从方案选型、硬件接入、PLC侧逻辑设计到MES联调一步步拆开讲清楚。搞设备自动化、做MES实施的朋友还有刚接触半导体通讯协议的工程师都可以拿这篇当参考。1. SECS/GEM到底是什么为什么半导体厂都离不开它1.1 设备联网的真实痛点先聊一个最常见的场景。一条半导体封装或测试产线设备好几十台有贴片机、固化炉、测试机、打标机PLC品牌五花八门有三菱的、西门子的、汇川的还有不少老设备用的是专用控制器。MES要管什么要管工单下发、批次追踪、设备状态、参数上传、报警记录、良率数据。这套需求一出来问题就来了MES怎么知道这台设备当前在跑哪个产品、跑了多少片、有没有报警、腔体温度是多少如果只是简单的数字量采集用Modbus TCP就能搞定但半导体行业的设备管理远不止“采几个寄存器”。MES需要和设备之间做完整的对话主机下发配方设备执行完主动上报结果设备发生报警要主动通知主机主机要查询设备的详细状态设备得按标准格式回复甚至MES要控制设备暂停、继续、结束当前批次。这些需求涉及到的是“设备行为规范”而不仅仅是一条通讯链路。SEMI标准里的SECS/GEM就是专门为这种场景设计的。1.2 SECS/GEM与Modbus、OPC UA的本质区别很多做传统工厂自动化的工程师刚接触SECS/GEM时都会问Modbus TCP也能传数据OPC UA语义也很丰富为什么半导体行业非要搞一套自己的标准这么想很正常但实际深入进去就会发现SECS/GEM和传统工业协议压根不在一个维度上。我打个比方Modbus像是两栋楼之间拉了一根水管水流量多大、什么时候流全靠两边自己约定SECS/GEM则是一套带了信封、地址、回执、格式规范的邮政系统每一封信件该怎么写、寄出去多久没回信算丢失、收件人该回什么格式的确认全都有明确规则。具体来说区别体现在几个层面。Modbus TCP传的是裸寄存器地址表含义由PLC编程人员自行定义换一个人维护就要重新翻手册OPC UA虽然把数据建模做得很好但它在半导体行业设备端的使用率很低没有设备厂商原生支持。SECS/GEM的价值在于它把“主机和设备之间如何对话”这件事做成了行业统一规范不管是哪家设备、哪个MES只要遵循同一套标准接口就能对接。而且GEM标准还规定了设备必须支持哪些状态、哪些事件、哪些报警这些对半导体工厂的追溯体系至关重要。1.3 SECS-I、HSMS、SECS-II、GEM这几个标准怎么区分第一次接触这套体系的人容易被一堆缩写绕晕。SECS-I、HSMS、SECS-II、GEM之间到底是什么关系我用自己的理解捋了一遍标准层级作用传输载体SECS-I传输层老一代串口通讯RS-232串口HSMS传输层新一代以太网通讯TCP/IPSECS-II消息层定义消息格式和内容依托HSMS或SECS-IGEM行为层定义设备状态模型、事件上报、报警、配方等行为规范基于SECS-II打个不是很严谨但好记的比方SECS-II是“信件的格式规范”HSMS是“送信的邮差”GEM则是“收件人和寄件人之间的行为守则”。没有GEM两台设备虽然能用SECS-II互发消息但彼此不知道什么时候该主动上报事件、什么时候该拒绝主机指令。有了GEM设备的行为才变得可预期、可管理。这也是为什么MES和设备的通讯联调核心工作全部围绕GEM定义的状态和事件展开。2. 通讯架构怎么搭从PLC到MES的完整链路2.1 三种主流架构根据现场条件选型PLC本身几乎不会直接支持SECS/GEM通讯因为这套协议栈的逻辑比较复杂对内存和处理能力有一定要求PLC的强项是实时控制不是处理复杂的字符串解析和状态机管理。所以现场方案基本都围绕“如何让PLC接入SECS/GEM体系”来设计最常见的路子有三条。第一种是硬件网关方案在PLC和MES之间加一台独立的SECS/GEM协议转换网关。PLC侧用Modbus TCP或以太网/IP与网关通讯网关另一侧跑HSMS与MES对接。网关负责把PLC寄存器里的数据映射成SECS消息并在内部维护GEM状态机。这种方案的好处是PLC程序改动量最小适合老设备改造坏处是多了一个硬件节点集成度一般而且网关的配置工具需要额外学习。第二种是工控机软件方案用一台安装了SECS/GEM服务软件的工控机向上通过HSMS连接MES向下通过Modbus、OPC UA或者以太网/IP采集PLC数据。SECS协议栈处理和GEM状态机全部由工控机上的软件完成PLC侧只需要预留数据读写接口。这个方案非常灵活现场调试也方便是目前设备联MES最主流的方式。我见过一些成熟的设备厂商直接把这套逻辑做成设备的标准软件模块出厂就预装好。第三种是在PLC里直接实现SECS/GEM逻辑需要PLC本身具备较强的通讯处理能力通常还得搭配专用的通讯处理模块。坦白讲这种方式在真实项目里比较少见一来开发量大二来后期维护门槛高除非是设备批量很大、想要彻底降低硬件成本否则我一般不建议。三种方案对比下来我个人的选型建议是老设备改造优先考虑硬件网关新设备或改造空间大的项目直接上工控机软件方案PLC内置方案只在极少数标准化程度极高的场景下考虑。2.2 不同品牌PLC的接入方案聊到具体PLC品牌接入思路会有一些差别。西门子PLC尤其是S7-1200、S7-1500走工控机方案非常顺手。PLC侧通过Profinet或Modbus TCP把数据块暴露给工控机工控机上的SECS服务软件用S7通讯或Modbus直接读写DB块。如果现场不想开放底层通讯也可以用OPC UAS7-1500的OPC UA服务器是内置的配置一下证书就行。三菱PLC无论是FX5U还是Q系列习惯上还是Modbus TCP最多。FX5U自带以太网口支持SLMP协议工控机采集起来也方便。如果是老款的FX3U则需要加一块以太网扩展模块才能走TCP。需要注意的是三菱的寄存器地址和Modbus地址之间有偏移映射关系联调前一定要把映射表核对清楚。国产PLC这两年接触得也多像汇川的AM系列、H5U系列基本都支持Modbus TCP和以太网/IP。汇川还有自己的通讯协议但第三方采集最好还是走Modbus兼容性最稳定。我踩过一个坑就是汇川某些固件版本对Modbus保持性寄存器区间的读取限制很严格超范围读会直接报错这个后面在排错部分详细说。2.3 选型时我踩过的一个坑这里说一个印象很深的项目。当时一条SMT线做MES改造设备侧是两台贴片机控制系统是三菱FX5UMES厂商推荐的方案是买某品牌的SECS网关。结果设备商把贴片机的程序封装得很死只开放了部分寄存器地址配方数据不在开放范围内。现场试了两天发现网关能上报设备状态但MES要下发配方到设备就完全做不了。后来我们换了思路在贴片机旁边加了一台小小的工控机用串口线直接连接贴片机的调试口从设备原生协议把配方数据读出来再通过工控机上的SECS服务与MES通讯。问题当场就解决了。这件事给我的教训是选SECS通讯方案之前第一步不是选网关还是选工控机而是先搞清楚设备和PLC到底开放了哪些数据接口、数据是否可写否则方案再先进落不了地也白搭。3. PLC侧核心逻辑消息设计与状态机实现3.1 SECS/GEM消息结构拆一个S6F11报文联调SECS/GEM的时候第一个要会的操作就是看消息。SECS-II消息从主机到设备最常见的几类是S1F1Are You There主机确认设备在线、S1F13Establish Communications Request建立通讯请求、S2F41Host Command主机命令下发、S6F11Event Report事件上报、S5F1Alarm Report报警上报。拿S6F11举例这是设备主动上报事件最核心的一条消息。一条完整的S6F11消息结构是这样的Header: Stream 06, Function 11 WBit 0 (无回复) 系统字节 16位随机数用来关联请求和回复 Message Body: DATAID: 数据ID, 通常为0 CEID: 采集事件ID, 比如设备状态变化1001, 批次完成1002 COLLECTION TIME: 事件发生时间, 格式YYYYMMDDHHMMSSSS REPORT DATA: 按Report ID组织的一组数据项 RPTID 1 DATA LIST: 数据项1: 设备ID 数据项2: 当前状态 数据项3: 当前配方名现场调式时我一般会让MES厂商把收到的S6F11原始报文导出来一行一行对着看。只要CEID对得上、数据项顺序对得上后面的解析就简单了。最怕的是两边对数据顺序理解不一致比如PLC侧把温度放在第三个位置MES侧按第二个位置解析查问题能查半天。3.2 PLC状态机设计思路SECS/GEM通讯中有一个特别关键的概念叫设备状态模型也就是Equipment State Model。GEM标准规定了设备至少有几种状态IDLE空闲、READY就绪、EXECUTING执行中、PAUSED暂停、STOPPED停止等。MES会通过查询指令获取设备当前状态并据此判断能否下发新工单。在PLC里实现这套状态机我建议不要用梯形图硬写太容易乱。用SCL或者结构化文本写状态机要清晰得多。状态之间用转移条件驱动比如CASE state OF IDLE: IF start_cmd THEN state : READY; END_IF; READY: IF process_start THEN state : EXECUTING; CEID : 1002; //批次开始 END_IF; EXECUTING: IF process_complete THEN state : IDLE; CEID : 1003; //批次完成 END_IF; END_CASE;这段逻辑看起来简单但实际上很多设备的状态切换远不止这些比如暂停、报警复位、强制停止。我的建议是先把GEM要求的状态模型画成一张状态转移图再把每个转移条件对应到PLC内部的实际信号最后再写代码。别一上来就写后面MES联调时状态对不上排查成本极高。现在也有一些AI辅助PLC代码生成的工具能根据状态转移描述自动生成SCL代码我自己试过用来做初版的框架生成效率确实高但状态的边界条件还是得人工确认。3.3 数据映射表怎么做配方怎么传SECS/GEM联调最细碎的活就是做数据映射表。PLC内部的基本单位是位、字、双字SECS消息里则是各种数据项每个数据项有SEMI标准定义的格式比如ASCII字符串、U2无符号16位整数、I4有符号32位整数。做映射表就是把PLC地址和SECS数据项一一对应起来。举个例子设备ID、配方号、当前批次号通常定义为ASCII字符串而腔体温度、压力这类模拟量通常定义为浮点格式但SEMI E5标准里没有直接定义单精度浮点一般用I4按整数传输约定好缩放的倍数。比如温度实际值是105.23摄氏度通讯时传输10523PLC侧再除以100还原。这个缩放倍数必须在映射表里写清楚并且和MES开发人员提前对齐否则最终报表里的数据对不上。配方数据是另一个最常见的联调痛点。MES下发配方到PLC通常通过S2F41命令携带配方参数PLC收到后解析并写入对应的数据区设备执行。这里有两个细节容易出问题一是配方参数数量必须和映射表保持一致多了少了都会导致解析错位二是PLC写入配方的动作是做一次性的写入完成后要回传一个确认这个确认不是简单的“收到”而是“执行成功”或“执行失败”。GEM标准里对S2F41的回复有明确要求回复格式错了MES会认为命令执行失败即便设备实际上已经收了配方。4. MES联调实战从模拟器到正式上线4.1 先用SECS模拟器空跑链路联调的第一原则先把系统联起来再谈功能。很多项目一上来就追求完美结果又要配PLC变量又要写MES逻辑两边同时调试出了问题根本分不清是通讯问题还是逻辑问题。我习惯的做法是先用SECS/GEM模拟器把链路空跑起来。MES侧可以先装一个开源的SECS模拟器当主机让PLC侧的设备服务程序往模拟器上报事件反过来也可以用模拟器当设备让MES往里下发指令验证MES的解析逻辑。两端单独验证都没问题了再让真设备和真MES对接。这个习惯帮我省掉了大量扯皮时间。本地部署MES的时候开源MES系统是个不错的选择像Carbon就是一个可以本地部署的开源MES。我在测试环境里用Docker把Carbon跑起来再通过它的开放接口对接SECS服务整体效果还不错。对于小团队或者验证项目来说本地部署一套开源MES来做联调比什么都要强。4.2 模拟环境下的联调步骤实测以工控机软件方案为例我整理了一份从零拉通链路的操作顺序你在现场可以直接照着做。第一步是固定IP和端口。设备端设定好HSMS服务器的IP、端口默认端口一般是5000通信模式有主动连接和被动监听两种。联调时我建议设成被动监听让MES侧主动连接这样逻辑更简单也方便排查是哪一侧发起了连接。第二步是在模拟器上测试设备服务端的握手消息重点看S1F13如果这条消息能正常回复S1F14说明通讯链路已经通了。第三步是测试设备主动上报S6F11模拟器上确认能收到事件并正确解析数据内容。第四步再测试MES下发的S2F41配方指令检查设备端能正确解析并返回S2F42确认。我在测试时踩过一个很典型的坑设备端主动上报事件非常积极每秒钟发几十条S6F11模拟器处理不过来网络抓包发现大量TCP重传。原因是PLC侧事件产生的条件设置得太宽一个小状态变化都触发上报。后来在事件采集逻辑里加了防抖和最小时间间隔比如同一事件10毫秒内只允许上报一次问题才解决。这条经验后来几乎在每个项目里都用到。4.3 上线前的测试清单联调通过不代表可以上线一套半导体设备通讯系统上线前我建议至少要过一遍这份测试清单设备ID配置正确MES侧注册信息与设备端完全一致。心跳机制验证MES断开后设备能自动检测到并在MES恢复后重新建立连接。断线重连测试拔掉网线或重启MES服务设备端能否按配置自动重新连接。事件上报可靠性连续跑100个批次确认没有漏报、重报。配方下发准确性不同配方反复下发确认数据写入正确且参数无错位。时间同步设备端和MES的时间偏差不能超过规定范围否则追溯记录会出现时间混乱。报警上报验证模拟设备报警确认MES能实时收到S5F1报警消息并正确恢复。这些东西看起来多但每一条线上出过事。尤其是时间同步很多工厂设备调完就没管过NTP设备时间偏了好几分钟最后追溯产品质量时才发现记录的时间轴全乱了那个返工成本远超过事先配一套时间同步的成本。5. 现场常见问题与排错经验实录5.1 HSMS连接建立老失败HSMS连接不上是排错的第一大问题。设备端设了主动模式MES侧也设了主动模式两边都不监听自然连不上。第一先确认模式一端是主动另一端必须是被动。第二查IP和端口设备端端口号是否和MES配置一致防火墙是否放行了TCP端口。第三查设备ID很多设备商在通讯建立时会校验Device ID不一致的连接请求直接拒绝。第四看抓包设备端和MES侧同时抓TCP报文看SYN包有没有发出来、有没有被RST在哪一步断的就能定位问题。之前碰到一个很隐蔽的问题网关设备的HSMS连接在运行半小时后规律性断开。后来抓包发现是TCP keepalive参数默认值太长导致中间网络设备把空闲连接回收了。把keepalive时间从默认的2小时改成30秒问题就消失了。这类问题网络报文能看出来但需要有耐心。5.2 事件上报丢失和堵塞事件上报丢失是最让人头疼的问题因为它不报错只是默默丢数据。几种常见原因里我遇到最多的是上报频率超过MES处理能力。SECS/GEM毕竟是基于TCP的有连接通讯TCP本身不丢数据但MES端应用层来不及处理缓冲区满了报文就会被丢弃。另一个原因是设备端把多个事件合并得太厉害。比如设备状态经历了IDLE-READY-EXECUTING结果PLC侧只上报了一个最终状态过程事件全部漏掉了。针对这种事我的建议是设备端的事件采集要按“状态变化即上报”的原则设计不要把中间态吞掉。有些联调时看着没关系但MES要做流程追溯的时候中间态恰恰是最关键的。5.3 超时参数怎么设置才合理SECS/GEM标准里定义了T3、T5、T6等超时参数很多人不重视但现场出问题的往往是它们。T3是Reply Timeout指请求消息发出后等待回复的时限标准建议45秒。这个值设得太短设备端处理稍慢就会导致主机误判超时设得太长链路故障时故障响应又太慢。T5是Connect Separation Timeout两个连接尝试之间的最小间隔默认10秒。如果设备端的重连间隔比这个参数小可能会被主机拒绝。我一般建议T3设45秒T5设15秒T6设45秒。但最终还是要根据现场设备实际响应时间来调整。方法很简单用抓包工具量一下从发请求到收到回复的实际耗时再在这个基础上留出2到3倍的余量。5.4 与PLC扫描周期冲突还有一个很容易忽略的问题就是SECS服务与PLC扫描周期之间的冲突。工控机通过Modbus TCP读取PLC数据时如果通讯周期设置得太短比如小于PLC的扫描周期大量读写请求会挤占PLC的通讯处理时间严重的甚至影响PLC的程序执行。碰到这种现象最直接的表现是PLC程序的循环周期从正常的5毫秒突然飙升到30毫秒以上设备动作都跟着变卡顿。解决思路也简单一是适当增大数据采集周期比如从50毫秒改成200毫秒对SECS/GEM这种应用来说足够了二是在PLC侧对通讯访问区域和程序运行区域做优化把用于通讯的数据放在独立的数据块里避免通讯请求直接干扰实时控制区域。我后来养成了一个习惯每次做通讯方案的时候先问一问设备厂商PLC的扫描周期余量有多少再做通讯周期设计。宁可联调时慢一点也不要因为通讯把设备的实时控制拖垮。做SECS/GEM通讯这件事核心不在于把协议背得多熟而在于对整个链路有整体性的理解设备侧怎么采集数据、中间层怎么解析消息、MES侧怎么消费数据每一层都可能出问题。我自己最大的体会是联调时要保持耐心所有的异常最终都能通过分段排查定位到具体环节。就像我常跟身边同事说的SECS/GEM通讯没有玄学只有没查到的细节。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑