【问题标题】:In Codesys, how to define pre-processors parameters?在 Codesys 中,如何定义预处理器参数?
【发布时间】:2020-06-20 17:18:35
【问题描述】:

我需要创建一定数量的 struct type 对,这些对将进一步用作 const 参数,并且具有基本相同的一组值,但按比例缩放一半,如下所示(给定一个 n 常量):

TYPE ADDR_1 :
    STRUCT  
        PARAMETER_A:    INT :=0;
        PARAMETER_B:    INT :=2;
        PARAMETER_C:    INT :=4;
        - - - 
        PARAMETER_n:    INT :=n; (* being n any number *)
    END_STRUCT
END_TYPE

以及相关对:

TYPE ADDR_2 :
    STRUCT  
        PARAMETER_X:    INT :=0/2;
        PARAMETER_Y:    INT :=2/2;
        PARAMETER_Z:    INT :=4/2;
        - - - 
        PARAMETER_n/2:  INT :=n/2;  (* being n any number *)
    END_STRUCT
END_TYPE

通过分别创建两个结构,它工作得很好,我使用它们创建一个 CONST 数组以在 SWITCH... 处使用CASE 语句 - 正如我们所熟知的,它只接受其索引处的常量,而不接受变量。

但是,在一个结构中所做的每一项更改都必须在另一个结构中进行重构,这在“最佳实践”设计方面确实不是一种安全的方法。

我现在面临的问题是,如果我在全局变量列表 (GVL) 中创建 CONST 值,它在编译时间线中没有优先级,我的意思是,首先评估结构。

另一种选择是使用 Pragmas,但它仅在特定范围内有效,这意味着它不会充当“全局参数”。

我只想在编译之前定义上述每个参数,这样我就可以定义一次,将一个除以 2。

【问题讨论】:

  • > 然而,在一个结构中所做的每个更改都必须在另一个结构中重构,就“最佳实践”设计而言,这确实不是一种安全的方法。如果您在那里进行更改,那么这些是常量吗?
  • 您使用的是 Codesys 2 还是 3?
  • 我使用 Twincat 3(它使用 Codesys 3 编译器)和来自 GVL 的常量测试了您的设置,并且没有编译错误。
  • 嗨@Filippo,我正在使用 Codesys 3
  • 嗨@Sergey,我在编程阶段的上下文中提到了“更改”,而不是在运行时。我想说的是,例如,如果我在一个结构中添加参数,我还需要在另一个结构中添加,具有相同的 (x2) 比例,如果我在这个计算中犯了错误,这将代表当前方法的弱点.

标签: plc codesys structured-text iec61131-3


【解决方案1】:

如果您不想使用常量全局变量,而只是像在 C 中那样“定义”,那么请使用 Pragmas

如果您希望您的 Pragma 具有全局范围,您可以将其放在全局变量列表中或使用继承。这是一个继承示例:

TYPE ST_Root :
STRUCT
    {IF defined (test) }
        n : INT := 1;
    {ELSE}
        n : INT := 2;
    {END_IF}
END_STRUCT
END_TYPE


TYPE ST_Derived EXTENDS ST_Root :
STRUCT
    x : INT := n + 1;
END_STRUCT
END_TYPE

【讨论】:

  • 你应该使用枚举作为你的 switch case 的索引。在你的情况下,只需使用 IF..ELSIF 语句。
【解决方案2】:

您只需要一个结构。

TYPE ADDR :
    STRUCT  
        PARAMETER_A:    INT :=0;
        PARAMETER_B:    INT :=2;
        PARAMETER_C:    INT :=4;
    END_STRUCT
END_TYPE

首先,将基数定义为常量。这将首先创建它。

VAR_GLOBAL CONSTANT
    MyADR: ADDR := (PARAMETER_A := 0, PARAMETER_B := 2, ...);
END_VAR

然后创建其他全局变量。

VAR_GLOBAL
    MyADRBy2: ADDR := (
        PARAMETER_A := MyADR.PARAMETER_A / 2, 
        PARAMETER_B := MyADR.PARAMETER_A / 2,
    ...);
END_VAR

【讨论】:

  • 你也可以只声明一个全局常量而不是一个常量结构实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2010-09-26
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多