пятница, 9 февраля 2018 г.

Панели оператора СП307 / СП310. Разбираемся с расширенным режимом. Практический пример

Закрепим навыки использования рассмотренных в предыдущих частях способов комбинирования элементов (вставкапривязка свойства к элементув расширенном режиме конфигуратора СП300 на примере более сложной задачи отображения значений.

Постановка задачи

Пусть по-прежнему нам нужно отображать значение с плавающей точкой, хранящееся в регистрах панели PSW256-257. Только теперь представим, что это показания какого-то датчика и для него есть целочисленный код состояния, хранящийся по адресу PSW258. И в зависимости от значения этого кода показания датчика должны отображаться в соответствии с таблицей:
КодЗначениеОтображение
10Показания в нормеЗначение из регистров PSW256-257. Цвет текста - чёрный
2-1Значение ниже нижнего аварийного пределаЗначение из регистров PSW256-257. Цвет текста - красный
31Значение выше верхнего аварийного пределаЗначение из регистров PSW256-257. Цвет текста - красный
4Все остальные значенияОшибка датчикаТекст: "ошибка". Цвет текста - красный

Создание элементов

Для решения поставленной задачей нам необходимо отображать разные элементы в зависимости от заданных условий. Для этого используется управляющий элемент IF (Условие), который в зависимости от истинности своего свойства Текущее значение выполняет один из двух вставленных в него элементов. Элемент IF можно рассматривать как аналог условного оператора в языках программирования.
Количество вариантов отображения можно свести к трём:
  1. Значение чёрного цвета (код = 0);
  2. Значение красного цвета (код = -1 или код = 1);
  3. Текст "ошибка" красного цвета (все остальные значения кода).
Всего нам нужно проверить два условия (при выполнении первого будет отображаться первый вариант, при выполнении второго - второй, а при невыполнении ни одного из них - третий) и соответственно нам понадобится два элемента IF. Также для формирования условий нам будут нужны следующие функциональные элементы:
  • элемент Логика. С его помощью мы реализуем операцию логического ИЛИ;
  • два элемента Сравнение. С их помощью будем сравнивать код состояния с 1 и -1;
  • три элемента READ. Они нам нужны для чтения кода состояния.
Невизуальные элементы
Сразу же настроим эти элементы. Нам нужно, чтобы элемент Логика выполнял операцию OR (ИЛИ):
Настройка элемента Логика
Элементы Сравнение настраиваем на условие равенства, формат числа оставляем Dec (знаковое целое), а правые операнды устанавливаем для двух элементов по-разному: у одного из них равным 1, а у другого -1:
Настройка двух элементов Сравнение
Три элемента READ нам нужны одинаковые (можно настроить один, а затем сделать две копии), настроенные на чтение одного слова из регистра PSW258:
Настройка элемента READ
Для отображения показаний датчика можно использовать, как элемент, созданный нами в предыдущей части, так и стандартные элементы Цифровой дисплей и Статический текст, настроенные соответствующим образом. Настроить свойства отображения готовых стандартных элементов всё-таки быстрее и проще, так что их использование предпочтительнее, если есть такая возможность.
Визуальные элементы
Так или иначе, нам нужно создать следующие визуальные элементы:
  • отображающий значение с плавающей точкой из регистров PSW256-257 чёрным цветом (Значение - норма);
  • копия предыдущего элемента только красного цвета (Значение - авария);
  • текст ошибка красного цвета (Текст - ошибка).
Чтобы в дальнейшем не путаться изменим этим элементам имена на указанные в скобках. Для этого для каждого визуального элемента откроем окно свойств расширенного режима и введём новое имя в окне, вызываемом кнопкой Имя блока:
Изменение имени элемента
Все визуальные элементы и элементы IF желательно сделать одного размера. Так впоследствии будет проще выделять получившийся комбинированный элемент.
Сейчас на экране у нас должно быть нечто подобное:
Элементы подготовлены

Объединение элементов. Этап 1

Начнём собирать наш элемент с реализации отображения показаний датчика красным цветом при значении кода состояния 1 или -1. Для этого одновременно выделяем:
  • Один из элементов IF.
  • Логический элемент OR.
  • Оба элемента сравнения (==).
  • Два элемента READ;
  • Визуальный элемент - значение красного цвета.
Желательно, чтобы все элементы оказались в одном месте, это позволит при последующем выделении и редактировании находить их в предсказуемых местах. Особенно это касается визуального элемента и элемента IF - после комбинирования, чтобы выделить элемент нужно будет щёлкнуть по местоположению IF, а отображаться на экране при этом будет визуальный элемент. В результате, если их местоположения не будут совпадать, то понять куда щёлкнуть, чтобы выделить элемент догадаться будет невозможно.
После выделения и выравнивания открываем окно свойств расширенного режима:

Дальнейший порядок действий нестрогий. Для определённости будем действовать в следующей последовательности:
  • раскрываем один из элементов сравнения, выделяем его свойство Операнд левый, нажимаем кнопку Property Contain, выделяем один из элементов READ, нажимаем кнопку Affirm Contain. В результате мы получили элемент, который возвращает логическую единицу при выполнении условия равенства значения регистра PSW258 1 или -1, в зависимости от того какой элемент нам попался. В противном случае элемент возвращает логический ноль:
  • повторяем предыдущие действия со вторым элементом сравнения и оставшимся свободным элементом READ:
  • раскрываем элемент OR и привязываем его свойства Операнд левый и Операнд правый к только что скомбинированным элементам сравнения (выделяем свойство Операнд левый, нажимаем кнопку Property Contain, выделяем один из элементов ==, нажимаем кнопку Affirm Contain; повторяем для свойства Операнд правый и оставшегося свободным элемента ==). В результате получаем элемент, который будет возвращать логическую единицу в случае равенства PSW258 1 или -1:
  • раскрываем элемент IF и привязываем его свойство Текущее значение к элементу OR (выделяем свойство Текущее значение, нажимаем кнопку Property Contain, выделяем элемент OR, нажимаем кнопку Affirm Contain). В результате получаем элемент, который будет отображать первый вставленный в него элемент при PSW258 = 1 или PSW258 = -1 и отображать второй вставленный в него элемент, если вышеуказанное условие не выполняется:
  • вставляем визуальный элемент, предварительно переименованный нами в 'Значение - авария', в элемент IF (выделяем 'Значение - авария', нажимаем кнопку Insert Unit, выделяем IF, нажимаем кнопку Affirm Insert):
  • дальше нам предстоит скомбинировать этот элемент IF с другим. Чтобы их не спутать переименуем этот элемент в 'IF - авария':
  • нажимаем кнопку OK.
Теперь у нас получился элемент, отображающий красным цветом значение регистров PSW256-257, если PSW258 = 1 или PSW258 = -1 и не отображающий ничего, если в регистре PSW258 находится любое другое значение.

Объединение элементов. Этап 2

После проверки условия равенства PSW258 1 и -1 нам осталось проверить равенство PSW258 нулю и оставшимся значениям. Строго говоря для этого нужно использовать элемент Сравнение с условием равенства и одним из операндов равным 0. Однако мы можем сэкономить на этом элементе, воспользовавшись тем, что элемент IF интерпретирует как логическую единицу любое значение отличное от нуля. Такой способ интерпретации используется не только элементом IF, но и всеми остальными элементами с логическими входами (свойствами).
Для окончания работы выделяем все элементы, включая вновь созданный, выравниваем их и открываем окно свойств расширенного режима:

Порядок действий по-прежнему нестрогий, его можно менять:
  • привязываем свойство Текущее значение пустого элемента IF к элементу READ (выделяем свойство Текущее значение, нажимаем кнопку Property Contain, выделяем элемент READ, нажимаем кнопку Affirm Contain). В результате мы получили элемент, отображающий первый вставленный элемент при ненулевом значении PSW258 и отображающий второй элемент при PSW258 = 0:
  • вставляем в этот IF элемент 'Текст - ошибка' (выделяем 'Текст - ошибка', нажимаем кнопку Insert Unit, выделяем IF, нажимаем кнопку Affirm Insert). В результате получаем элемент отображающий красную надпись 'ошибка' при PSW258 не равном нулю и не отображающий ничего при PSW258 = 0:
  • вставляем в этот же IF элемент 'Значение - норма' (выделяем 'Значение - норма', нажимаем кнопку Insert Unit, выделяем IF, нажимаем кнопку Affirm Insert). В результате получаем элемент отображающий красную надпись 'ошибка' при PSW258 не равном нулю и отображающий значение PSW256-257 чёрным цветом при PSW258 = 0:
  • вставляем этот элемент IF в другой, названный нами 'IF - авария' (выделяем IF, нажимаем кнопку Insert Unit, выделяем 'IF - авария', нажимаем кнопку Affirm Insert). В результате получаем элемент отображающий значение красным цветом, при выходе за аварийные пределы. В противном случае, если PSW258 не равно нулю, отображается текст "ошибка", а если равно, то значение чёрным цветом:
  • нажимаем кнопку ОК.
Теперь наша цель достигнута. Можно вытащить на экран пару стандартных элементов Цифровой ввод, настроить их на ввод показаний датчика и кода его состояния и убедиться, что всё работает как задумывалось (ссылка на готовый проект):
Скриншот демонстрационного проекта

Заключение

Если открыть двойным щелчком мыши окно свойств получившегося элемента, то мы увидим у него три вкладки:
Окно свойств сконфигурированного элемента IF
  1. Переключение - на этой вкладке задаётся какой из элементов, вставленных в элемент IF, будет отображаться в конфигураторе (всегда) или на панели (если не задано значение свойства Текущее значение). Эта вкладка уникальна для элементов IF.
  2. Объект - на этой вкладке отображается список всех элементов READ и WRITE, входящих в состав элемента IF. Как видно на скриншоте, конфигуратор умеет группировать элементы с одинаковыми адресами позволяя при этом редактировать значения адресов для всех элементов сразу. Это упрощает повторное использование созданных в расширенном режиме элементов, ускоряя их перепривязку к другим переменным контроллера. Более того, среда исполнения панели также умеет группировать запросы чтения по одинаковым адресам. Отсюда следует, что нет смысла стремиться сократить количество элементов READ, обращающихся по одному и тому же адресу. Панель всё равно повторное чтение из контроллера выполнять не будет. Данная вкладка появляется у управляющих элементов при использовании ими элементов READ или WRITE.
  3. Расположение - стандартная вкладка для визуальных и управляющих элементов, позволяющая задать их размер и местоположение.
Ещё несколько замечаний напоследок.
  1. В два этапа мы создавали наш комбинированный элемент только для упрощения описания процесса. Можно было бы создать его одним махом, выделив сразу все элементы. Или, наоборот, разбить процесс на более мелкие этапы и комбинировать, например, элементы только подвое. Это определяется только личным удобством.
  2. В данной части мы комбинировали только текстовые элементы. Ограничиваться однотипными элементами совершенно необязательно. Можно было бы, например, вместо надписи "ошибка" использовать какое-нибудь изображение. Также элементы можно группировать и вставлять в элементы IF получившиеся Группы, отображая при заданных условиях, например, текст и изображение одновременно.
  3. При использовании элементов IF важен порядок, в котором вставленные в него элементы располагаются в списке Self Unit. Этот порядок в случае необходимости можно менять с помощью кнопок Move Up и Move Down, которые появляются при выделении элементов, находящихся в списке Self Unit.
  4. В иллюстративных целях можно представить полную структуру получившегося элемента в виде следующего псевдокода:
IF - авария {
    Contain Unit:
        OR {
            Contain Unit:
                == (0 , 1) {
                    Contain Unit:
                        READ (PSW258) {}
                    Self Property:
                        Операнд левый = <READ (PSW258)>
                }
                == (0 , -1) {
                    Contain Unit:
                        READ (PSW258) {}
                    Self Property:
                        Операнд левый = <READ (PSW258)>
                }
            Self Property:
                Операнд левый = <== (0 , 1)>
                Операнд правый = <== (0 , -1)>
        }
    Self Unit:
        Значение - авария {}
        IF {
            Contain Unit:
                READ (PSW258) {}
            Self Unit:
                Текст - ошибка {}
                Значение - норма {}
            Self Property:
                Текущее значение = <READ (PSW258)>
        }
    Self Property:
        Текущее значение = <OR>
}

Комментариев нет:

Отправить комментарий