在工业自动化项目中,物料分拣是经典且高频的应用场景。很多工程师在初次接触汇川H5U PLC与FactoryIO仿真软件联调时,常会感到无从下手——如何将视觉传感器的信号转化为可靠的控制逻辑?如何构建一个稳定、易维护的程序框架?本文将分享一套基于顺序功能图(SFC)的“三物料分拣系统”核心编程逻辑模板。这套模板不仅清晰地拆解了分拣流程,更将视觉检测、气缸动作、传送带控制与联机通讯融为一体,形成了一套可复用的工程化解决方案。无论你是正在学习PLC编程的学生,还是需要快速搭建分拣系统的工程师,这套逻辑都能让你事半功倍。
1. 系统概述与核心组件介绍
在深入代码之前,我们首先要理解整个系统的构成和工作原理。一个典型的三物料分拣系统,其核心目标是:通过视觉传感器识别出传送带上三种不同颜色(例如红、绿、蓝)或形状的物料,然后控制对应的气动推杆或机械臂,将物料推入指定的分拣槽中。
1.1 系统核心组件与功能
整个系统由硬件和软件两部分协同工作:
- 控制核心 - 汇川H5U PLC:作为系统的大脑,负责接收所有输入信号(如传感器信号),执行我们编写的控制逻辑,并输出控制信号驱动执行机构(如气缸电磁阀、电机驱动器)。
- 仿真与可视化 - FactoryIO:这是一个强大的3D工业场景仿真软件。我们可以在电脑上搭建出包含传送带、传感器、气缸、物料模型的虚拟分拣线,并通过驱动与真实的汇川H5U PLC进行联机通讯。这极大地降低了学习成本和项目前期的调试风险。
- “眼睛” - 视觉传感器:在实际系统中,可能是颜色传感器、光电传感器或工业相机。在仿真中,FactoryIO会模拟其信号。它的作用是检测物料是否到位以及识别物料类型(通常用不同的数字信号表示,如1、2、3)。
- “手臂” - 执行机构:主要是三个分拣气缸(对应三种物料)和传送带电机。PLC通过输出点控制气缸的伸出/缩回和电机的启停。
- 通讯桥梁:实现FactoryIO(运行在PC上)与汇川H5U PLC之间数据交换的通道,通常采用Modbus TCP/IP或汇川自由协议over Ethernet。
1.2 为什么选择顺序功能图(SFC)?
对于分拣这种具有明显顺序步骤、多种状态转换的流程控制,顺序功能图(Sequential Function Chart, SFC)是最直观、最合适的编程语言。它源于佩特里网,将复杂的控制流程分解为一系列的“步”(Step)和“转换”(Transition)。
- 步(Step):代表系统的一个稳定状态,例如“等待物料”、“气缸A伸出”。在步中,可以执行具体的动作。
- 转换(Transition):从一个步切换到下一个步的条件,例如“物料到位且为红色”。
- 优势:结构清晰,逻辑与工艺流程图一一对应,易于设计、调试和维护。当需要增加一种物料或改变分拣顺序时,只需在SFC框架内增减步和转换条件即可,程序主体结构不变。
2. 环境准备与软件配置
在开始编程前,请确保你的开发环境已就绪。以下是基于当前常见版本的配置说明。
2.1 所需软件及版本
- 汇川PLC编程软件(AutoShop):建议使用V2.8或以上版本。这是汇川H系列PLC的官方编程软件,支持梯形图(LD)、指令表(IL)、顺序功能图(SFC)等多种编程语言。
- FactoryIO仿真软件:建议使用2.5.10或以上版本。请从官网或正规渠道获取并完成激活。
- 操作系统:Windows 10 或 Windows 11 专业版/企业版。
2.2 软件安装与基础设置
- 安装AutoShop:按照向导安装汇川AutoShop软件。安装完成后,连接你的汇川H5U PLC硬件(如果进行实物调试),或使用软件自带的模拟器功能进行离线测试。
- 安装FactoryIO:安装FactoryIO,并确保其已被正确激活。首次运行时,可以选择界面语言。
- 关键配置 - 驱动设置:这是联机通讯成功的关键。
- 打开FactoryIO,进入
File -> Drivers。 - 在驱动列表中选择
Inovance(汇川)。注意,不同版本的FactoryIO驱动名称可能略有差异,也可能是“H3U”或“Modbus TCP”。 - 配置驱动参数。如果选择Modbus TCP,通常需要设置PLC的IP地址(例如
192.168.1.10)、端口号(默认为502)、以及Modbus从站地址(默认为1)。这些设置需要与PLC内部的配置或AutoShop中的设置保持一致。
- 打开FactoryIO,进入
2.3 建立通讯连接
- 在AutoShop中设置PLC:如果是真实PLC,确保其IP地址与FactoryIO驱动中设置的一致。如果是模拟器,模拟器本身会虚拟一个网络适配器,需要配置模拟PLC的IP。
- 在FactoryIO中加载场景:从FactoryIO的场景库中,选择一个包含传送带、传感器和气缸的场景,或自己搭建一个简单的分拣线场景。将场景中的输入(如传感器I0.0)、输出(如气缸Q0.0)与驱动中定义的地址映射好。
- 连接测试:在AutoShop中编写一个简单的点动程序,控制一个输出点。下载到PLC(或模拟PLC)并运行。然后在FactoryIO场景中观察对应的执行机构(如灯、气缸)是否有反应。反之,在FactoryIO中手动触发一个传感器,观察AutoShop监控表中对应的输入点是否变化。双向测试成功,标志着通讯链路已打通。
3. 顺序功能图(SFC)核心逻辑拆解
本节将详细拆解三物料分拣系统的SFC程序结构。我们将程序分为几个关键的“步”和“转换”。
3.1 SFC程序基本结构
一个完整的SFC程序始于一个初始步(通常用双线框表示),结束于一个循环返回或结束。我们这里采用循环结构,使系统能连续工作。
[初始步 S0] (系统初始化) | v (转换条件:启动按钮 & 无急停) [步 S1] (传送带运行,等待物料) | v (转换条件:视觉传感器检测到物料) [选择分支] --(物料类型=1)--> [步 S2] (执行分拣动作1) | --(物料类型=2)--> [步 S3] (执行分拣动作2) | --(物料类型=3)--> [步 S4] (执行分拣动作3) | --(其他/超时)--> [步 S5] (异常处理) | v (所有分拣动作步完成后,汇合到同一转换条件:动作完成) [步 S6] (复位动作,延时) | v (转换条件:延时到) (跳转回步 S1,等待下一个物料)- 选择分支:根据视觉传感器的不同信号(1,2,3),选择不同的分拣路径。这是系统的核心决策点。
- 并行分支:如果需要多个动作同时执行(例如,分拣气缸伸出时,传送带暂停),可以使用并行分支。本例为简化,采用顺序执行。
3.2 I/O地址规划与变量定义
在编写程序前,规划好软元件(内部继电器、寄存器)和物理I/O的映射至关重要。以下是一个示例规划表:
| 元件类型 | 地址/名称 | 说明 |
|---|---|---|
| 输入 (X) | X0 | 系统启动按钮 (FactoryIO模拟) |
| X1 | 系统停止/急停按钮 | |
| X2 | 视觉传感器(物料到位) | |
| D0 (数据寄存器) | 视觉传感器类型值(1:红, 2:绿, 3:蓝) | |
| 输出 (Y) | Y0 | 传送带电机运行 |
| Y1 | 红色物料分拣气缸 | |
| Y2 | 绿色物料分拣气缸 | |
| Y3 | 蓝色物料分拣气缸 | |
| Y10 | 蜂鸣器(异常报警) | |
| 内部辅助 (M) | M0 | 系统运行总标志 |
| M100-M120 | SFC各步的激活标志(AutoShop中SFC步通常自动关联状态位) | |
| 定时器 (T) | T0 | 分拣动作保持时间(如气缸伸出时间) |
| T1 | 动作复位后延时,确保物料落下 |
注意:在FactoryIO中,你需要将场景中的传感器和执行器与上述X/Y地址进行绑定。D0寄存器值的写入,可以通过FactoryIO的“标签”功能或脚本模拟视觉传感器输出。
4. 完整SFC程序实现与代码详解
现在,我们在汇川AutoShop软件中,将上述逻辑转化为实际的SFC程序。
4.1 创建新工程与SFC程序块
- 打开AutoShop,新建一个工程,设备类型选择对应的H5U型号。
- 在程序组织单元(POU)中,新建一个程序块,编程语言选择“SFC”。
4.2 编写SFC主体逻辑
以下是SFC程序的详细步骤描述及关键代码片段。在AutoShop的SFC编辑器中,这些步骤通过图形化方式连接。
// 以下为SFC图形化编程的文本化描述,实际在AutoShop中为图形界面 // 步与动作使用梯形图(LD)编写 // ---- 初始步 ---- 步 S0: “INIT” 动作: (无,或执行一次初始化复位) 转换条件 TR0: M8002 (PLC上电首次扫描ON) 或 停止后复位完成 | v // ---- 主循环开始 ---- 步 S1: “RUN_CONVEYOR” 动作: LD M0 // 系统运行标志 OUT Y0 // 启动传送带 转换条件 TR1: X0 AND M0 // 启动按钮按下且系统运行 | v // ---- 检测等待步 ---- 步 S2: “WAIT_FOR_OBJECT” 动作: (保持传送带运行 Y0) 转换条件 TR2: X2 // 视觉传感器检测到物料到位 | v // ***** 选择分支开始 ***** // 分支条件:根据D0的值跳转 | +--[D0 = K1]--> 步 S10: “SORT_RED” | 动作: SET Y1 // 红色气缸伸出 | OUT T0 K50 // 定时0.5秒(根据实际调整) | 转换条件: T0 // 定时时间到 | | | v | +--[D0 = K2]--> 步 S20: “SORT_GREEN” | 动作: SET Y2 // 绿色气缸伸出 | OUT T0 K50 | 转换条件: T0 | | | v | +--[D0 = K3]--> 步 S30: “SORT_BLUE” | 动作: SET Y3 // 蓝色气缸伸出 | OUT T0 K50 | 转换条件: T0 | | | v | +--[ELSE]--> 步 S40: “ERROR_HANDLE” 动作: SET Y10 // 报警蜂鸣器 OUT T2 K100 // 报警延时 转换条件: T2 | v (报警后也可选择回到等待步或停机) // ***** 选择分支汇合 ***** // 所有正常分拣步(S10,S20,S30)完成后,转换条件均为T0,汇合到同一点 // 异常步S40单独处理 | v (正常路径汇合点) 步 S50: “RESET_ACTION” 动作: RST Y1 RST Y2 RST Y3 // 复位所有气缸 OUT T1 K30 // 短暂延时,确保物料滑入槽内 转换条件 TR3: T1 // 复位延时到 | v (使用“JUMP”指令跳转回步 S1: “RUN_CONVEYOR”) // 形成循环关键点解释:
- 系统运行标志M0:由启动/停止按钮控制。这是所有自动流程的前提,便于紧急停止。
- 视觉值寄存器D0:在真实系统中,由视觉控制器通过通讯写入。在FactoryIO仿真中,你需要通过其“标签”或“脚本”功能,在检测到物料时,根据物料类型向PLC的D0寄存器写入1、2或3。这模拟了视觉传感器的通讯过程。
- 定时器T0:用于控制气缸伸出保持时间。时间常数K50表示50*10ms=0.5秒,需根据实际气缸速度调整。
- 选择分支的实现:在AutoShop的SFC中,可以直接在转换条件上编写判断语句,如
D0=K1。软件会自动处理分支与汇合。 - 异常处理:当D0的值不是1、2、3时,进入异常处理步。这是一个非常重要的工程实践,能防止因信号干扰或错误导致的程序卡死。
4.3 辅助梯形图程序
SFC主要描述流程,一些基础逻辑和故障处理更适合用梯形图写在另一个程序块中。
// 文件:主程序或子程序(梯形图) // 1. 系统启停控制 LD X0 // 启动按钮 OR M0 ANI X1 // 停止按钮(常闭点,按下断开) OUT M0 // 系统运行总标志 // 2. 视觉传感器信号处理(示例:在FactoryIO中用脚本写D0,此处可做滤波) // 可以添加一个上升沿触发,确保每次只处理一个物料 LD X2 PLS M100 // M100产生一个扫描周期的脉冲 LD M100 MOV D0 D100 // 将视觉类型值存入缓存寄存器D100 // 这里可以添加数据有效性判断,例如 D100必须在1~3之间 // 3. 急停处理(最高优先级) LD X1 // 急停按钮按下 RST Y0 // 立即停止传送带 RST Y1 // 立即复位所有气缸 RST Y2 RST Y3 RST M0 // 清除运行标志 // 同时,可以强制将SFC跳转回初始步S0(具体指令取决于PLC型号和软件)5. FactoryIO场景搭建与联机调试
程序编写完成后,需要在FactoryIO中搭建测试环境进行联调。
5.1 搭建分拣场景
- 在FactoryIO中新建场景。
- 从左侧元件库拖放:一条
Conveyor(传送带)、三个Cylinder(气缸,作为推杆)、三个Photoeye(光电传感器,一个用于物料检测,两个用于限位?实际上视觉识别通常用一个传感器配合软件)。为了模拟视觉,我们用一个传感器检测到位,物料类型则通过“标签”来区分。 - 在传送带起点放置一个
Emitter(发射器)来生成物料。在发射器的属性中,可以创建不同的物料类型(如Red Box, Green Box, Blue Box)。 - 将传送带电机、传感器、气缸与之前规划的I/O地址进行绑定(如Conveyor Motor -> Y0, Sensor -> X2, Cylinder1 -> Y1...)。
5.2 模拟视觉传感器信号
这是仿真的关键。我们需要让FactoryIO在检测到物料时,不仅触发X2,还要向PLC的D0寄存器写入对应的值。
- 在FactoryIO中,进入
View -> Script Editor。 - 编写Lua脚本,监听物料通过的事件。以下是一个简化的示例思路:
-- 假设有一个名为‘ColorSensor’的传感器 function onSensorActivated(sensor) if sensor.name == “ColorSensor” then local object = sensor.detectedObject local tagValue = 0 if object.type == “RedBox” then tagValue = 1 elseif object.type == “GreenBox” then tagValue = 2 elseif object.type == “BlueBox” then tagValue = 3 end -- 将值写入PLC的D0寄存器。具体函数取决于驱动,可能是 setTag(‘D0’, tagValue) driver.writeRegister(‘D0’, tagValue) -- 示例写法,实际函数名需查驱动手册 end end -- 注册事件监听器 scene.onSensorActivated = onSensorActivated注意:FactoryIO不同版本和驱动的脚本API可能不同,请务必查阅其官方文档。核心思想是:用脚本逻辑模拟视觉控制器的通讯功能。
5.3 联机调试步骤
- 离线测试:先在AutoShop中利用软件模拟器运行SFC程序,使用“软元件测试”功能强制改变X2和D0的值,观察SFC步的切换和Y输出点的变化。确保逻辑正确。
- 连接FactoryIO:关闭模拟器,将AutoShop与真实PLC或设置为与FactoryIO通讯的IP连接。将程序下载到PLC。
- 在线监控:在AutoShop中在线监控程序。在FactoryIO中启动场景,并开始发射物料。
- 观察与排错:
- 观察物料到达传感器时,PLC的X2是否亮起,D0寄存器值是否变为1、2、3。
- 观察对应的步(如S10)是否被激活,对应的输出点(如Y1)是否输出。
- 观察FactoryIO场景中的气缸是否动作,物料是否被正确推入槽中。
- 如果物料堆积或动作不协调,调整定时器T0和T1的值。
6. 常见问题与排查思路
在调试过程中,你可能会遇到以下典型问题:
| 问题现象 | 可能原因 | 排查思路与解决方案 |
|---|---|---|
| FactoryIO与PLC无法通讯 | 1. IP地址设置错误。 2. 端口号不正确。 3. 防火墙阻止。 4. PLC未处于RUN模式。 | 1. 使用ping命令检查网络连通性。 2. 核对AutoShop中PLC的IP与FactoryIO驱动中设置的IP是否一致。 3. 暂时关闭防火墙测试。 4. 确认PLC已运行,且程序已下载。 |
| 传感器信号无反应 | 1. I/O地址映射错误。 2. FactoryIO中传感器未正确关联到驱动地址。 3. PLC输入点滤波时间过长。 | 1. 在AutoShop监控表中,强制对应X点,看FactoryIO中传感器是否高亮。 2. 双击FactoryIO中传感器,检查其“Address”属性是否正确。 3. 检查PLC系统参数中的输入滤波时间,适当调小。 |
| 气缸不动作 | 1. 输出地址映射错误。 2. SFC程序未执行到对应步。 3. 气路/电路问题(实物)。 4. FactoryIO中气缸未关联输出地址。 | 1. 在AutoShop中监控Y点,当SFC步激活时,Y点是否输出。 2. 检查SFC的选择分支条件(D0值)是否满足。 3. 在FactoryIO中检查气缸的“Actuator”属性地址。 |
| 视觉类型值D0不正确 | 1. FactoryIO脚本未正确写入。 2. 通讯写入失败。 3. 物料类型判断逻辑有误。 | 1. 在FactoryIO脚本中添加调试打印,确认tagValue计算正确。 2. 检查驱动写寄存器的函数调用格式和地址格式。 3. 在AutoShop中直接监控D0寄存器,观察其值变化。 |
| SFC程序不循环,只执行一次 | 1. 最后一步没有跳转回初始步或等待步。 2. 转换条件始终不满足,导致流程卡死。 | 1. 检查SFC最后一个步之后是否有“JUMP”指令跳转到循环起点。 2. 检查复位步S50的转换条件T1是否正常触发。 |
| 多个物料同时处理导致混乱 | 1. 没有对视觉信号进行“一次性”处理。 2. 传送带速度过快,SFC流程来不及处理。 | 1. 在梯形图中使用上升沿(PLS)指令,确保每个物料只触发一次流程。 2. 在等待物料步(S2)增加“互锁”,只有处于该步时才允许检测新物料。也可以在机械上增加间距。 |
7. 工程优化与最佳实践
一个能稳定运行的程序是基础,一个易于维护和扩展的程序才是优秀的工程代码。
7.1 程序结构优化
- 模块化设计:将SFC主流程、气缸控制子程序、报警处理子程序、通讯处理子程序分开编写。在汇川AutoShop中,可以使用“子程序”或“功能块”来实现。
- 使用功能块封装气缸动作:将气缸的伸出、缩回、动作延时及到位检测(如果有磁性开关)封装成一个可重复调用的功能块。这样主SFC程序会更加简洁。
- 状态与报警分离:建立独立的报警处理程序块。将设备故障(如气缸超时未到位)、流程异常(如未知物料类型)等统一管理,并输出到报警灯或HMI。
7.2 增强系统鲁棒性
- 信号去抖与滤波:对关键的传感器信号(如X2)在梯形图中进行软件滤波,防止抖动误触发。
- 超时监控:在SFC的每一步,尤其是执行动作的步(如S10),添加步激活时间监控。如果该步激活时间超过合理范围(例如气缸伸出本应1秒完成,但3秒后仍未完成),则触发报警并跳转到安全状态。这可以防止因气缸卡死导致的程序死等。
- 模式管理:增加手动/自动模式切换。在手动模式下,可以通过HMI或按钮单独点动每个气缸和传送带,便于设备调试和维护。
- 数据追溯:如果需要,可以将每次分拣的物料类型、时间等信息存入PLC的数据寄存器或通过通讯上传到上位机,便于生产统计。
7.3 通讯与仿真注意事项
- Modbus地址映射:如果使用Modbus TCP通讯,务必清楚汇川H5U PLC的Modbus地址与内部软元件(如D、M)的映射关系。例如,D0寄存器可能对应Modbus Holding Register的40001地址。FactoryIO驱动中的地址设置需与此一致。
- 仿真不是实物:FactoryIO仿真忽略了物理世界的惯性、延迟和随机故障。在仿真通过后,切换到实物调试时,务必从低速、单步开始,逐步提高速度,并仔细调整传感器位置、气缸节流阀和各项延时参数。
- 文档与注释:在程序中对每一个SFC步、重要的转换条件、功能块进行详细的注释。这对自己后期维护和团队交接至关重要。
通过本文的详解,你应该已经掌握了一套从零构建汇川H5U PLC与FactoryIO联合仿真三物料分拣系统的完整方法。这套基于顺序功能图的核心逻辑模板,清晰地分离了流程控制与设备动作,结构稳定且易于扩展。你可以在此基础上,增加物料类型、引入机器人抓取、添加上位机监控,从而构建更复杂的自动化系统。记住,好的程序不仅是能跑起来,更是要跑得稳、看得懂、改得动。建议你将此模板保存,在未来的项目中灵活应用和演化。