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
Павел Ивашкевич
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
Показать полностью
1
Олег Пфлюг
19.09.2017 19:36
 
Есть проблема. При обращении к не существующему регистру или превышении размера запроса относительно буфера, МК зависает. Изменил KRModbusRTUSlaveRS485.h
Показать полностью
5
Руслан Кандирал
19.09.2017 21:18
Олег Пфлюг
 
Желательно изначально предусмотреть максимальный размер запроса и указать соответствующее значение в константу
Если же есть вероятность переполнения буфера, то можно пропускать такие запросы следующей проверкой
По поводу несуществующего регистра. Класс KRModbusRTUSlaveRS485 ничего не считывает и не записывает. Для этих действий он вызывает виртуальные методы класса KRRegisters write и read. В примере эти методы описываются в классе Data. Если у вас зависает контроллер при обращении к несуществующему регистру, то нужно искать проблему в коде этих методов.
Показать полностью

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

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