Мини 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 |
Спасибо вам за вашу работу.
Я надеюсь, что Google Translate правильно переводит.
Я плохо разбираюсь в Delphi.
У меня есть устройства Modbus RTU. 2 различных типа преобразователя RS485 в TCP, подключенного к ПК.
Я использую компоненты Delphi (TKRTCPConnector, TKRModbusMaster, TKRModbusClient, mbtype = mbtRTU).
1. У меня нет проблем с конвертером rs485TOTCP. (Подключено 12 подчиненных устройств)
2. У меня проблема с конвертером rs485TOTCP. (Подключено 3 ведомых устройства). Опрос Modbus v.s. Я могу подключиться к тестовой программе и читать информацию. Я подключаюсь (TKRTCPConnector, TKRModbusMaster, TKRModbusClient, mbtype = mbtRTU), но не могу получить информацию. Когда я смотрю на это с помощью TKRMBMon, ответом является только SlaveID.
Спасибо
Индикаторы приведенные в данной статье работают с KRModbusClient. То есть, Вам нужно будет взять TShape(именно его я и использую в своих индикаторах) и менять ему цвет в зависимости от значений coils.