Как объявить тип данных ENUM в Yaskawa MotionWorks IEC 3? - PullRequest
2 голосов
/ 14 марта 2019

Я пытаюсь добавить свой собственный enum в MotionWorks. После создания нового типа данных доступны только следующие типы: ARRAY, STRING, STRUCT.

Написание следующего кода:

TYPE SimulationType:
(
    Passing :=  0,
    Random  :=  1,
    Failing :=  2
) INT := 0;
END_TYPE

не компилируется. Яскава, кажется, соответствует ENUM (согласно этому списку ), но я не могу понять, как это объявить.

Edit: Я могу сделать следующее:

TYPE
    ResultType:(Pass, Random, Fail);
END_TYPE

Но это, кажется, не создает перечисление, так как я не могу получить доступ к его значению. Я могу получить к нему доступ как к структуре.

Редактировать 2:

Если я заявляю:

TYPE
    ResultType:(Pass, Random, Fail);
END_TYPE

И установить переменную

ExpectedResultType : ResultType;

Тогда в коде я пытаюсь использовать:

IF ExpectedResultType = ResultType.Pass THEN
    Done := TRUE;
END_IF;

Он компилируется, но не запускается.

Попытка использовать этот код не скомпилируется:

CASE ExpectedResultType OF
    ResultType.Pass:
        Done := TRUE;
        Error := FALSE;
    ResultType.Random:
        Done := TRUE;
    ResultType.Fail:
        Error := TRUE;
        Done := FALSE;
END_CASE;

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Перечисления в MotionWorks объявляются в типах данных, как в этом примере:

TYPE
    MyEnum:(Zero,One,Two,Three);
END_TYPE

ENUM в MotionWorks нельзя присвоить значение. Первое перечисление всегда будет равно 0 (ноль), второе - 1 (один) и т. Д.

Тогда перечисления могут использоваться в IF .. END_IF предложениях, подобных этому:

Я назову мою переменную "i". Переменная должна быть объявлена ​​ как INT. Любой другой тип не будет работать. В коде используйте это так:

IF i = MyEnum#Zero THEN
 (* do some work *)
ELSIF i = MyEnum#One THEN
 (* do some other work *)
END_IF

ENUM нельзя использовать в инструкциях CASE в MotionWorks.

0 голосов
/ 14 марта 2019

Вы можете установить значение по умолчанию только для одного из ваших локальных членов enum. Не для других значений или даже числа, как вы пытались.
Попробуйте вместо этого в строке 6:
) INT: = Проходящий;

0 голосов
/ 14 марта 2019

Это то, что у меня есть для Schneider, то есть IEC61131, поэтому оно должно быть таким же

TYPE E_HomeLimitSwitch:
(
  ePositiveDirectionRisingEdge := 0,
  eNegativeDirectionRisingEdge := 1,
  ePositiveDirectionFallingEdge := 2,
  eNegativeDirectionFallingEdge := 3
);
END_TYPE

Я не думаю, что вы INT:=0 должны быть там.

...