Как определить параметры препроцессора в Codesys? - PullRequest
1 голос
/ 08 марта 2020

Мне нужно создать определенное количество 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 оператор - который, как мы хорошо знаем, принимает только константы по своим индексам, а не переменные.

Однако каждое изменение, внесенное в одну структуру, должно быть реорганизованным в другую структуру, в действительности это небезопасный подход при разработке «лучших практик».

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что если я создам CONST значений в глобальном списке переменных (GVL), он не имеет приоритета во временной шкале компиляции, я имею в виду, структурирует сначала оценивается.

Другой вариант был с использованием Pragmas , но он работает только в пределах определенной c области действия, что означает, что он не будет действовать как «глобальный». параметры '.

Я просто хотел определить каждый параметр выше перед компиляцией таким образом, чтобы я мог определить только один раз, разделив один на другой на 2.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Вам понадобится только одна структура.

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
0 голосов
/ 10 марта 2020

Если вы не хотите использовать постоянные глобальные переменные, а просто «определяете», как в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...