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
Анна Каргу
18.03.2019 13:46
Руслан Кандирал
 
Руслан, спасибо за Ваш труд! Помогите, пожалуйста, со следующей проблемой: в этом же модуле KRCOMPortSets компилятор ругается на TKRFlowControl, IKRCfgParam, TKRIniCfgParam, TKRIniCfgParam.

И еще - при установке компонент можно выбрать d210 или d150. Я установила d210. Это правильно? и в чем разница?

Пути ко всем папкам и подпапкам из архива (Kandiral_01.03.2018\Kandiral) прописаны в Tools->Options->Enviroment Options->Delphi Options->Library

Версия Delphi 10.2 Tokyo
Показать полностью
5
Руслан Кандирал
18.03.2019 14:34
Анна Каргу
 
150 и 210 это Package Version
http://docwiki.embarcadero.com/RADStudio...

Соответственно это delphi XE и XE7. Если у вас Delphi XE7 или выше, нужно ставить d210. В противном случае d150.

Что именно выдает компилятор? Если он не может найти указанные классы, значит вы не правильно указали пути к библиотекам.

Вот последняя компонентов:
https://kandiral.ru/downloads/Kandiral_2...

Перед установкой нужно деинсталировать старые компоненты
Вот краткая инструкция по установке
https://kandiral.ru/o_sajte.html#comment...:
Показать полностью
0
Анна Каргу
18.03.2019 16:00
Руслан Кандирал
 
Спасибо!
Все удалила и установила заново. Теперь работает.
Показать полностью
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
Руслан Кандирал
 
Все Ваше
Показать полностью
5
Руслан Кандирал
22.05.2018 15:16
Павел Ивашкевич
 
Связь с контроллером по RS485 или UART ?
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:19
Руслан Кандирал
 
rs485
Показать полностью
5
Руслан Кандирал
22.05.2018 15:22
Павел Ивашкевич
 
ок. Я проделаю тесты и отпишусь.
Если успею сегодня, если нет, тогда уже завтра
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:30
Руслан Кандирал
 
Спасибо, проверил сейчас еще раз. сейчас работает. похоже на то, что где-то кэш есть, который не убирается каждый раз вовремя. После заливания других библиотек, а потом опять вашей и заработало.
Показать полностью
0
Павел Ивашкевич
26.04.2018 10:12
 
Добрый день. Подскажите, пожалуйста, где задается адрес устройства, которое я подключаю к компьютеру. Нашел только в модбас.клиент но, там если адрес отличный от 1, то связь вообще не устанавливается. Подключаюсь по РТУ.
Показать полностью
5
Руслан Кандирал
26.04.2018 11:07
Павел Ивашкевич
 
Здравствуйте.
Я так понял вы про Delphi, а не про Arduino.
На восьмой минуте начинается про TModbusClient

Я в примерах на Delphi обычно делаю форму мониторинга пакетов, на которой отображается содержимое исходящих и входящих пакетов. Там можно проверить на сколько правильные идут пакеты. В ModbusRTU первый байт - это адрес устройства и в исходящем, и во входящем пакетах.
Показать полностью
0
Павел Ивашкевич
26.04.2018 11:45
Руслан Кандирал
 
Да, так я и написал про это, что в поле адреса, если адрес отличный от 1, то связи нет. При этом нет разницы какой адрес на устройстве, все равно связь есть.
Показать полностью
0
Павел Ивашкевич
26.04.2018 12:23
Руслан Кандирал
 
Спасибо, разобрался. У контроллера не хотел адрес меняться и перескакивал на 1 по умолчанию.
Показать полностью
1
Олег Пфлюг
08.11.2017 12:58
 
Добрый день. Решил на arduino Nano собрать преобразователь посылок из rs232 в модбас rtu. Имеется один аппаратный порт. Его под rs232 т.к. в приборе нельзя снизить скорость (115200). Для модбаса использую программный (скорость 9600). С SoftwareSerial, ваша библиотека работает. Но есть загвоздка SoftwareSerial тормозит аппаратный порт. Решил использовать AltSoftSerial. Ваша библиотека с ней не работает, не отвечает на запросы. Проверял цепочку на проброс данных без модбаса, все хорошо. Думаю что то с таймеров KRTON. Так как он использует функцию millis, а AltSoftSerial работает на аппаратном прерывании. У меня мало опыта работы с мк, в основном ПЛК. Прошу помощи.
Показать полностью
5
Руслан Кандирал
08.11.2017 22:40
Олег Пфлюг
 
KRTON в библиотеки Modbus не используется. Этот таймер используется только в тестовом скетче.

По идее библиотека KRModbusRTUSlave.h должна была работать с AltSoftSerial.

Вот сделал библиотеку заточенную под AltSoftSerial
http://kandiral.ru/downloads/ModbusRTUTe...

Но я ее не тестировал, так как сейчас нет возможности. На выходных проверю.
Показать полностью
1
Олег Пфлюг
09.11.2017 16:29
Руслан Кандирал
 
Проверил код. Пришлось изменить так как висло все. В основном это связанно что AltSoftSerial вроде как идет параллельным потоком. Использовал спецификатор переменной volatile (http://arduino.ua/ru/prog/Volatile) И в некоторых переменных увеличил разрядность что бы не было переполнения. Часть кода ниже:
Показать полностью
5
Руслан Кандирал
10.11.2017 13:28
Олег Пфлюг
 
А после внесенных изменений ваша проблема решилась?
Показать полностью
1
Олег Пфлюг
10.11.2017 19:32
Руслан Кандирал
 
Ваш пример. Заработал. Теперь свой код отлаживаю. Спасибо!!!
Показать полностью
5
Руслан Кандирал
09.11.2017 21:46
Олег Пфлюг
 
На Arduino Nano

8 - RX
9 - TX
Показать полностью
1
Олег Пфлюг
10.11.2017 13:09
Руслан Кандирал
 
Да
Показать полностью
5
Руслан Кандирал
09.11.2017 21:33
Олег Пфлюг
 
SoftwareSerial и HardwareSerial тоже используют прерывания.

volatile добавляется к тем переменным, которые используются и в основном потоке и в параллельном. Конкретно в этой библиотеке не используются прерывания и параллельные потоки, по этому добавлять volatile нет ни какого смысла.

AltSoftSerial в разных контроллерах использует разные дискретные входа
//
// Board Transmit Receive PWM Unusable
// ----- -------- ------- ------------
// Teensy 3.0 & 3.1 21 20 22
// Teensy 2.0 9 10 (none)
// Teensy++ 2.0 25 4 26, 27
// Arduino Uno 9 8 10
// Arduino Leonardo 5 13 (none)
// Arduino Mega 46 48 44, 45
// Wiring-S 5 6 4
// Sanguino 13 14 12

Вы к каким подключились?
Показать полностью
1
Олег Пфлюг
10.11.2017 13:10
Руслан Кандирал
 
9, 8
Показать полностью

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

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 включает в себя компонент для работы с файловой системой, сетью, автоматизацией и другие.