【问题标题】:How to cast enum to uint in structured text如何在结构化文本中将枚举转换为 uint
【发布时间】:2021-09-23 20:29:35
【问题描述】:

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

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

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

mot1_ctrmode = PD4_modes.homing_mode

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

【问题讨论】:

    标签: casting codesys structured-text


    【解决方案1】:

    首先SINTUINT不一样:

    • SINTSma​​ll(有符号)INT,8 位,(-128 到 127)
    • UINTU无符号INT,16 位,(0 到 65535)

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

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

    如果您想避免从原始整数转换为 ENUM,则必须删除 strict attribute(使用 {attribute 'strict'} 执行 PD4_modes_enum_variable := mot1_ctrmode; 会产生 C0358: 'mot1_ctrmode' is not a valid value for strict ENUM type 'PD4_modes' 错误),或者像我一样使用 UNION前面提到过。

    【讨论】:

      【解决方案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。所以不需要类型转换。

      【讨论】:

      • +1 对于这个答案,这确实可以解决我为自己没有弄清楚这个问题而感到难过的问题。我选择了 Guiorgys 的答案,因为他详细说明了一点……
      猜你喜欢
      • 1970-01-01
      • 2016-02-29
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多