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

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

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

  • 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 от 20.11.2019 г.
Старые версии
 
Поделиться:
0
CyberMan Bat
19.11.2019 18:05
 
Давно как то искал компонент Modbus для Delphi, ничего тогда не нашел и делал по простому... И вот нашел Ваши компоненты, которые по сути сводят всё к настройке практически одной мышкой, это большой плюс.

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

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

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

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

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

Отдельная благодарность за Ваш вклад! Надеюсь проект будет поддерживаться.
Показать полностью
5
Руслан Кандирал
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?

И ещё вопрос, анализируется ли в ответе третий байт - кол-во байт данных? Я в своей программе его не анализировал, проверял пакет просто по контрольной сумме, это позволяло передавать прибору около тысячи переменных за один запрос, нужно это было для построения графиков..
Показать полностью
5
Руслан Кандирал
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 на форме по умолчанию открывается обработчик ошибок, неплохо бы в будущем изменить на обработчик самого таймера.

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

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

И Вас с наступающим Новым Годом!
Показать полностью
5
Руслан Кандирал
20.11.2019 09:34
CyberMan Bat
 
Вы правы по поводу неправильной записи, но она возникает только если выбрана функция записи mbwfWriteHoldingRegister(0x06), если выбрать функцию mbwfWriteHoldingRegisters(0x10), то запись будет правильная. Обновлю сегодня весь пакет компонентов с теми изменениями, которые вы просили, но поздно вечером.
Показать полностью
5
Руслан Кандирал
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, какие есть мысли?
Показать полностью
5
Руслан Кандирал
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;
Показать полностью
5
Руслан Кандирал
07.11.2019 09:31
Владимир Киевский
 
Получается, что все компоненты корректно останавливают свои потоки. Мне нужно видеть код, чтобы определить причину. Можете скинуть ссылку через форму обратной связи
Показать полностью
0
Владимир Киевский
07.11.2019 10:01
Руслан Кандирал
 
отправил
Показать полностью
0
Ruslan Tomak
26.01.2019 15:04
 
А есть пример работы с KRCOMPortConnector?
Просто мне MODBUS не нужен, у меня свой протокол.
Я так понял, нужно с KRCOMPortConnector.Send разобраться?
Показать полностью
5
Руслан Кандирал
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
Но ничего не происходит. Это я понял из примера с сайта. Или я что-то упустил?
Как я понял, должно открыться окно с настройками порта?
Показать полностью
5
Руслан Кандирал
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;"
Показать полностью
5
Руслан Кандирал
12.01.2019 23:03
Алексей Никанов
 
У меня когда-то тоже такая ошибка вылетала. Уже не помню в чем точно была причина. Но скорее всего у вас версия Delphi ниже XE или попробуйте новее версию компонентов
https://kandiral.ru/o_sajte.html#comment...
Показать полностью
0
Денис Яковлев
11.10.2018 01:37
 
Есть ли версия данных компонентов подходящая для Delphi 7?
Показать полностью
5
Руслан Кандирал
11.10.2018 06:13
Денис Яковлев
 
Нет. Компоненты изначально разрабатывались под Delphi XE.
Можно попробовать поставить на Delphi 7, но как минимум точно будет проблема со строками, так как код заточен под двухбайтовые строки, а в седьмой версии используются одно байтовые. По этому, я думаю, проще Вам перейти на Delphi XE.
Показать полностью

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

28.01.2020 16:15
Опубликована статья о принципе работы коннекторов в 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 г.

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

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