我正在尝试在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;
答案 0 :(得分:2)
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语句中使用。
答案 1 :(得分:0)
这对于施耐德电气来说是IEC61131,因此应该相同
TYPE E_HomeLimitSwitch:
(
ePositiveDirectionRisingEdge := 0,
eNegativeDirectionRisingEdge := 1,
ePositiveDirectionFallingEdge := 2,
eNegativeDirectionFallingEdge := 3
);
END_TYPE
我不认为您INT:=0
应该在那里。
答案 2 :(得分:0)
您只能将默认值设置为本地枚举成员之一。不要尝试其他值甚至数字。
在第6行中尝试以下方法:
)INT:=通过;
答案 3 :(得分:0)
与 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),还是有一些区别的。澄清一下,在 Cases 中没有使用枚举并没有使 Multiprog 成为劣质的 IDE。