抖音粉丝群1
『7x24小时有问必答』

今天给大家分享一个  PLC  主流程和子程序设计系统化方法,从工程实践出发,既强调可维护性,也考虑扫描机制和任务管理。
一、设计原则
1.主流程保持简洁、稳定
①主流程只做任务调度、步序管理、通信刷新和关键安全判断。  
②避免在主流程中写复杂循环或长时间等待(比如  WHILE  等待轴完成)。
③主流程类似调度中心总控大脑,决定哪一步该执行什么子程序。  
2.子程序模块化
①每个子程序完成一个明确功能,例如:  
某个气缸伸缩动作  
一个输送机构动作  
报警处理逻辑  
一个伺服轴单次运动命令  
②子程序要只关心自己的任务,不依赖全局复杂状态。  
输入输出尽量通过参数传递或映射到内部变量,避免主流程直接操控子程序内部细节。  
3.状态机思想
每个动作或流程最好用步序/状态机实现,而不是单纯用循环等待。
每个状态对应一个动作请求或判断条件,下一状态根据完成或异常条件转移。  
结合  PLC  扫描机制,状态机可以保证动作不会阻塞主循环。  
二、主流程设计
1.  主流程结构示意
主循环  (Main Program / Main Task)                                                                           
输入采样                                         
②  系统安全判断  (急停、限位、报警)                 

③  
模式判断  (自动  /  手动  /  调试)                    

④  
步序控制调用子程序  (状态机判断,触发动作)

⑤  
子程序执行监控  (完成/异常)                        

⑥  
输出刷新                                                     

⑦  
通信/诊断/后台任务                                    
主流程做状态/模式管理  +  子程序调度
不要在主流程里直接操作输出,而是通过子程序封装。  
如果有多个任务,主流程可以调用周期任务/事件任务/高速任务。  
2.  主流程特点
特性
说明
扫描周期短
保证输入采样及时,输出刷新不延迟
不阻塞
避免  WHILE  或长延时
统一调度
所有子程序都通过状态机或标志位触发
错误安全
主流程先做安全检查,再执行动作
三、子程序设计
1.  子程序的职责
①每个子程序完成一个独立功能单元。  
②子程序接收输入参数/标志位,输出完成、忙碌、错误信号
③子程序不直接访问全局输出端子,输出通过映像区或者主流程统一刷新。  
示例接口
SubProgram: CylinderExtendInputs:

Enable       : BOOL

SafetyOK: BOOL

Outputs:

Done          : BOOL

Busy          : BOOL

Error        : BOOL

Internal:

Step          : INT    //  
状态机步号
<b>2.  子程序内部结构
使用  步序控制/状态机
Step 0:  初始化Step 10:  发出伸出命令

Step 20:  
等待传感器到位

Step 30:  
结束,Done = TRUE

Step 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>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码