1

我需要创建一定数量的结构 类型对,它们将进一步用作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。

4

2 回答 2

0

您只需要一种结构。

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
于 2020-03-10T08:55:15.780 回答
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
于 2020-03-10T08:24:31.437 回答