Мини 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
 
Поделиться:
0
Альфред Минниханов
01.03.2023 15:45
 
Здравствуйте, Руслан! Спасибо вам за раздачу такого интересного материала! Не могли бы вы добавить в свойства KRVCheckBox такой параметр, который бы давал возможность программно передавать значение данного бита другому биту в другом регистре? Типа Value в переменной регистра. Или добавить самой переменной регистра после точки. Например, mb0001.3
Показать полностью
0
?im?ek Randa
03.05.2021 02:38
 
Привет Руслан,
Спасибо вам за вашу работу.
Я надеюсь, что 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.

Спасибо
Показать полностью
0
Nikolay
25.08.2020 20:57
 
Добрый, день. Подскажите как с помощью ваших компонентов считать одиночный бит coil с контроллера и визуализировать его индикатором в программе.
Показать полностью
13
Руслан Кандирал
25.08.2020 21:31
Nikolay
 
Вот, тут еще пример
https://kandiral.ru/o_sajte.html#comment...
Показать полностью
13
Руслан Кандирал
25.08.2020 21:28
Nikolay
 
Здравствуйте! Если Вас интересует именно чтение coil функцией 0x1, то это можно сделать через компонент KRModbusMaster. Я в комментария описывал как это делается
https://kandiral.ru/delphi/primer_pereda...

Индикаторы приведенные в данной статье работают с KRModbusClient. То есть, Вам нужно будет взять TShape(именно его я и использую в своих индикаторах) и менять ему цвет в зависимости от значений coils.
Показать полностью

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

18.07.2021 14:30
Новая статья по экспорту Google Sheet в MS Excel
Экспорт таблиц Google Sheets в файл MS Excel с помощью Google Script, а также сохранение на Google Drive и отправка на e-mail
30.03.2021 14:53
Обновлен набор компонентов для Delphi
Пакет компонентов для Delphi обновлен до версии от 30.03.2021 г.
14.03.2021 04:54
Обновлен скрипт экспорта Google таблиц в PDF
Добавлены новые возможности при экспорте Google таблиц в PDF файл
22.01.2021 11:45
Обновлен пакет компонентов для Delphi
В пакет компонентов для Delphi было внесено большое количество изменений, касающиеся протокола Modbus и мультиязычности

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

Экспорт таблиц Google Sheets в PDF файл, на email и на Google диск
Экспорт таблиц Google Sheets в PDF файл с помощью Google Script с последующим скачиванием или сохранением на Google Drive или отправкой на почту
Набор компонентов для Delphi
Набор компонентов для Delphi включает в себя компонент для работы с файловой системой, сетью, автоматизацией и другие.
Пример передачи данных по протоколу Modbus на Delphi
Пример передачи данных с контроллера ОВЕН ПЛК100 в программу на Delphi по протоколу Modbus
Инструкция по установке компонентов на Delphi
Подробная инструкция по установке компонентов на Delphi с видео обзором