
今天给大家分享一个 PLC 主流程和子程序设计系统化方法,从工程实践出发,既强调可维护性,也考虑扫描机制和任务管理。 一、设计原则 1.主流程保持简洁、稳定 ①主流程只做任务调度、步序管理、通信刷新和关键安全判断。 ②避免在主流程中写复杂循环或长时间等待(比如 WHILE 等待轴完成)。 ③主流程类似“调度中心”或“总控大脑”,决定哪一步该执行什么子程序。 2.子程序模块化 ①每个子程序完成一个明确功能,例如: 某个气缸伸缩动作 一个输送机构动作 报警处理逻辑 一个伺服轴单次运动命令 ②子程序要只关心自己的任务,不依赖全局复杂状态。 输入输出尽量通过参数传递或映射到内部变量,避免主流程直接操控子程序内部细节。 3.状态机思想 每个动作或流程最好用步序/状态机实现,而不是单纯用循环等待。 每个状态对应一个动作请求或判断条件,下一状态根据完成或异常条件转移。 结合 PLC 扫描机制,状态机可以保证动作不会阻塞主循环。 二、主流程设计 1. 主流程结构示意 主循环 (Main Program / Main Task) ①输入采样 ② 系统安全判断 (急停、限位、报警) ③ 模式判断 (自动 / 手动 / 调试) ④ 步序控制调用子程序 (状态机判断,触发动作)⑤ 子程序执行监控 (完成/异常) ⑥ 输出刷新 ⑦ 通信/诊断/后台任务 主流程做状态/模式管理 + 子程序调度。 不要在主流程里直接操作输出,而是通过子程序封装。 如果有多个任务,主流程可以调用周期任务/事件任务/高速任务。 2. 主流程特点 特性 | 说明 | 扫描周期短 | 保证输入采样及时,输出刷新不延迟 | 不阻塞 | 避免 WHILE 或长延时 | 统一调度 | 所有子程序都通过状态机或标志位触发 | 错误安全 | 主流程先做安全检查,再执行动作 |
三、子程序设计 1. 子程序的职责 ①每个子程序完成一个独立功能单元。 ②子程序接收输入参数/标志位,输出完成、忙碌、错误信号。 ③子程序不直接访问全局输出端子,输出通过映像区或者主流程统一刷新。 示例接口 SubProgram: CylinderExtendInputs:Enable : BOOLSafetyOK: BOOLOutputs:Done : BOOLBusy : BOOLError : BOOLInternal:Step : INT // 状态机步号 <b>2. 子程序内部结构 使用 步序控制/状态机: Step 0: 初始化Step 10: 发出伸出命令Step 20: 等待传感器到位Step 30: 结束,Done = TRUEStep 900: 异常处理 特点: <b>①非阻塞:每一扫描周期只判断一次,不停循环等待。 ②完成/忙碌/错误标志:主流程根据这些标志判断是否进入下一步。 ③安全检查:内部检查限位、传感器、急停等异常。 3. 子程序示例 (伺服运动) CASE Step OF 0: // 初始化 Done := FALSE; Busy := FALSE; Error := FALSE; IF Enable AND SafetyOK THEN Step := 10; 10: // 发出运动命令 SendAxisCommand(PosTarget); Busy := TRUE; Step := 20; 20: // 等待轴完成 IF AxisDone THEN Step := 30; IF AxisError THEN Step := 900; 30: // 完成 Done := TRUE; Busy := FALSE; Step := 0; 900: // 异常 Error := TRUE; Busy := FALSE; Step := 0;END_CASE; <b>说明: ①每次扫描只执行一个状态判断。 ②主流程轮询 Done/Busy/Error,决定下一动作。 ③不阻塞主循环,保证其他动作和通信正常执行。 四、主流程调用子程序 假设生产线有三步动作:伸气缸 → 伺服定位 → 启动输送带。 主流程伪代码: // 主流程循环ScanCycle: // 1. 输入采样& 安全判断 ReadInputs(); IF NOT SafetyOK THEN StopAllOutputs(); RETURN; // 2. 步序管理 CASE Step OF 0: CylinderExtend(Enable := TRUE, SafetyOK := SafetyOK); IF CylinderExtend.Done THEN Step := 10; 10: ServoMove(Enable := TRUE, Target := Pos1); IF ServoMove.Done THEN Step := 20; 20: ConveyorStart(Enable := TRUE); Step := 30; 30: // 循环下一产品 Step := 0; END_CASE; // 3. 输出刷新 WriteOutputs(); 特点: ①主流程只负责<b>调度与状态管理。 ②子程序内部处理具体动作和错误。 ③这样程序可读性高、维护简单、方便调试。 五、设计建议 1.按功能划分子程序: ①气缸控制 ②伺服运动 ③计数/定时 ④报警处理 ⑤模式切换/主流程 2.输入输出参数化: ①避免子程序直接操作物理端子 ②通过参数或映像区通信 3.状态机 + 标志位: ①非阻塞 ②扫描周期安全 ③易于多任务调度 4.统一主流程结构: 安全判断 → 模式判断 → 步序/子程序 → 输出刷新 → 通信/后台 5.调试与仿真: ①子程序独立调试 ②主流程只调度,减少复杂交互 总结 ①主流程:调度中心,管理步骤/模式/安全,不阻塞。 ②子程序:独立功能块,内部状态机控制具体动作,提供完成/忙碌/错误标志。 ③扫描机制适配:主流程循环调度,子程序每扫描周期只做状态判断,避免WHILE 等待阻塞。 ④输出刷新:统一由主流程映射,保证程序顺序可控。 --- 往期热门文章: </b></b></b></b> 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |