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
Андрей Губко
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
Вадим Самчук
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
Руслан Кандирал
 
Все Ваше
Показать полностью
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
Олег Пфлюг
 
А после внесенных изменений ваша проблема решилась?
Показать полностью

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

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