2

我正在尝试在 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;
4

4 回答 4

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 语句中。

于 2019-03-20T11:32:53.560 回答
1

这就是我为施耐德所拥有的 IEC61131,所以它应该是相同的

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

我认为你INT:=0不应该在那里。

于 2019-03-14T13:39:39.657 回答
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。

于 2021-02-21T17:24:19.717 回答
0

您只能将默认值设置为您的本地枚举成员之一。不要像您尝试的那样使用其他值甚至是数字。
在第 6 行尝试这个
:) INT := Passing;

于 2019-03-14T14:15:10.873 回答