Каков наилучший способ сделать эффективный и гибкий конечный автомат (SM) в IEC61131-3/CodeSyS v2.3? Есть ли хорошие примеры реализации SM на CodeSys V2.3?
Насколько я понимаю, есть 3 разных типа СМ:
1. Логика случая SM - простая, просто измените состояния на основе логики if, совсем не гибкая, сложная в обслуживании.
2. SM с табличным управлением - лучше, но без указателей на функции нужны дополнительные условные инструкции для выполнения некоторых действий на основе текущего состояния.
3. State Design Pattern SM - лучший вариант, гибкий, без громоздких операторов CASE, без дублирования.
Я пытаюсь принять C State Design Patter Адама Торнхилла: 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