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

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

 
Скачать:
Набор библиотек KRModbus для контроллеров Arduino от 30.07.2019
Программа для тестирования библиотек Modbus на контроллерах Arduino
 
Поделиться:
0
Billy Bonce
23.11.2022 13:49
 
Добрый день, Руслан. Похоже, на Ардуино все встало и заработало. При запуске Вашего ModbusTester.exe
изменяются значения в пяти верхних окнах левой колонки, остальные значения неизменны, нижнее окно
правой колонки пустое, нижнее окно средней колонки закрашено черным.
при отключении Ардуино надпись "No Connection", закрашиваются черным все окна левой колонки,
нижнее окно средней колонки и верхнее окно правой колонки.
При компиляции файлов из папки source одинаково для Win64 и Win32 выдает ошибку
"Unit 'KRCOMPortSets' not found". При удалении KRCOMPortSets из Uses ошибок становится больше.
Как лечить проблему? Может быть, надо взять более старую версию компонентов? Одновременно для
Delphi и Arduino? Какую и где? Или есть решение поизящней?
Показать полностью
0
alex Misst
18.09.2021 15:34
 
Доброго дня Руслан!
SoftwareSerial Serial1(10,9); // RX, TX (пробовал другое название порта не помогло)
KRModbusRTUSlaveRS485 mb(Serial1,data,3,3);
так не работает, работает если только в первом параметре стоит Serial
пробовал и так
SoftwareSerial Serial21(10,9)
KRModbusRTUSlave mb(Serial21,data,3); что-то все равно не получается, наверное все таки что то делаю не так?
и еще.. есть такой преобразователь https://aliexpress.ru/item/1005001632287... для него так понимаю параметр uint8_t txen_ уже не нужен?
Показать полностью
13
Руслан Кандирал
18.09.2021 16:35
alex Misst
 
Здравствуйте!

Я использую преобразователь на чипе MAX485

Обновленные библиотеки:
https://kandiral.ru/downloads/arduino_ka...

Пример ModbusRTURS485:
https://kandiral.ru/downloads/ModbusRTUR...
Показать полностью
0
alex Misst
18.09.2021 17:56
Руслан Кандирал
 
Заработало Спасибо!!!!
Показать полностью
0
Сергій Слободян
14.06.2021 22:48
 
Руслан, огромное мерси за сэкономленное время! Делал маленькую поделку с управлением от компа. И прям в несколько минут подвязал к ней Модбас-управление с вашей библиотекой. Плата ГолубаяПилюля на SТМ32. Все взлетело без вопросов.
Показать полностью
0
Дмитрий Понкратьев
02.03.2021 14:55
 
Руслан добрый день. Можно ли создать несколько объектов KRModbusRTUSlave на одной ардуинке, но с разными адресами? Пробовал так:
Data50 и Data51 - это тот же класс Data, только в них используются регистры 50 и 51 соответственно.
Показать полностью
13
Руслан Кандирал
02.03.2021 15:26
Дмитрий Понкратьев
 
Здравствуйте, Дмитрий!

Нет. Так как пакет из буфера порта будет забирать только один из объектов, какой успеет.
Показать полностью
0
Дмитрий Понкратьев
02.03.2021 15:31
Руслан Кандирал
 
Понятно, спасибо.
Показать полностью
0
Freegy LTD
22.12.2019 11:43
 
Руслан, хотел бы получить ответы и комментарии на свои вопросы, если буду немного резок - прошу простить, на данный момент не нашел рабочей библиотеки под авр для модбас рту с полной и правильной реализацией протокола:
1. Программа для тестирования не работает под win7 (64), даже под администратором, не видит com port, другое ПО видит.
2. РТУ Модбас подразумевает использование только 1 битных и 16 битных переменных, которые четко распределены по адресному пространству (дискретные, коилы, инпуты, холдинги). Нумерация каждого из типов начинается с 0 адреса, при этом для исключения пересечения адресов МК должен автоматически разбрасывать данные по разным массивам в зависимости от пренадлежности к определенным данным (например коил и холдинг с адресом 0 должны находится в разных массивах). Не увидел этой реализации в данной библиотеке.
3. Слишком мало коментариев в коде и скудно описана библиотека. Наример нет четкого описания - какие прерывания используются, таймеры и другой функционал, который может быть затронут пользователем для реализации своих других функций. Нет полного описания переменных доступных для работы с библиотекой и их организацие и т.д.

Например задача: Есть устройство Мастер какое-то- есть слейв МК например на АВР 2560 - МК выполняет кучу разностей - работа с двигателями, датчиками, ацп и т.п. и обменивается с мастером посредством Модбас РТУ, имея по 10 регистров коилов, 10 холдингов, 10 инпутов. Физический адрес каждого из типов начинается с 0, логический с 00001, 30001, 40001. запись/чтение доступно только для инпутов, остальные только чтение.
Показать полностью
13
Руслан Кандирал
22.12.2019 12:42
Freegy LTD
 
1. Что значит "не видит com port"? Его нет в списке?
2. В данной библиотеке используются только 16 битные регистры и обрабатываются только следующие функции:
Read Holding Registers (03H)
Read Input Registers (04H)
Write Holding Register (06H)
Write Holding Registers (10H)
Изначально, когда я писал эти библиотеки, задача была не привязываться к каким либо данным(массивам). Чтобы программист сам решал какую именно информацию отправлять по определенному адресу и куда ее сохранять. Если вы хотите чтобы вся передаваемая информация хранилась в массивах это довольно просто реализовать. Пример:
3. Библиотека очень проста и весь функционал умещается в одном методе _DO(). Вот последовательность выполняемых действий метода _DO():
1) Проверка наличия данных в порту. Если буфер пуст, то возвращаем управление(return).
2) Если время после последнего прихода данных не превысило waitRespTime и время с прихода первого байта не превысило tmReadTimeout, то возвращаем управление.
3) Считывание данных с буфера порта с параллельным подсчетом контрольной суммы
4) Если контрольная сумма не соответствует двум последним байтам пакет, то возвращаем управление.
5) Если номер функции не соответствует 03H, 04H, 06H, 10H, то отправляем ошибку мастеру и возвращаем управление
6) Если пришел запрос чтения (03H, 04H), то вызываем метод
uint16_t Data::read(uint16_t index)
Метод read может вызываться несколько раз подряд, в зависимости от того, сколько регистров нужно считать. Полученные значения отправляются мастеру
7) Если пришел запрос записи (06H, 10H), то вызываем метод
void Data::write(uint16_t index, uint16_t value)
Метод write также может вызываться несколько раз подряд, в зависимости от того, сколько регистров нужно записать. Мастеру отправляется положительный ответ


При желании функционал с дискретными данными можно дописать.
Показать полностью
0
Freegy LTD
22.12.2019 13:46
Руслан Кандирал
 
1. Порт есть в списке, нет связи, usb-485 не реагирует (как минимум светодиод обмена не мигает).
2. Протокол Модбас достаточно стандартизирован, отклонение от его стандартов - это другой протокол, возможно основанный на модбас, но другой. (

https://github.com/andresarmento/modbus-...
Показать полностью
13
Руслан Кандирал
22.12.2019 14:14
Freegy LTD
 
1. Вы используете пример для RS485?
2. Протокол передачи данных - это набор правил согласно которым эти данные передаются. В моей библиотеки выдержаны правила передачи данных. Что именно передавать решает программист, использующий библиотеку.
Показать полностью
0
Freegy LTD
22.12.2019 14:24
Руслан Кандирал
 
1. Пример для RS485.
2. Правила для modbus закрепелны не только для передачи данных но и для формирования данных которые передаются: начиная от группировку данных по их типам (регистры 00000-40000, офсет адресов перед передачей), формирования пакета от мастера к слейву и обратно, временных и скоростных характеристик передачи-частота опроса мастером, тайм аут, паузы между запросами, поведение если в сети несколько слейвов, расшифровка посылок, распределение их по регистрам согласно правилам формирования регистров модбас.
Показать полностью
13
Руслан Кандирал
22.12.2019 15:21
Freegy LTD
 
1. Какой контроллер используете для тестирования?
Для работы тестовой программы/скетча нужно:
1) Открыть скетч ModbusRTUTestRS485 и указать нужный порт и номер дискретного входа к которому подключен контакт TXEN(на преобразователях MAX485 контакты DE и RE замыкаются на этот вход)
KRModbusRTUSlaveRS485 mb(/*Порт*/Serial,data,/*TXEN*/2,1);
2) В строке
Serial.begin(9600);
указать нужную скорость передачи данных
3) Залить скетч в контроллер
4) Запустить тестовую программу на компьютере, настроить порт и в выпадающем списке(верхний правый угол) выбрать Modbus RTU. Затем нажать кнопку Connect

Если связи не будет, то попробуйте использовать программы для тестирования Modbus(например qmodbus), чтобы определить в чем проблема в программе или в отсутствии данных с контроллера.

2. Давайте не будем спорить по этому поводу. Сейчас многие производители приборов и контроллеров используют протокол Modbus только как инструмент передачи данных. И зачастую им даже не важно какими именно функциями вы будите считывать (03H, 04H) или записывать (06H, 10H) данные. Моя задача была реализовать передачу данных с максимально быстрой обработкой пакетов и с минимальными затратами ресурсов контроллера
Показать полностью
0
Freegy LTD
22.12.2019 16:03
Руслан Кандирал
 
Я изначально написал, что другие программы для модбас 485 работают, конекретно ModbusLook Light - доп тульзина от OPC Modbus free. Порт выбирается, скорость выставляется, проблема в том что при нажатии кнопки коннект нет обращения к переходнику, возможно проблема 64 битной винды и особенно win7.
Показать полностью
13
Руслан Кандирал
22.12.2019 16:13
Freegy LTD
 
Программу я тестировал на Win7 x64, с этим проблем быть не должно. А для чего вам вообще тестовая программа? Я так понял вас интересует именно Modbus Slave для контроллера?
Показать полностью
0
Freegy LTD
22.12.2019 18:14
Руслан Кандирал
 
Программа не нужна, я просто пытался разобраться в вашей библиотеке.
Лучшую, в плане реализации (в плане быстродействия не проверял еще) бибилотеку под модбас_РТУ для слейва привел в ссылке выше.

Я обычно сам пишу на LabView все подряд под win при необходимости.
Показать полностью
0
Игорь Коровка
18.08.2019 02:58
 
2 small fix для {$R+}

procedure BytesFromWord(wd: Word; out bt0,bt1: byte);
begin
bt0:=wd and $FF ; // Igor - было bt0:=wd

-----------------------
function MBMASCIIReadHoldingRegisters(ADevAddr: byte; AStartReg, ACount: Word;
ABuffer: PKRBuffer; out ARecvLen: Byte): Byte;

....
// bt:=-WordRec(wd).Lo; // Похоже $FF - X 18 08 2019 Igor
bt:= $FF -WordRec(wd).Lo;
Показать полностью
13
Руслан Кандирал
21.08.2019 22:58
Игорь Коровка
 
Ok. Спасибо
В следующей версии компонентов будут эти изменения
Показать полностью
0
Игорь Коровка
17.08.2019 09:43
 
На XE 10.3 Rio версия от августа 2019 modbus tester запустился , на arduino я не понял как сделать чтоб встала как библиотека - пришлось менять все include <> на "". На atmega 328p все заработало+ Delphi
Здорово! Спасибо большеое автору а то иначе ничего не найти в инете для modbus и Delphi!
Показать полностью
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
Показать полностью
13
Руслан Кандирал
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, в комп возвращает один пакет два раза на один запрос. Подскажите в чем проблема?
Показать полностью
13
Руслан Кандирал
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 условия туда. Заранее благодарен.
Показать полностью
13
Руслан Кандирал
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 на терминал компа работает нормально.
Показать полностью
13
Руслан Кандирал
05.02.2019 20:08
Андрей Губко
 
Тестировал на Arduino UNO, TTL to RS485 на схеме MAX485, USB to RS485.



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

Что-бы вставить картинку, нужно ее загрузить на любой файлообменник или в облако, а в комментарий добавить ссылку.
Показать полностью
0
Андрей Губко
05.02.2019 21:48
Руслан Кандирал
 
Спасибо! Странно. Я попробую еще раз. Я вынимал из ардуино АТ328Р и пробовал на монтажной плате без навесных элементов. Но в любом случае спасибо! Если не против я пришлю Вам результаты своих опытов.
Показать полностью
13
Руслан Кандирал
05.02.2019 22:07
Андрей Губко
 
ok
Показать полностью
13
Руслан Кандирал
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 через переходник.
Показать полностью
13
Руслан Кандирал
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' ???
Показать полностью
13
Руслан Кандирал
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
Показать полностью
13
Руслан Кандирал
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-х символов.
Показать полностью
13
Руслан Кандирал
01.06.2018 10:31
Павел Ивашкевич
 
Показать полностью
0
Павел Ивашкевич
01.06.2018 13:00
Руслан Кандирал
 
я с вашим примером на дельфи работаю, а ардуино библиотека другая. пытаюсь работать со строкой, но более 4-х букв не передается. кратное 2 тоже пробовал. Поле ввода черное.
Показать полностью
13
Руслан Кандирал
01.06.2018 20:56
Павел Ивашкевич
 
Я вам указать точно причину не смогу, так как даже не знаю с какой библиотекой вы работаете.

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

И как я понял для отображения вы используете компонент KRField. У него есть свойство ErrorToHint, если его включить, то в момент когда поле черное достаточно навести указатель мышки и выскочит всплывающая подсказка с текущей ошибкой.
Показать полностью
0
Павел Ивашкевич
22.05.2018 08:53
 
Добрый день. Подскажите, пожалуйста по примеру из видео в статье выше - меняю адрес в программе ардуино, но в программе на Дельфи, все равно только с адресом 1 устройство подключает. Может где-то еще адрес в программе ардуино меняется?
Показать полностью
13
Руслан Кандирал
22.05.2018 14:25
Павел Ивашкевич
 
Убедитесь, что вы меняете именно адрес
В библиотеках с RS485 в названии сначала идет номер TXEN входа, а затем адрес
Какую именно библиотеку вы используете?
Показать полностью
0
Павел Ивашкевич
22.05.2018 14:51
Руслан Кандирал
 
библиотека KRModbusRTUSlaveRS485.
KRModbusRTUSlaveRS485 mb(Serial,data,TXEN,1); - в этой строчке сложно ошибиться)
Показать полностью
13
Руслан Кандирал
22.05.2018 14:57
Павел Ивашкевич
 
Ну да... Последнее значение - это адрес. И вы ее меняете, а связь все равно идет только с адресом 1 ?
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:02
Руслан Кандирал
 
да.
Показать полностью
13
Руслан Кандирал
22.05.2018 15:08
Павел Ивашкевич
 
Вы используете код (Delphi/Arduino) из статьи или свой?
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:09
Руслан Кандирал
 
Все Ваше
Показать полностью
13
Руслан Кандирал
22.05.2018 15:16
Павел Ивашкевич
 
Связь с контроллером по RS485 или UART ?
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:19
Руслан Кандирал
 
rs485
Показать полностью
13
Руслан Кандирал
22.05.2018 15:22
Павел Ивашкевич
 
ок. Я проделаю тесты и отпишусь.
Если успею сегодня, если нет, тогда уже завтра
Показать полностью
0
Павел Ивашкевич
22.05.2018 15:30
Руслан Кандирал
 
Спасибо, проверил сейчас еще раз. сейчас работает. похоже на то, что где-то кэш есть, который не убирается каждый раз вовремя. После заливания других библиотек, а потом опять вашей и заработало.
Показать полностью
0
Павел Ивашкевич
26.04.2018 10:12
 
Добрый день. Подскажите, пожалуйста, где задается адрес устройства, которое я подключаю к компьютеру. Нашел только в модбас.клиент но, там если адрес отличный от 1, то связь вообще не устанавливается. Подключаюсь по РТУ.
Показать полностью
13
Руслан Кандирал
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 работает на аппаратном прерывании. У меня мало опыта работы с мк, в основном ПЛК. Прошу помощи.
Показать полностью
13
Руслан Кандирал
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) И в некоторых переменных увеличил разрядность что бы не было переполнения. Часть кода ниже:
Показать полностью
13
Руслан Кандирал
10.11.2017 13:28
Олег Пфлюг
 
А после внесенных изменений ваша проблема решилась?
Показать полностью
1
Олег Пфлюг
10.11.2017 19:32
Руслан Кандирал
 
Ваш пример. Заработал. Теперь свой код отлаживаю. Спасибо!!!
Показать полностью
13
Руслан Кандирал
09.11.2017 21:46
Олег Пфлюг
 
На Arduino Nano

8 - RX
9 - TX
Показать полностью
1
Олег Пфлюг
10.11.2017 13:09
Руслан Кандирал
 
Да
Показать полностью
13
Руслан Кандирал
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
Показать полностью
13
Руслан Кандирал
19.09.2017 21:18
Олег Пфлюг
 
Желательно изначально предусмотреть максимальный размер запроса и указать соответствующее значение в константу
Если же есть вероятность переполнения буфера, то можно пропускать такие запросы следующей проверкой
По поводу несуществующего регистра. Класс KRModbusRTUSlaveRS485 ничего не считывает и не записывает. Для этих действий он вызывает виртуальные методы класса KRRegisters write и read. В примере эти методы описываются в классе Data. Если у вас зависает контроллер при обращении к несуществующему регистру, то нужно искать проблему в коде этих методов.
Показать полностью
1
Олег Пфлюг
08.10.2017 21:10
Руслан Кандирал
 
Здравствуйте. Прошу прощение. Торопился. Сделал как вы написали. Нашел решения при использовании программного UART. При таком решение переключение прием передача через UCSR не возможна. Взял за основу рисунок 3 вот из этой ссылки http://www.gaw.ru/html.cgi/txt/publ/_rtc...

Но вместо элемента "НЕ" Который стоит перед "TX". Изменил SoftwareSerial.cpp. Инвертировал просто.
Вот здесь:
И вот здесь:
Данное решение позволила упростить схему и использовать стандартный переходник который можно купить на алиэкспресс. Хочу пояснить. (не реклама!!!) У меня вот этот переходник https://arduino-ua.com/prod1343-interfei.... Не паял только, перемычки поставил со стороны МК, как на Рисунке 3. То что смотрит в общую сеть, цепь не трогал.
Показать полностью
1
Олег Пфлюг
08.11.2017 13:03
Олег Пфлюг
 
Отказался от программного инвертирования. Собрал инвертор на 2XOR . Один вход на плюс, а другой к МК на TX. Использовал вот эту микросхему SN74AHC1G86DBVR
Показать полностью
0
Павел Ивашкевич
25.05.2017 13:29
 
Ругается на строчку " KRCOMPortSets1.Init;" говорит, что Init нет такого обработчика.
Показать полностью
13
Руслан Кандирал
25.05.2017 20:30
Павел Ивашкевич
 
Программа сделана с более новой версией библиотек, я ее еще не выложил.

Обновите эти файлы
https://kandiral.ru/downloads/KRCOMPortC...
https://kandiral.ru/downloads/KRCOMPortS...

в папке \Kandiral\Automation\ и перекомпилируйте набор компонентов
Показать полностью
0
Павел Ивашкевич
26.05.2017 11:15
Руслан Кандирал
 
Спасибо! Попробую. Использую Вашу программу с библиотекой для ардуино "SimpleModbusSlave". Все работает, что в принципе логично.
Показать полностью
13
Руслан Кандирал
26.05.2017 11:32
Павел Ивашкевич
 
Пожалуйста.
Мой вариант Modbus Slave для Arduino работает быстрее SimpleModbusSlave и использует меньше ресурсов контроллера.
Показать полностью
0
Павел Ивашкевич
26.05.2017 12:33
Руслан Кандирал
 
Да, на счет скорости, Вы правы. Осталось с вашим примером разобраться.
Показать полностью
0
Алексей Мухамедов
29.03.2017 08:00
 
Чувак, ты красавичк!
Если все так просто, как в видео то с меня лайки под все твои видео. А то я с другими библиотеками ModBus 4-й день бьюсь головой об стену.
Показать полностью

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

18.07.2021 14:30
Новая статья по экспорту Google Sheet в MS Excel
Экспорт таблиц Google Sheets в файл MS Excel с помощью Google Script, а также сохранение на Google Drive и отправка на e-mail
30.03.2021 14:53
Обновлен набор компонентов для Delphi
Пакет компонентов для Delphi обновлен до версии от 30.03.2021 г.
14.03.2021 04:54
Обновлен скрипт экспорта Google таблиц в PDF
Добавлены новые возможности при экспорте Google таблиц в PDF файл
22.01.2021 11:45
Обновлен пакет компонентов для Delphi
В пакет компонентов для Delphi было внесено большое количество изменений, касающиеся протокола Modbus и мультиязычности

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

Экспорт таблиц Google Sheets в PDF файл, на email и на Google диск
Экспорт таблиц Google Sheets в PDF файл с помощью Google Script с последующим скачиванием или сохранением на Google Drive или отправкой на почту
Набор компонентов для Delphi
Набор компонентов для Delphi включает в себя компонент для работы с файловой системой, сетью, автоматизацией и другие.
Пример передачи данных по протоколу Modbus на Delphi
Пример передачи данных с контроллера ОВЕН ПЛК100 в программу на Delphi по протоколу Modbus
Инструкция по установке компонентов на Delphi
Подробная инструкция по установке компонентов на Delphi с видео обзором