Как в Codesys определить параметры препроцессора?

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

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


person aluis.rcastro    schedule 08.03.2020    source источник
comment
› Однако каждое изменение, внесенное в одну структуру, должно быть рефакторингом в другой структуре, что действительно небезопасно с точки зрения проектирования «наилучших практик». Насколько это константы, если вы вносите туда изменения?   -  person Sergey Romanov    schedule 09.03.2020
comment
Вы используете Codesys 2 или 3?   -  person Filippo Boido    schedule 09.03.2020
comment
Я протестировал вашу установку с помощью Twincat 3 (который использует компилятор Codesys 3) и константу из GVL и не обнаружил ошибок компиляции.   -  person Filippo Boido    schedule 09.03.2020
comment
Привет @Filippo, я использую Codesys 3   -  person aluis.rcastro    schedule 10.03.2020
comment
Привет @Sergey, я имел в виду изменения в контексте этапа программирования, а не во время выполнения. Я хотел сказать, что если, например, я добавляю параметры в одну структуру, мне нужно добавить и в другую структуру, имеющую тот же масштаб (x2). Если я допустил ошибку в этом расчете, это будет представлять собой слабость текущего подхода. .   -  person aluis.rcastro    schedule 10.03.2020
comment
Привет @Filippo, я использовал TwinCAT3 некоторое время назад, и поскольку он основан на Visual Studio IDE, там доступно много ресурсов. В любом случае, я имел в виду не упомянутую выше пару структур как проблему, а скорее отсутствие способа создать «глобальный» параметр директивы препроцессора (аналогично #define ), который будет использоваться в обеих структурах выше.   -  person aluis.rcastro    schedule 10.03.2020
comment
Значит, у вас нет проблем с тем, что n и n являются постоянной глобальной переменной?   -  person Filippo Boido    schedule 10.03.2020
comment
Вы сказали, что проблема, с которой я столкнулся сейчас, заключается в том, что если я создаю значения CONST в списке глобальных переменных (GVL), они не имеют приоритета на временной шкале компиляции, я имею в виду, что сначала оцениваются структуры. Но это неверно, вы можете создать свою структуру с предопределенной глобальной константой, и значение будет присвоено во время компиляции.   -  person Filippo Boido    schedule 10.03.2020
comment
Вы можете определить первую структуру в области CONSTANT, а другую в глобальных переменных, используя только константу в качестве основы для деления.   -  person Sergey Romanov    schedule 10.03.2020
comment
Я бы сказал, что решением будет использование обеих функций, которые вы рекомендовали; В частности, EXTENDS — это то, что до сих пор не приходило в голову, это кажется многообещающим. Что касается использования глобальной переменной, это невозможно сделать таким образом; обратите внимание, что, как сказано, эта структура будет использоваться в качестве индекса расположения switch...case, и в качестве индексов разрешены только константы. (Я буду обновлять эту ветку по мере продвижения в этом отношении)   -  person aluis.rcastro    schedule 11.03.2020


Ответы (2)


Если вы не хотите использовать постоянные глобальные переменные, а просто «определяете», как в 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
person Filippo Boido    schedule 10.03.2020
comment
Вы должны использовать перечисления для индексов вашего случая переключения. В вашем случае просто используйте операторы IF..ELSIF. - person Filippo Boido; 11.03.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
person Sergey Romanov    schedule 10.03.2020
comment
Вы также можете просто объявить глобальную константу вместо константного экземпляра структуры. - person Filippo Boido; 10.03.2020