1

在 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
4

1 回答 1

1

我们只是对我们的机器使用简单的 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 中不可能使用不完整的指针。您唯一的选择是创建一个指向字节的指针然后当您需要使用指针时,创建一个指向您要使用的数据结构的新指针,并传递地址。

于 2016-06-08T10:34:09.447 回答