Показано с 1 по 4 из 4

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

  1. #1

    По умолчанию Динамическое изменение свойств элементов в CodeSys 3.5

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

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

  2. #2

    По умолчанию

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

    Цитата Сообщение от Кирилл28 Посмотреть сообщение
    И еще нужно динамически менять ip адрес. Пробовал в Network_info присваивать переменную, потом с панели записывал значение в эту переменную, но число не записывается, хотя в режиме эмуляции число записывается. Подскажите как реализовать?
    На текущий момент изменить сетевые настройки СПК из программы не получится - только через конфигуратор.
    Такой функционал запланирован на следующую версию таргет-файлов, но о сроках пока сказать не могу.

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

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

    1) Делаем визуализацию (далее по тексту "фрейм") необходимого размера (подробнее в документе СПК. Визуализация);
    2) Располагаем на ней нужный компонент (в данном случае "Стрелочный индикатор 90°);
    3) Задаем следующие настройки:
    "Начало шкалы" устанавливаем равным 0;
    "Конец шкалы" устанавливаем равным 100;
    "Формат шкалы (с-синтаксис)" делаем пустым (удаляем значения по умолчанию);
    Остальное настройте по вкусу;
    Итоговый результат должен выглядеть примерно так:
    MeterSettings.png
    4) Добавляем входные переменные фрейму:
    rCurrentValue : REAL;
    rMinMeterValue : REAL;
    rMaxMeterValue : REAL;
    MeterVariables.png
    5) Добавляем элемент "прямоугольник";
    6) Настраиваем вид прямоугольника:
    "Атрибуты заливки": пустой;
    "Стиль линии": пустой;
    "Свойства текста" прямоугольника настройте по своему вкусу, я выбрал цвет текста - белый.
    "Текст" прямоугольника задайте %s;
    Итог выглядит примерно так:
    MeterLabel.png
    7) Расположите 4 таких прямоугольника: в начале шкалы, 2 в середине, и 1 в конце.
    На этих прямоугольниках будут находится метки шкалы.
    Должно получится примерно так:
    MeterView.png
    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 на необходимые Вам).
    MeterRangePercent.png

    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)
    MeterValue.png


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


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

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

    Я приложил архив проекта к сообщению (все описанное выше находится на вкладке POU в папке CustomMeter).
    CustomMeterPous.png
    Если остались вопросы - обращайтесь, поможем.
    Вложения Вложения
    Последний раз редактировалось Осинский Алексей; 04.03.2018 в 21:17.
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

  3. #3

    По умолчанию

    Спасибо Алексей за ответ и за подсказку!

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

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

  4. #4

    По умолчанию

    Цитата Сообщение от Кирилл28 Посмотреть сообщение
    Спасибо Алексей за ответ и за подсказку!

    Спасибо за помощь!
    Пожалуйста.
    Рад, что смог помочь.

    Цитата Сообщение от Кирилл28 Посмотреть сообщение
    Я сделал немного проще, как вы посоветовали выставил 0-100 диапазон шкалы, скрыл значения шкалы, добавил прямоугольники с переменными и в PRG добавил блок lin_trafo с присвоенными нужными переменными. Он автоматически мне считал линейное преобразование.
    Если я Вас правильно понял, то Ваше решение немного проще т.к. Вы обошлись без использования фрейма.
    Мое же решение позволяет иметь столько индикаторов, сколько необходимо без необходимости объявления дополнительных ФБ в программе.
    Но они оба имеют право на жизнь.
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

Похожие темы

  1. Динамическое изменение настроек ModBus
    от DmitriiAnyushin в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 18.08.2015, 13:01
  2. Отображение свойств элементов в CoDeSys v3
    от АлексейШ в разделе СПК2хх
    Ответов: 2
    Последнее сообщение: 12.03.2014, 10:46
  3. Ответов: 3
    Последнее сообщение: 12.09.2011, 12:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •