Набор компонентов для Delphi

Инструкция по установке компонентов на Delphi
Набор компонентов на GitHub

Общие компоненты

  • KRBLEdit – поле ввода с прикрепленной меткой
  • KRBluetooth.pas – работа с блютуз устройством
  • KRBoundLabel.pas – метка, которую можно прикрепить к любому визуальному компоненту
  • KRCheckBox.pas – модифицированный TCheckBox
  • KRCheckGroupBox – модифицированный TCheckGroupBox
  • KRComboBox – модифицированный TComboBox
  • KRComponentCollection – коллекция из TComponent
  • KRImageList – модифицированный TImageList
  • KRIniConfig – набор компонентов для работы с ini-файлом
  • KRListView – модифицированный TListView
  • KRNormalArray – компоненты для потокового расчета среднеарифметического значения
  • KRProgressBar – модифицированный TProgressBar
  • KRRadioButton – модифицированный TRadioButton
  • KRThreadQueue – синхронизированная очередь
  • KRThread – модифицированный TThread
  • KRTimer – таймер
  • KRValueEdit – поле для ввода числового значения
  • KRVersionInfo – получение информации о приложении

Работа с файловой системой

  • KRDriveComboBox – выпадающий список дисковых накопителей
  • KRFileList – список файлов
  • KROpenFolderDlg – диалоговое окно выбора папки

Сеть

  • KRBTSocketClient – сокет клиент для передачи данных по bluetooth
  • KRBTSocketServer – сокет сервер для передачи данных по bluetooth
  • KRParser – класс для создания потоковых парсеров
  • KRParserCfg – конфигурационные данные для KRParser
  • KRSockets – набор компонентов для работы с сокетами
  • KRTCPSocketClient – сокет клиент для передачи данных по протоколу TCP/IP
  • KRTCPSocketServer – сокет сервер для передачи данных по протоколу TCP/IP
  • KRUDPSocketServer – сокет сервер для передачи данных по протоколу UDP

Автоматизация

  • KRBTConnector – клиент для передачи данных по bluetooth в потоке
  • KRBtnVarUpdate – кнопка обновления переменной TKRVariable
  • KRBTServer – сервер для передачи данных по bluetooth в потоке
  • KRCOMPort – класс для работы с COM-портом
  • KRCOMPortSets – форма настройки COM-порта
  • KRCOMPortConnector – клиент для передачи данных через COM-порт в потоке
  • KRConnector – набор классов для потоковых клиентов
  • KRConnectorQueueBar – компонент на основе TKRProgressBar, отображающий уровень заполнения очереди коннектора
  • KRField – поле для мониторинга и установки значения переменной TKRVariable
  • KRIndicator – индикатор
  • KRMBMon – мониторинг пакетов протокола Modbus
  • KRMBRegIndex – компонент настройки Modbus регистра, устанавливает индекс
  • KRMBRegInterval – компонент настройки Modbus регистра, устанавливает интервал обновления
  • KRMBRegReadFunc – компонент настройки Modbus регистра, устанавливает функцию чтения
  • KRMBRegs – компонент для отладки Modbus регистров
  • KRMBRegWriteFunc – компонент настройки Modbus регистра, устанавливает функцию записи
  • KRModbus – компонент для работы по протоколу Modbus
  • KRModbusMaster – набор стандартных функций Modbus и инструментов для построения и обработки результата
  • KRModbusClient – набор инструментов для управления удаленными переменными, связь с которыми осуществляется по средствам протокола Modbus
  • KRNMEA0183 – компонент для работы по протоколу NMEA0183
  • KRPlcIO – компонент для работы с файлами контроллеров ОВЕН
  • KRServer – сервер для передачи данных в потоке
  • KRSpeedInfo – компонент для отображения скорости
  • KRTCPConnector – клиент для передачи данных по протоколу TCP/IP в потоке
  • KRTCPServer – сервер для передачи данных по протоколу TCP/IP в потоке
  • KRVariables – переменные, используются при сетевой передачи данных
  • KRVarLabel – компонент для мониторинга значения переменной TKRVariable
  • KRVButton – кнопка для установки значения переменной TKRVariable
  • KRVCheckBox – checkbox для включения/выключения бита в переменной TKRVariable
  • KRVCheckGroupBox – GroupBox с прикрепленным компонентом KRVCheckBox
  • KRVComboBox – выпадающий список для установки значения переменной TKRVariable по индексу выбранного элемента

Web

  • KRGoogleAuth – авторизация в Google, посредством протокола OAuth 2.0
  • KRGoogleContacts – работа с контактами через Google Contacts API
  • KRGoogleSheets – работа с таблицами через Google Sheets API

Утилиты

  • funcs – набор функция
  • KRCRC – функции расчета crc-суммы
  • KRHTMLParseUtils – набор функция для поиска в HTML коде
  • KRStreamCoder – кодировка потока относительно кодового слова
  • KRStrUtils – набор функций для работы со строками
  • lgop – логические операции

Версия Delphi должна быть не ниже XE.

Скачать:
Набор компонентов для Delphi от 30.03.2021 г.

  Начиная с версии компонентов от 21.01.2021 года были внесены значительные изменения, из-за чего могут возникать ошибки совместимости с предыдущими версияси
подробнее...

Старые версии
 
Поделиться:
0
Dim Ban
06.03.2023 10:22
 
Доброго дня! Отличная библиотека, большая работа! Установил на RAD Studio 11.0 Version 28.0.42600.6491, установилась 260 версия без проблем, все вроде работает, кроме KRTCPServer, при подключении ModbusPoll вываливает ошибку Project ModbusTest.exe raised exception class $C0000005 with message 'access violation at 0x00000000: read of address 0x00000000'., запрос однократно приходит, дальше запросы не идут, после переподключения то же самое..., что может быть, может быть есть обновленные компоненты?
Показать полностью
0
Dim Ban
07.03.2023 09:15
Dim Ban
 
....добавил KRTPServer и все заработало, есть ли какое описание на KRTCPServer и KRTPServer, как правильно разбирать запросы и отправлять ответы с использованием компонентов или только обрабатывать OnRecv и Send...
Показать полностью
13
Руслан Кандирал
07.03.2023 09:41
Dim Ban
 
Показать полностью
0
Dim Ban
07.03.2023 17:29
Руслан Кандирал
 
Спасибо за пример!!! Не могу только понять где в примере формируются сами запросы и ответы?
Показать полностью
13
Руслан Кандирал
07.03.2023 17:45
Dim Ban
 
То, наверное, был не совсем правильный пример. KRTPServer - это я делал простой протокол связи по TCP для каких-то своих целей.

Вот пример более свежий, там отдельно сервер и клиент

https://kandiral.ru/downloads/MacroClien...
Показать полностью
0
Dim Ban
07.03.2023 17:43
Dim Ban
 
На сколько я понимаю это в клиентском модуле формируется эхо-запрос, а в серверном ответ..., для тестирования...
Показать полностью
0
Dim Ban
07.03.2023 17:48
Dim Ban
 
Спасибо! Сейчас посмотрю...
Показать полностью
0
Dim Ban
07.03.2023 18:13
Dim Ban
 
В последнем примере не совсем то.., KRTCPServer без KRTPServer у меня не работает, вываливает ошибку (писал выше), добавляю, все ок, у меня простой вопрос, на сервере я обрабатываю OnRecvAsync, определяю функцию, адрес регистра, данные и на их основе формирую ответ через метод Send сервера, правильный ли у меня подход или есть для сервера обработчик, который сам может обработать принятые данные типа как в клиенте переменные?
Показать полностью
13
Руслан Кандирал
07.03.2023 18:26
Dim Ban
 
Нужно обрабатывать OnEvent и в тот же буфера ложить ответ
TKRServerEvent = procedure(Sender: TObject; APack: PKRBuffer2k; var ALength: integer)

Это событие вызывается из потока подключенного клиента при получение пакета данных
Если после обработки события ALength установить в ноль то ответ не отправляется. А если нужно отправить ответ, то в APack заганяем данные, а в ALength длину данных

И нужно учитывать, что это событие вызывается из под потока ( нельзя использовать визуальные компоненты и при необходимости использовать методы синхронизации потоков)
Показать полностью
0
Dim Ban
09.03.2023 13:02
Руслан Кандирал
 
Ок! Благодарю за ответ! Буду пробовать...
Показать полностью
0
Lowcod (dev)
04.02.2023 08:48
 
Здраствуйте! Подскажите пожалуйста. Установил ваши компоненты под RAD Studio 11 Version 28.0.46141.0937 если быть точным. Ставил с понижением версии как в иструкции. Все в стало но с пропусками класов string в AnsiString. Есть ли у вас время и желание пересобрать компоненты под 11 версиию? И какие из ваших компоненты работают под Androide64\32.
Показать полностью
13
Руслан Кандирал
04.02.2023 09:48
Lowcod (dev)
 
Здравствуйте!
1) На сайте выложена старая версия компонентов. В текущей версии максимальная сборка 10.4 (я обычно юзаю последний релиз предпоследней версии, то есть к примеру когда выйдет версия 11.1 я перейду на последний апдейт одиннадцатой версии ). Это сборку я ставил на RAD Studio 11
2) "Все в стало но с пропусками класов string в AnsiString" - не совсем понял
3) "Есть ли у вас время и желание пересобрать компоненты под 11 версию?" - я могу вам выслать текущую версию
4) "И какие из ваших компоненты работают под Androide64\32". Я в Delphi под Android не программирую, по этому точно сказать не могу. В большинстве случаев за основу я беру стандартные компоненты Delphi. Соответственно, если родительские классы поддерживаются в Android, то и мои должны.
Показать полностью
0
Евгений Старцев
09.08.2021 23:47
 
Здравствуйте!
Подскажите пожалуйста, как можно прикрутить ModBus подобный протокол счетчиков воды "Пульсар"?
Насколько это будет трудозатратный процесс?
Спасибо.
Показать полностью
13
Руслан Кандирал
10.08.2021 05:58
Евгений Старцев
 
Здравствуйте, Евгений!

Я правильно понял, вы имеете ввиду другой протокол, не Modbus, но похожий?
Это будет зависеть от того на сколько сложный и насколько документирован(наличие открытой спецификации) сам протокол.
Показать полностью
0
Евгений Старцев
10.08.2021 11:37
Руслан Кандирал
 
Протокол открытый. Ссылка на документы https://cloud.mail.ru/public/kkp6/eCaSjw...
https://cloud.mail.ru/public/iewD/CFvg8h...
Показать полностью
0
Евгений Старцев
10.08.2021 11:46
Евгений Старцев
 
Спецификация протокола "ПульсарМ"
https://cloud.mail.ru/public/kn85/tCEed4...
Показать полностью
0
?im?ek Randa
03.05.2021 02:40
 
Привет Руслан,
Спасибо вам за вашу работу.
Я надеюсь, что 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.

Спасибо
Показать полностью
13
Руслан Кандирал
03.05.2021 07:07
?im?ek Randa
 
Здравствуйте.
Непонятен вопрос.

Покажите, что выводит TKRMBMon
Показать полностью
0
?im?ek Randa
03.05.2021 17:32
Руслан Кандирал
 
Спасибо за быстрый ответ.
Показать полностью
13
Руслан Кандирал
04.05.2021 10:42
?im?ek Randa
 
Вы можете скопировать файл
https://github.com/kandiral/Kandiral/blo...

в папку своего проекта и в строке 188 вставить
Sleep( 35 );

Это может помочь. Но это не есть хороший способ решения данной проблемы
Показать полностью
0
?im?ek Randa
05.05.2021 13:39
Руслан Кандирал
 
БОЛЬШОЕ СПАСИБО РУСЛАН
Показать полностью
13
Руслан Кандирал
04.05.2021 10:35
?im?ek Randa
 
Проблема в преобразователе RS485 to TCP и в компоненте TKRTCPConnector

С преобразователем RS485 to USB и TKRCOMPortConnector должно работать.

Причина:
Я TKRTCPConnector использовал для связи с Modbus TCP Slave устройствами. Такие устройства ответ посылают одним пакетом. Преобразователь RS485 to TCP делит ответ на части и отсылает его порциями. Деление пакета происходит по каким-то внутренним таймингам преобразователя. В результате TKRTCPConnector получает часть ответа и считает его за полный ответ.

Я не работал через преобразователь RS485 to TCP и поэтому в компоненте TKRTCPConnector не учел такую проблему.

В комментарии под видео ответил на английском языке
Показать полностью
0
Сергей Кинаш
22.04.2021 12:46
 
Здравствуйте, Руслан! В вашем "Примере передачи данных по протоколу Modbus на Delphi" при закрытии программы что-то продолжает держать COM-порт занятым. Т.е. при подключении к этому же порту другой программой (в ней с com-портом работаю без ваших компонентов) мне приходится сначала физически выдернуть/вставить usb из порта, тогда подключиться удаётся. Не подскажете, как поступить? Логи KRRuntimeErrors показывают, что
KRTimer1.Enabled:=false;
KRModbusClient1.Active:=false;
KRModbusMaster1.Active:=false;
KRCOMPortConnector1.Active:=false;
отрабатывают штатно.
Показать полностью
13
Руслан Кандирал
22.04.2021 13:39
Сергей Кинаш
 
Здравствуйте, Сергей!

Ранее с такой проблемой не сталкивался. А не может быть проблема в устройстве?

Если отрабатывает KRCOMPortConnector1.Active:=false , то вызывается процедура KRExecuteLast в которой закрывается порт
https://github.com/kandiral/Kandiral/blo...

В старой версии компонентов порт закрывается в деструкторе KRCOMPortConnector

Но в любом случае ни какой код не может быть идеальным. Попробуйте добавить логи в мои библиотеки, может где-то есть ошибка.
Показать полностью
0
?ukasz Fabrowicz
25.02.2021 19:12
 
Здравствуй. Как я могу выполнять математические операции с переменной Modbus mb000_wdvr (MCT_WORD <- TKRMBRegister)? Как преобразовать его в простое слово? И наоборот, как записать слово переменную в MODBUS как MCT_WORD <- TKRMBRegister?
Показать полностью
13
Руслан Кандирал
25.02.2021 19:20
?ukasz Fabrowicz
 
Здравствуйте.

Показать полностью
0
Alexander Chisty
04.10.2020 10:29
 
Здравствуйте. Хотел пользоваться компонентом NMEA0183 .Но там не реализовано много предложений. Вот стандарт NMEA.Может вам понадобится. https://yadi.sk/i/QP62-S4Zp9-TEA
Показать полностью
13
Руслан Кандирал
04.10.2020 16:59
Alexander Chisty
 
Здравствуйте! Да, я знаю. Там реализована только та часть протокола, которая мне нужна была на момент создания юнита. За мануал спасибо! У меня есть, но по проще, и многие показатели толком не описаны
https://kandiral.ru/downloads/NMEA0183.p...

В любом случае, данный юнит я буду переделывать. Я сделал под Arduino и Owen более быстрый и качественный обработчик. Сделаю аналогичный и под Delphi,
Показать полностью
0
CyberMan Bat
26.05.2020 22:18
 
Здравствуйте! Сделал на одном своем приборе журнал событий, в энергонезависимую память влезает около 4600 строк лога. И чтобы не тратить оперативку на весь лог делаю следующим образом: в приборе в четырех IR-регистрах размещаю строку лога и в отдельном регистре записываю номер этой строки - для контроля, после каждого ответа контроллер прибора подгружает в эти регистры следующую строку из памяти и инкриминирует её номер. Таким образом читая одни и те же регистры 4600 раз можно выгрузить весь лог.
Все работает, но читается довольно медленно. В программе обновляю регистры через UpdateValueAsync, тормозит именно эта процедура, не отрицаю что для такой задачи она не предназначена, но можно как-то настроить время между запросами?
И наверняка есть более грамотный способ, например через событие которое возникает сразу после считывания массива регистров?

Вот черновой код который вычитывает строки:

Показать полностью
13
Руслан Кандирал
27.05.2020 06:08
CyberMan Bat
 
Здравствуйте!

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

У меня есть еще не документированный функционал:

DWSTR - передача строк произвольной длинны используя два регистра (4 байта)
Функционал описан в файле KRModbusClient.pas
Для работы нужен дополнительный функционал на Slave устройстве

Вот библиотека для контроллеров ОВЕН
https://kandiral.ru/downloads/DTSRV2.lib...

Вот библиотека для Arduino
https://kandiral.ru/downloads/KRDWSTR.h....

Если вы реализуете функционал этих библиотек в своем приборе, то в Delphi вам будет достаточно использовать регистр типа MCT_DWSTR


Есть еще функционал для передачи файлов, тоже в KRModbusClient.pas. Там используется переменное количество регистров.
Показать полностью
0
CyberMan Bat
19.11.2019 18:05
 
Давно как то искал компонент Modbus для Delphi, ничего тогда не нашел и делал по простому... И вот нашел Ваши компоненты, которые по сути сводят всё к настройке практически одной мышкой, это большой плюс.

Есть вопросы и возможные ошибки:

1.При записи 32-битного float в HoldingRegisters через поле KRField,
не учитывается свойство переменной HighWordFirst когда оно true
А при чтении учитывается, по этому при записи происходит перестановка слов местами.
Мне почему-то привычно когда байты идут по-порядку, без всяких перестановок слов, хотя многие почему-то переставляют )

2.Возможно ли разбить один регистр на две байтовые переменные, чтобы при этом
запись в двух KRField правильно отрабатывала (не перетирала соседний байт в ноль в регистре)
Это было бы актуально для байтовых переменных не расходуя регистры за зря

3. Возможно ли обновлять состояние индикатора по стандартному таймеру?
Пробую через KRIndicator1.Update - не работает.

4. Не хватает примеров просто отправки пакета по кнопке, а так же интересна работа с отправкой / приемом файла.

Отдельная благодарность за Ваш вклад! Надеюсь проект будет поддерживаться.
Показать полностью
13
Руслан Кандирал
20.11.2019 23:21
CyberMan Bat
 
Обновил библиотеки.

1. Если тип переменной MCT_BYTE, то при записи старший байт не стирается
2. Для того чтобы значение переменной типа MCT_BYTE бралось из старшего байта нужно в свойство HighByteFirst установить в false
3. Состояние индикатора можно обновлять с помощью методов Update, Refresh и Repaint
Показать полностью
0
CyberMan Bat
25.11.2019 20:11
Руслан Кандирал
 
Здравствуйте! Огромное спасибо за оперативный ответ и обновление компонентов. Теперь всё работает, единственный момент, побайтовая запись в регистр правильно работает при условии что регистр будет периодически читаться, без этого второй байт записывает значение первого от предыдущего чтения, берется где-то видимо из буфера. Тут конечно спорный момент возникает, откуда брать актуальный второй байт, из программы или прибора, логично брать из программы т.к. в текущий момент идёт работа через программу, а изменение переменных через меню прибора в этот момент блокировать.
Т.е. если постоянно не читать Holding-регистры, то логика такая: при запуске программы или открытии окна настроек, вычитываются все Holding-регистры и все данные становятся актуальными, а запись происходит уже с учетом тех данных которые в данный момент в полях формы.
Если же постоянно читать из прибора Holding-регистры, то синхронизация данных происходит сама собой и всё правильно записывается. И в принципе можно ничего не исправлять, но об этом моменте нужно помнить.

По поводу отправки пакета, я имею ввиду просто запрос по кнопке через функцию и как я понимаю для Input-регистров это делается через функцию MBMReadInputRegisters(ADevAddr: byte; AStartReg, ACount: Word; AFrom: byte; ABuffer: PKRBuffer; out ARecvLen: Byte)
Хотелось бы увидеть пример её работы, как ловить ответ и куда он принимается, в тот же ABuffer?

И ещё вопрос, анализируется ли в ответе третий байт - кол-во байт данных? Я в своей программе его не анализировал, проверял пакет просто по контрольной сумме, это позволяло передавать прибору около тысячи переменных за один запрос, нужно это было для построения графиков..
Показать полностью
13
Руслан Кандирал
25.11.2019 21:03
CyberMan Bat
 
1) Для обновления значений переменных у которых Interval=0 я делаю следующим образом. У всех этих переменных ставлю свойство WaitForUpdates в True (после вызова метода UpdateValue, запрос будет посылаться до тех пор пока не будет получено значение)
таким образом получается, что при подключении к устройству все эти переменные обновят свои значения.
С байтовыми переменными немного сложнее. Так, второй байт(не используемый), после обновления сохраняется и при записи добавляется к регистру. Но тут получается сложность если отдельной переменной используется и второй байт. Тут получается если второй байт будет перезаписан, то первая переменная об этом знать не будет и при ее записи значение второго байта перезапишется в то которое было сохранено. Тут палка о двух концах, по этому я байтовые переменные практически не использую.

2) Для самостоятельной отправки пакетов нужен компонент KRModbusMaster
Вот пример
Тут нужно учесть один момент, что CallBack функция вызывается не в основном потоке.

3) Количество байт данных используется при формирование списка полученных регистров
В файле KRModbusMaster.pas функция(для RTU)
function TKRMBThread.chRTUReadInputRegisters
Также проверяется контрольная сумма и бит ошибки в функции
procedure TKRMBThread._CallBack

Если вы хотите принимать или получать большое количество данных, то можно использовать переменную с типом MCT_ARRAY. Вот пример использования
Показать полностью
0
CyberMan Bat
29.12.2019 16:48
Руслан Кандирал
 
Спасибо за ответы. Да через тип MCT_ARRAY работает, (главное не забыть добавить в uses KRTypes) получается что запрос происходит как обычно, а ответ помещается в отдельный массив, ограничение правда в максимум 255 регистров за один запрос, в принципе с этим можно жить.

Есть ещё пара вопросов:
1. В чем разница между компонентами для компорта и блютустовыми компонентами, если в винде блютус так же работает через виртуальный компорт?
2. Будет ли портирование под FireMonkey? Чтобы можно было делать приложения под андроид. Я думаю это дало бы преимущество библиотеке.
3. Двойным кликом по компоненту KRTimer на форме по умолчанию открывается обработчик ошибок, неплохо бы в будущем изменить на обработчик самого таймера.

Не теряю надежды в следующем году увидеть примеры работы с файлами :)
С наступающими праздниками!
Показать полностью
13
Руслан Кандирал
30.12.2019 00:00
CyberMan Bat
 
1. У меня связь по Bluetooth выполнена через сокет. Плюс есть компонент KRBluetooth, через который можно получить список видимых устройств и провести сопряжение с выбранным.
2. Я не пользуюсь FireMonkey. Под Android я программирую в Eclipse на Java и я уже давно сделал аналоги своих библиотек для Modbus на Java под Android, но я их еще ни где не выкладывал.
3. ок, если это возможно, то сделаю.

Я много чего хочу выложить на сайт, в том числе и статью про работу с файлами, но у меня не хватает на это времени. По этому статьи добавляю по мере возможности.

И Вас с наступающим Новым Годом!
Показать полностью
13
Руслан Кандирал
20.11.2019 09:34
CyberMan Bat
 
Вы правы по поводу неправильной записи, но она возникает только если выбрана функция записи mbwfWriteHoldingRegister(0x06), если выбрать функцию mbwfWriteHoldingRegisters(0x10), то запись будет правильная. Обновлю сегодня весь пакет компонентов с теми изменениями, которые вы просили, но поздно вечером.
Показать полностью
13
Руслан Кандирал
19.11.2019 22:00
CyberMan Bat
 
Здравствуйте!
1. Вроде работает правильно. Преобразование последовательности байтов и у SINGLE и у DWORD производится одной и той же функцией. По этому если неправильно формируется SINGLE то и DWORD должен формироваться неправильно. Пожалуйста, перепроверьте и отпишитесь.
2. Я могу это сделать завтра, но смогу скинуть только измененные файл здесь в комментариях. Полностью обновить пакет компонентов пока нет возможности.
3. Update - эта процедура наследуется от TShape или, если быть точнее, от TControl. Я ее не перегружаю. То есть она просто перерисовывает фигуру с теми же свойствами. Но, хотя, хорошее замечание. Сделаю завтра и тоже скину файлом.
4. Что вы имеете ввиду под фразой "отправки пакета"? Работа с файлами реализована недавно. Это не стандартные возможности modbus, а моя разработка. Для передачи файлов на удаленном устройстве тоже должен быть дополнительный функционал, я его реализовал только для контроллеров Owen и Arduino. По этому вопросу будет отдельная статья.

Проект поддерживаю по мере возможности, пока забрасывать не собираюсь.
Показать полностью
0
Владимир Киевский
07.11.2019 08:53
 
Добрый день!
Заметил такую проблему в закрытии приложения. При только чтении программа закрывается корректно. Если произвести запись значений TKRMBRegister.Value, а потом закрыть используя
KRTimer1.Enabled:=false;
KRModbusClient1.Active:=false;
KRModbusMaster1.Active:=false;
KRCOMPortConnector1.Active:=false;
программа не завершает работу (только через диспетчер задач). Обмен данными прекращается. Соединение COM, какие есть мысли?
Показать полностью
13
Руслан Кандирал
07.11.2019 09:07
Владимир Киевский
 
Здравствуйте!
Для начала, вам нужно определить какой именно из компонентов подвисает. Это можно сделать сохраняя логи в файл. Я для этих целей использую модуль KRRuntimeErrors

Показать полностью
0
Владимир Киевский
07.11.2019 09:28
Руслан Кандирал
 
Что-то после записи мешает закрыть приложение.
Показать полностью
0
Владимир Киевский
07.11.2019 09:19
Руслан Кандирал
 
Ошибок вроде нет,
2019-11-07 08:15:28.942 KRTimer1.Enabled:=false;
2019-11-07 08:15:29.942 KRModbusClient1.Enabled:=false;
2019-11-07 08:15:29.957 KRModbusMaster1.Enabled:=false;
2019-11-07 08:15:29.979 KRCOMPortConnector1.Enabled:=false;
Показать полностью
13
Руслан Кандирал
07.11.2019 09:31
Владимир Киевский
 
Получается, что все компоненты корректно останавливают свои потоки. Мне нужно видеть код, чтобы определить причину. Можете скинуть ссылку через форму обратной связи
Показать полностью
0
Владимир Киевский
07.11.2019 10:01
Руслан Кандирал
 
отправил
Показать полностью
0
Ruslan Tomak
26.01.2019 15:04
 
А есть пример работы с KRCOMPortConnector?
Просто мне MODBUS не нужен, у меня свой протокол.
Я так понял, нужно с KRCOMPortConnector.Send разобраться?
Показать полностью
13
Руслан Кандирал
26.01.2019 22:30
Ruslan Tomak
 
KRCOMPortConnector - наследник класса KRConnector.
Задача класса KRConnector отправить запрос, получить ответ и вернуть его при помощи callback функции.
Классы KRCOMPortConnector, KRTCPConnector и KRBTConnector определяют способ передачи данных.

Пример работы с KRConnector есть в файле KRModbusMaster.pas

В двух словах:

procedure Send(APack: PKRBuffer; ALength: integer; ACallBack: TKRConnectorCallBack;
AData: Pointer = nil; AWaitResult: boolean = true; ARecvLen: integer = 0;
ADelimiter: Cardinal = 0; ADelimiterLen: integer = 0);

отправляет запрос в очередь на обработку коннектором.

APack: PKRBuffer - указатель на буфер с отправляемыми данными
ALength: integer - длинна пакета данных
ACallBack: TKRConnectorCallBack - callback функция, которая будет вызвана после обработки запроса
AData: Pointer = nil - указатель на дополнительные данные. Указатель будет передан в callback функции.
AWaitResult: boolean = true - ждать ответ на запрос
ARecvLen: integer = 0 - если мы знаем длину ответа, то указываем тут
ADelimiter: Cardinal = 0 - если есть разделитель между пакетами ответа, то указываем тут. Например в текстовой версии modbus есть разделитель <CR><LF>
ADelimiterLen: integer = 0 - количество байт в разделителе (1-4)


функция, которая будет вызвана после обработки запроса
procedure Callback(AError: integer; APack: PKRBuffer; ALength: integer; AData: Pointer) ;

AError: integer - код ошибки (0 - нет ошибок)
APack: PKRBuffer - указатель на буфер с ответом. Это тот-же буфер который использовался при отправке пакета. Если вы его создавали при помощи функции GetMem или New, то в callback функции нужно освободить память буфера. Так сделано в KRModbusMaster.pas
ALength: integer - количество байт данных в ответе
AData: Pointer - указатель на дополнительные данные


Возможные ошибки:

'Нет ошибок.',
ceOK = TKRConnectorError(0);

'Очередь коннектора переполнена.',
ceQueueOverflowed = TKRConnectorError(1);

'Соединение не установлено.',
ceNotConnection = TKRConnectorError(2);

'Не удалось отправить данные.',
ceDataNotSended = TKRConnectorError(3);

'Ответ не получен.',
ceNoResponse = TKRConnectorError(4);

'Истекло время ожидания при отправке данных.',
ceRequestTimeout = TKRConnectorError(5);

'Истекло время ожидания при получении данных.',
ceResponseTimeout = TKRConnectorError(6);

'Соединение не активно.'
ceNotActive = TKRConnectorError(7);
Показать полностью
0
Ruslan Tomak
25.01.2019 22:25
 
Привет. Вопрос про KRCOMPortSets.
Добавил его на форму, при создании формы делаю KRCOMPortSets.Init
Затем по нажатию кнопки делаю KRCOMPortSets.Execute
Но ничего не происходит. Это я понял из примера с сайта. Или я что-то упустил?
Как я понял, должно открыться окно с настройками порта?
Показать полностью
13
Руслан Кандирал
25.01.2019 22:52
Ruslan Tomak
 
У компонента KRCOMPortSets есть свойство COMPort. В нём нужно указать объект который будет настраиваться. Добавляются только объекты соответствующие интерфейсу IKRCOMPortSets
Показать полностью
0
Алексей Никанов
12.01.2019 22:47
 
Руслан, проект поражает объёмом... Но при компиляции, в юните KRIniConfig, была обнаружена не объявленная переменная в процедуре "TKRIniCfgParam.SetDefaultValue(const Value: String);". Строка 326:- "_fs:=FormatSettings;"
Показать полностью
13
Руслан Кандирал
12.01.2019 23:03
Алексей Никанов
 
У меня когда-то тоже такая ошибка вылетала. Уже не помню в чем точно была причина. Но скорее всего у вас версия Delphi ниже XE или попробуйте новее версию компонентов
https://kandiral.ru/o_sajte.html#comment...
Показать полностью
0
Денис Яковлев
11.10.2018 01:37
 
Есть ли версия данных компонентов подходящая для Delphi 7?
Показать полностью
13
Руслан Кандирал
11.10.2018 06:13
Денис Яковлев
 
Нет. Компоненты изначально разрабатывались под Delphi XE.
Можно попробовать поставить на Delphi 7, но как минимум точно будет проблема со строками, так как код заточен под двухбайтовые строки, а в седьмой версии используются одно байтовые. По этому, я думаю, проще Вам перейти на Delphi XE.
Показать полностью

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

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 или отправкой на почту
Modbus Slave на Arduino
Реализация клиентской части протокола Modbus RTU и Modbus ASCII для контроллеров Arduino
Инструкция по установке компонентов на Delphi
Подробная инструкция по установке компонентов на Delphi с видео обзором
Пример передачи данных по протоколу Modbus на Delphi
Пример передачи данных с контроллера ОВЕН ПЛК100 в программу на Delphi по протоколу Modbus