随便在工控群里一搜FactoryIO,十个人里有九个都在问怎么把几条输送线安全地汇到一起。说实话,这个题目看着简单,就是个“合流”嘛,但真正用梯形图往上写的时候,一堆人卡在互锁、放行时序、物料追尾这些问题上。今天我把这套输送线汇流仿真实验程序的完整思路拆开讲,从场景配置到每一段梯形图的写法,再到调试时踩过的坑,一次性说清楚。
这个程序的核心逻辑并不复杂,难的是把“逻辑清晰”“注释详细”“通俗易懂”这三点同时做到。我用的是最简单的梯形图写法,没有跳转满天飞,也没有一堆让人看不懂的中间地址,全程就靠几个内部继电器加定时器把汇流动作梳理得明明白白。不管是刚接触PLC的在校学生,还是在工厂里想快速验证工艺逻辑的电气工程师,这套思路都值得参考。
1. 项目概述与场景分析
1.1 FactoryIO是什么,为什么要用它做输送线汇流实验
FactoryIO是一款工业自动化仿真软件,里面内置了大量贴近真实产线的3D场景,比如传送带分拣、机械手搬运、AGV调度、立体仓库,当然也包括我们今天要说的输送线汇流。它的价值在于:你不需要真的搭一条皮带线、装一堆传感器、接一个PLC,就能在电脑上把完整的控制逻辑跑通。对你没看错,是用软件去虚拟调试。
在实际教学和项目预研里,FactoryIO特别适合干一件事——验证程序逻辑。我见过太多人直接在真机上调试,传感器还没装好,程序先写了一堆,结果一上电就撞机,现场噼里啪啦响,领导在旁边看着,那叫一个尴尬。所以用仿真软件先把逻辑吃透,再上真机,这是成熟工程师的做法,也是FactoryIO最核心的用途。
具体到输送线汇流这个场景,它模拟的是两条(或多条)进料输送带向同一条主输送带合流的过程。别小看这个工艺,它是所有物料搬运系统里的基础单元。饮料灌装线、快递分拣线、汽车焊装线的零部件配送,本质都是这个逻辑的变体。控制得好,产线流畅高效;控制不好,物料在汇流点打架、堵料、甚至掉落,生产线被迫停机,损失是连续的。
1.2 汇流场景的工艺需求与控制难点
先花两分钟把工艺捋清楚。整体布局通常是这样:A输送带从左侧送料,B输送带从右侧送料,两条线在中间位置汇入同一条主输送带,主输送带将物料统一送往下一工位。每条进料带靠近汇流点的位置装有一个光电传感器,用来检测物料是否到达等待区;汇流点后方的主带上也装有一个传感器,用来判断汇流区域是否已经被物料占用。
说白了,控制需求就三条:
- 当某条进料线有物料到达等待区,且汇流点空闲时,放行该物料进入主带。
- 当两条进料线同时有物料等待时,必须保证一次只放行一条线上的物料,不能让两个物料在汇流点撞车。
- 物料进入主带后,要与前一个物料保持安全间距,避免追尾。
听起来挺简单,但难点全藏在细节里。第一,传感器信号有响应时间,物料在皮带上有惯性,挡停装置释放后物料不会瞬间到汇流点,这个时间差如果处理不好,就会导致两条线的物料同时进入主带。第二,互锁不能只做在“放行”这一个动作上,还要考虑物料已经越过等待区、但还没完全离开传感器检测范围时的状态,否则程序会在一个物料还没走完的时候就重复放行,造成连锁堵塞。第三,也是最现实的问题,很多初学者写的梯形图能“跑通”,但只要物料间距稍微变一变,或者两条线的节拍同时到达峰值,程序就崩了。
1.3 程序整体设计原则:为什么“简单”反而更难写
在做这个程序之前,我给自己定了三条原则,也建议你写任何PLC程序之前都问一遍自己这三个问题。
第一,逻辑必须能跟着扫描周期走。PLC程序是循环扫描执行的,你在纸上画逻辑图的时候是一维的、理想化的,但实际运行是每几个毫秒重新扫描一遍所有触点状态。如果程序里到处是跳转、循环嵌套、复杂的中间标志,那你的程序在执行顺序上就很容易出问题。
第二,注释必须写到“别人看一行就懂一行”的程度。很多初学者有个坏习惯,程序写完不写注释,三个月后自己回头看都懵。梯形图本来就是给电气工程师看的,不是给编译器看的。一套注释清晰的程序,不仅是给别人看的,更是给未来的自己看的。这套程序里我坚持每条网络(Network)都写明“这段在干什么、为什么这么写、触发条件是什么”。
第三,能用基础指令解决的就不要上复杂指令。汇流这种场景,用常开常闭触点、线圈输出、置位复位、TON定时器,最多再加个上升沿指令,就能写得很漂亮。堆一堆功能块、数组、结构体,看起来高大上,但出了问题排查起来极其痛苦。简洁、可读、可靠,这三者才是工业程序的真正“高级”。
2. 硬件配置与I/O地址规划
2.1 FactoryIO场景搭建与通信配置
场景搭建这一步,很多人觉得“不就是拖几个传送带进去吗”,结果一上手就发现不是那么回事。FactoryIO里传送带的方向、位置、角度都需要精细调整。我用的汇流场景,是直接选了软件内置的汇流(Converging)相关场景模板,然后在此基础上微调了传送带长度和传感器位置。
如果你用的FactoryIO版本里没有现成的汇流场景,也可以自己搭。打开场景编辑器,选两条直线传送带(Conveyor),一条主传送带,把两条进料带的尾端对准主传送带的侧边,让它们的运动方向都指向主带。这里有一个非常关键的点:进料带与主带的夹角和位置决定了物料能否顺利交接。最常见的问题就是两条进料带和主带之间存在缝隙,物料过不去,卡在交接处,仿真里表现为物料原地抖动或者直接穿透。
通信配置方面,我用的是TIA Portal + S7-PLCSIM作为PLC仿真环境,通过FactoryIO的S7通讯驱动与虚拟PLC连接。具体操作是:在FactoryIO的“File”菜单里打开“Drivers”,选择Siemens S7,设置IP地址为PLCSIM实际使用的地址(通常默认就行),点击“Connect”。这里强烈建议先单独跑通一个最简单的启停程序验证通信,再开始写汇流逻辑。我第一做的时候,就是先写了“按一个按钮,主线启动”的程序,确认FactoryIO里的场景能被PLC信号驱动,然后再开始写正式的汇流程序。这一步能帮你把“通信问题”和“程序问题”隔离开,排查起来心里有底。
2.2 I/O地址映射与传感器布置
通信通了,接着就是I/O地址规划。这一步我放在写程序之前做,并且用一个表格把地址钉死,后续写梯形图时严格按表引用,绝不临时改地址。这是避免程序写到一半地址冲突的基础。
下面是我这个实验程序的I/O分配方案:
| 信号名称 | PLC地址 | 类型 | 说明 |
|---|---|---|---|
| A线启动按钮 | I0.0 | 数字量输入 | 按下后系统启动,A/B线同时运转 |
| 停止/复位按钮 | I0.1 | 数字量输入 | 按下后所有输出停止,并复位内部状态 |
| A线等待区光电传感器 | I0.2 | 数字量输入 | A线物料到达汇流前等待点时置1 |
| B线等待区光电传感器 | I0.3 | 数字量输入 | B线物料到达汇流前等待点时置1 |
| 汇流区占用传感器 | I0.4 | 数字量输入 | 主带上有物料经过汇流点时置1 |
| A线输送带电机 | Q0.0 | 数字量输出 | 控制A线皮带运转/停止 |
| B线输送带电机 | Q0.1 | 数字量输出 | 控制B线皮带运转/停止 |
| 主输送带电机 | Q0.2 | 数字量输出 | 主带常转,除非急停 |
注意看,A线和B线的“放行”我没有用单独的挡停气缸输出,而是直接通过控制对应输送带电机的启停来实现。这个方案在FactoryIO里最稳定,因为你不需要额外配置夹具装置。物料到等待区后,进料带停止,物料就停在传感器位置等待;汇流区允许放行时,再启动该进料带,物料就会被送往主带。
传感器布置有个要点:A线和B线的等待区传感器位置,不能离汇流点太近,也不能太远。太近,物料还没稳定停下来就触发,容易误判;太远,程序放行后要等很久物料才到汇流区,降低效率。我经过调参,把等待区传感器放在离汇流点约一个物料直径的位置,这样既能准确检测物料到位,又能在放行后较快进入主带。汇流区占用传感器就安装在主带上,位于两条进料带汇入点下游一点点,保证它检测到的“占用”覆盖整个汇流区域。
2.3 梯形图编程环境准备与任务分区
TIA Portal里新建项目时,CPU型号要和PLCSIM一致。我用的CPU 1214C DC/DC/DC,这个型号IO点数够用,指令也齐全。设置好IP地址后,在程序块里新建一个OB1(主组织块),所有逻辑都写在OB1里。我这个程序比较简单,不需要用OB100初始化或者OB35定时中断,全部在一个主循环里搞定,这也符合“简单清晰”的初衷。
写程序之前,我习惯先把任务分区列出来,相当于给程序画个地图。这套程序我分成了四个块,不是程序结构上的FC/FB,而是逻辑上的段落:
- 系统启停逻辑:处理启动、停止、复位动作,决定整个系统是否处于运行状态。
- A线放行逻辑:检测A线物料是否到位,判断汇流区是否空闲,决定A线皮带是否运转。
- B线放行逻辑:与A线完全对称,同时加入与A线之间的互锁。
- 状态指示与辅助逻辑:记录当前放行状态,防止重复放行,以及做一些边缘检测。
这样的分区方式,让我在写梯形图时思路很明确,每段程序完成一件事。工厂里经验丰富的电气工程师看到这种程序,一眼就知道这个作者是系统地想过问题的,而不是想到哪写到哪。
3. 梯形图核心逻辑设计与实操
3.1 系统启停与复位逻辑:所有动作的“总开关”
先看最常见的启停逻辑。我用一个内部继电器M0.0作为系统运行标志。启动按钮I0.0按下后,M0.0置位并自保持;停止/复位按钮I0.1按下后,M0.0复位,同时所有输出全部复位,所有内部状态标志全部清零。
这里要特别说明为什么用置位复位指令SP和RP,而不是用简单的线圈输出。如果用线圈输出,启动按钮和停止按钮要按常规自锁方式接成“启动回路”,这在逻辑上也行,但一旦系统里出现急停、故障复位等复杂情况,自锁回路很容易出现触点和线圈互相干扰的问题。用置位复位,逻辑关系更明确,后续做故障复位也更灵活。
梯形图的网络结构大致是这样:
- Network 1“系统启动”:常开触点I0.0(启动按钮)串联常闭触点I0.1(停止按钮)后,驱动置位线圈M0.0。意思就是按启动且没有按停止时,把运行标志置位。
- Network 2“停止复位”:常开触点I0.1直接驱动复位线圈M0.0。同时这个复位线圈还可以并联其他复位线圈,把Q0.0、Q0.1、Q0.2以及M0.1、M0.2等所有中间状态全部复位。
在编写复位逻辑时有一个容易忽略的细节:把“Q0.0、Q0.1、Q0.2全部复位”这一动作放在停止按钮这个网络里,还是单独用一个M0.1“急停中”标志?这两种思路都行。我最终选择的方式是直接复位所有输出和状态,不做急停标志,因为这个实验场景比较单一,不需要区分“急停”和“停止”两种状态。但如果你的场景里有多个工位,建议还是用一个内部继电器来表示“系统整体停机”,避免每次复位时到处都要改线圈。
另外,要特别提一下启动条件的互锁。我在这里用了一个常闭触点I0.1串联在启动回路里,这保证了只有没按停止按钮时启动才有效。这个设计在工厂里叫“安全原则”:任何状态下,停止按钮的优先级永远高于启动按钮。即使在程序运行中意外按到了启动,也不能把已经停止的系统重新拉起来,除非先复位再按启动,这样避免了误操作导致设备突然动作。
3.2 汇流防冲突互锁逻辑:两条线不能同时放行
这是整个程序最核心的部分。汇流场景里最怕的就是A线和B线同时放行,两个物料在汇流点撞车。所以,必须有硬互锁。
我用一个内部继电器M0.1来表示“A线当前正在放行”,M0.2表示“B线当前正在放行”。这两个标志必须遵循一个铁律:M0.1和M0.2在同一时刻只能有一个为1,绝对不允许同时为1。
先看A线的启动条件:
A线等待区光电传感器I0.2为1(说明A线有物料在等),且系统运行标志M0.0为1,且汇流区占用传感器I0.4为0(说明汇流点空着),且B线不在放行中(即M0.2为0)。
这四个条件串联在一起,结果驱动A线放行标志M0.1的置位线圈,同时驱动A线皮带电机Q0.0输出。这里要注意,我用的是置位指令,也就是一旦满足条件,M0.1会被一直保持为1,直到复位条件满足。
同理,B线的启动条件:
B线等待区光电传感器I0.3为1,且M0.0为1,且I0.4为0,且A线不在放行中(即M0.1为0)。
这就是互锁。A线的条件里串了B线的常闭触点M0.2,B线的条件里串了A线的常闭触点M0.1。只要B线正在放行,M0.2为1,它的常闭触点就断开,A线的放行条件永远不满足,A线皮带电机会立即停止或者无法启动。反过来也一样。
用梯形图画出来就是两个对称的网络,看起来特别清爽。很多初学者在这里会犯一个错:只用“汇流区占用传感器I0.4”来做互锁,认为只要汇流区没物料就可以放行。这在两个物料同时到达、但都还没进入汇流区检测范围的情况下,会出现什么结果?A线和B线同时判断“汇流区空闲”,同时放行,两个物料同时冲进汇流区,撞个正着。所以仅靠汇流区传感器互锁是不够的,必须引入“放行中”标志的互锁,把两条线在决策层面就隔离开。
3.3 顺序放行与定时控制实现:防止“释放过早”和“重复放行”
光有互锁还不够,还要处理“什么时候复位放行标志”的问题。如果物料已经被放行并离开了等待区传感器,但汇流区还没检测到物料,这时候程序告诉你“A线正在放行”是合理的,因为物料正在路上。但如果物料已经过了汇流点,I0.4从1变0了,程序必须把M0.1复位,否则A线会一直占着放行权,B线永远没机会放料。
所以,A线放行标志的复位条件是什么?我用的方案是:当A线放行标志M0.1为1,且汇流区传感器I0.4从0变成1(即物料进入到汇流区检测范围)后,延迟一段时间再复位M0.1,同时停止A线皮带电机。
这里为什么要有延迟?因为物料进入汇流区检测范围时,它的尾部可能还在A线皮带上,如果你立即把A线皮带电机停住,物料的尾巴会被A线皮带拽住,或者物料停在汇流点中间,把主带堵住。所以,需要让A线皮带再转一段时间,确保物料完全离开A线、完全进入主带。这个时间我用TON定时器实现,通常设置0.8到1.2秒,具体数值取决于A线皮带速度和物料长度。
我程序里用了两个定时器:
- TON定时器T1:A线放行后的“尾部脱离时间”,A线放行条件满足,M0.1置位,同时启动这样一个定时器,定时1秒。定时时间到,说明尾部已经完整离开A线等待区,此时如果物料已经到达汇流区,就把M0.1复位,并停止A线皮带电机Q0.0。
- TON定时器T2:B线放行后的“尾部脱离时间”,逻辑和A线完全对称,定时也是1秒。
用TON定时器的时候有一个容易出错的点:定时器的触发条件。如果你把M0.1直接接到定时器使能端上,那么只要M0.1为1,定时器就一直计时。但问题在于,M0.1从置位到复位可能持续好几秒甚至更长(如果后面主带堵了,物料一直没离开,M0.1就要一直保持),那定时器早就计到1秒了,它会不停地输出1。这样会导致什么结果?M0.1因为“定时时间到”条件复位,然后因为汇流区还在占用,A线又不会立刻再次放行,那还好;但如果你稍加改动,把定时器输出用作了其他用途,就会产生混乱。
我最终的写法是:TON定时器的使能端接的是“M0.1为1且I0.4为1”。也就是物料已经到达汇流区之后才开始计时1秒。这样更精准地模拟了“尾部脱离”的物理过程。当定时器输出为1时,复位M0.1,并让Q0.0停止。这个思路同样适用于B线。
3.4 完整梯形图结构说明与注释规范
把这套逻辑串起来,完整梯形图从Network 1到Network 8,总共8个网络,结构如下:
| Network | 功能 | 使用指令 | 注释重点 |
|---|---|---|---|
| 1 | 启动逻辑 | 常开/常闭触点、置位 | 说明启动条件、为什么串停止按钮常闭 |
| 2 | 停止/复位逻辑 | 常开触点、复位线圈 | 说明复位的范围,包括输出和内部标志 |
| 3 | A线放行条件判断 | 常开/常闭触点、置位 | 说明四个条件各自的作用,重点强调与M0.2的互锁 |
| 4 | A线放行执行与定时 | TON、常开触点、复位 | 说明“尾部脱离”的物理过程,定时器的由来 |
| 5 | B线放行条件判断 | 常开/常闭触点、置位 | 与Network 3对称,强调互锁的对称性 |
| 6 | B线放行执行与定时 | TON、常开触点、复位 | 与Network 4对称 |
| 7 | 主带电机控制 | 常开触点、线圈 | 主带一直运行,但停止时也必须停 |
| 8 | 辅助状态记录 | 常开触点、线圈 | 记录A/B线当前是否有物料正在汇入,方便监控 |
注释我写得很细,每条Network前面都有一段中文注释,说明完整逻辑。比如Network 3的注释我会写:“当A线等待区传感器检测到物料、系统在运行、汇流区空闲、且B线未在放行时,置位A线放行标志,同时启动A线皮带,将物料送往汇流区。”
写注释有几个技巧,我分享一下。第一,注释里写“为什么”,而不是只写“是什么”。比如你写“I0.2为1”,那别人不知道I0.2是什么;但如果你写“A线等待区有物料”,别人一眼就看懂了。第二,关键条件用“且”“或”“非”这样的逻辑词写清楚,这样即使不太会梯形图的人也能顺着注释读通程序。第三,定时器的时间值要在注释里给出依据,比如“1秒,按A线皮带速度0.3m/s、物料长度0.15m计算得出”,而不是模糊地写“延时”。
4. 调试运行与常见问题排查
4.1 仿真联调步骤与运行效果验证
程序下载到PLCSIM后,在FactoryIO里点运行,就可以看到动态效果了。下面是我调试时的标准步骤,建议你也按这个顺序来。
第一步,空载测试。不投料,只在FactoryIO里启动场景,点启动按钮,确认A线、B线、主带三条皮带都转起来,且方向正确。如果哪条带反转,直接去梯形图里看输出线圈对应的Q点,查通信映射,别上来就改场景。
第二步,单线测试。只用A线投料,放一个物料在A线入口,看它到等待区后A线皮带是否停止,物料是否稳定停在传感器位置。然后手动操作(或者场景自动产生物料)让物料触发等待区传感器,此时A线皮带应该重新启动,物料进入主带,汇流区传感器亮起,然后A线皮带延时1秒后停止。这一条线走通,说明A线的顺序逻辑没问题。
第三步,B线单测。把A线的物料清空,用同样的方式测B线,确认对称逻辑没问题。
第四步,双线汇流测试。这是最关键的环节。同时在A线和B线放物料,故意让它们同时到达等待区,观察程序是否只放行其中一条线,等该物料完全进入主带、A线放行标志复位后,B线才开始放行。
我调试时遇到的一个很典型的现象是:两条线的物料几乎同时到达等待区,程序也正确地只放行了A线,但A线物料完全进入主带后,B线却迟迟不放行,像卡死了一样。后来一查,问题出在B线放行条件的“等待区传感器”上。由于A线物料经过主带汇流点时,物理上会遮挡住B线等待区传感器吗?并不会,但是B线物料在等待时可能刚好处于传感器检测范围的边缘,信号不稳定,导致程序里I0.3一会儿为1一会儿为0。当A线放行结束后,B线的I0.3刚好是0,B线以为没有物料,自然就不放行了。
这个问题怎么解决?我在程序里把B线放行条件里的“B线等待区传感器I0.3为1”改成了用“置位保持”的方式处理。具体来说,B线等待区传感器I0.3为1时,置位一个内部继电器M0.3“B线有待放行物料”,然后用M0.3代替I0.3作为放行条件,只有当B线真正放行完成后才复位M0.3。这样即使传感器的瞬时信号抖动,也不影响放行判定的连续性。这个调整虽然只改了几个触点,但效果立竿见影,双线汇流从此不再卡死。这个方案也推荐给你,算是这套程序里最值钱的一个优化。
4.2 常见问题速查表
调试过程中我把遇到和预判到的典型问题整理成了一个速查表,建议收藏备用。
| 现象 | 可能原因 | 排查与解决方法 |
|---|---|---|
| 物料到等待区后皮带不停 | 等待区传感器信号没进PLC | 检查通信映射、I0.2地址是否配置正确;在TIA里监控I0.2是否能变化 |
| 两条线物料同时进主带 | 互锁失效 | 检查A线条件里是否串了M0.2常闭,B线条件里是否串了M0.1常闭;确认M0.1/M0.2没有同时为1 |
| B线永久不放行 | 放行标志未复位 | 检查B线放行标志M0.2的复位条件是否依赖I0.4上升沿;检查传感器抖动导致的信号丢失 |
| 物料在汇流点来回抖动 | 皮带方向或位置不对 | 在FactoryIO里检查进料带与主带的相对位置;调整进料带速度 |
| 启动后马上停止 | 停止/复位按钮信号异常 | 检查I0.1是否在PLCSIM中被强制为1;查Network 2复位逻辑是否误触发 |
| 定时时间到了物料还没走完 | 定时器时间偏短 | 测量物料从等待区到完全离开汇流点的实际时间,把T1/T2时间加长,通常1.5秒更保险 |
4.3 踩坑经验与优化建议
第一次跑这套程序时,我把所有时间都调得很快,想着反正是仿真,速度快一点省时间。结果物料在汇流点上连环撞,场面一度失控。后来我仔细一想,仿真里的速度和真实产线是可以等比例映射的,如果仿真里都跑不顺,真机只会更严重。所以我最终把传送带速度调到接近真实产线的水平,大概是0.2到0.4米/秒,然后重新调定时器参数,逻辑才变得和预期一致。
这里要说一个重要经验:仿真调程序,一定要让速度接近真实场景,不要因为“反正是仿真”就乱调参数。你调出来的定时器、互锁、放行时序,最终是要落到真机上的,参数差得太多,逻辑看起来对,但实际没法用。
第二个优化是加一个“汇流区堵塞报警”。这个是我的扩展经验,不一定每个人都需要,但有了它,调试时省了很多时间。在梯形图里加一个Network:如果A线放行标志M0.1或B线放行标志M0.2为1,且汇流区占用传感器I0.4在10秒内都没有变为0,说明物料卡在汇流点了,输出一个报警标志。你在PLCSIM里看到报警标志,就可以直接定位到“汇流区堵料”,而不是满世界去查传感器地址。工厂里这叫“设备自我诊断”,是高级工程师和普通电工程序拉开差距的地方。
第三个建议是,在程序顶部用注释块写清楚版本信息、修改记录、适用场景。这套程序我已经改了三个版本,每版都记录了改动原因。有一天你回过头来看老程序,你会感谢自己当时写下的那几行版本说明。
5. 扩展方向与学习建议
场景本身很简单,但它的扩展价值非常大。做完这套输送线汇流实验,你会对PLC梯形图编程里的互锁、置位复位、定时器、顺序控制这几个核心概念有全新的认识。这些概念不是独立的,它们组合在一起才形成了工业自动化的“骨架”。
一个自然的扩展方向是把汇流逻辑升级为多线汇流,比如把两条进料线变成四条,或者加入滑道式优先权控制(A线优先级高于B线和C线)。这时候你仍然可以用M0.1、M0.2、M0.3这样的标志,但互锁条件会越来越多,钳位关系也会变得复杂。另一个方向是加入分拣逻辑,比如在汇流前增加颜色传感器,根据物料颜色决定它走哪条支线,这就是把汇流和分拣结合起来了,在电商物流系统里非常常见。
如果你还想把这个实验做得更“工程化”,可以引入报警灯、触摸屏控制变量、甚至用SCADA系统实时监控。不过这些往大处扩展了,先把这个基础版吃透,再往上加,你会轻松很多。
踩过这么多坑之后,我的体会是:写PLC程序最核心的能力不是背指令,而是能把物理世界里的时序关系、安全关系,用程序准确地翻译出来。FactoryIO这套仿真实验,恰恰是训练这种翻译能力最好的方式。你可以在电脑前反复试错,把“汇流防撞”这种工艺理解得透透的,再上真机时就胸有成竹了。