PDA

Просмотр полной версии : Динамическое изменение свойств элементов в CodeSys 3.5



Кирилл28
04.03.2018, 18:19
Добрый день!
Подскажите пожалуйста, есть ли возможность (и как ее реализовать) в CodeSys v3.5 изменить свойства элемента из кода программы?
Например мне нужно изменить диапазон шкалы "Стрелочного индикатора" из панели СП207.

И еще нужно динамически менять ip адрес. Пробовал в Network_info присваивать переменную, потом с панели записывал значение в эту переменную, но число не записывается, хотя в режиме эмуляции число записывается. Подскажите как реализовать?

Осинский Алексей
04.03.2018, 21:06
Добрый день, Кирилл.
Начну с вопроса попроще:



И еще нужно динамически менять ip адрес. Пробовал в Network_info присваивать переменную, потом с панели записывал значение в эту переменную, но число не записывается, хотя в режиме эмуляции число записывается. Подскажите как реализовать?

На текущий момент изменить сетевые настройки СПК из программы не получится - только через конфигуратор.
Такой функционал запланирован на следующую версию таргет-файлов, но о сроках пока сказать не могу.

Теперь вопрос посложнее:


Подскажите пожалуйста, есть ли возможность (и как ее реализовать) в CodeSys v3.5 изменить свойства элемента из кода программы?
Например мне нужно изменить диапазон шкалы "Стрелочного индикатора" из панели СП207.

На текущий момент сделать этого простым способом не получится.

Есть следующий вариант решения:

1) Делаем визуализацию (далее по тексту "фрейм") необходимого размера (подробнее в документе СПК. Визуализация (http://www.owen.ru/forum/showthread.php?t=22038));
2) Располагаем на ней нужный компонент (в данном случае "Стрелочный индикатор 90°);
3) Задаем следующие настройки:
"Начало шкалы" устанавливаем равным 0;
"Конец шкалы" устанавливаем равным 100;
"Формат шкалы (с-синтаксис)" делаем пустым (удаляем значения по умолчанию);
Остальное настройте по вкусу;
Итоговый результат должен выглядеть примерно так:
35908
4) Добавляем входные переменные фрейму:
rCurrentValue : REAL;
rMinMeterValue : REAL;
rMaxMeterValue : REAL;
35909
5) Добавляем элемент "прямоугольник";
6) Настраиваем вид прямоугольника:
"Атрибуты заливки": пустой;
"Стиль линии": пустой;
"Свойства текста" прямоугольника настройте по своему вкусу, я выбрал цвет текста - белый.
"Текст" прямоугольника задайте %s;
Итог выглядит примерно так:
35910
7) Расположите 4 таких прямоугольника: в начале шкалы, 2 в середине, и 1 в конце.
На этих прямоугольниках будут находится метки шкалы.
Должно получится примерно так:
35911
8) Пишем функцию, которая выведет надписи на прямоугольниках:



(*
Возвращает текстовое значение, соответствующее указанному проценту
(usiPercent) диапазона rMinValue .. rMaxValue
Вернет 'ERROR'
если rMinValue >= rMaxValue или
usiPercent находится за диапазоном 0..100%
*)
FUNCTION GetRangePercentString : STRING
VAR_INPUT
usiPercent : USINT
(_c_usiMinPercentValue.._c_usiMaxPercentValue);
rMinValue : REAL;
rMaxValue : REAL;
END_VAR
VAR CONSTANT
_c_sErrorString : STRING := 'ERROR';
_c_usiMinPercentValue : USINT := 0;
_c_usiMaxPercentValue : USINT := 100;
_c_usiSignificantDigitsCount : USINT := 1;
END_VAR
VAR
_xIsRangeCorrect : BOOL;
_xIsPercentInRange : BOOL;
_rPercentValue : REAL;
_rRangeSize : REAL;
END_VAR

Тело функции


getRangePercentString := _c_sErrorString;
_xIsRangeCorrect := rMinValue < rMaxValue;
_xIsPercentInRange := (usiPercent >= _c_usiMinPercentValue)
AND (usiPercent <= _c_usiMaxPercentValue);

IF _xIsRangeCorrect AND _xIsPercentInRange THEN
_rRangeSize := rMaxValue - rMinValue;
_rPercentValue := (USINT_TO_REAL (usiPercent) * _rRangeSize)
/ 100.0 + rMinValue;
getRangePercentString := OSU.REAL_TO_STRING_FORMAT (_rPercentValue,
_c_usiSignificantDigitsCount, OSU.DECIMAL_SEPARATOR.DOT);
END_IF


9) Свойство "Текстовая переменная" наших прямоугольников задаем таким (сверху вниз):
getRangePercentString (0, rMinMeterValue, rMaxMeterValue)
getRangePercentString (40, rMinMeterValue, rMaxMeterValue)
getRangePercentString (80, rMinMeterValue, rMaxMeterValue)
getRangePercentString (100, rMinMeterValue, rMaxMeterValue)
Это выведет надписи на шкале, соответствующие 0%, 40%, 80%, и 100% диапазона соответственно. (Если Вам нужны другие значения, просто измените 0..100 на необходимые Вам).
35912

10) Пишем функцию, которая задаст положение стрелки индикатора



(*
Возвращает отношение (в процентах) текущего значения
rCurrentValue к диапазону rMinValue .. rMaxValue
Вернет 0
если rMinValue >= rMaxValue или
rCurrentValue находится за диапазоном rMinValue .. rMaxValue
*)
FUNCTION ValueToRangePercent : USINT
VAR_INPUT
rCurrentValue : REAL;
rMinValue : REAL;
rMaxValue : REAL;
END_VAR
VAR CONSTANT
_c_usiErrorValue : USINT := 0;
END_VAR
VAR
_xIsRangeCorrect : BOOL;
_xIsPercentInRange : BOOL;
_rPercentValue : REAL;
_rRangeSize : REAL;
END_VAR

Тело функции


ValueToRangePercent := _c_usiErrorValue;
_xIsRangeCorrect := rMinValue < rMaxValue;
_xIsPercentInRange := (rCurrentValue >= rMinValue)
AND (rCurrentValue <= rMaxValue);

IF _xIsRangeCorrect AND _xIsPercentInRange THEN
_rRangeSize := rMaxValue - rMinValue;
_rPercentValue := (rCurrentValue - rMinValue) / (rMaxValue - rMinValue) *
100;
ValueToRangePercent := REAL_TO_USINT (_rPercentValue);
END_IF


11) Возвращаемся к нашему индикатору и в его поле "значение" пишем


ValueToRangePercent (rCurrentValue, rMinMeterValue, rMaxMeterValue)

35913


Настало время тестировать индикатор:


12) На визуализацию, на которой необходимо отобразить индикатор добавляем элемент "фрейм".
В качестве источника указываем фрейм, созданный на шаге 1.
35914
13) В конфигурации фрейма привяжите переменные, которые задают диапазон и текущее значение индикатора (я укажу просто значения):
35915
14) Загрузите проект в контроллер и увидите что-то похожее на:
35916

Изменяя в процессе выполнения программы переменные, привязанные на шаге 13 Вы будете видеть изменение шкалы и положение стрелки.
Если значение rCurrentValue будет вне диапазона rMinMeterValue ... rMaxMeterValue - стрелка будет находится в минимальном положении.

Я приложил архив проекта к сообщению (все описанное выше находится на вкладке POU в папке CustomMeter).
35917
Если остались вопросы - обращайтесь, поможем.

Кирилл28
09.03.2018, 12:04
Спасибо Алексей за ответ и за подсказку!

Я сделал немного проще, как вы посоветовали выставил 0-100 диапазон шкалы, скрыл значения шкалы, добавил прямоугольники с переменными и в PRG добавил блок lin_trafo с присвоенными нужными переменными. Он автоматически мне считал линейное преобразование.

Спасибо за помощь!

Осинский Алексей
12.03.2018, 16:02
Спасибо Алексей за ответ и за подсказку!

Спасибо за помощь!

Пожалуйста.
Рад, что смог помочь.



Я сделал немного проще, как вы посоветовали выставил 0-100 диапазон шкалы, скрыл значения шкалы, добавил прямоугольники с переменными и в PRG добавил блок lin_trafo с присвоенными нужными переменными. Он автоматически мне считал линейное преобразование.

Если я Вас правильно понял, то Ваше решение немного проще т.к. Вы обошлись без использования фрейма.
Мое же решение позволяет иметь столько индикаторов, сколько необходимо без необходимости объявления дополнительных ФБ в программе.
Но они оба имеют право на жизнь.