В версию компонентов от 21.01.2021 года были внесены значительные изменения, из-за чего могут возникать ошибки совместимости с предыдущими версияси подробнее...
Набор библиотек JEDI API распаковываем в папку (путь указываю для примера, каждый может распаковывать туда куда душе будет угодно, главное что-бы путь в Environment Variables был прописан правильно):
C:\Delphi\JEDI\
Набор моих библиотек распаковываем в папку (про расположение папки см. выше):
C:\Delphi\Kandiral\
1. Запускаем Delphi
2. Заходим в меню "Component"->"Install Packages...". Если в списке есть уже установленные ранее компоненты(старая версия), удаляем их.
3. Заходим в меню "Tools"->"Options..."->"Environment Variables". Добавляем переменные(если их нет, а если есть, то проверяем правильность пути) JEDI=C:\Delphi\JEDI и переменную KANDIRAL=C:\Delphi\Kandiral
4. Заходим в меню "Tools"->"Options..."->"Library". В "Selected Platform" выбираем "32-bit Windows". В "Library path" добавляем следующие пути(если их там нет)
$(JEDI)\jwa\branches\2.3\Common
$(JEDI)\jwa\branches\2.3\Includes
$(JEDI)\jwa\branches\2.3\SaCMAPI
$(JEDI)\jwa\branches\2.3\Win32API
$(KANDIRAL)\Release\$(ProductVersion)\$(Platform)
$(KANDIRAL)\Resources
$(KANDIRAL)\dfm
в "Browsing path" добавляем такие пути
$(KANDIRAL)\Automation
$(KANDIRAL)\Common
$(KANDIRAL)\Crypting
$(KANDIRAL)\File
$(KANDIRAL)\Graphics
$(KANDIRAL)\ISO
$(KANDIRAL)\Media
$(KANDIRAL)\Net
$(KANDIRAL)\Utils
$(KANDIRAL)\Web
$(KANDIRAL)\Windows
5. Открываем одну из групп проектов, которая соответствует вашей версии Delphi. Имя файла группы проектов имеет следующий вид Kandiral150.groupproj. Где 150 - это Package Version (подробнее см. тут Compiler Versions).
Kandiral150.groupproj Delphi XE
Kandiral160.groupproj Delphi XE2
Kandiral170.groupproj Delphi XE3
Kandiral180.groupproj Delphi XE4
Kandiral190.groupproj Delphi XE5
Kandiral200.groupproj Delphi XE6
Kandiral210.groupproj Delphi XE7
Kandiral220.groupproj Delphi XE8
Kandiral230.groupproj Delphi 10 Seattle
Kandiral240.groupproj Delphi 10.1 Berlin
Kandiral250.groupproj Delphi 10.2 Tokyo
Kandiral260.groupproj Delphi 10.3 Rio
если в списке нет необходимого вам файла, то берем версии ниже. То есть если например у вас "Delphi 10 Seattle", а файла Kandiral230.groupproj нет, то открываем файл Kandiral220.groupproj или ниже версии, который есть.
6. В Project Manager на названии группы жмем правой кнопкой мыши и в контекстном меню выбираем "Build All"
7. После компиляции поочередно на каждом пакете жмем правой кнопкой мыши и в контекстном меню выбираем "Install"
Если всё сделано правильно, то в палитре компонентов должны появиться установленные элементы.
При установке путей к библиотекам нужно указать платформу "32-bit Windows"
В некоторых версиях компилятор ругается на файл с картинками
Мне, во всех случаях возникновения этой ошибки, помог перезапуск Delphi.
Если перезапуск Delphi не помогает, то идём следующим путем
Первый способ. Убираем из пакета файл с картинками. На работу библиотек это не повлияет, просто сами компоненты будут без картинок. Для этого в "Project Manager" на названии пакета (например KRCommon160) жмём правой кнопкой мыши и в контекстном меню выбираем "View Source"
Удаляем строчку
{$R '..\..\Common\KRCommon.dcr'}
и перекомпилируем пакет.
Второй способ. Подключаем картинки старого формата. В каждом пакете есть файл типа "ИмяПакета.dcr", в нем содержатся картинки всех компонентов (которые я уже нарисовал). Но есть и еще dcr файлы, которые сделаны в imageedit от Delphi 7. Второй способ заключается в том, что-бы заменить новый файл с картинками на старые. Для этого в "Project Manager" на названии пакета (например KRCommon160) жмём правой кнопкой мыши и в контекстном меню выбираем "View Source"
И вместо файла KRCommon.dcr подключаем все остальные dcr файлы из папки Common
Перекомпилируем пакет. Аналогично проделываем с остальными пакетами где вылетает ошибка.
Как я понял, ошибка в каком-то из примеров. Это из-за того, что пример был сделан на старой версии компонентов, где в событиях использовался тип PKRBuffer. Нужно в процедурах send и recv изменить тип указателя на буфер с PKRBuffer на PByte
Здравствуйте! Компоненты заточены на использование двухбайтовых строк, плюс используются некоторые элементы типа FormatSettings и др. , которых нет в Delphi 7
Добрый день! Пытаюсь установить 250 на 10.2. При Build all выдает: [dcc32 Fatal Error] KRGoogleSearchConsole.pas(25): F2613 Unit 'uLkJSON' not found. Все пути в указал Спасибо
Да есть такая ошибка. Дело в том, что модуль uLkJSON был удален в последней версии. Как я не отлавил эту ошибку на тестах перед загрузкой, непонятно
Походу uLkJSON остался в двух юнитак пакета KRWeb. Можно компилировать пакеты по отдельности, все кроме KRWeb, то есть не выбирать "Build All" на группе пакетов, а на каждом пакете делать Build
Руслан, подскажите, по работе с вашими компонентами. Я новичок, поэтому не судите строго... Пытаюсь прочитать значения температуры с модуля Овен МВ110-8А (подключен к компу через преобразователь интерфейса Овен АС-4), по протоколу Modbus-RTU. Поместил на форму KRCOMPortConnector1, KRModbusMaster1, KRModbusClient1. Выставил настройки COM порта. В KRModbusClient1 добавил переменную, указал регистр входа. Добавил KRField, связал его с переменной. Запускаю проект, в поле KRField вместо температуры - ноль. Лампочка опроса в модули не мигает. Что нужно еще сделать, чтобы прочитать температуру из модуля?
И еще в компоненте KRField пропало поле Timer которое присутствует в обучающих видио. Как теперь задать периодичность обновления поля?
Там исходники и есть откомпилированный файл, то есть можно запустить программу и проверить как она работает.
Программа считывает, с заданным интервалом, один или два регистра и отображает значение согласно заданной конфигурации
Для работы нужно: 1) Кнопка COMSets - настройки ком порта ( нужно указать порт к которому подключен прибор и скорость передачи данных ) 2) Внизу в поле Modbus Address указать modbus адрес устройства 3) В поле Index, указать номер регистра 4) В поле Interval, период обновления значения в миллисекундах 5) Нажать кнопку Connect
Если связь с устройством установится, то в двух полях слева вверху под кнопками, должно отображаться текущее значение.
В процессе обновления можно изменять: 1) Тип значение (MCT_BYTE - один байт без знака; MCT_WORD - один регистр без знака; MCT_SMALLINT - один регистр со знаком; MCT_DWORD - два регистра(4 байта), без знака; MCT_INT - два регистра(4 байта), со знаком; MCT_SINGLE - два регистра(4 байта), значение с плавающей запятой; ) 2) Read Function - функция чтения (0x03 или 0x04) 3) High Byte First - последовательность байтов 4) High Word First - последовательность регистров
Если связь будет нестабильной, то под кнопкой COMTimes можно увеличить тайминг ReadTotalTimeoutConstant до 20 или 25
И кнопка MBMon открывает окно в котором можно посмотреть все данный который приходят/уходят в устройства, то есть пакеты протокола Modbus
Спасибо за программу, с ней всё заработало. У меня ещё вопрос! Как можно реализовать обмен с COM портом не по протоколу Modbus? А например, по такому: Связь устанавливается посредством послания запросов и получения ответов на них. Стандартная посылка состоит из 4-х байт. Первый байт - управляющий. Второй содержит младший байт адреса запрашиваемой переменной. Третий байт содержит данные. Четвертый байт- байт контрольной суммы. (Сумма по модулю 256 первых трех).
Я только разбираюсь в ваших компонентах. Поэтому пока сложно представить, как это сделать.
Там основной функционал описан в классе TKRMBThread функция TKRMBThread.DoSendRTU отправляет данные в коннектор а в процедуре TKRModbusMaster.ConnectorCB идет разбор ответа
Как я понял ошибка выглядит как-то так : “Required package rtl not found” Это проблема у Вас в Delphi. Подобных тем много в интернете: https://www.google.com.ua/search?q=delph...
У Вас версия Delphi ниже XE и там нет глобальной переменной FormatSettings Как вариант Вы можете везде где используется структура FormatSettings заменить на соответствующие глобальные переменные. То есть, в старых версия были отдельные переменные форматирования: Сейчас все они объединены в одну структуру FormatSettings
Но учтите, что компоненты разрабатывались и тестировались под Delphi от версии XE и выше
Здравствуйте, подскажи пожалуйста по следующему вопросу. Команда управления устройством содержится в 0 и 1 бите holding регистра. Как правильно с помощью ваших компонентов изменить 2 бита регистра не затрагивая другие биты?
Руслан, спасибо. Читал эту статью. Скажите, правильно ли я понимаю, что мне нужно последовательно изменить каждый бит по отдельности? 2 сразу я не могу изменить?
Вы можете напрямую работать с регистров с помощью стандартных компонентов Delphi, например по нажатию кнопки Тут есть два момента: 1) Вам нужно позаботиться об обновлении значения, что-бы не затронуть другие биту нужно знать их значение, то есть до изменения состояния бита нужно получить текущее значение регистра. Можно задать интервал обновления KRMBRegister1.Interval:=500 2) Сделать установку значения до отправки KRMBRegister1.UpdateType:=vutBefore. Данный параметр желательно устанавливать во всех регистрах где идет работа с битами. vutBefore - говорит программе, что локальное значение регистра нужно установить до отправки его устройству.
Добрый день! при скачивании каталога с компонентами файлов от 17.08.2019 в ней нет папке Release. Думал, что проблема в антивирусе, но при скачивании с других устройств этой папке нет. В чем может быть причина?
Смотрю все по COM порту работают. У меня ModBus TCP устройства и Токио 10.2. Компонент с ModBus TCP корректно отработает?
Проверьте. Должно работать.
Установлю и отпишусь
пробовал на версиях 10.2 10.3 10.4. Если закоментировать, то неработает логирование.
Form1.KRCOMPortConnector1.OnSendAsync:=send;
Form1.KRCOMPortConnector1.OnRecvAsync:=recv;
[dcc32 Error] MonitoringUnit.pas(102): E2010 Incompatible types: 'PByte' and 'PKRBuffer'
еще при загрузке проекта на всех полях ввода пишет Error reading KRField1.Timer Property Timer not exist
Как я понял, ошибка в каком-то из примеров.
Это из-за того, что пример был сделан на старой версии компонентов, где в событиях использовался тип PKRBuffer.
Нужно в процедурах send и recv изменить тип указателя на буфер с PKRBuffer на PByte
Компоненты заточены на использование двухбайтовых строк, плюс используются некоторые элементы типа FormatSettings и др. , которых нет в Delphi 7
Все пути в указал
Спасибо
Да есть такая ошибка. Дело в том, что модуль uLkJSON был удален в последней версии.
Как я не отлавил эту ошибку на тестах перед загрузкой, непонятно
Походу uLkJSON остался в двух юнитак пакета KRWeb. Можно компилировать пакеты по отдельности, все кроме KRWeb, то есть не выбирать "Build All" на группе пакетов, а на каждом пакете делать Build
А я сейчас буду исправлять.
Вам спасибо!
Спасибо за быстрый ответ ;)
Я новичок, поэтому не судите строго...
Пытаюсь прочитать значения температуры с модуля Овен МВ110-8А (подключен к компу через преобразователь интерфейса Овен АС-4), по протоколу Modbus-RTU.
Поместил на форму KRCOMPortConnector1, KRModbusMaster1, KRModbusClient1. Выставил настройки COM порта.
В KRModbusClient1 добавил переменную, указал регистр входа.
Добавил KRField, связал его с переменной.
Запускаю проект, в поле KRField вместо температуры - ноль. Лампочка опроса в модули не мигает.
Что нужно еще сделать, чтобы прочитать температуру из модуля?
И еще в компоненте KRField пропало поле Timer которое присутствует в обучающих видио.
Как теперь задать периодичность обновления поля?
Спасибо большое за ответ!
Там исходники и есть откомпилированный файл, то есть можно запустить программу и проверить как она работает.
Программа считывает, с заданным интервалом, один или два регистра и
отображает значение согласно заданной конфигурации
Для работы нужно:
1) Кнопка COMSets - настройки ком порта ( нужно указать порт к
которому подключен прибор и скорость передачи данных )
2) Внизу в поле Modbus Address указать modbus адрес устройства
3) В поле Index, указать номер регистра
4) В поле Interval, период обновления значения в миллисекундах
5) Нажать кнопку Connect
Если связь с устройством установится, то в двух полях слева вверху под
кнопками, должно отображаться текущее значение.
В процессе обновления можно изменять:
1) Тип значение (MCT_BYTE - один байт без знака; MCT_WORD - один
регистр без знака; MCT_SMALLINT - один регистр со знаком; MCT_DWORD -
два регистра(4 байта), без знака; MCT_INT - два регистра(4 байта), со
знаком; MCT_SINGLE - два регистра(4 байта), значение с плавающей
запятой; )
2) Read Function - функция чтения (0x03 или 0x04)
3) High Byte First - последовательность байтов
4) High Word First - последовательность регистров
Если связь будет нестабильной, то под кнопкой COMTimes можно увеличить
тайминг ReadTotalTimeoutConstant до 20 или 25
И кнопка MBMon открывает окно в котором можно посмотреть все данный
который приходят/уходят в устройства, то есть пакеты протокола Modbus
У меня ещё вопрос! Как можно реализовать обмен с COM портом не по протоколу Modbus?
А например, по такому:
Связь устанавливается посредством послания запросов и получения
ответов на них. Стандартная посылка состоит из 4-х байт.
Первый байт - управляющий.
Второй содержит младший байт адреса запрашиваемой переменной.
Третий байт содержит данные.
Четвертый байт- байт контрольной суммы. (Сумма по модулю 256
первых трех).
Я только разбираюсь в ваших компонентах. Поэтому пока сложно представить, как это сделать.
KRCOMPortConnector.Send - отправляет запрос и по Callback возвращает ответ.
Вам нужно посмотреть код файла KRModbusMaster.pas
Там основной функционал описан в классе TKRMBThread
функция TKRMBThread.DoSendRTU отправляет данные в коннектор
а в процедуре TKRModbusMaster.ConnectorCB идет разбор ответа
Вот тут уже был вопрос по работе с коннектором
Как я понял ошибка выглядит как-то так : “Required package rtl not found”
Это проблема у Вас в Delphi. Подобных тем много в интернете:
при "Build All"
выскакивает ошибка на строчке
_fs:=FormatSettings;
Undeclared identifier
что делать???
помогите пожалуйста
У Вас версия Delphi ниже XE и там нет глобальной переменной FormatSettings
Как вариант Вы можете везде где используется структура FormatSettings заменить на соответствующие глобальные переменные. То есть, в старых версия были отдельные переменные форматирования:
Сейчас все они объединены в одну структуру FormatSettings
Но учтите, что компоненты разрабатывались и тестировались под Delphi от версии XE и выше
Посмотрите статью и видео:
Там есть пример управления битами с помощью компонентов KRVCheckBox и TKRIndVButton
Тут есть два момента:
1) Вам нужно позаботиться об обновлении значения, что-бы не затронуть другие биту нужно знать их значение, то есть до изменения состояния бита нужно получить текущее значение регистра. Можно задать интервал обновления KRMBRegister1.Interval:=500
2) Сделать установку значения до отправки KRMBRegister1.UpdateType:=vutBefore. Данный параметр желательно устанавливать во всех регистрах где идет работа с битами. vutBefore - говорит программе, что локальное значение регистра нужно установить до отправки его устройству.
Добавил:
Все решилось добавлением строки "$(BDSLIB)\$(PLATFORM)\release" в Library Path