#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 низшей средой разработки.