Конечный автомат CodeSys 2.3

Каков наилучший способ сделать эффективный и гибкий конечный автомат (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

person Andrew    schedule 26.12.2015    source источник


Ответы (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 невозможно использовать неполные указатели. Единственный вариант, который у вас есть, это создать POINTER TO BYTE Затем, когда вам нужно использовать указатель, создайте новый, который указывает на структуру данных, которую вы хотите использовать, и передайте адрес.

person Stefan Roelofs    schedule 08.06.2016