在 IEC61131-3 / CodeSyS v2.3 中制作高效灵活的状态机 (SM) 的最佳方法是什么?CodeSys V2.3 上有没有很好的 SM 实现示例?
据我了解,有 3 种不同类型的 SM:
1.Case logic SM——简单,只是根据if逻辑改变状态,一点都不灵活,难维护。
2.Table 驱动 SM - 更好,但没有函数指针,需要额外的条件指令来根据当前状态运行一些操作。
3.State Design Pattern SM - 最佳选择,灵活,没有大量的 CASE 语句,没有重复。
我正在尝试采用 Adam Tornhill 的 C State Design Pattern:http: //www.adamtornhill.com/Patterns%20in%20C%202,%20STATE.pdf 但从纯 C 语言转换为结构文本非常困难。CodeSys 支持功能块指针,但我不知道如何在 ST 中声明不完整的指针类型(甚至可能吗?):
/*C-style incomplite state pointer*/
typedef struct State* StatePtr;
struct State
{
EventFunc exampleFunc1;
EventFunc exampleFunc2;
}
{ST-style incomplite state pointer ???}
TYPE Sm_state_t :
STRUCT
State:POINTER TO ???;
END_STRUCT
END_TYPE