Как объявить тип данных ENUM в Yaskawa MotionWorks IEC 3?

#enums #plc #iec61131-3

#перечисления #plc #iec61131-3

Вопрос:

Я пытаюсь добавить свое собственное перечисление в MotionWorks. После создания нового типа данных единственными доступными типами являются ARRAY, STRING, STRUCT.

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

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

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

Редактировать: я могу сделать следующее:

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

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

Правка 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;
  

Ответ №1:

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

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

Перечислениям в 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
  

Перечисления не могут использоваться в операторах CASE в MotionWorks.

Ответ №2:

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

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

Я не думаю, что вам INT:=0 следует там присутствовать.

Комментарии:

1. К сожалению, это не работает с Yaskawa. Если я удаляю места размещения, то он компилируется, но, похоже, создает структуру некоторого типа вместо enum.

Ответ №3:

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

Комментарии:

1. Он не будет компилироваться с какой-либо цифрой / типом / словом в объявлении. Когда значение по умолчанию не установлено, он компилируется, но enum объявлен неправильно. Похоже, что он компилируется как структура.

2. Что ж, я запустил ваш код из «Edit 2» в моем Beckhoff PLC (также IEC61131-3), и он компилируется и выполняется отлично. После сброса ExpectedResultType сбрасывается на ‘Fail (0)’, и запись в него ‘Random’ или ‘Fail’ также работает в этом случае. Вы уверены, что ваша программа по-прежнему такая же, как ваша «Edit 2»?

3. Я работаю с Beckhoff с начала 2016 года, и перечисления там действительно работают очень хорошо. Но вопрос в том, что Yaskawa MotionWorks 3 намного хуже. Twincat от Beckhoff, как и многие другие производители, основан на CoDeSys. Однако MotionWorks основан на какой-то другой системе. Их реализация отличается. Теоретически синтаксис кода должен быть похожим, но это не так.

Ответ №4:

в отличие от Codesys, Yaskawa MotionWorksIEC не полностью поддерживает перечисления. На языке ST использование enum довольно популярно в операторах CASE, но MotionWorksIEC не поддерживает использование enum в операторах case.

Но вы все равно можете определять перечисления, как показано ниже.

 TYPE
PackMLState:(Starting,Starting,Aborting,Aborted,Helding,Held,Etc);
END_TYPE
  

Тип enum можно использовать как;

 IF machineState = PackMLState#Starting THEN
;;
END_IF
  

Сравнивая Codesys и MotionWorksIEC (которые в основном являются Phoenix Contact, KW Software Multiprog), есть некоторые различия. Для пояснения, отсутствие использования enum в Cases не делает Multiprog низшей средой разработки.