在IEC61131-3 / CodeSyS v2.3中创建高效灵活的状态机(SM)的最佳方法是什么?在CodeSys V2.3上有什么很好的SM实现的例子吗?
据我所知,SM有3种不同的类型:
1.用例逻辑SM -简单,仅根据if逻辑改变状态,一点也不灵活,很难维护。
2.表驱动的SM -更好,但没有函数指针,需要额外的条件指令来运行一些基于当前状态的操作。
3.状态设计模式SM -最佳选项,灵活,没有庞大的CASE语句,没有重复。
我正在尝试采用Adam Tornhill的C状态设计模式: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发布于 2016-06-08 18:34:09
我们只对我们的机器使用简单的CASE逻辑:
CASE iState OF
0:
if x then
iState := iState + 10;
end_if
10:
if y then
iState := iState + 10;
end_if
20:
etc..很简单,但它能做这件事。
在CODESYS中不可能使用不完整的指针。唯一的选择是创建一个指向BYTE的指针,然后当您需要使用该指针时,创建一个指向您想要使用的数据结构的新指针,并传递地址。
https://stackoverflow.com/questions/34471815
复制相似问题