Как да декларирам тип данни ENUM в Yaskawa MotionWorks IEC 3?

Опитвам се да добавя собствено enum в 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;

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


Отговори (4)


Енумите в MotionWorks се декларират в типове данни като този пример:

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

На ENUM в MotionWorks не може да се присвоява стойност. Първото enum винаги ще бъде равно на 0 (нула), второто единица на 1 (едно) и т.н.

Тогава enum-ите могат да се използват в 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 за съжаление. Ако изтрия разположения, тогава се компилира, но изглежда създава структура от някакъв тип вместо enum. - person Ilya Dan; 14.03.2019

Можете да зададете стойността по подразбиране само на един от вашите локални enum членове. Не към други стойности или дори число, както опитахте.
Опитайте това вместо това в ред 6:
) INT := Преминаване;

person pboedker    schedule 14.03.2019
comment
Няма да се компилира с никаква цифра / тип / дума в декларацията. Когато не е зададена стойност по подразбиране, тя се компилира, но enum не е деклариран правилно. Изглежда, че се компилира като структура. - person Ilya Dan; 14.03.2019
comment
Е, стартирах вашия код от „Редактиране 2“ в моя Beckhoff PLC (също IEC61131-3) и той се компилира и работи перфектно. След нулиране ExpectedResultType се нулира на „Fail(0)“ и записването на „Random“ или „Fail“ в него също работи в случая. Сигурни ли сте, че вашата програма все още е същата като вашата „Edit 2“? - person pboedker; 15.03.2019
comment
Работя с Beckhoff от началото на 2016 г. и enums работят там наистина много добре. Но въпросът е за много по-лошия MotionWorks 3 на Yaskawa. Twincat на Beckhoff, както и много други производители, е базиран на CoDeSys. MotionWorks обаче е базиран на друга система. Изпълнението им е различно. Теоретично синтаксисът на кода трябва да е подобен, но не е. - person Ilya Dan; 15.03.2019

за разлика от Codesys, MotionWorksIEC на Yaskawa не поддържа напълно изброяване. В езика ST използването на enum е доста популярно в операторите CASE, но MotionWorksIEC не поддържа използването на enum в изразите case.

Но все още можете да дефинирате enum, както е показано по-долу.

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 по-лоша IDE.

person gundoganfa    schedule 21.02.2021