简介面向自动化设备工程师与产线集成人员的 SMEMA 协议详解手册围绕表面贴装设备制造商协会标准系统梳理了设备间通信的硬件接口、电缆引脚定义、板卡转移条件、出入口传感器与中间传感器的控制逻辑并总结了兼容性、可靠性和扩展性等优势可帮助读者快速理解 SMEMA 在流水线联机、设备间搬运自动化与 SMT 组装测试等场景中的实际应用。压缩包仅含 1 个 PDF 文件大小 737KB内容结构紧凑、图文结合适合作为产线调试、设备选型、协议学习和前后主机通信配置的基础参考资料。已有 1214 人学习下载配套讲解覆盖从硬件连接到软件联动的完整链路同时给出面向 Mac 产品先进制造环境的 SMEMA 标准说明能帮助工程师排查板卡传递异常、优化接口信号与联机控制流程。1. 一条信号线卡住整条产线SMEMA 协议到底是什么在自动化行业里SMEMA 协议常常被低估它就是 SMT 产线上相邻两台设备之间传递「我这里有板子」和「我可以接板子」的两组 24V 信号。但就是这么简单的信号如果时序没捋清楚回流焊出口接上缓存机就能让整条线体停半天。SMEMA 是表面贴装设备制造协会定义的设备联机标准接口核心价值不是传输数据而是用两对硬接线完成上下游设备的安全握手避免撞板、叠板。适合谁读SMT 设备工程师、自动化集成商现场调试人员、PLC 编程的新手——凡是做设备连线的迟早要和这根信号线打交道。2. 把 SMEMA 协议拆开看握手逻辑、三组信号与实时序图2.1 信号定义上游给什么、下游回什么SMEMA 协议约定的不是串口、网口而是数字量 IO。绝大多数产线上的 SMEMA 信号围绕两个核心信号展开一个叫「板到位」Board Present / In Position由上游设备发出意思是「我这里有板子已经准备好了」另一个叫「可接收」Ready to Receive / Accept由下游设备回复意思是「你现在可以把板子送过来」。这两个信号都是 24V DC 电平信号带光耦隔离接线端子通常是 4 线制24V 电源、COM 地、信号输入、信号输出。有的设备端子排上标的是 Load Request / Load Ready / Unload Request / Unload Ready翻译过来其实是同一件事的不同视角上游的 Unload Ready 等价于下游看到的 Load Request。产品型录里写「符合 SMEMA 标准」指的就是设备预留了这样一对信号点并且信号电气特性兼容 24V。标准的握手过程是上游设备检测到板子到位拉高「板到位」信号 → 下游设备检测到这个高电平并且自身处于可接板状态拉高「可接收」信号 → 上游看到「可接收」为高启动传送马达把板子送进下游 → 板子离开上游到位传感器后上游把「板到位」撤掉 → 下游检测到板子进入自己内部按自己的节拍开始处理。整个交互里没有数据帧、没有地址、没有协议栈就是两个电平在互相较劲。2.2 硬件接线从 COM/24V 到 NPN 与 PNP 的混接真正动手接线时SMEMA 最常翻车的地方是信号类型不匹配。24V 数字量信号分为源型PNP高电平有效和漏型NPN低电平有效。旧设备用 NPN 的很多新 PLC 输入模块大多数支持 PNP直接对接就会出现电平永远不对的问题。我一般会在端子排这边做转接。SMEMA 标准本身推荐采用光耦隔离这样设备之间不共地抗干扰也好。但不少老设备直接就把传感器电源和信号地接在一起遇到两台设备电源相位不一致地线之间就会有电位差轻则信号乱跳重则烧 IO 模块。接线时用 4 芯屏蔽线一端接设备 SMEMA 端子的对应信号点屏蔽层单端接地。不要在两端同时接地否则屏蔽层会成为地环路的一部分反而引入干扰。电源方面如果上游和下游各用各的 24V那就必须有光耦中转如果确认共地可以直连但要做好浪涌保护。下表是典型 4 线端子排的接法端子名称方向说明24V输入公共电源正极通常由本设备内部 24V 引出COM / GND输入公共地决定信号的参考电平Signal In输入接收对端设备的信号Signal Out输出发给对端设备的信号遇到 NPN 混 PNP 的情况常见做法是在中间加一个 24V 中间继电器或光耦转接模块把对端的 NPN 信号变成干接点再接本端 PLC 的 PNP 输入。不要指望改 PLC 输入类型就能通吃模块换型比现场改线贵多了。2.3 时序细节为什么先到先得在产线上不成立很多工程师第一次写 SMEMA 联机逻辑时会下意识地做「先到先得」只要有板就给下游发信号。听起来没毛病但实际生产里有三种情况会出问题。第一种是下游正在处理上一块板内部缓存满此时即使收到「板到位」也不能回「可接收」。如果程序写成收到板就启动传送带板子就会顶在前一块板尾部造成叠板。标准时序要求下游必须确认自身空闲后才拉高「可接收」。第二种是板子比较长上游到位传感器还在感应中板子头已经伸进下游。上游不能因为传感器被触发就一直保持「板到位」否则下游会以为还有一整块板在等待。正确做法是上游发出「板到位」后看到「可接收」为高就启动传送并开始计时在设定时间内强制撤掉「板到位」。第三种是掉电重启。设备重启瞬间PLC 输出模块可能有几十毫秒的随机输出如果恰好把「可接收」拉高上游就会误认为下游准备好而自动送板。所以程序里必须有上电初始化逻辑让输出保持安全电平至少 500ms 后再进入待机。因此SMEMA 的主线不是「谁先触发谁」而是「每个状态都带保持时间和超时时间」的完备握手。这也是把协议跑稳的核心思路。3. 用 PLC 把 SMEMA 联机跑通IO 分配、状态机与参数3.1 最小硬件清单与 IO 分配表以最常见的「贴片机 → 缓存机」一段为例缓存机作为下游需要接收贴片机的板到位信号并向贴片机回复可接收信号。PLC 需要 2 个输入点、2 个输出点。这里不选高端 CPU一个带数字量 IO 的小型 PLC 就够了关键要求是输入支持沿中断或者扫描周期小于 10ms——因为板子通过传感器的速度很快扫描周期太长会丢掉信号。IO 分配建议如下PLC 地址信号名方向说明DI0Upstream_Board_Present输入上游「板到位」来自贴片机DI1Downstream_Busy输入本机内部缓存满或者其他禁止接板的条件DO0Accept_To_Upstream输出给上游的「可接收」DO1Block_To_Downstream输出给后道设备的「板到位」如果需要转发一般我会加一个运行模式选择开关自动模式下按状态机跑手动模式下强制输出用来单台设备调试传送带。这个开关在联机调试阶段非常有用等协议跑通之后再拨回自动。3.2 结构化文本程序沿检测与三态状态机下面用结构化文本ST写一个缓存机与贴片机之间的 SMEMA 握手程序框架。这个程序不是某个品牌专用移植到西门子、倍福、Codesys 平台时只需要改变量声明方式。// 变量声明 VAR // 输入信号 di_upstream_board_present : BOOL; // 上游板到位 di_downstream_busy : BOOL; // 本机内部忙 di_reset_fault : BOOL; // 故障复位按钮 // 输出信号 do_accept_to_upstream : BOOL; // 给上游的可接收信号 do_block_to_downstream : BOOL; // 给下游的板到位信号 // 内部变量 state : INT; // 状态机当前状态 rtrig_upstream : R_TRIG; // 上游板到位上升沿 ftrig_upstream : F_TRIG; // 上游板到位下降沿 ton_debounce : TON; // 输入防抖定时器 ton_hold_release : TON; // 信号释放保持定时器 ton_backlight : TON; // 超时报警定时器 fault_flag : BOOL; // 故障标志 END_VAR // 主程序 rtrig_upstream(CLK : di_upstream_board_present); ftrig_upstream(CLK : di_upstream_board_present); // 输入防抖抖动超过 50ms 才认为是有效信号 IF di_upstream_board_present THEN ton_debounce(IN : TRUE, PT : T#50MS); ELSE ton_debounce(IN : FALSE); END_IF CASE state OF 0: // IDLE 空闲状态 do_accept_to_upstream : FALSE; do_block_to_downstream : FALSE; // 上游板到位稳定为高且本机不忙才进入待接板状态 IF ton_debounce.Q AND NOT di_downstream_busy THEN state : 10; END_IF 10: // READY 可接收状态 // 拉高给上游的可接收信号允许送板 do_accept_to_upstream : TRUE; // 板到位信号持续为高则检测板子是否进入本机 IF rtrig_upstream.Q THEN state : 20; END_IF // 若板到位信号过早消失说明板子被拉回或异常回到空闲 IF ftrig_upstream.Q THEN state : 0; END_IF 20: // ENTERING 板子进入状态 // 保持可接收信号等待板子完全通过上游传感器 do_accept_to_upstream : TRUE; ton_hold_release(IN : NOT di_upstream_board_present, PT : T#300MS); IF ton_hold_release.Q THEN state : 30; END_IF // 超时保护进入状态 5s 后仍未结束置故障 ton_backlight(IN : TRUE, PT : T#5S); IF ton_backlight.Q THEN fault_flag : TRUE; state : 90; END_IF 30: // INSIDE 板子已在本机 do_accept_to_upstream : FALSE; // 本机处理完成后转发给下游 do_block_to_downstream : TRUE; state : 40; 40: // TRANSFER 向前传递 // 等下游回复可接收示例中简化延时模拟下游发送 ton_hold_release(IN : TRUE, PT : T#500MS); IF ton_hold_release.Q THEN do_block_to_downstream : FALSE; state : 0; END_IF 90: // FAULT 故障状态 do_accept_to_upstream : FALSE; do_block_to_downstream : FALSE; IF di_reset_fault THEN fault_flag : FALSE; state : 0; END_IF END_CASE这段程序的逻辑说明状态 0 是空闲只有上游板到位信号稳定超过 50ms 且本机不忙才进入可接收状态状态 10 拉高「可接收」同时用沿检测判断板子是否已经开始进入本机状态 20 是关键的保持阶段板子头部已经进机器、但尾部还没完全离开上游传感器时必须保持「可接收」为高直到上游的板到位信号消失再保持 300ms确保板子完全落入本机传送带。最后的状态 90 是超时保护防止传感器故障或板子卡住时产线一直停在那里。参数说明防抖时间 50ms 适合常规光电传感器如果现场用对射传感器响应快可以缩到 30ms如果用的是超声波或电容传感器建议放到 100ms。保持时间 300ms 取决于传送带速度和板长计算公式是「板长 传感器间距」除以带速现场调的时候用秒表实测一下更稳妥。3.3 必调参数防抖时间、保持时间、超时阈值的经验值防抖时间上面说过这里再给一组默认值NPN/PNP 传感器输出延时小于 1ms 的光电式防抖 3050ms机械式限位开关防抖 100150ms模拟量转换的数字输出防抖 200ms 以上。防抖过大带来的副作用是联机响应变慢上下游节拍紧的时候会让产线吞吐下降一点点所以不要为了省事把防抖统一设成 300ms。保持时间要按最短板子来算。比如带速 1.5m/s传感器间间距 200mm最短板长 50mm那么50200/1500 ≈ 167ms我一般留 1.5 倍余量设 300ms。注意这里不是越长越好保持时间过长会导致下游早已接住板子但「可接收」还没撤掉上游如果正好有下一块板就会继续送板造成两块板间距过近。超时阈值主要保护异常状态进入状态 20 后 5 秒没有完成基本可以判断为卡板状态 40 等待下游 10 秒没有回复说明下游故障或没加电。这些阈值建议单独放到一个参数区现场调试时用触摸屏改不要写进程序里硬编码。4. 新旧设备混接与协议变体三线、双向与空闲电平4.1 三线握手老设备的确认线是怎么用的早期产线上有一种三线制 SMEMA 变体除了 24V 和 COM只有一条「板到位」信号线没有独立的「可接收」线。下游设备检测到板到位为高后直接启动传送带把板拉进来——这本质上是用传送带自身来回答「我收到了」。这种方案的隐患是下游还在忙的时候上游送板过来只能靠机械挡板硬顶顶多了就会伤板边。遇到这种老设备我一般不给它改内部程序而是在中间加一个中转 PLC 或继电器逻辑把老设备的三线信号转换成标准四线握手。具体做法是老设备输出的「板到位」接到中转模块的输入中转模块判断下游空闲后才向上游回「可接收」。下游喂给老设备的信号同样做转发。这样老设备的时序短板被外部逻辑补上了不需要动它原厂程序出问题也好回滚。4.2 双向传输与空闲电平常通还是常断是坑点另一类容易踩坑的是双向传输线体比如可以正反转的缓存机。SMEMA 标准在物理层上定义了「板到位」和「可接收」两个方向但没规定双向同时存在时如何处理。很多双向设备会复用一条信号线作为「可接收」输出和「板到位」输入通过设备内程序判断当前传送方向来做切换。这时最容易出现的问题是空闲电平不一致。设备 A 空闲时把「板到位」信号拉低设备 B 空闲时把「可接收」信号拉高。对接后A 认为没有板B 认为 A 一直在请求送板。正规的 SMEMA 空闲电平约定是信号为低电平代表无效但不少国产设备为了检测线路断路会把空闲信号拉高一但断线也能报故障。两种哲学撞在一起就必须在对接处做电平取反。我跑产线时有个习惯第一步不急着接信号线先把万用表打在直流电压档分别测量两台设备空闲时各信号端对 COM 的电压记录成一张表。哪条线空闲是高、哪条是低一目了然。匹配好电平再接线能省下后面一整天的排查时间。4.3 长短节拍适配缓存位解决不了时序信号保持才解决上下游设备的处理节拍不同步时工程师第一反应是加缓存工位。缓存工位确实能拉平均吞吐波动但缓存满后的背压问题仍然要回到 SMEMA 时序来解决。典型场景是贴片机节拍 20 秒一块回流焊连续进板每块间隔 10 秒中间缓存机很快堆满之后回流焊每 10 秒向缓存机要一块板缓存机却需要等待贴片机 20 秒才能供给。在这种情况下缓存机不应该简单地把贴片机信号的上升沿继续向后传而应该缓存本机有板这个状态并在后道请求时再拉高「板到位」。换句话说Bukfer 是对状态做缓存不是对信号做缓存。程序上就两行把「缓存工位有空」纳入「可接收」的条件里把「缓存有板」作为向后道设备发「板到位」的条件。这样上下游的快慢节奏被缓存机的状态分隔开板子间距由缓存机决定而不是由贴片机决定。这里也解释了为什么直接复制前面那段状态机用到一进多出或多进一出的设备上会出问题状态机需要为每个通道单独维护一组状态变量包括每个通道自己的上游板到位、给上游的可接收、以及通道互斥的仲裁逻辑。别偷懒用一组全局变量否则两条线同时来板时会互相覆盖信号。5. 联机调试避坑5 个把停线原因从「信号线」转成「设备」的排查记录5.1 上电即报警NPN/PNP 混接导致常发信号现象上游和下游一上电PLC 的 SMEMA 输入指示灯就常亮下游还没动作上游就开始送板。原因端子排上的信号线把 24V 接到了 PLC 的漏型输入点上。PLC 输入模块是 PNP 型信号为高电平有效而设备输出是 NPN 型导通时把信号线拉到 COMPLC 检测到的是低电平。此时如果信号线悬空PLC 读取到输入点被上拉电阻拉高误认为信号有效。解决用万用表测信号线对 COM 电压。悬空时如果量到 24V说明是 PNP 输入特性需要把对端设备改成 NPN 或加继电器转接。我不建议在端子排上直接把信号线对 COM 短接来找逻辑那是拿设备 IO 口冒险。规范做法是确认两端 IO 类型后选配中间继电器NPN 输出驱动继电器线圈继电器触点接 PNP 输入——电气隔离的同时还能吸收一部分浪涌。5.2 下游一直不给允许PLC 沿检测写法错误现象上游板到位信号正常拉高PLC 输入指示灯亮但 DO 输出可接收信号始终不动作。原因程序里用的是上升沿触发R_TRIG但信号在上电前就已经是高电平。PLC 上电后第一次扫描时沿检测只记录初始值不产生上升沿。结果信号已经在那里了程序还在等一个永远不会来的沿。这是 PLC 联机程序最常见的翻车点之一。解决SMEMA 信号检测不要用沿触发要用电平保持 防抖。程序逻辑应该写成信号为高持续 50ms就认为是有效。沿检测只用于「板子开始进入本机」这种瞬间事件不要用于「是否有板」这种状态判断。代码里把 rtrig_upstream 用于状态切换把 ton_debounce 用于信号有效性判断两者职责不同。5.3 信号抖动双送板防抖时间设短了现象同一块板在进入下游时下游收到两个「板到位」脉冲导致二次送板板子间距突然变短。原因传感器检测到板的反光边缘时输出会有几十毫秒的抖动尤其是漫反射光电传感器。防抖时间设成 10ms 根本滤不掉PLC 把同一个板子的前后沿当成了两块板。另外传送带滚轮跳动也会让传感器瞬时脱离检测。解决先把防抖时间设到 100ms观察传送带上板子经过时信号波形是否只有一个高电平区间。如果还有毛刺用示波器测传感器输出确认毛刺宽度再定防抖时间。不要盲目加到 500ms否则节拍快的时候板子已经在下游处理了「板到位」还在防抖计时响应延时会吃掉产线的效率。5.4 回流焊出口误报共地干扰把光耦打穿现象回流焊出口接缓存机正常生产几小时后偶发误报「有板」但实际缓存机里是空的。检查程序逻辑、传感器都没问题重启后又正常。原因回流焊内部有加热器和大功率马达地线上干扰很大。缓存机与回流焊共用了同一个 24V 电源回流焊的加热器通断瞬间在地线上产生几十伏的尖峰灌进光耦初级后导致次级误触发。如果光耦隔离能力不足或根本没有光耦直接硬件连线故障频率会更高。解决用独立 24V 电源给 SMEMA 接口板供电信号线过光耦模块再进 PLC。屏蔽层单端接地并将接地线接到真正的接地铜排不要接到设备外壳。另外在两台设备之间加一个 TVS 二极管把电压尖峰钳在 33V 以下成本几块钱能保护后级模块不被击穿。5.5 半板不上料传感器布点超出板长别赖协议现象小于 100mm 的短板上不了料上游明明有板下游就是不回可接收。检查程序、信号、电压全正常。原因上游设备的到位传感器安装位置距离边缘太远短板长度不足以同时触发两个传感器。SMEMA 协议只规定信号接口不规定传感器怎么布点这块属于机械安装问题。短板在传送带上只触发了一个传感器PLC 认为板没有到位自然不会发信号。解决调整传感器安装位置或增加传感器数量。常见做法是在传送带中段增加一个对射传感器把「到位」判断改成「两个传感器任意一个触发即视为有板」。注意这样的话长板经过时会同时触发两个传感器程序里要加去重逻辑否则又会回到 5.3 的双送板问题。我在现场通常会加一个定时窗口传感器触发后超过 2 秒仍为高认为是一块长板否则按短板处理。6. 不靠玄学用空跑计时与状态日志验证联机质量6.1 空跑计时法测三种节拍的握手时长联机调通只是开始联机质量要用数据说话。我会在产线空跑时测三种节拍的握手时长连续送板、满缓存后送板、下游处理中送板。每种节拍跑 20 次记录从上游发「板到位」到下游回「可接收」的间隔。正常值通常在 50300ms。如果超过 500ms说明下游 PLC 扫描周期长或程序里防抖时间过大如果小于 10ms反而要怀疑信号是不是被旁路了——有的工程师会把可接收信号强制为常通表面看产能最高但实际上下游没有余量任何扰动都会叠板。我见过一条线这样跑了三年没出事直到换了一种板子边角毛刺稍大就卡在了下游入口。6.2 状态日志脚本从 PLC 导 CSV 数握手异常PLC 里加一段记录代码把每次状态变化的时间戳和状态编号追加到 CSV。采样周期不需要太高10ms 足够关键是时间戳要有可靠的时钟。下面用 Python 分析 CSV看异常的分布。import csv from collections import Counter def load_log(path): records [] with open(path, newline, encodingutf-8) as f: reader csv.DictReader(f) for row in reader: records.append(row) return records def analyze_handshake(records): # 统计各状态停留时长 durations [] prev_ts None prev_state None for r in records: ts float(r[timestamp_ms]) state int(r[state]) if prev_ts is not None: durations.append((prev_state, ts - prev_ts)) prev_ts ts prev_state state # 按状态汇总平均停留时长 state_stats Counter() state_total Counter() for state, dur in durations: state_total[state] dur state_stats[state] 1 print(状态 10可接收平均保持时间: %.1f ms % (state_total.get(10, 0) / max(1, state_stats.get(10, 0)))) print(状态 90故障出现次数:, state_stats.get(90, 0)) if __name__ __main__: analyze_handshake(load_log(smema_log.csv))这个脚本只做两件事读 CSV 状态序列按状态累计停留时间并计算平均值。如果状态 90 出现次数不为 0说明联机过程中发生过超时保护这比任何「看着好像正常」都可靠。进一步的判断是看状态 10 的保持时间是否稳定标准差大说明信号防抖参数在跟着传感器抖动走需要回现场调传感头位置。6.3 验证阈值什么样算联机合格我给自己定的联机验收标准参考如下连续送板 100 次故障状态出现 0 次状态保持时间波动小于 20%线体启停 10 次每次启动后第一个握手周期不超过 1 秒。达到这三条这套 SMEMA 联机才算真正合格可以放产线去跑量。如果连续 100 次都没有问题但偶尔出现一次莫名奇妙的停线不要直接去改程序。我的习惯是先在 PLC 里加一个掉电记忆的故障缓冲记录停线瞬间所有 IO 的状态快照然后让线继续跑。等下次故障复现时翻快照往往比盲调高效得多——之前有一台回流焊出口的间歇性误报就是靠快照发现出问题前 300ms 有一段 5V 的电压跌落才追到电源模块电容老化上。这些验证工具不复杂但现场大多数情况并不缺工具缺的是把协议当成有时序约束的接口去对待。SMEMA 不是接两根线那么简单状态机、防抖、保持时间、超时保护这四样都到位了线体才能扛得住生产节拍的冲击。希望这些踩过坑的经验能帮你少走几步弯路。本文还有配套的精品资源点击获取