Пример передачи данных по протоколу Modbus на Delphi

 

Для примера будем использовать контроллер ОВЕН ПЛК100. Для использования Modbus ASCII или Modbus RTU нужно подключить контроллер к компьютеру через COM порт, а для Modbus TCP по сети.

В конфигурации ПЛК добавляем компонент Modbus(slave). В группе Modbus[FIX] добавляем компонент соответствующий той связи которая соединяет компьютер с контроллером. Далее в группе Modbus(slave) добавляем регистры как показано на картинке

Компонент Modbus c набором переменных в конфигурации контроллера
Переменные Modbus
  • wdvr - двухбайтовое без знаковое
  • intvr - двухбайтовое знаковое
  • dwvr - четырех байтовое без знаковое
  • dintvr - четырех байтовое знаковое
  • fltvr - четырех байтовое с плавающей точкой
  • str - изходящая строк
  • str_ - продолжение исходящей строки
  • str2 - входящая строка

Продолжению входящей строки нет необходимости присваивать имя, так как напрямую к этой переменной обращаться не будем.

Программа контроллера будет с периодом 100мс изменять значения всех переменных, что-бы данные изменения наблюдать в программе на Delphi

Создаем VCL приложение в Delphi
Программа на Delphi для примера Modbus соединения

Добавляем на форму

  • StatusBar с одним текстовым полем
  • KRTimer, в свойствах Interval=500
  • KRCOMPortConnector, в свойствах устанавливаем необходимые настройки подключения
  • KRSpeeInfo, в свойстве Component выбираем коннектор
  • KRModbusMaster, в свойствах выбираем коннектор
  • KRModbusClient, в свойствах выбираем компонент KRModbusMaster, устанавливаем адрес устройства единицу и тип Modbus протокола mbtACSII
  • Создаем Modbus переменную, для этого в структуре объектов на компоненте KRModbusClient1 открываем контекстное меню и выбираем пункт "Add". В свойствах переменной устанавливаем Interval=500, MCVarType=MCT_WORD, Name="mb000_wdvr"
  • Создаем Modbus переменную, в свойствах устанавливаем Interval=500, MCVarType=MCT_SMALLINT, Name="mb001_intvr", RegisterIndex=1
  • Создаем Modbus переменную, в свойствах устанавливаем Interval=500, MCVarType=MCT_DWORD, Name="mb002_dwvr", RegisterIndex=2
  • Создаем Modbus переменную, в свойствах устанавливаем Interval=500, MCVarType=MCT_INT, Name="mb004_dintvr", RegisterIndex=4
  • Создаем Modbus переменную, в свойствах устанавливаем Interval=500, MCVarType=MCT_SINGLE, Name="mb006_fltvr", RegisterIndex=6
  • Создаем Modbus переменную, в свойствах устанавливаем Interval=500, MCVarType=MCT_STRING, Name="mb008_str", RegisterIndex=8
  • Создаем Modbus переменную, в свойствах устанавливаем MCVarType=MCT_STRING, Name="mb012_str2", RegisterIndex=12, UpAftWrite=true, WaitForUpdates=true

Если нужно установить соединение по Modbus RTU, то в свойствах компонента KRModbusClient установить MBType=mbtACSII

Если нужно установить связи по Modbus TCP, то вместо коннектора KRCOMPortConnector нужно использовать KRTCPConnector и в свойствах компонента KRModbusClient установить MBType=mbtTCP

Пример передачи данных с контроллера ОВЕН ПЛК100 в программу на Delphi по протоколу Modbus
 
Поделиться:
0
Алексей Григорьев
05.08.2019 19:28
 
Здравствуте, Руслан! В ваших примерах передачи данных вы создаете в delphi(с помощью TKRMBRegister) modbus переменные и соответственно передаете их. А если переменные уже заранее заданы в программе delphi и их нужно передать в плк, то как тогда эти переменные передавать с помощью ваших компонентов?
Показать полностью
5
Руслан Кандирал
05.08.2019 20:17
Алексей Григорьев
 
Здравствуйте, Алексей! Как именно заданы ваши переменные? Можете показать часть кода? Мне не совсем понятно, что вы имеете ввиду.
Показать полностью
0
Алексей Григорьев
05.08.2019 21:01
Руслан Кандирал
 
Например, в программе delphi есть следующее объявление NDvizh : integer. Переменная NDvizh является порядковым номером движения заготовки по конвейеру. Данную переменную требуется передать в плк. Каким образом можно это сделать с помощью ваших компонентов через modbus?
Я пытался присвоить значение своих переменных вашим(modbus-переменным), но появлялась ошибка Unit1.pas(71): E2010 Incompatible types: 'TKRMBRegister' and 'Integer'
Показать полностью
5
Руслан Кандирал
05.08.2019 21:57
Алексей Григорьев
 
Кидаете на форму коннектор (соответствующий вашему подключению), KRModbusMaster, KRModbusClient. Настраиваете их как в примере. В KRModbusClient создаете переменную с именем например mb_NDvizh с типом MCT_WORD (это один регистр, без знаковое значение), указываете индекс регистра в свойстве RegisterIndex. И по событию нажатия кнопки можно сделать так
Показать полностью
0
Алексей Григорьев
06.08.2019 10:04
Руслан Кандирал
 
Отлично, спасибо за помощь!
Показать полностью
1
Сергей Никитенко
05.07.2019 12:49
 
Здравствуйте, Руслан.
Я всё к предыдущему вопросу....именно при закрытии одной программы (не важно какой именно) теряется связь с контроллером(из всех программ на delphi и связь ПЛК с панелью СП310(RS232), через codesys по ethernet связь остаётся(вижу что переменные передаваемые панелью СП310 не обновляются, через непонятное время начинают обновляться), как будто ПЛК делает сброс всех соединений...)...может как-то некорректно закрывается TCP соединение...???
KRTimer1.Enabled:=FALSE;
KRModbusClient1.Active:=FALSE;
KRModbusMaster1.Active:=FALSE;
KRTCPConnector1.Active:=FALSE;
Для решения данной ситуации пытаюсь реализовать следующее:
1) сделать закрытие сетевого соединения (как будто выдернул ethernet из ПК);
2) KRTimer1.Enabled:=FALSE;
KRModbusClient1.Active:=FALSE;
KRModbusMaster1.Active:=FALSE;
KRTCPConnector1.Active:=FALSE;
3) восстановить сетевое соединение и закрыть программу...
тогда вторая программа на 2 ПК не разрывает соединение с контроллером...
Показать полностью
5
Руслан Кандирал
08.07.2019 21:04
Сергей Никитенко
 
Здравствуйте, Сергей

Провел тест. Всё нормально. Вот видео
https://kandiral.ru/downloads/bandicam%2...

Вот исходники
https://kandiral.ru/downloads/modbus_tes...
Показать полностью
1
Сергей Никитенко
09.07.2019 09:32
Руслан Кандирал
 
Здравствуйте, Руслан.
У Вас всё нормально работает....но у меня почему-то не хочет...может контроллер что-то глючит овен 110-32......вообщем реализовал так как писал:
1) закрытие сетевого соединения (как будто выдернул ethernet из ПК);
2) KRTimer1.Enabled:=FALSE;
KRModbusClient1.Active:=FALSE;
KRModbusMaster1.Active:=FALSE;
KRTCPConnector1.Active:=FALSE;
3) восстановить сетевое соединение и закрыть программу...
Показать полностью
5
Руслан Кандирал
05.07.2019 15:10
Сергей Никитенко
 
Здравствуйте, Сергей
Ок. Я протестирую и отпишусь.
Показать полностью
1
Сергей Никитенко
03.07.2019 15:36
 
Здравствуйте, Руслан.
Спасибо за предыдущий ответ...разбираюсь с программой в контроллере..
Возник ещё - вопрос: возможно ли из двух приложений на делфи (с разных ПК) опрашивать один и тот же контроллер по TCP?
Опробовал следующее: в одной программе опрашиваю порт 502(стандартный), в другой 503 ...когда обе программы проконнектились до контроллера всё нормально, но стоит закрыть программу на одном ПК, на втором теряется связь...на некоторое время...потом восстанавливается..
Показать полностью
5
Руслан Кандирал
03.07.2019 16:42
Сергей Никитенко
 
Здравствуйте, Сергей
У меня была похожая ситуация. Только на одном компьютере было запущено две программы, которые подключались к одному контроллеру. Вроде проблем не было.
Вот скрин настроек подключения в codesys
Показать полностью
1
Vladimir Gruzdev
02.07.2019 12:58
 
Здравствуйте, Руслан!
Программист из меня так себе, пытаюсь сделать программку для связи дельфи - контроллер по modbus tcp, и застопорился я на вашем замечательном наборе компонентов, который я скачал, но не знаю как подключить к Delphi 10.3. Пробовал Components-install new-KRmodbusМaster и вылезает окно KRConnector с кучей ошибок на незнакомые элементы. Несовместимость с 10.3 или я делаю что то не так?
Показать полностью
5
Руслан Кандирал
03.07.2019 01:09
Vladimir Gruzdev
 
Опубликовал последнюю версию компонентов
https://kandiral.ru/delphi/nabor_kompone...

И сделал инструкцию
https://kandiral.ru/delphi/instrukciya_p...
Показать полностью
1
Vladimir Gruzdev
03.07.2019 09:55
Руслан Кандирал
 
Огромное спасибо! Буду пробовать.
Показать полностью
5
Руслан Кандирал
02.07.2019 14:00
Vladimir Gruzdev
 
Здравствуйте, Владимир
Давно уже собирался обновить набор компонентов и инструкцию по установке. Через несколько часов выложу текстовую инструкцию. Видео обзор сделаю вечером или даже ближе к ночи.
Показать полностью
0
Андрей Марченко
01.07.2019 19:09
 
Здравствуйте, Руслан...
Есть ли у вас эти компоненты для работы с Modbus RTU для старого дельфи 2007го года ?
(Delphi® 2007 for Win32® Version 11.0.2804.9245). Надо вставить в старый проект работу с модбасом...
Показать полностью
5
Руслан Кандирал
01.07.2019 19:20
Андрей Марченко
 
Здравствуйте, Андрей
Компоненты тестировались на Delphi с версии XE (ver 15). А что мешает откомпилировать старый проект под Delphi XE?
Показать полностью
1
Сергей Никитенко
01.07.2019 09:57
 
Здравствуйте, Руслан...
Возникает ещё такая ситуация....возможно у Вас было что-то подобное:
Пытаюсь подключиться к ПЛК ОВЕН через ваши компоненты...пишет - не удалось соединиться...
при этом через Codesys подключается всё норм...через несколько попыток - удаётся соединиться...
после этого пытаюсь соединиться через Codesys(происходит ошибка подключения, вторая попытка удачно), но после этого сбрасываются переменные modbus в 0, которые до переменной которую опрашиваю...
Показать полностью
5
Руслан Кандирал
01.07.2019 12:41
Сергей Никитенко
 
Здравствуйте, Сергей.
Codesys и Modbus работают на разных портах и должны работать параллельно не зависимо друг от друга. У меня на видео видно как программа опрашивает данные по Modbus и при этом работает Codesys и тоже опрашивает переменные. Но так как у Вас сбрасываются регистры Modbus, могу предположить, что где-то программа зацыкливается и контроллер перезагружается.
Показать полностью
1
Сергей Никитенко
08.05.2019 10:30
 
Здравствуйте, Руслан...
я всё с той же проблемой рассинхронизации пакетов....по TCP сделал WaitRespTime=100...более менее стало стабильно...но всё равно ...например, сегодня возникла рассинхронизация...как при такой ситуации правильно пересбросить соедининение?
Показать полностью
5
Руслан Кандирал
12.05.2019 09:20
Сергей Никитенко
 
WaitRespTime можно еще попробовать увеличить.

Отловить рассинхронизацию можно по одному из регистров, который постоянно обновляется:
Думаю в будущем что-то сделаю для решения этой проблемы.
Показать полностью
Комментарий удален
1
Сергей Никитенко
29.04.2019 09:11
 
Здравствуйте. Подскажите... Подключаюсь пока к 2 контроллерам по TCP (два коннектора, 2 мастера и 2 клиента)... При старте программы всё нормально считываются значения...но через разное время (5 минут, может через сутки...) перестают считываться значения...(последнее считанное значение подсвечено цветом ошибки (оливковым))...и всё...перезапустишь программу...всё опять становится нормально...как возможно это побороть?
Пробовал сделать, как Вы описывали через события OnError и OnValUpdated переменной...только не понял что за строки(функция) в событии таймера:

if not connected then begin
setGState(100); ?????
connected:=true; ?????
закоментил данные строки...но ничего не помогло..
Показать полностью
5
Руслан Кандирал
29.04.2019 09:36
Сергей Никитенко
 
Здравствуйте. У Вас контроллеры на разных IP или стоит преобразователь RS485 to TCP? Если вы для вывода значений используете KRField, то у него есть свойство ErrorToHint для отображения сообщения об ошибке в Hint(всплывающую подсказку). Если ErrorToHint=true и ShowHint=true, то когда поле в ошибке(цвет зависит от свойств ErrorColor и ErrorFontColor) достаточно на него навести курсор мыши и в всплывающей подсказке отобразится сообщение об ошибке.

В вашем случае, я думаю, лучше писать логи в файл. Как минимум мониторинг пакетов. А потом анализировать данные в логах.

Код который Вы привели это часть моей программы.
setGState(100); Выводит сообщение по полученному коду
Переменная connected нужна для определения момента подключения/отключения к устройству.
Показать полностью
1
Сергей Никитенко
29.04.2019 12:17
Руслан Кандирал
 
Сейчас, повторилась ситуация.... выдал ошибку:
Ошибка обработки данных: неверный идентификатор пакета

лог
29.04.2019 12:18:18.855 SEND: 6A 00 00 00 00 06 01 03 00 0B 00 01
29.04.2019 12:18:18.857 RECV: 69 00 00 00 00 05 01 03 02 00 02
29.04.2019 12:18:19.056 SEND: 6B 00 00 00 00 06 01 03 00 50 00 01
29.04.2019 12:18:19.058 RECV: 6A 00 00 00 00 05 01 03 02 00 A7
29.04.2019 12:18:19.256 SEND: 6C 00 00 00 00 06 01 03 00 00 00 01
29.04.2019 12:18:19.258 RECV: 6B 00 00 00 00 05 01 03 02 00 00

т.е. получается рассинхронизация...пакетов...а как её победить возможно?
Показать полностью
5
Руслан Кандирал
29.04.2019 15:29
Сергей Никитенко
 
В коннекторе нужно увеличить тайминги. Для TCP должно быть достаточно
WriteTimeout=1000
ReadTimeout=1000
WaitRespTime=50
если не поможет то увеличивайте тайминги. Read и Write таймауты больше 2000 делать нет смысла. WaitRespTime не должен быть больше ReadTimeout. Для начала пробуйте увеличивать WaitRespTime.
Показать полностью
1
Сергей Никитенко
29.04.2019 15:44
Руслан Кандирал
 
Буду пытаться...подскажите а что за тайминги: WaitOutTime и WaitTime?
Показать полностью
5
Руслан Кандирал
29.04.2019 15:51
Сергей Никитенко
 
WaitTime - это простой между отправкой пакетов. Можно ставить 5 или даже меньше.
WaitOutTime - это простой в исходящей очереди при отправке результата в колбеки. Тоже можно ставить небольшое значение.

Эти свойство нужно увеличивать если программа сильно грузит систему.
Показать полностью
1
Сергей Никитенко
29.04.2019 10:15
Руслан Кандирал
 
Контроллеры на разных IP, использую KRVarLabel- попробую посмотреть что за ошибка...
Показать полностью
0
Андрей Савельев
06.04.2019 18:49
 
Здравствуйте, Руслан!

Пожалуйста подскажите, можно ли через KRMBRegister считывать сразу большое количество регистров, например в строку или поток, с последующим парсингом их в значения типа Single?
Показать полностью
5
Руслан Кандирал
07.04.2019 13:03
Андрей Савельев
 
Нет. Пока такой возможности нет. Но это можно сделать уровнем ниже, с помощью KRModbusMaster. В этом случае нужно помнить о синхронизации потоков, так как функция CallBack вызывается не из основного потока. Вот пример:

Показать полностью
0
Андрей Савельев
09.04.2019 18:06
Руслан Кандирал
 
Спасибо за ответ, но тогда получается, что функции, возвращающие результат через CallBack, нельзя вызывать часто или в цикле, т.к. мы будем плодить все новые и новые потоки?
Показать полностью
5
Руслан Кандирал
09.04.2019 21:20
Андрей Савельев
 
Нет, параллельный поток один. Но так как он не основной, то обращаться к визуальным компонентам из него нельзя. Это как минимум, а как максимум нельзя обращаться к объектам, которые могут использоваться в параллельных потоках. Например код
вызовет ошибку в строке 10. Есть, как минимум, три решения:
1) Присваивать значения простым переменным, а в основном потоке работать с этими переменными. Это так как я показал в предыдущем комментарии и еще тут https://kandiral.ru/delphi/krmodbusmaste... . Единственный недостаток этого способа, что вы не фиксируете момента обновления значений
2) Через сообщения windows. https://kandiral.ru/delphi/krmodbusmaste... . Тут фиксируется момент обновления, но и приостанавливается работа потока.
3) Через таймер, функция SetTimer . Это способ используется в TKRVariable . Принцип такой, в callback сохраняются значения в переменные как в варианте 1, а затем запускается таймар с небольшим интервалом, который вызывает событие OnValUpdated. То есть, тут мы сохраняем значения и фиксируем момент обновления и при этом не останавливаем поток.
Показать полностью
1
Олег Пфлюг
22.01.2019 13:39
 
Здравствуйте, Руслан.
У вас переменные для опроса добавляются через выпадающее меню элемента KRModbusClient1 ( mb000_wdvr). Если возможность подтянуть переменные из конфигурационного файла? Или каким либо образом автоматизировать импорт переменных?
Показать полностью
5
Руслан Кандирал
24.01.2019 13:20
Олег Пфлюг
 
Здравствуйте, Олег
Нет. Такого я не делал.
Вот пример как это можно сделать:

Вот INI файл, который у меня получился

Показать полностью
1
Олег Пфлюг
28.02.2019 13:57
Руслан Кандирал
 
Спасибо большое за ответ.
Показать полностью
0
Вадим Самчук
02.01.2019 11:32
 
Здравствуйте Руслан! Помогите пожалуйста.
Немогу подключится через переходник COM порт - RS485 к FX3U. Параметры Modbus RTU 19200 8bit 0 0 настроил. В окне MonitoringForm ничего нет. При попытке использовать OnSendAsync и OnRecvAsync ошибка Undeclared identifier 'PKRBuffer'
Показать полностью
5
Руслан Кандирал
02.01.2019 19:31
Вадим Самчук
 
"В окне MonitoringForm ничего нет."
Должны отображаться, как минимум, отправляемые пакеты. Если вообще ничего нет, значит вы не запустили процесс опроса подчиненного устройства.

"При попытке использовать OnSendAsync и OnRecvAsync ошибка Undeclared identifier 'PKRBuffer'"
Нужно подключить модуль KRTypes в uses
Показать полностью
0
Василий Иванов
21.10.2018 20:53
 
Здравствуйте, Руслан!
Столкнулся с такой проблемой. При подключении нескольких ModbusClient (у меня их 5), если от первых двух ответ не пришел, то третий и далее уже не опрашиваются. Пытался играть с интервалами - не помогло. Может, подскажете, какой параметр крутить? Здесь очень много таймингов (на ComPortConnection), но почти все они, как я понял, относятся к потоковой передаче. У меня обычный Modbus RTU с периодическим опросом.
Спасибо.
Показать полностью
5
Руслан Кандирал
21.10.2018 21:07
Василий Иванов
 
Здравствуйте, Василий!

Я так понял у вас несколько устройств сидят на RS485.
Вот тут я объяснял как сам боролся с этой проблемой
Показать полностью
0
Василий Иванов
22.10.2018 22:19
Руслан Кандирал
 
Свойство CountErrorsForReconnect ни в одном из Modbus компонентах не нашел.
Так же на событие OnError переменных ни одна ошибка не выходит.
Сделал так.
На таймер, на котором собственно уже сидела фиксация ошибок по свойству Error переменных с подкрашиванием панелек (я не использовал ваши поля для вывода), добавил смену свойства Interval проблемных переменных на большее число (3000). А в событии ValUpdated первой переменной для каждого клиента, снова вернул нормальный интервал 50.
При этом свойство ReconnectTime (коннектора) уменьшил до 10, иначе был опять долгий реконнект с задержками и кашей на выходе.
Проверил по скану, вроде работает более менее.
Еще почему-то иногда вылазит ошибка "Ошибка контрольной суммы". Помогла установка свойства ErrorCount переменных в 3. Видимо, оно отвечает за минимальное кол-во ошибок для их фиксации.
А вообще, я вам очень благодарен и восхищаюсь проделанной вами работой. Спасибо. По возможности обязательно отблагодарю материально.
P.S. Очень не хватает описания свойств компонентов. Все приходится выяснять методом тыка.
Показать полностью
5
Руслан Кандирал
23.10.2018 10:36
Василий Иванов
 
У вас старая версия компонентов. Более новые я выкидывал в комментариях. Вот последняя:
https://kandiral.ru/downloads/Kandiral_2...

Там есть CountErrorsForReconnect и недавно я еще разделил ошибки на два типа. Ошибки при отправке пакета явно сигнализируют о том, что есть проблемы со связью, там сейчас установлен жесткий предел 7, после чего происходит реконнект. Реконнект по ошибкам при получении ответа зависит от свойства CountErrorsForReconnect.

Перед установкой нужно деинсталировать старые компоненты
Вот кратка инструкция по установки:
https://kandiral.ru/o_sajte.html#comment...

"Ошибка контрольной суммы" возникает из за того, что после отправки запроса ожидается ответ в течении времени WriteTimeout+ReadTimeout. Если за это время ответ не пришел или пришел не полностью, то возникнет ошибка "Нет ответа" или "Ошибка контрольной суммы". И потом та часть ответа которая не пришла на текущий запрос придет на следующий. Если такие ошибки возникают часто, то нужно поиграться с таймингами ReadTimeout и WaitRespTime. ReadTimeout - это время ожидания ответа, обработка ответа происходит если он пришел до ReadTimeout или после срабатывания ReadTimeout. WaitRespTime - это время ожидания между частями ответа. Например пришло какое-то количество байт ответа, сразу обработка не происходит, а идет опрос еще в течении времени WaitRespTime. И если за время WaitRespTime ни чего не приходит, то начинается обработка.


" Помогла установка свойства ErrorCount переменных в 3. Видимо, оно отвечает за минимальное кол-во ошибок для их фиксации. " - да вы правы. Как ни настраивай систему, все равно периодически ошибки проскакивают. Для этого я добавил такое свойство.
Показать полностью
0
Konstantin Mamberger
18.10.2018 11:26
 
Здравствуйте!
Пытаюсь прочитать по ModbusTCP, адрес 192.168.1.99 AError=-102
на форме KRTCPConnector1 ip=192.168.1.99
KRModbusMaster1 ссылается на KRTCPConnector1
KRModbusClient1 на KRModbusMaster1
на пойму что вставлять в адрес устройства в ReadHoldingRegisters
как не меняю всегда AError=-102
плиз пример чтения HoldingRegisters с записью пример увидел но то же что писать в адресе устройства
у меня слейв на ардуино с использованием
#include <ModbusIP_ENC28J60.h>

Показать полностью
5
Руслан Кандирал
18.10.2018 20:54
Konstantin Mamberger
 
Ошибка -102 это "Соединение не установлено.". То есть коннектор не может подключиться к устройству.

Что-бы получить сообщение о ошибке вызовите KRModbusMaster1.ErrorMsg(AError,s)
где s - это переменная в которую запишится область возникновения ошибки: "Ошибка обработки данных" - уровень протокола Modbus; "Ошибка передачи данных" уровень коннектора.

Например если вызвать
KRModbusMaster1.ErrorMsg(-102,s)
то функция вернет строку "Соединение не установлено.", а в s будет "Ошибка передачи данных"


В вашем случае проблема может быть на уровне протокола TCP/IP, не верно указан IP адрес или порт. Или на уровне физического подключения: кабель, порт. Или код контроллера.
Показать полностью
0
Андрей Савельев
25.09.2018 19:44
 
Здравствуйте, Руслан! Столкнулся со следующей проблемой: при присвоении значений регистрам через свойство Value компоента TKRMBRegister значение данного свойства меняется не сразу, а либо при обращении к любому другому компоненту TKRMBRegister либо при выходе из процедуры в которой производилось присвоение. Фактически для гарантированного появления значения в соответствующем регистре нужно присвоить значение свойству Value дважды. Подскажите, почему так происходит и как избежать подобного поведения?
Показать полностью
5
Руслан Кандирал
25.09.2018 19:56
Андрей Савельев
 
Здравствуйте, Андрей!

У KRMBRegister есть свойство UpdateType. Возможные значения:
vutAfter(по умолчанию) - обновлять значение после положительного ответа подчиненного устройства
vutBefore - обновлять значение сразу при присваивании свойству Value. То есть перед отправкой подчиненному устройству
vutAftUpdate - обновлять значение после отправки запроса чтения. То есть отправляется значение, затем отправляется запрос чтения и после положительного ответа обновляется значение.

Я думаю вам подойдет vutBefore
Показать полностью
0
Андрей Савельев
25.09.2018 20:30
Руслан Кандирал
 
Благодарю. А в случае отсутствия положительного ответа от устройства будет ли компонент делать повторные попытки присвоить значение регистру, или это нужно контролировать самому?
Показать полностью
5
Руслан Кандирал
26.09.2018 05:18
Андрей Савельев
 
Это нужно контролировать самому
Показать полностью
0
Андрей Савельев
14.09.2018 22:10
 
Руслан, Modbus функции 15 «Force Multiple Coils» и 16 «Preset Multiple Regs», судя по контексту, реализованы в методах WriteCoils и WriteHoldingRegisters компонента KRModbusMaster? Можно попросить Вас привести примеры их использования...
Показать полностью
5
Руслан Кандирал
15.09.2018 08:51
Андрей Савельев
 
Показать полностью

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

14.09.2019 16:00
Добавлено описание модуля KRVariables.pas
KRVariables - виртуальные классы для работы с переменными удаленного устройства
01.09.2019 12:11
Добавлена статья о работе с компонентом KRIniConfig
KRIniConfig - компонент для работы с конфигурационными параметрами ini-файла. Является надстройкой над TKRIniFile
30.08.2019 02:48
Опубликовано описание класса TKRField
TKRField - поле ввода/вывода значения переменной TKRVariable
28.08.2019 15:35
Добавлена новая статья
Добавлено описание модуля KRIniConfig.pas

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

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