Мини SCADA система на Delphi

 

В данной статье я расскажу о всех моих интерактивных компонентов мониторинга и управления. То есть, компонентах с помощью которых можно управлять удаленным устройством и мониторить его параметры.

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

Теперь перейдем непосредственно к самим компонентам. Первый это таймер KRTimer. Принцип работы его аналогичен стандартному таймеру TTimer. Единственное отличие это то, что его можно прикреплять к компоненту, который он будет обновлять с заданной периодичностью. Например, в таймере этой программы установлен интервал 500млс и он сейчас прикреплен ко всем компонентам и, следовательно, все показания будут обновляться с периодом в 500млс. То есть, например если нам нужно чтобы одни индикаторы обновлялись два раза в секунду, а другие пять раз в секунду, то мы создаем отдельно два таймера и прикрепим их к нужным элементам.

Теперь приступим к визуальным компонентам. Начнем с компонента KRField. Я о нем уже немного говорил в обзоре работы с протоколом Modbus. Происходит он от TEdit и часть свойств наследует от него. Задача KRField отображать и устанавливать значение заданного параметра. Отображается значение в заданном формате. То есть если это, например время в UNIX формате, то мы его можем сразу отображать как время и дату, достаточно в опции DateTime указать значение fdtDateTime. Для работы в свойствах KRField устанавливаем таймер обновления и переменную или в данном случае регистр Modbus. Если нужно мониторить один регистр, а устанавливать значение в другой, то в поле VarSet устанавливаем регистр для записи значения.

Есть еще аналогичный компонент только с приставкой «BL» KRBLField. Приставка «BL» во всех моих компонента означает, что есть прикрепленная метка, аналогично TLabeledEdit, только возможности моей метки немного шире.

KRVarLabel - метка. Задача аналогична KRField, но только вывод значения, без установки. Этот компонент происходит от стандартной метки и имеет прозрачный фон. В свойствах указываем таймер и параметр мониторинга. Эта метка нам будет отображать время контроллера, которое приходит в формате UNIX, по этому в поле DateTime мы устанавливаем соответствующее значение.

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

KRVComboBox - выпадающий список. Если в свойстве Style этого компонента указано csDropDown, то он считает, что прикреплен строковый регистр. Если стиль csDropDownList, в зависимости от свойства CheckValue значение параметра будет соответствовать индексу или указателю data. В этом компоненте не добавляется таймер, он отлавливает событие обновления переменной. Добавляется только сама переменная.

Следующий компонент KRVCheckBox. Может отображать и устанавливать бит определенного регистра или отправлять/сравнивать с указанными значениями. Например, checkbox под кнопкой «Start» мониторит нулевой бит регистра mb0006_started, а устанавливает значение 1 или 2 в регистр mb0007_sets. А чекбоксы установленные в ряд мониторят, и устанавливают бит одного и того же регистра mb0012_bt3. В KRVCheckBox устанавливается два регистра. Один для мониторинга, второй для установки. В обоих полях можно указать один и тот же регистр. Также нужно добавить таймер.

KRIndicator - индикатор. Задача индикатора изменять цвет в зависимости от состояния бита регистра или реагировать на преодоления максимального или минимально предела. В программе два индикатора с подписями «x < 64» и «x > 128» реагируют на максимальный и минимальный пределы, а индикаторы выше, установленные в ряд, отображают значение бита регистра. В свойствах добавляется таймер и параметр для мониторинга, а также указывается на что реагировать индикатору.

KRVButton - кнопка. Кнопка выполняет действие в зависимости от свойства Action. Это может быть сброс бита(vbatClearBit), установка бита(vbatSetBit), установка значения(vbatSetValue), установка значения с предварительной отправкой нуля(vbatSetValueAftZero) и инверсия бита(vbatTggleBit). Также кнопка может задать подтверждающий вопрос, указанный в параметре AskMsg. В свойствах нужно указать регистр. Таймер тут не добавляется.

TKRIndVButton - кнопка с индикатором. Кнопка аналогична предыдущей, индикатор такой же, как описанные ранее. Единственное отличие данной кнопки, что она может работать как ключ(переключатель) в зависимости от состояния индикатора. То есть в зависимости от состояния индикатора кнопка может выполнять разные действия, иметь разные подписи и задавать разные подтверждающие вопросы.

Теперь поговорим о логике процесса. Весь основной алгоритм контроллера находится в файле Data.h

Метка KRVarLabel в верхнем правом углу отображает дату и время контроллера. Регистр mb0000_datetime(имена всех регистров начинаются с "mbxxxx", где "xxxx" – индекс регистра). В контроллере у нас нет часов реального времени, начальное время задано статично и при включенном контроллере увеличивается на единицу каждую секунду. Кнопка радом, как я уже и говорил синхронизирует время контроллера со временем компьютера.

Основное окно разделено на четыре независимых процесса. Первый это мониторинг трех значений разного тапа WORD(mb0002_word), SMALLINT(mb0003_int) и SINGLE(mb0004_float). Все эти значения в контроллере раз в секунду изменяются. Процесс изменения мы можем останавливать и запускать с помощью кнопки или чекбокса. Для остановки нужно отправить двойку в регистр mb0007_sets, а для запуска единицу. При отправке тройки все значения сбрасываются в ноль, это делает кнопка сброса. О состоянии процесса, остановлен или запущу, говорит регистр mb0006_started.

Следующий процесс это логическая операция над двумя значениями. Значения задаются с помощью полей KRField(регистры mb0008_bt0 и mb0009_bt1), текущая операция выбирается в выпадающем списке(регистр mb0010_opr). Само вычисление производится в контроллере, результат отображается в виде битов с помощью индикаторов. Отсчет битов справа налево.

Следующий, это не совсем процесс, это информации и возможность корректировки значения одного регистра mb0012_bt3. Устанавливать значения мы можем с помощью поля KRField или побитно с помощь чекбоксов. Индикаторы нам сообщают о преодолении значением заданного предела.

И последнее. Это тоже один регистр mb0013_bt4. Но биты мы устанавливаем с помощью кнопок ключей, которые еще и будут выдавать подтверждающее сообщений.

Вот, в принципе и все. Теперь можно запустить и проверить, как оно работает.

На основе этих компонентов, конечно, не сделать управление большим производством. Для этих целей существуют специальные средства разработки, но не большие проекты вполне возможно реализовать.

Демонстрация компонентов удаленного управления и мониторинга на Delphi
 
Поделиться:

Новости сайта

20.11.2019 22:12
Обновлен пакет библиотек для Delphi
Доступна для скачивания новая версия компонентов для Delphi от 20.11.2019г.
16.10.2019 12:45
Экспорт Google Sheets в PDF файл
Пример экспорта Google таблицы в PDF файл с помощь Google Script
09.10.2019 02:20
Обновлена версия компонентов для Delphi
Опубликована новая версия компонентов для Delphi от 9.10.2019 г.
22.09.2019 22:31
Добавлено описание модуля KRVCheckBox.pas
KRVCheckBox - интерактивный элемент мониторинга и управления удаленным устройством

Популярные статьи

Modbus Slave на Arduino
Реализация клиентской части протокола Modbus RTU и Modbus ASCII для контроллеров Arduino
Пример передачи данных по протоколу Modbus на Delphi
Пример передачи данных с контроллера ОВЕН ПЛК100 в программу на Delphi по протоколу Modbus
Набор компонентов для Delphi
Набор компонентов для Delphi включает в себя компонент для работы с файловой системой, сетью, автоматизацией и другие.
Инструкция по установке компонентов на Delphi
Подробная инструкция по установке компонентов на Delphi с видео обзором