基于PLC功能块与触摸屏实现用户可编程工业控制系统

📅 2026/8/1 3:22:30
基于PLC功能块与触摸屏实现用户可编程工业控制系统
1. 项目概述为什么我们需要“用户可编程”的控制系统在工业自动化领域干了十几年我见过太多这样的场景一条生产线刚调试好工艺部门就提出要改一个动作顺序或者设备卖到客户现场客户的操作工希望调整某个报警的延时时间。传统的做法是什么打电话给原厂工程师或者等我们出差到现场连上电脑打开编程软件修改程序下载测试……一套流程下来少则半天多则几天时间和金钱成本都高得吓人。“用户可编程”这个概念就是为了打破这个僵局。它不是说让用户去写复杂的PLC梯形图或ST语言而是通过我们预先设计好的、友好的交互界面通常是触摸屏将一些关键的、允许变动的工艺参数、动作逻辑甚至简单的流程选择权安全地交给现场的操作人员或维护工程师。这个项目的核心就是用PLC可编程逻辑控制器作为控制大脑用触摸屏HMI作为交互和编程界面搭建一个既稳定可靠又具备灵活调整能力的控制系统。简单来说我们要做的不是一个“黑箱”设备用户只能按启动停止。我们要做的是一个“白箱”箱子的核心控制逻辑安全联锁、急停处理、核心保护由我们牢牢锁死而箱子里的一些“抽屉”如速度、时间、计数、简单工步选择则配上了钥匙并附上了使用说明书交给用户自己去安全地调整。这不仅能极大提升设备的适应性和客户满意度也能减少我们后期大量的维护出差实现双赢。接下来我就以一个典型的物料分拣与入库项目为例拆解如何从零开始实现这样一个系统。2. 整体架构设计与核心思路拆解2.1 硬件选型与通信架构规划一个可靠的控制项目硬件是基石。对于用户可编程项目硬件选型需要额外考虑两点一是PLC的编程灵活性和功能块支持二是触摸屏的脚本与变量处理能力。PLC的选择我推荐使用支持结构化编程和强大功能块FB的中型PLC例如西门子S7-1200/1500系列、三菱FX5U/Q系列、或者汇川的AM/AC系列。这些PLC都完美支持本次项目核心的FB功能块编程。为什么不选小型PLC如S7-200 SMART或FX3U因为它们对结构化编程的支持较弱全局变量管理麻烦当程序逻辑复杂后维护和实现用户可编程会非常吃力。触摸屏的选择触摸屏是用户交互的窗口也是“可编程”的入口。我们需要选择一款支持多语言、配方功能、强大的脚本如VBScript或JavaScript以及数据记录的型号。威纶通的cMT系列、西门子的精智面板Comfort Panel、昆仑通态的TPC系列都是不错的选择。它们能提供丰富的控件如按钮、输入框、下拉列表、趋势图来构建用户编程界面。通信架构最常用、最稳定的方式是以太网通信如西门子的Profinet、三菱的CC-Link IE Basic或者通用的Modbus TCP。以太网通信速度快布线简单且便于未来与上位机SCADA或MES系统集成。PLC与触摸屏之间建立连接后触摸屏上的控件直接关联到PLC的DB数据块或M/L/D寄存器实现数据交换。注意在规划硬件时务必为未来可能的扩展留有余量。例如PLC的I/O点数和内存要预留20%-30%触摸屏的存储空间要足够保存用户可能创建的大量配方数据。2.2 软件层面的核心思想分层与封装软件设计是项目的灵魂。要实现清晰、可维护、用户可编程的系统必须采用分层和封装的思路。第一层底层驱动与安全逻辑PLC侧完全封闭这一层程序由设备制造商我们完全编写并锁定用户无法修改。它负责最底层的设备安全包括急停处理无论任何情况急停信号必须能切断所有危险动力源。安全门/光栅联锁确保在防护打开时危险动作无法执行。电机过热、过载保护直接读取驱动器故障信号并做出响应。基本的单轴/单气缸控制例如控制一个气缸伸出/缩回的通用逻辑包含超时报警和互锁。这部分程序通常写在PLC的“主程序块”如OB1或专门的安全功能块中使用绝对地址或全局变量确保其最高优先级和稳定性。第二层工艺功能块封装PLC侧接口开放这是本次项目的核心。我们将一个完整的、可重复使用的工艺过程比如“轮毂分拣入库”封装成一个FB功能块。这个FB有明确的输入Input、输出Output和输入输出InOut引脚以及内部的静态变量Static。输入引脚提供给用户的“编程”接口。例如i_ChannelSelect分拣通道选择、i_TargetPosition目标库位、i_Speed皮带速度。输出引脚反馈给用户的状态。例如o_ProcessDone流程完成、o_ErrorCode错误代码。内部逻辑在FB内部我们编写完整的、优化的控制序列。用户通过修改输入引脚的值来改变这个序列的执行参数但无法改变序列本身的顺序和结构。这样做的好处是主程序变得极其简洁只需要调用这个FB的实例如FB_Sorting.In_1并连接好实际的硬件I/O地址即可。程序结构清晰易于调试。第三层用户交互与参数管理触摸屏侧用户可操作这一层在触摸屏上实现。我们设计友好的画面参数设置画面包含数字输入框、下拉选择框等这些控件直接链接到PLC中对应FB实例的输入引脚变量如FB_Sorting.In_1.i_Speed。配方管理画面允许用户将多组参数如针对不同型号轮毂的A、B、C三套参数保存为不同的“配方”一键调用。流程触发与监控画面提供启动、停止、复位按钮并显示当前流程状态、进度百分比、错误信息等链接到FB的输出引脚。用户的所有“编程”操作实质上就是在触摸屏上修改这些链接到PLC FB引脚变量的值。他们无需接触任何一行梯形图代码。3. 核心功能块FB的详细设计与编程3.1 FB功能块的接口定义与内部结构我们以“轮毂分拣入库”功能为例创建一个名为FB_SortingAndStorage的功能块。第一步定义引脚接口在PLC编程软件如TIA Portal、GX Works3中创建FB时首先规划变量接口。一个设计良好的接口是成功的一半。// 输入参数 (用户可通过触摸屏修改) VAR_INPUT i_Start : BOOL; // 启动信号上升沿触发 i_Channel : INT; // 分拣通道选择 (1,2,3) i_TargetRow : INT; // 目标库位行号 i_TargetCol : INT; // 目标库位列号 i_ConveyorSpeed : REAL; // 皮带速度设定值 (0.0-1.0) i_RobotDelay : TIME; // 机器人离开后皮带启动延时 END_VAR // 输出参数 (反馈给触摸屏状态) VAR_OUTPUT o_Busy : BOOL; // 功能块执行中 o_Done : BOOL; // 流程正常完成 o_Error : BOOL; // 发生错误 o_ErrorID : WORD; // 错误代码 o_CurrentStep : INT; // 当前步骤号用于进度显示 END_VAR // 输入输出参数 (通常连接实际硬件I/O) VAR_IN_OUT io_RobotDone : BOOL; // 机器人完成信号 io_ConvMotor : BOOL; // 皮带电机控制 io_StopCylinder : BOOL; // 挡停气缸 io_PushCylinder : BOOL; // 推料气缸 io_StoreCylinder : BOOL; // 入库气缸 io_SensorBegin : BOOL; // 皮带起始端传感器 io_SensorEnd : BOOL; // 皮带末端传感器 END_VAR // 静态变量 (功能块内部状态记忆) VAR r_Trigger : R_TRIG; // 上升沿检测功能块实例 state : INT; // 顺序控制状态机状态 timer_Delay : TON; // 延时定时器实例 stepCounter : INT; // 步骤计数器 END_VAR第二步设计内部状态机核心逻辑在FB的内部编程中最经典、最可靠的方法是使用状态机State Machine例如用CASE语句实现。// 主逻辑在每次PLC扫描周期执行 CASE state OF 0: // 状态0空闲等待 o_Busy : FALSE; o_Done : FALSE; o_CurrentStep : 0; IF r_Trigger(CLK:i_Start) THEN // 检查输入参数合法性 IF i_Channel 1 AND i_Channel 3 AND i_TargetRow 1 AND i_TargetCol 1 THEN state : 10; // 参数合法进入下一步 o_Busy : TRUE; o_Error : FALSE; ELSE o_Error : TRUE; o_ErrorID : 16#1001; // 参数错误代码 END_IF; END_IF; 10: // 状态10选择通道并通知上位系统/机器人此处为模拟 o_CurrentStep : 1; // 根据i_Channel的值激活对应的通道指示灯或信号实际项目中需连接具体输出 // 假设通过一个数组或计算来映射通道 state : 20; 20: // 状态20等待机器人抓取并放置轮毂到皮带起始端 o_CurrentStep : 2; // 监控io_SensorBegin当传感器检测到轮毂且收到机器人完成信号io_RobotDone IF io_SensorBegin AND io_RobotDone THEN // 启动延时定时器等待机器人完全离开 timer_Delay(IN:TRUE, PT:i_RobotDelay); state : 30; END_IF; 30: // 状态30延时等待然后启动皮带 o_CurrentStep : 3; timer_Delay(IN:TRUE, PT:i_RobotDelay); // 继续计时 IF timer_Delay.Q THEN // 定时时间到 io_ConvMotor : TRUE; // 启动皮带 state : 40; timer_Delay(IN:FALSE); // 复位定时器 END_IF; 40: // 状态40轮毂在皮带上运输到达挡停位 o_CurrentStep : 4; // 当轮毂运输到分拣位时挡停气缸动作假设有传感器信号触发 // 这里简化逻辑运行固定时间或等待特定传感器 // 假设用步进计数器模拟 stepCounter : stepCounter 1; IF stepCounter 50 THEN // 模拟到达 io_ConvMotor : FALSE; // 停止皮带 io_StopCylinder : TRUE; // 挡停气缸伸出 state : 50; stepCounter : 0; END_IF; 50: // 状态50推料气缸动作将轮毂推入对应通道 o_CurrentStep : 5; io_PushCylinder : TRUE; // 使用定时器或传感器确认推料完成 stepCounter : stepCounter 1; IF stepCounter 30 THEN io_PushCylinder : FALSE; io_StopCylinder : FALSE; // 挡停收回 state : 60; stepCounter : 0; END_IF; 60: // 状态60入库气缸动作将轮毂推入最终库位 o_CurrentStep : 6; io_StoreCylinder : TRUE; stepCounter : stepCounter 1; IF stepCounter 40 THEN io_StoreCylinder : FALSE; state : 100; // 完成 stepCounter : 0; END_IF; 100: // 状态100流程完成 o_CurrentStep : 7; o_Done : TRUE; // 保持完成状态一个周期或等待复位 IF NOT i_Start THEN // 启动信号下降沿自动复位 state : 0; o_Done : FALSE; o_Busy : FALSE; END_IF; END_CASE; // 错误处理状态可单独一个CASE或整合在上述逻辑中 IF o_Error THEN // 立即停止所有输出动作 io_ConvMotor : FALSE; io_StopCylinder : FALSE; io_PushCylinder : FALSE; io_StoreCylinder : FALSE; // 可以跳转到专门的错误处理状态 state : 200; END_IF;实操心得在FB内部使用状态机编程是工业控制中最清晰、最易调试的方法。每个状态只做一件事状态转换条件明确。务必为每个状态添加详细的注释并输出o_CurrentStep到触摸屏这样在调试时通过触摸屏就能一眼看出程序“卡”在哪个步骤极大提升排查效率。3.2 在主程序OB1中调用FB实例FB设计好后它只是一个模板。我们需要在主循环组织块如OB1中为它创建一个“实例”Instance这个实例拥有独立的存储空间背景数据块。// 主程序 OB1 VAR SortingFB_Instance : FB_SortingAndStorage; // 声明一个功能块实例 StartButton : BOOL; // 连接触摸屏启动按钮 // 其他全局变量... END_VAR // 调用功能块实例 SortingFB_Instance( i_Start : StartButton, // 将触摸屏按钮链接到FB启动引脚 i_Channel : “HMI_ChannelSelect”, // 链接到HMI上的通道选择变量 i_TargetRow : “HMI_TargetRow”, i_TargetCol : “HMI_TargetCol”, i_ConveyorSpeed : “HMI_Speed”, i_RobotDelay : T#5S, // 也可以由HMI设定这里举例固定5秒 // 连接实际I/O信号到输入输出引脚 io_RobotDone : “I0.0”, // 实际机器人完成输入点 io_ConvMotor : “Q0.0”, // 实际皮带电机输出点 io_StopCylinder : “Q0.1”, io_PushCylinder : “Q0.2”, io_StoreCylinder : “Q0.3”, io_SensorBegin : “I0.1”, io_SensorEnd : “I0.2”, // 获取输出状态供HMI显示 o_Busy “HMI_Status_Busy”, o_Done “HMI_Status_Done”, o_Error “HMI_Status_Error”, o_ErrorID “HMI_ErrorCode”, o_CurrentStep “HMI_CurrentStep” );通过这样的调用主程序变得非常简洁。所有复杂的逻辑都封装在FB_SortingAndStorage内部。当工艺需要修改时我们只需修改FB内部的状态机或参数当需要增加一套分拣机构时只需再声明一个实例如SortingFB_Instance2并连接不同的I/O地址即可实现了极高的代码复用率。4. 触摸屏组态构建用户可编程界面4.1 变量连接与画面规划在触摸屏软件如WinCC Flexible、威纶通EasyBuilder Pro中第一步是与PLC建立通信连接并定义好需要交换的变量。这些变量必须与PLC程序中FB实例的引脚变量一一对应。变量表定义示例在触摸屏软件中HMI_Start(BOOL) - 链接至 PLC 的StartButtonHMI_ChannelSelect(INT) - 链接至 PLC 的“HMI_ChannelSelect”(对应FB的i_Channel)HMI_Speed(REAL) - 链接至 PLC 的“HMI_Speed”HMI_Status_CurrentStep(INT) - 链接至 PLC 的“HMI_CurrentStep”HMI_Alarm_Message(STRING) - 链接至 PLC 的报警文本地址画面规划主监控画面显示设备整体布局动画、关键传感器状态、电机运行指示、当前错误信息。手动操作画面用于调试提供每个气缸、电机的点动按钮。参数设置画面核心提供用户编程界面。配方管理画面保存、加载、删除多套参数。报警历史画面记录发生的错误和操作日志。系统管理画面用户权限管理如操作员只能修改速度工程师可以修改通道选择。4.2 参数设置画面的详细组态这是用户进行“编程”的主要场所。我们以“分拣参数设置”画面为例。布局设计顶部画面标题“分拣流程参数设置”。左侧流程示意图或步骤列表。中部参数输入区。右侧当前状态显示区如当前步骤、FB的o_Busy,o_Done状态。底部按钮区保存到配方、从配方加载、确认设定、返回。控件使用与属性设置通道选择使用“符号I/O域”或“组合框”。连接变量HMI_ChannelSelect属性设置数值范围1-3。文本列表1 - “通道A” 2 - “通道B” 3 - “通道C”。这样用户在画面上看到的是易懂的文本PLC收到的是对应的整数值。目标库位输入使用两个“数字I/O域”。连接变量HMI_TargetRow和HMI_TargetCol属性设置数据类型为INT最小值1最大值10根据实际库位大小。可以启用“输入帮助”弹出数字键盘。皮带速度设定使用“滑块”控件或“数字I/O域”。连接变量HMI_Speed属性数据类型REAL最小值0.0最大值1.0对应0%-100%速度。使用滑块更直观。机器人离开延时使用“数字I/O域”。连接变量HMI_RobotDelay属性数据类型为TIME时间。在西门子系统中通常用DINT双整数表示毫秒然后通过触摸屏的格式转换功能显示为“时:分:秒.毫秒”。需要仔细配置格式。状态显示使用“文本列表”和“I/O域”。连接变量HMI_Status_CurrentStep属性创建文本列表0-“空闲”1-“选择通道”2-“等待上料”……7-“完成”。将I/O域设置为“输出”并关联此文本列表。用户就能直接看到“当前步骤等待上料”这样的友好提示。启动/停止按钮使用“按钮”控件。启动按钮按下时置位HMI_Start释放时复位或使用“置位”和“复位”两个按钮。停止按钮按下时置位一个全局急停或停止变量该变量应连接到FB的复位逻辑或主程序的急停处理。注意事项所有用户可修改的参数变量在PLC程序端必须做好限幅和有效性检查就像我们在FB的状态0里做的那样。防止用户输入一个“999”的速度值导致设备飞车。这是安全设计的重中之重。4.3 配方功能的实现配方功能允许用户保存多套参数一键切换是实现柔性生产的关键。现代中高端触摸屏都内置了强大的配方功能。实现步骤在触摸屏软件中创建配方新建一个配方命名为“轮毂分拣参数”。定义配方元素将HMI_ChannelSelect,HMI_TargetRow,HMI_TargetCol,HMI_Speed等变量添加为配方元素。创建配方记录在配方下创建多条记录如“型号A参数”、“型号B参数”、“型号C参数”并为每条记录设置好对应的参数值。在画面上组态配方控件添加“配方视图”控件关联到“轮毂分拣参数”配方。控件会以表格形式显示所有记录用户可以直接在表格中修改数值。添加“保存配方”、“加载配方”、“新建记录”、“删除记录”按钮并配置其数据传送操作。数据存储配方数据可以存储在触摸屏的内部闪存或外插的SD卡中断电不丢失。当用户在生产前只需在触摸屏上选择“型号B参数”点击“加载”所有相关的参数就会自动从配方写入到对应的HMI变量并通过通信自动下载到PLC的FB输入引脚中。整个换产过程在几秒钟内完成无需任何编程操作。5. 仿真、调试与现场问题排查实录5.1 PLC与触摸屏的联合仿真在项目开发中期联合仿真能发现大部分逻辑错误节省大量现场调试时间。西门子TIA Portal平台下的仿真流程启动PLC仿真PLCSIM在TIA Portal中将项目下载到仿真的PLC。启动HMI仿真在WinCC Advanced中点击“使用仿真器启动”。建立连接确保HMI仿真器的连接指向PLCSIM的IP地址通常是127.0.0.1。调试在PLCSIM中可以强制或修改输入点I点的状态模拟传感器信号。在HMI仿真画面上操作按钮、修改参数。在TIA Portal的“监控与强制表”中在线查看FB实例内部所有变量的实时状态特别是状态机变量state和步骤o_CurrentStep这是调试的“上帝视角”。三菱GX Works3 GT Simulator3流程类似先启动GX Simulator3仿真PLC再启动GT Simulator3仿真触摸屏并进行关联。踩坑记录仿真时最常见的错误是通信连接失败。务必检查三点① PLC与HMI项目中的IP地址、站号是否一致② 仿真软件的网络适配器设置是否正确通常需要设置为“PN/IE”或“回环地址”③ PLC程序是否已经处于“RUN”模式。一个笨办法但有效关闭所有仿真软件和工程重启电脑然后严格按照先PLC仿真、后HMI仿真的顺序启动。5.2 现场调试核心环节与技巧现场调试是检验设计的最终环节遵循“先静态后动态先手动后自动”的原则。第一步上电检查与通信测试给PLC和触摸屏上电观察指示灯是否正常。在触摸屏上进入“通信状态”画面如果有查看与PLC的连接状态是否为“OK”。在手动画面中点动一个输出点如一个指示灯用万用表测量对应PLC输出端子是否有电压变化确认硬件接线和输出模块正常。第二步手动模式调试在触摸屏手动画面中逐个测试每个气缸的伸出、缩回每个电机的正转、反转。关键技巧测试时让人守在气缸或电机旁一手放在急停按钮上。点动一下观察动作方向是否正确行程是否到位。如果方向反了立即拍急停然后在程序中修改输出点的逻辑或者交换气缸的电磁阀接线。永远不要相信图纸是100%正确的。第三步自动流程单步调试将系统切换到自动模式但先不要连接真实的传感器。在PLC编程软件中在线使用“强制”功能模拟传感器的信号。例如当流程走到“等待上料”状态时强制io_SensorBegin和io_RobotDone为TRUE观察程序是否能顺利进入下一步。通过这种“半实物仿真”可以验证整个FB状态机的逻辑是否正确各个延时和互锁是否生效。第四步全自动联调连接所有真实传感器拿一个真实的工件或模拟工件进行测试。重要安全措施第一次全自动运行速度参数i_ConveyorSpeed务必设置为一个较低的值如0.2延时参数设置得长一些。观察整个流程是否平顺有无碰撞风险。在触摸屏上修改参数如换一个通道测试用户编程功能是否生效。5.3 常见问题排查速查表以下是我在多年项目中总结的用户可编程系统最常见的几类问题及排查思路问题现象可能原因排查步骤触摸屏上参数修改后设备动作无变化1. 通信中断。2. HMI变量未正确链接到PLC地址。3. PLC中FB的输入引脚未被主程序调用或连接。4. PLC程序处于“STOP”模式。1. 检查HMI通信状态指示灯/画面。2. 在线监控PLC中对应地址的值在HMI修改参数看PLC中值是否变化。3. 检查主程序OB1中是否调用了FB实例且引脚连接正确。4. 查看PLC运行状态。流程执行到某一步骤停止不动1. 状态转换条件不满足。2. 传感器故障或信号未到达。3. 定时器时间设置过长。4. 互锁条件阻止。1. 在线监控FB内部state和o_CurrentStep变量确定卡在哪一步。2. 监控该步骤的转换条件变量检查传感器信号是否正常。3. 检查该步骤使用的定时器当前值是否在增加。4. 检查是否有急停、安全门等全局互锁信号被触发。触摸屏显示“通信错误”或“连接失败”1. 网线松动或损坏。2. IP地址冲突或设置错误。3. PLC与HMI子网掩码不一致。4. 防火墙或杀毒软件阻止。1. 重新插拔网线更换网线测试。2. 用电脑Ping PLC和HMI的IP地址检查连通性。3. 核对两者IP和子网掩码如255.255.255.0。4. 临时禁用电脑防火墙测试仅调试时。用户保存的配方数据丢失1. 配方未执行“保存到存储卡”操作。2. 触摸屏存储介质如SD卡损坏。3. 断电前数据还在缓存未写入永久存储。1. 确认用户操作是“保存”而非“仅修改内存”。2. 检查触摸屏存储卡是否接触良好尝试格式化后重新下载配方。3. 在HMI程序中为关键配方增加“自动周期保存”或“退出画面时自动保存”的逻辑。修改参数后设备动作异常如速度过快1. PLC程序侧缺乏参数限幅保护。2. HMI控件输入范围设置错误。3. 工程单位换算错误。1. 在FB的启动逻辑中状态0增加参数有效性判断和限幅。2. 检查HMI数字输入框的“上限值”、“下限值”属性。3. 确认HMI上设定的速度值如0.5与PLC程序中驱动器的速度给定值如500rpm之间的换算关系是否正确。6. 项目总结与进阶思考通过这个“用户可编程的物料分拣控制项目”我们实践了一套从硬件选型、软件架构设计、核心功能块编程到人机界面组态的完整方法论。其核心价值在于将稳定的控制逻辑与可变的工艺参数解耦通过触摸屏这个友好桥梁把有限的、安全的“编程权”下放给用户。在实际操作中有几点体会特别深刻第一前期规划重于后期编码。花时间定义清晰的FB接口和HMI画面框架后期调试能省下一半的力气。第二仿真测试不可或缺。它不仅能验证逻辑更是向客户展示方案、进行培训的好工具。第三文档和注释就是给未来的自己或同事的情书。在FB和复杂逻辑旁写下“为什么这么做”半年后回来看会感激不尽。这个项目还可以进一步扩展。例如引入用户权限管理不同级别的账号能修改的参数范围不同增加数据追溯功能将每次生产的参数、结果、操作员记录到数据库或者加入简单的视觉引导通过相机识别轮毂型号自动调用对应的分拣配方。这些扩展都可以在现有分层架构上平滑地增加而这正是优秀设计带来的强大生命力。