0

我有一个在 codesys 3.5 中运行的结构化文本程序,我想在其中将某些电机的模式设置为多个值。为了获得良好的封装代码,我定义了以下结构:

{attribute 'strict'}
TYPE PD4_modes :
(
    no_mode := 0,
    position:= 1,
    velocity := 2,
    homing_mode := 3
) UINT;
END_TYPE

但是,一旦我尝试将此值分配给sint驱动电机模式的适当变量(an),如下所示:

mot1_ctrmode = PD4_modes.homing_mode

我得到错误:type PD4_modes cannot be cast to sint。这是为什么?我以为我在结构中将模式定义为 uint ?因此不需要铸造,对吧?我也试图删除该属性strict,但这并没有帮助......

4

2 回答 2

3

首先,SINT不一样UINT

  • SINT : S mall (signed) INT , 8 bits, (-128 to 127)
  • UINT :无符号 INT , 16 bits, (0 to 65535)

它们是完全不同的整数类型。如果需要,您可以将一个转换为另一个(只要数字适合另一种类型,否则您可能会丢失一些数据)。Quirzo已经表明,但简而言之,您可以使用该UINT_TO_SINT功能。另一种选择是使用UNION

但是,如果可以,您应该尝试更改其中一个或另一个的类型以匹配相同,或者更好的是,您可以定义mot1_ctrmodePD4_modes,让编译器为您完成这项工作。如果 和 的类型mot1_ctrmode匹配PD4_modes,您将避免从 ENUM 转换为原始整数。

如果您想避免从原始整数转换为 ENUM,那么您必须删除严格属性(这样做PD4_modes_enum_variable := mot1_ctrmode;{attribute 'strict'}出错C0358: 'mot1_ctrmode' is not a valid value for strict ENUM type 'PD4_modes'),或者使用我之前提到的 UNION。

于 2021-09-24T09:17:23.837 回答
2

您需要将枚举转换为 SINT。例如:

//Shorter way:
mot1_ctrmode  := TO_SINT(PD4_modes.homing_mode);

//Typical way
mot1_ctrmode  := UINT_TO_SINT(PD4_modes.homing_mode);

如果可能,您还可以考虑将枚举定义为 SINT 或将 mot1_ctrmode 定义为 UINT。所以不需要类型转换。

于 2021-09-24T07:15:08.523 回答