如何在 Yaskawa MotionWorks IEC 3 中声明数据类型 ENUM?
How to declare data type ENUM in Yaskawa MotionWorks IEC 3?
我正在尝试在 MotionWorks 中添加我自己的枚举。
创建新数据类型后,唯一可用的类型是 ARRAY、STRING、STRUCT。
编写以下代码:
TYPE SimulationType:
(
Passing := 0,
Random := 1,
Failing := 2
) INT := 0;
END_TYPE
不编译。
Yaskawa 似乎遵守 ENUM(根据 this list),但我不知道如何声明它。
编辑:
我可以做到以下几点:
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;
这是我为 Schneider 提供的 IEC61131,所以它应该是相同的
TYPE E_HomeLimitSwitch:
(
ePositiveDirectionRisingEdge := 0,
eNegativeDirectionRisingEdge := 1,
ePositiveDirectionFallingEdge := 2,
eNegativeDirectionFallingEdge := 3
);
END_TYPE
我认为你 INT:=0
不应该在那里。
您只能将默认值设置为您的本地枚举成员之一。不要像您尝试的那样使用其他值甚至数字。
在第 6 行试试这个:
) INT := 通过;
MotionWorks 中的枚举在数据类型中声明如下例:
TYPE
MyEnum:(Zero,One,Two,Three);
END_TYPE
无法为 MotionWorks 中的 ENUM 赋值。第一个枚举将始终等于 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 不能在 MotionWorks 的 CASE 语句中使用。
与 Codesys 不同,Yaskawa 的 MotionWorksIEC 不完全支持枚举。在 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),存在一些差异。为澄清起见,案例中缺少枚举并不会使 Multiprog 成为劣等 IDE.
我正在尝试在 MotionWorks 中添加我自己的枚举。 创建新数据类型后,唯一可用的类型是 ARRAY、STRING、STRUCT。
编写以下代码:
TYPE SimulationType:
(
Passing := 0,
Random := 1,
Failing := 2
) INT := 0;
END_TYPE
不编译。 Yaskawa 似乎遵守 ENUM(根据 this list),但我不知道如何声明它。
编辑: 我可以做到以下几点:
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;
这是我为 Schneider 提供的 IEC61131,所以它应该是相同的
TYPE E_HomeLimitSwitch:
(
ePositiveDirectionRisingEdge := 0,
eNegativeDirectionRisingEdge := 1,
ePositiveDirectionFallingEdge := 2,
eNegativeDirectionFallingEdge := 3
);
END_TYPE
我认为你 INT:=0
不应该在那里。
您只能将默认值设置为您的本地枚举成员之一。不要像您尝试的那样使用其他值甚至数字。
在第 6 行试试这个:
) INT := 通过;
MotionWorks 中的枚举在数据类型中声明如下例:
TYPE
MyEnum:(Zero,One,Two,Three);
END_TYPE
无法为 MotionWorks 中的 ENUM 赋值。第一个枚举将始终等于 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 不能在 MotionWorks 的 CASE 语句中使用。
与 Codesys 不同,Yaskawa 的 MotionWorksIEC 不完全支持枚举。在 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),存在一些差异。为澄清起见,案例中缺少枚举并不会使 Multiprog 成为劣等 IDE.