在Codesys中,如何定义预处理器参数?

问题描述 投票:1回答:1

我需要创建一定数量的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。

plc codesys structured-text iec61131-3
1个回答
0
投票

如果您不想使用常量全局变量,而只是像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
© www.soinside.com 2019 - 2024. All rights reserved.