Как объявить тип данных ENUM в Yaskawa MotionWorks IEC 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

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

Редактировать 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;

person Ilya Dan    schedule 14.03.2019    source источник


Ответы (4)


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

person Ilya Dan    schedule 20.03.2019

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

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

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

person mrsargent    schedule 14.03.2019
comment
К сожалению, это не работает с Yaskawa. Если я стираю размещения, то он компилируется, но, похоже, создает структуру какого-то типа вместо перечисления. - person Ilya Dan; 14.03.2019

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

person pboedker    schedule 14.03.2019
comment
Он не будет компилироваться с какой-либо цифрой/типом/словом в объявлении. Если значение по умолчанию не установлено, оно компилируется, но перечисление объявлено неправильно. Похоже, он компилируется как структура. - person Ilya Dan; 14.03.2019
comment
Что ж, я запустил ваш код из «Edit 2» в своем ПЛК Beckhoff (также IEC61131-3), и он отлично компилируется и работает. После сброса ExpectedResultType сбрасывается на «Fail(0)», и запись в него «Random» или «Fail» также работает в этом случае. Вы уверены, что ваша программа все еще такая же, как ваша «Редактировать 2»? - person pboedker; 15.03.2019
comment
Я работаю с Beckhoff с начала 2016 года, и перечисления действительно работают там очень хорошо. Но речь идет о сильно уступающем MotionWorks 3 от Yaskawa. Twincat от Beckhoff, как и у многих других производителей, основан на CoDeSys. Однако MotionWorks основан на какой-то другой системе. Их реализация отличается. Теоретически синтаксис кода должен быть похожим, но это не так. - person Ilya Dan; 15.03.2019

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

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

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

Вы можете использовать тип перечисления как;

IF machineState = PackMLState#Starting THEN
;;
END_IF

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

person gundoganfa    schedule 21.02.2021