Modbus Slave на Arduino

KRModbusSlave

KRModbusSlave - родительский класс для классов KRModbusRTUSlave и KRModbusASCIISlave. Содержит основные параметры.
Конструктор
Методы

KRRegisters

KRRegisters - родительский класс для обработчика данных.
Методы

KRModbusRTUSlave

KRModbusRTUSlave - обработчик пакетов Modbus RTU. Является наследником KRModbusSlave и перегружает только метод _DO().

KRModbusASCIISlave

KRModbusASCIISlave - обработчик пакетов Modbus ASCII. Является наследником KRModbusSlave и перегружает только метод _DO().

KRModbusRTUSlaveRS485

KRModbusRTUSlaveRS485 - обработчик пакетов Modbus RTU с поддержкой преобразователя UART TTL-RS485. Является наследником KRModbusSlave и перегружает только метод _DO().
Конструктор

Пример использование



Для примера будем передавать данные из контроллера в программу на Delphi.

Создаем обработчик данных на базе класса KRRegisters. В нем объявляются те данные, которые должны быть доступны посредством протокола Modbus. Для примера будем использовать локальные переменные следующих типов: word, int, uint32_t, long, float и строку. Строка в Arduino будет представлена в виде побайтового массива, это поможет избежать проблем с кодировкой. Еще будем передавать массив регистров и данные из EEPROM.

В проекте создадим обработчик данных и обработчик протокола Modbus. В зависимости от того, какого типа Modbus (RTU или ASCII) необходим, подключаем соответствующий обработчик. Для того, что бы была видна динамика изменения данных будем менять их значения через определенный период времени.

Форма программы на Delphi
Программа для тестирования протокола Modbus с контроллера Arduino

Программа на Delphi будет отображать значения переменных из контроллера с периодом обновления 2 раза в секунду. А так же будет возможность изменять значения переменных. С помощью выпадающего списка в верхнем правом углу формы устанавливаем тип протокола RTU или ASCII.

Оптимизация

Добавил оптимизированные варианты библиотек:

ModbusRTUTestUART0
ModbusRTUTestRS485UART0

Библиотеки привязаны к порту UART0, и для передачи данных не используется стандартные средства управления аппаратными UART портами. Управление портом осуществляется напрямую, через регистры.

ModbusRTUTestUART0min
ModbusRTUTestRS485UART0min

Алгоритм обработки протокола упрощен, но при этом функционал не меняется. Подробнее рассказывается в видео ролике.



Набор библиотек ModbusSlave для контроллеров Arduino
 
Поделиться:
0
Игорь Коровка
04.02.2019 05:35
 
Сколько не пробовал на XE10.2 - не смог сдетаь exe ModbusTester.dpr чтоб работал как оригинальный - половина квадратов черная то init нету в компонетах до Kandiral_23.10.2018.zip то
Form1.KRCOMPortConnector1.OnSendAsync:=send; типы пааметов не совпадают byte и integer.
Было бы очень здорово если бы вы выложили верисю + демо под XE10.2 или XE10.3
Показать полностью
5
Руслан Кандирал
05.02.2019 20:20
Игорь Коровка
 
Исправил ошибку
Form1.KRCOMPortConnector1.OnSendAsync:=send;

Это связано с тем, что в новой версии(Kandiral_23.10.2018.zip) тип события OnSendAsync изменился.
Пакет библиотек и тестовую программу перезалил.
Показать полностью
0
Андрей Губко
08.01.2019 17:41
 
Добрый день Руслан. Спасибо за публикацию. попробовал Ваш код для rtu 485 пример работает. Попробовал в ascii пример вставить строки для 485, в комп возвращает один пакет два раза на один запрос. Подскажите в чем проблема?
Показать полностью
5
Руслан Кандирал
08.01.2019 17:58
Андрей Губко
 
А я не делал ASCII для RS485. Для RTU есть библиотека KRModbusRTUSlaveRS485.h заточенная под RS485, а для ASCII я такой не делал. Библиотека KRModbusASCIISlave.h сделана под UART, там не задействован контакт TXEN от переходника RS485.
Показать полностью
0
Андрей Губко
03.02.2019 10:58
Руслан Кандирал
 
Руслан спасибо за ответ. У меня горит проект. Если не трудно за определенное вознаграждения заточит библиотеку KRModbusASCIISlave.h под RS485. Мой ящик ***@mail.ru условия туда. Заранее благодарен.
Показать полностью
5
Руслан Кандирал
04.02.2019 11:34
Андрей Губко
 
Добавил библиотеку Modbus ASCII по RS485
Показать полностью
0
Андрей Губко
04.02.2019 20:51
Руслан Кандирал
 
Спасибо Руслан, но я так понял что данная библиотека KRModbusASCIISlave.h под RS485 реально не проверялась. Я подключил Микросхему rs485 по стандартной схеме к Atmega 328P зашил Ваш Скетч и попробовал передать команду через терминал Com port toolkit 3.5. Как я и предполагал в терминал посыпался повторяющийся пакет информации многократно. При изменении в ModbusRTUSlaveRS485.h строки 83 if(txenON)return; и 84 *txenPort &= ~txenMask; на строки 83 if(!txenON) //return; 84 *txenPort &= ~txenMask; Выводится в терминал двойной ответный пакет. Я почему сомневался? Я тоже самое проделывал ранее (В первом вопросе я уже писал) взяв образец управления выводом txenPort от ModbusRTUSlaveRS485.h
Для KRModbusRTUSlaveRS485.h работает нормально У меня есть скрины ноя не знаю как суда вставить. Заранее Спасибо! Может чего подскажете? Причем интересно, что через преобразователь RS232-RS485 на терминал компа работает нормально.
Показать полностью
5
Руслан Кандирал
05.02.2019 20:08
Андрей Губко
 
Тестировал на Arduino UNO, TTL to RS485 на схеме MAX485, USB to RS485.



Работает нормально.

Что-бы вставить картинку, нужно ее загрузить на любой файлообменник или в облако, а в комментарий добавить ссылку.
Показать полностью
0
Андрей Губко
05.02.2019 21:48
Руслан Кандирал
 
Спасибо! Странно. Я попробую еще раз. Я вынимал из ардуино АТ328Р и пробовал на монтажной плате без навесных элементов. Но в любом случае спасибо! Если не против я пришлю Вам результаты своих опытов.
Показать полностью
5
Руслан Кандирал
05.02.2019 22:07
Андрей Губко
 
ok
Показать полностью
5
Руслан Кандирал
04.02.2019 21:53
Андрей Губко
 
Ok
Завтра протестирую
Показать полностью
0
Андрей Губко
05.02.2019 22:29
Руслан Кандирал
 
Спасибо!
Показать полностью
0
Андрей Губко
09.02.2019 11:21
Андрей Губко
 
Руслан!!! Огромное Спасибо!!! Тема Закрыта!!! Все Получилось!!!
Показать полностью
0
Андрей Губко
08.02.2019 23:12
Андрей Губко
 
Руслан Привет! Собираю схему как на картинке с Arduino и преобразователем работает нормально. Как только вынимаю AT328P из панельки делаю минимальную обвязку (кварц на 16мГц, 2 конденсатора на 22пФ, цепь сброса. И подключаю также к тому преобразователю 232-485 и не работает. Не подскажешь чего может быть?
Показать полностью
0
Вадим Самчук
02.01.2019 12:45
 
Добрый день! При открытии проекта получаю ошибки для всех KRField : Error readind KRField1.ValType: Properly ValType does not exist. Ignore the error and continue? Игнорирую для всех и при компиляции - ошибка в строке KRCOMPortSets1.Init =
TKRCOMPortSets does not contain a member named 'Init' как решить подскажите пожалуйста.
Ваше приложение ModbusTester.exe работает и успешно сконнэктилось с FX3U по Modbus через переходник.
Показать полностью
5
Руслан Кандирал
02.01.2019 19:35
Вадим Самчук
 
Установите другую версию компонентов
https://kandiral.ru/o_sajte.html#comment...
Показать полностью
0
Вадим Самчук
13.01.2019 21:55
Руслан Кандирал
 
Добрый день. Установил другую версию компонентов, но при попытке компиляции ошибка: [dcc32 Error] E1026 File not found: 'KRCOMPortSets.dfm' ???
Показать полностью
5
Руслан Кандирал
14.01.2019 01:34
Вадим Самчук
 
В настройках Delphi нужно прописать путь к фалу KRCOMPortSets.dfm
Tools->Options->Enviroment Options->Delphi Options->Library
Показать полностью
0
Вадим Самчук
14.01.2019 12:24
Руслан Кандирал
 
Спасибо, за помощь!
Показать полностью
0
Павел Ивашкевич
01.06.2018 08:45
 
Добрый день! Вопрос по вашему примеру программы на Delphi - какие данные нужно передавать для регистра строкового типа, что бы отображалось более 4-х символов.
Показать полностью
5
Руслан Кандирал
01.06.2018 10:31
Павел Ивашкевич
 
Показать полностью
0
Павел Ивашкевич
01.06.2018 13:00
Руслан Кандирал
 
я с вашим примером на дельфи работаю, а ардуино библиотека другая. пытаюсь работать со строкой, но более 4-х букв не передается. кратное 2 тоже пробовал. Поле ввода черное.
Показать полностью
5
Руслан Кандирал
01.06.2018 20:56
Павел Ивашкевич
 
Я вам указать точно причину не смогу, так как даже не знаю с какой библиотекой вы работаете.

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

И как я понял для отображения вы используете компонент KRField. У него есть свойство ErrorToHint, если его включить, то в момент когда поле черное достаточно навести указатель мышки и выскочит всплывающая подсказка с текущей ошибкой.
Показать полностью
0
Павел Ивашкевич
22.05.2018 08:53
 
Добрый день. Подскажите, пожалуйста по примеру из видео в статье выше - меняю адрес в программе ардуино, но в программе на Дельфи, все равно только с адресом 1 устройство подключает. Может где-то еще адрес в программе ардуино меняется?
Показать полностью
5
Руслан Кандирал
22.05.2018 14:25
Павел Ивашкевич
 
Убедитесь, что вы меняете именно адрес
В библиотеках с RS485 в названии сначала идет номер TXEN входа, а затем адрес
Какую именно библиотеку вы используете?
Показать полностью
0
Павел Ивашкевич
22.05.2018 14:51
Руслан Кандирал
 
библиотека KRModbusRTUSlaveRS485.
KRModbusRTUSlaveRS485 mb(Serial,data,TXEN,1); - в этой строчке сложно ошибиться)
Показать полностью
5
Руслан Кандирал
22.05.2018 14:57
Павел Ивашкевич
 
Ну да... Последнее значение - это адрес. И вы ее меняете, а связь все равно идет только с адресом 1 ?
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:02
Руслан Кандирал
 
да.
Показать полностью
5
Руслан Кандирал
22.05.2018 15:08
Павел Ивашкевич
 
Вы используете код (Delphi/Arduino) из статьи или свой?
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:09
Руслан Кандирал
 
Все Ваше
Показать полностью

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

06.02.2018 15:53
Добавлена программа SimpleADB
Программа SimpleADB разработана в среде Delphi XE для отладки Android устройств через утилиту adb
07.10.2017 23:57
Оптимизация библиотек Modbus для контроллеров Arduino
Сделал оптимизированный вариант библиотек Modbus под Arduino, с целью снизить размер занимаемой памяти для скетча
28.03.2017 23:51
Modbus Slave RTU/ASCII для микроконтроллеров Arduino
Реализация клиентской части протокола Modbus RTU и Modbus ASCII для контроллеров Arduino и пример использования с видео обзором

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

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