简介:面向表面贴装与自动化产线集成场景的SMEMA协议详解文档,适合设备调试、产线运维与系统集成工程师查阅,用于解决不同厂商设备之间信号对接与板卡传输联动的实际问题。全包仅含1个PDF文件,约737KB,篇幅紧凑,以图文页面的形式依次梳理协议要点:电气硬件接口部分说明顶部2910±10mm与底部450mm传送带的公母连接器安装位置及Pin1~4的接线用法;软件控制逻辑给出上游有板可发、下游就绪可收的板卡转移条件;传感器章节围绕出口、入口与中间传感器展开,讲清T3、T4状态监测以及中间传感器缓存单板、避免板与板挤压的防撞机制;末尾归纳兼容性、可靠性与扩展性三方面优势。对需要现场核对接口定义或编写联机控制逻辑的读者,可作为对照手册使用。目前已有1217人学习。
1. 四根线撑起一条产线:SMEMA 协议真正在回答的两个问题
第一次拆开两台自动化设备之间的连接线,很多人会愣一下:整条产线上最贵的两台机器,彼此之间居然只靠四根线说话。没有以太网、没有报文头、没有序列号,甚至连“我是谁”都不用报。这就是 SMEMA 协议最反直觉的地方——它不传输数据,它只传递两个布尔状态:我这儿有板要发,和我这儿能接。所有关于节拍、缓冲、防撞、堵板的复杂行为,都是从这两个状态里长出来的。
值得把它搞懂的原因很实际:现场八成“设备对接不上”的问题,最后查出来不是机械精度不够,也不是 PLC 程序写错,而是对这两句话的理解出了偏差——有人把“能接”接成了常通,有人把“有板”当成了电平而不是边沿,有人给一条传送带装了两个暂存位。这类问题不会报错,只会偶发停线,是最难查的一类黑匣子。
2. 机械与电气基准:2910 mm、450 mm 和四根针脚为什么被写死
2.1 2910 mm 与 ±10 mm:公差不是留给加工的,是留给两次装配误差叠加的
这份资料给出的机械基准很具体:顶部传送带的定位尺寸是 2910 mm,公差 ±10 mm;底部传送带是 450 mm。数字本身不重要,重要的是那个 ±10 mm 出现在哪里、为什么是它。
设备对接时,板子要从 A 机的导轨末端滑到 B 机的导轨起点,中间必然有一条物理缝隙。这条缝隙两侧的传送面如果不等高,板的前缘就会顶在对方的侧板上,或者前缘悬空、重心一过缝就往下掉。而两台设备是各自独立装配、各自调水平的,任何一台的装配误差都会独立贡献到这条缝上。±10 mm 不是给单台设备的加工余量,是给“两台设备的误差同时朝最坏方向叠加”留的余量。
所以现场调机时有个血泪经验:不要拿自己机器的基准面去量对方的传送面,要拿同一个第三方基准(比如共同的车间地面基准点或者一根长直尺)去比对两侧。用各自的基准去量,量出来永远是“我这边是准的”,然后板照掉不误。这个坑在双层线体上还会翻倍——上下两层传送面各自要满足同一套公差,任何一层超差,那一层的板就会卡。
2.2 连接器装背面:一个被低估的走线决策
资料里专门提了一句“建议把连接器安装在机器的背面”。这句话看起来像安装说明,其实是一条设计约束。
产线的正面是操作面:上料、下料、人工干预、屏幕操作、维护通道,全在这一侧。如果把设备间的信号连接器装在正面,线缆会横穿操作区,一方面挡人,一方面在人工处理卡板时极易被扯脱。而被扯脱的后果比想象中严重:握手信号一断,下游会认为上游“没板”,上游会认为下游“不能接”,整段线同时进入等待态,表现出来就是“莫名其妙全线停住,复位又好了”。
装在背面还有一个隐性好处:设备间线缆的走向会和气路、电源线走在同一侧,便于做成一条集中的线束,后期排查时一眼能找到那四根信号线在哪。这一点在设备密集、背后空间只有几十厘米的产线上,价值远超它表面的“整洁”。
2.3 公母连接器与 Pin1~4:为什么线缆两头常常是同性别的
资料里同时出现了公连接器(Male Connector)和母连接器(Female Connector)两种,并且明确 Pin1、2、3、4 是被使用的,同时标注了“不需要 failed board available”。把这几条拼起来,能还原出这个接口的真实形态。
| 引脚 | 常见用途 | 信号方向 | 是否必需 |
|---|---|---|---|
| Pin 1 | 板可用(Board Available) | 上游 → 下游 | 必需 |
| Pin 2 | 机器准备好接收(Machine Ready) | 下游 → 上游 | 必需 |
| Pin 3 | 坏板旁路 / 备用 | 视实现而定 | 资料明确可不接 |
| Pin 4 | 公共参考(信号地) | 双向共地 | 必需 |
提示:上表是行业里常见的接法归纳,具体针脚定义以对接设备的接口手册为准,两边不一致时以“谁是信号发出方”为准逐根核对。
为什么现场见到的对接线缆经常两头都是公头?因为按照标准建议,设备侧统一装母座(固定在机背,不怕碰、不怕积尘),那么连接两台设备的线缆就必然两端都是公头,内部再做交叉——A 机的 Pin1 出,接到 B 机的 Pin1 入;B 机的 Pin2 出,接到 A 机的 Pin2 入。做成同性别线缆而不是一公一母,还顺带解决了一个问题:线缆是易损件,同性别的线缆不区分方向,仓库里备一种就行,插反了也不会烧——因为四根线里只有一根是地,接错顶多是不工作,不会短路。
至于“不需要 failed board available”,这句话的工程含义比它看起来重。它意味着这套接口不承载“这块板是坏的”这个语义。坏板要靠别的环节拦:要么在软件里记录、由控制系统在分流工位剔除,要么靠人工。如果你指望握手信号帮你把坏板挡在下游之外,那从一开始就用错了这套协议。
3. 握手时序:上游“有板可发”和下游“准备好接”是怎么变成一次真实转移的
3.1 两个布尔量构成的四态状态机
资料把转移条件写得很干脆:上游机器有板可发,下游机器准备好接收。两个条件同时成立,板才动。反过来,任何一个条件撤销,板就不该继续动——但“不该继续动”和“立刻停”是两件事,这是后面要展开的关键。
把这两个布尔量展开,其实是四个状态:都没有(空闲)、只有上游有板(等待下游)、只有下游能收(等待来板)、两者都有(转移中)。看起来简单,但它没有队列语义——它不能表达“我还有第二块板在后面排队”,也不能表达“我这边能存两块”。这个表达能力的天花板,直接决定了第 4 章中间传感器为什么只能有一个。
下面这段是上游侧一个最小可用的握手实现,去掉所有业务逻辑,只保留状态迁移:
class UpstreamHandshake: def __init__(self): self.board_available = False # Pin1:输出给下游,我有板 self.machine_ready_in = False # Pin2:从下游读入,你能收 self.board_at_outlet = False # 出口传感器:板确实到了出口位 self.transferring = False def tick(self, dt_ms): # 只有板真的压在出口传感器上,才对外宣称"我有板" if self.board_at_outlet and not self.transferring: self.board_available = True # 两个条件同时成立才启动皮带,缺一不动 if self.board_available and self.machine_ready_in and not self.transferring: self.belt_run() self.transferring = True # 关键:下游撤回 ready 时不立刻刹车,等板尾离开出口传感器再收尾 if self.transferring and not self.board_at_outlet: self.board_available = False self.transferring = False self.belt_stop()这段代码里最容易被改错的是最后那个判断。很多现场翻车的版本写成了“下游 ready 一消失就 belt_stop()”,逻辑上没错,物理上灾难:板刚过一半缝,下游因为自己内部某个工位短暂忙了一下把 ready 撤了,上游立刻刹车,板就停在两机之间的缝上。下一次 ready 回来,皮带再启动,板以一个不可控的初速度继续走,位置全乱。正确的做法是:ready 只在“启动那一刻”被采样,一旦启动,必须走完一个完整的传输动作,直到出口传感器确认板尾离开。
3.2 T3 与 T4:传感器被用来量时间,不是量位置
资料里有一句话信息量很大:出口传感器和入口传感器一起,用于检查 T3 和 T4 状态。注意这个措辞——传感器在这里的角色不是“检测板在不在”,而是“检测某一段时间有没有超出预期”。
这是工业握手协议里一个很朴素的诊断思路:板从上游出口传感器触发,到下游入口传感器触发,中间经过的那段时间就是 T3;板从进入下游到离开下游出口,是 T4。这两段时间在正常节拍下是稳定的,一旦某块板花的时间明显变长,说明它卡住了;明显变短,说明它是被“甩”过去的,或者传感器误触发。资料里没有给出 T3、T4 的具体毫秒数,这很正常——它们取决于传送带速度、板长、两机间距,是每一条线自己标定的,不是一个可以写死在标准里的常数。
真正的价值在于:这两个时间窗把“板丢了”这种模糊故障,变成了“哪一段超时”这种可定位故障。是上游迟迟不启动,还是板在缝里卡住,还是下游收了板但没送出去,从 T3、T4 的异常方向就能直接判断。这也是为什么标准要求入口和出口两个传感器都必须有——只装一个,你只知道板“来过”,不知道它“什么时候走的”。
3.3 为什么握手信号不用脉冲而用电平
一个常见的实现问题是:这四根线为什么不设计成发一个脉冲表示“有板”,而是维持一个电平?
因为脉冲要求收发双方有共同的时钟基准和边沿检测能力,而电平只要求对方能读高低。在跨厂商、跨年代、跨控制平台的场景下,这是巨大的差别:一边是十年前的继电器逻辑,一边是新写的软 PLC,它们唯一能达成共识的就是“这根线上现在是高还是低”。电平还有自恢复能力——线缆瞬断一下,电平回来之后状态自动恢复正确;脉冲丢了就是丢了,得靠重传机制,而重传机制又需要报文和序号,那就不是四根线能解决的事了。
代价也很明显:电平方案无法区分“一次”和“一直”。上游把“有板”拉高之后一直保持,下游无法知道这中间板是不是换了一块。所以这套协议隐含了一个前提——同一时刻,一个传输方向上只有一块板在流转。这个前提如果不成立,整套语义就崩了。
4. 传感器布局:入口、出口、中间三个位置各自守住哪条边界
4.1 入口与出口:一个管“进来了”,一个管“出去了”
入口传感器和出口传感器分别装在设备的进料端和出料端,它们守住的是这台设备的物理边界。入口传感器触发,表示板已经完整进入本机,可以开始本机的工作(测试、贴装、组装);出口传感器触发,表示板已经到达出口位,可以对外宣称“我有板可发”。
这里有个容易忽略的细节:传感器的安装位置决定了它测的是“板头”还是“板尾”。如果传感器装在导轨内侧偏里,它可能在板头刚到时就被触发,此时板尾还在上一台机器里——这时候如果对外发“我有板”,下游一给 ready,皮带一动,板就会被从上一台机器里硬拽出来。所以出口传感器一般要装在能确认整块板都在本机内的位置,或者至少在控制逻辑里加一个“板头触发后再延时/计数”的确认。
资料里用“板开始移出”“板正在移出”这样的描述,其实就是在强调这个动作是分阶段被观测的:启动 → 移动 → 完全离开,每个阶段对应不同的传感器状态。把这三个阶段压成一个“板在不在”的布尔量,是很多自制控制程序出问题的起点。
4.2 中间传感器:为什么一条传送带只能有一个
中间传感器的逻辑,资料写得很明确:当下游没有发出“准备好接收”的信号时,用它把板停下来,暂存在这段传送带上,防止板与板之间相撞。紧接着又补了一句关键约束——一条传送带上只用一个中间传感器,保证一条传送带只能存一块板,避免底层传送带上的板互相挤压。
这个“只能一个”不是省钱,是协议表达能力决定的。前面说过,SMEMA 只有两个布尔量,它没有队列语义。如果一条传送带上设两个暂存位,控制程序就必须回答“现在第一块板在 A 位还是 B 位”“下游放行时该放哪一块”这类问题,而这些问题的答案无法通过四根线传达给邻居设备。邻居只知道“你能收”,它不知道你手里有几块板、正要放第几块。一旦双方的内部计数出现偏差,就会出现同时放两块板、或者一块板被永久压住的情况。
所以用一个中间传感器,本质是把“缓冲”这个功能压缩成一个最多存一块的寄存器:有板或者没板,二选一,和协议的表达能力严格对齐。这是一种很典型的工程妥协——用硬件的物理约束,去弥补协议的语义缺失。
def buffer_logic(inlet, middle, outlet, downstream_ready): # 中间位有板、下游没准备好:停在中间传感器上,形成单板缓冲 if middle and not downstream_ready: belt.stop() return "BUFFER_HOLD" # 中间位有板、下游已准备好:放行,直到板尾离开中间位 if middle and downstream_ready: belt.run() return "RELEASE" # 中间位空:正常随流,不干预 return "FLOW"这段逻辑只有三个分支,但它隐含了“一块板”的守恒:进入 BUFFER_HOLD 时皮带停、板压住传感器;只有下游 ready 才进 RELEASE。如果这条线上有两个中间传感器,这段代码就得改成带索引的数组,而索引状态无法同步给对方设备——这就是问题所在。注意downstream_ready只在判断时被采样,一旦进入 RELEASE,不应该因为 ready 抖动而回退到 HOLD,否则板会在两个状态之间反复起停。
4.3 堵板、连板与“一块板”的守恒
把三个传感器的位置关系画在脑子里:入口在进料侧,出口在出料侧,中间在两者之间偏下游的位置。板从入口进来,经过中间位,最后从出口出去。整条传送带上任何时刻最多只有一块板处于“被本机持有”的状态,这就是守恒条件。
破坏这个守恒的典型场景是“连板”:上游的出口传感器装得太靠内,前一块板还没完全离开,后一块板已经压上来了,上游就认为“我有板”,于是又发了一次。下游收到 ready 之后一启动,两块板几乎同时进入,中间传感器只能压住其中一块,另一块继续往前撞。表现出来就是板面划伤、板边崩缺,严重的会卡死皮带。
另一个场景是“堵板”:下游迟迟不给 ready,中间位已经存了一块,上游不知道,继续往这边送。这时候如果没有中间传感器的停板逻辑,板会一块顶一块地叠在传送带上,最后整段堵死。中间传感器在这里起的作用,是把“下游不收”这个信息,通过物理停板的方式,反向传导给上游的出口传感器——板停在中间位不动,上游出口传感器就不会清空,“有板可发”就一直保持,上游自然也就不再送新的。这是一个完全靠硬件完成的背压机制,不需要任何额外的通信。
5. 避坑与排查:那几类“看起来像机械故障”的对接失败
5.1 电气与接线类:信号明明通了,逻辑就是不对
现象一:下游设备空着,上游死活不发板。原因通常出在“机器准备好”这根线的电气形态上。有的设备输出的是干接点(无源触点),有的输出的是 24V 有源电平,还有的是 PNP/NPN 三极管输出。如果上游按有源信号去读一个干接点,读到的是浮空,永远判定为“不能收”;反过来,如果上游按干接点去读一个 24V 有源输出,可能会把输入光耦打穿,或者读到常高。解决方式很朴素:断电,用万用表量两端在静止态和 ready 态下的电压,确认是“通断变化”还是“高低电平变化”,再决定中间加不加继电器隔离。
现象二:板偶尔丢,日志里两个信号同时有效。这类问题多半是共地不良或者线缆太长。四根线里的公共参考一旦虚接,信号电平就会随负载漂移,读到的“高”可能刚好在阈值附近,采样时有时无。加上变频器、伺服驱动器在旁边,干扰会更明显。解决顺序是:先确认 Pin4 两端确实导通(电阻接近 0),再把信号线换成屏蔽双绞并单端接地,最后把控制器的采样周期压到毫秒级并加去抖计数。不要一上来就改程序逻辑,先排除物理层。
现象三:线缆被扯脱后复位,全线不动。前面提过,连接器装在操作面是根源。已经装错了的,补救办法是在线缆两端加固定卡扣,并且把线缆走向改到设备背面绕行。更彻底的做法是在程序里加一个“握手信号持续无效超过 N 秒”的报警,让操作员第一时间知道是信号断了,而不是去查机械。
5.2 时序与传感器类:动作都对,节拍就是不稳
现象四:板停在两机之间的缝上,下次启动位置全乱。这就是 3.1 里说的那个坑:下游 ready 短暂撤销时,上游立刻刹车。解决方式是把“允许启动”和“允许停止”拆成两个不同的条件——启动要求 ready 有效,停止只要求“板尾已离开出口传感器”。换句话说,一次传输动作一旦开始就是原子的,中途不接受打断。
现象五:中间位存了两块板,撞在一起。要么是中间传感器装了两个,要么是传感器位置太靠上游,导致板还没完全到中间位就触发了停板,第二块板跟上来时前一块还没停稳。解决:一条传送带只保留一个中间传感器,位置放在进出料之间的中点偏下游,并且用板尾触发而不是板头触发来判断“板已到位”。
注意:以上五类问题的共同点是“不会报错”。SMEMA 协议本身没有任何错误码、没有诊断报文,它只会表现为“不动”或“乱动”。所以现场排查的第一原则永远是:先量线,再看时序,最后才改程序。
6. 取舍与验证:为什么 SMEMA 宁可“表达力弱”也不肯多说一句话
把这套协议的设计摊开看,它的取舍其实非常克制:不表达板的内容、不表达队列深度、不做设备寻址、不做错误上报,甚至连“坏板”都不在信号里。它只保留了两个布尔量和一条公共地。
这不是技术能力的限制,而是兼容性的下限。一条产线上可能同时存在继电器逻辑的老设备、软 PLC 的中生代设备、以及新写的运动控制器。任何需要“约定数据结构”的方案,都会在异厂对接时崩掉——因为一旦涉及数据,就要约定字节序、报文格式、超时重传、版本兼容,而这些东西没有一个是四根线能承载的。布尔电平是所有控制平台的最小公共子集,选它,等于选择了“谁都能接”。
代价同样清晰:表达能力弱,多板缓冲只能靠硬件上的中间传感器硬扛,且一条传送带只能存一块;坏板旁路要么用掉 Pin3,要么干脆放弃,靠下游工位剔除;没有诊断信息,故障定位全靠 T3、T4 这样的时间窗和现场经验。这些代价在今天看是明显的,但在需要跨厂商互换设备的场景里,仍然是更划算的那一边。
验证方法我自己常用一套最小回路:两台设备之间只接一根四芯线,中间串一个能手动拨高低电平的小盒子,代替邻居设备发“准备好”。拨到高,看上游是否启动;拨到低,看板是否停在中间位;在板移动过程中快速拨低再拨高,看上游是否会中途刹车。这三步能验出八成以上的时序实现问题,比在现场等偶发故障高效得多。
从那以后我每次对接新设备,都强制先做这三个动作再谈联调,宁可多花半小时拨那个小盒子,也不愿意在量产线上等一次“偶发停线”。希望帮到你。
本文还有配套的精品资源,点击获取