标题:扔掉西门子那坨“迷宫”——我用 ST 手搓的 Codesys OMAC 状态机,一小时就能跑
Codesys OMAC状态机 inoproshop版 PackML模板 自己用ST语言写的OMAC状态机比西门子官方的状态机简单N倍会codesys 1-2天能看懂。西门子那个状态机看半年还是懵的不建议用。 inoproshop版本V1.9.0.1程序没有任何密码。先说结论把西门子官方那套 PackML 状态机直接删了吧看半年还是懵不如我自己 200 行 ST 代码来得痛快。下面这套模板在 Inoproshop V1.9.0.1 里跑得好好的没密码直接 CtrlC / CtrlV 就能玩。一、先给你看看“迷宫”长啥样西门子官方示例此处省略 5000 行 SCL 和 20 个嵌套 FB看得我脑仁疼我的版本核心就 3 个文件PackMLTop.FB顶层调度StateTable.TcDUT枚举PackMLTest.PRG10 行 Demo二、枚举先定好别整花里胡哨TYPE PackMLState : ( Cleared : 0, Stopped : 1, Starting : 2, Idle : 3, Suspended : 4, Execute : 5, Stopping : 6, Aborting : 7, Aborted : 8, Holding : 9, Held : 10, Unholding : 11, Resetting : 12 ); END_TYPE就这么 13 个状态OMAC 标准里规定的不多不少。别想着再加“WaitForCoffee”这种奇奇怪怪的状态真没必要。三、核心状态机200 行以内打住FUNCTION_BLOCK PackMLTop VAR_INPUT iStart : BOOL; // 外部按钮 iStop : BOOL; iAbort : BOOL; iReset : BOOL; iCmdSuspend : BOOL; iCmdUnsuspend: BOOL; END_VAR VAR_OUTPUT oState : PackMLState; END_VAR VAR fsm : PackMLState : Cleared; END_VAR真正的状态迁移逻辑用 CASE 一把梭CASE fsm OF Cleared: IF iReset THEN fsm : Resetting; END_IF Resetting: // 这里随便塞点初始化代码 fsm : Stopped; Stopped: IF iStart THEN fsm : Starting; END_IF Starting: // 假设启动电机、开阀门 fsm : Idle; Idle: IF iStart THEN fsm : Execute; ELSIF iStop THEN fsm : Stopping; END_IF Execute: // 正常生产节拍 IF iStop THEN fsm : Stopping; ELSIF iAbort THEN fsm : Aborting; ELSIF iCmdSuspend THEN fsm : Suspended; END_IF Stopping: // 减速、关阀 fsm : Stopped; Aborting: // 紧急停车 fsm : Aborted; Aborted: IF iReset THEN fsm : Resetting; END_IF Suspended: IF iCmdUnsuspend THEN fsm : Execute; END_IF END_CASE oState : fsm;就这么简单。Codesys OMAC状态机 inoproshop版 PackML模板 自己用ST语言写的OMAC状态机比西门子官方的状态机简单N倍会codesys 1-2天能看懂。西门子那个状态机看半年还是懵的不建议用。 inoproshop版本V1.9.0.1程序没有任何密码。没有嵌套 5 层的 CASE没有 20 个接口指针没有“动态绑定”这种玄学。四、10 行 Demo 跑起来PROGRAM PackMLTest VAR top : PackMLTop; pbStart : BOOL; pbStop : BOOL; pbAbort : BOOL; pbReset : BOOL; END_VAR top( iStart : pbStart, iStop : pbStop, iAbort : pbAbort, iReset : pbReset, oState );把pbStart绑到 HMI 按钮跑一圈Stopped → Starting → Idle → Execute → Stopping → StoppedHMI 上状态灯一路闪爽。五、你可能想问的几个坑Execute 里怎么做循环直接在里面写IF Step 10 THEN Step : 0 END_IF就行别搞子状态机越简单越稳。报警怎么处理在 Execute 里检测到报警 →fsm : Aborting完事。报警清除后给iReset又回到 Resetting。想加 OEE 统计在 Execute 里加计数器在 Idle/Stopped 里算时间别在状态机里塞一堆杂活保持干净。六、源码自取把下面三坨文件直接丢进 Inoproshop 工程PackMLTop.FBStateTable.TcDUTPackMLTest.PRG没有加密没有版权随便改。要是改崩了CtrlZ 就行反正 200 行不到一眼能看全。最后一句状态机这玩意儿大道至简别把自己绕进西门子的“设计模式”里。