Ссылаясь на константу из библиотеки, twincat 3

Я пытаюсь создать библиотеку twincat 3, которая делает что-то, используя глобальные константы, определенные в основном проекте, например, создает массивы размером с эти константы и циклически перебирает их. Однако я потерпел неудачу, и мне интересно, можно ли это сделать. Я просто получаю эту ошибку «Ошибка 4 Граница« cPassedConstant »массива не является постоянным значением», когда я пытаюсь построить основной проект. Ошибка исходит из массива, определенного в библиотеке.

Я попытался создать GVL с одноименной константой в библиотеке, а затем установить для свойства «внешняя реализация» значение true, но это не помогает.

Моя цель здесь — создать библиотеку управления вводом-выводом с фильтрацией и тому подобное. И тогда я мог бы просто добавить его в основной проект и определить некоторые константы, такие как «cDigitalIputsCount», «cAnalogInputCount» и так далее.


person Jari Koivuluoma    schedule 08.12.2017    source источник
comment
Я не очень понимаю проблему. Массивы, использующие константы, возможны, даже если константа находится в библиотеке. Не могли бы вы предоставить код с четким разделением того, что находится в библиотеке, а что в другом проекте?   -  person Felix Keil    schedule 09.12.2017
comment
Я специально хочу, чтобы константа была определена в основном проекте и использовалась библиотекой. Допустим, я хочу создать систему, например, с 10 аналоговыми входами/выходами.   -  person Jari Koivuluoma    schedule 09.12.2017
comment
... Затем я бы включил свою библиотеку ввода-вывода в основной проект, определив глобальную константу cAINs: UINT := 10; а затем в MAIN я бы вызвал PRG_IO POU, который находится в библиотеке. В PRG_IO будет ARRAY[1..cAINs] FB_AnalogIn, который будет выполняться в цикле for. Также в библиотеке будет функция F_GetAnalogIn, которая будет получать отфильтрованное/масштабированное значение AI для FB. Дело в том, что я мог бы легко создать систему ввода-вывода с переменным количеством операций ввода-вывода, просто включив библиотеку, определив несколько констант и вызвав PRG_IO. Теперь ты понимаешь?   -  person Jari Koivuluoma    schedule 09.12.2017


Ответы (3)


Возможно, вместо этого вы сможете обойтись новой функцией ARRAY[*], хотя она все еще очень ограничена. Нет другого способа, кроме как определить константу в библиотеке.

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

Сбивает с толку в TwinCat3 то, что вы можете создавать успешные проекты с ошибками программирования внутри. Компилятор TwinCat3 допускает неработающий код внутри проекта, пока он не вызывается. Поэтому, когда вы отправляете библиотеки, вы всегда должны использовать «Проверить все объекты».

person Felix Keil    schedule 10.12.2017

Вам следует проверить функцию Beckhoff под названием Список параметров. . Добавив список параметров в проект библиотеки, вы можете переопределить константы библиотеки в проекте, использующем библиотеку. Определение происходит в менеджере библиотек.

Изображение с сайта Beckhoff: введите здесь описание изображения

Я думаю, что это должно сделать это. Конечно, другой вариант — использовать параметр ARRAY[*], что тоже прекрасно (для мира программирования ПЛК). Проблема со списками параметров заключается в том, что это переопределение всего проекта. Использование ARRAY[*] позволяет динамически изменять размер.

person Quirzo    schedule 29.01.2018

Я бы предложил использовать ARRAY[*] переменной длины, как описано в приведенной ниже ссылке (а также в Beckhoff/Infosys, раздел DataTypes/Array).

Дело в том, что вы должны объявить ARRAY[1..cAINs] для FB_AnalogIO в вашей основной программе (она знает FB_AnalogIO из вашей аналоговой библиотеки и может объявить его с постоянным размером).

Затем PRG_IO следует изменить либо на функцию, либо на функциональный блок, чтобы он принимал ARRAY[*] как VAR_IN_OUT, не зная точного размера.

https://stefanhenneken.wordpress.com/2016/09/27/iec-61131-3-arrays-with-variable-length/

person pboedker    schedule 11.12.2017
comment
Благодарю вас! Я не знал о такой функции. Я посмотрю на это. - person Jari Koivuluoma; 11.12.2017