Modbus RTU

Вопросы программирования в системе Ардуино
Solmik
Сообщения: 2
Зарегистрирован: 25 янв 2018, 19:54

Modbus RTU

Сообщение Solmik » 28 янв 2018, 22:02

Здравствуйте!
Подскажите, пожалуйста: Modbus RTU - в начале и конце кадра сообщения передаётся маркерный интервал с длительностью равной времени передачи 4-х символов. Как передать такой интервал? Если пин определён как последовательный порт, то его нельзя включить на заданный промежуток времени? или через диоды (монтажное ИЛИ) можно вместе 2 пина включить?


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Modbus RTU

Сообщение Эдуард » 28 янв 2018, 23:35

Здравствуйте!
Эти интервалы передаются неактивным состоянием. Попросту говоря это паузы в передаче. Когда UART заканчивает передачу, его выход переходит в состояние лог. 1. Т.е. в начале и в конце кадра необходимо сделать задержку в передаче данных длительностью не менее времени, необходимого на передачу 3,5 символов.

Solmik
Сообщения: 2
Зарегистрирован: 25 янв 2018, 19:54

Re: Modbus RTU

Сообщение Solmik » 29 янв 2018, 20:43

вот я и спрашивал КАК эту задержку сделать?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Modbus RTU

Сообщение Эдуард » 29 янв 2018, 21:17

Здравствуйте!
Задержку перед передачей пакета реализовать достаточно просто. В библиотеке Tiny_MODBUS_RTU_Slave я формирую задержку, отсчитывая вызовы прерывания по таймеру. Но эта библиотеке работает параллельным процессом. Если вас устроит зависание программы при передаче или приеме, то можете использовать другие стандартные функции задержки.
С реализацией задержки в конце кадра несколько сложнее. Передача данных происходит с помощью стандартного класса Serial. А в этом классе передача данных происходит из буфера по прерыванию, и нет функции проверки окончания передачи. Поэтому я проверяю бит UART, который говорит о том, что все данные из аппаратного UART переданы.

Код: Выделить всё

    // ожидание окончания передачи
    if( (UCSR0A & 64) != 0 ) {
      // передача закончена
   }   

Пенсионер
Сообщения: 1
Зарегистрирован: 19 сен 2018, 15:21

Re: Modbus RTU

Сообщение Пенсионер » 28 сен 2018, 05:53

Здравствуйте!
Не могу понять причину ошибки при компиляции.
Проверено на нескольких компьютерах с разными ОС.

#include <Tiny_ModBusRTU_Master.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}

C:\ ... \Arduino\libraries\Tiny_ModBusRTU_Master/Tiny_ModBusRTU_Master.h:47:10: error: extra qualification ...
void Tiny_ModBusRTU_Master::errorFrame(byte st); // ошибка кадра

GRAF3377
Сообщения: 3
Зарегистрирован: 22 май 2020, 02:35

Re: Modbus RTU

Сообщение GRAF3377 » 22 май 2020, 02:42

Пенсионер писал(а):#include <Tiny_ModBusRTU_Master.h>
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
C:\ ... \Arduino\libraries\Tiny_ModBusRTU_Master/Tiny_ModBusRTU_Master.h:47:10: error: extra qualification ...
void Tiny_ModBusRTU_Master::errorFrame(byte st); // ошибка кадра

Эдуард, прошу помощи.
Кто нашел причину ошибки компиляции? Пробовал в новой версии ардуины, пробовал переместить скетч на диск С, пробовал скинуть библиотеку в корень папки с программой. Ругается все равно. Заметил особенность, что все элементы public в оболочке IDE подсвечиваются, а вот именно errorFrame нет. Не могу запустить из-за этой ошибки проект((

GRAF3377
Сообщения: 3
Зарегистрирован: 22 май 2020, 02:35

Re: Modbus RTU

Сообщение GRAF3377 » 22 май 2020, 02:49

Всегда ссылается на 47 строку, вне зависимости от ее содержимого

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Modbus RTU

Сообщение Эдуард » 22 май 2020, 23:03

Здравствуйте!
Только что еще раз попробовал. Компилируется без ошибок. У меня версия Arduino 1.8.1.

Может в этом дело.
Попробуйте в файле Tiny_ModBusRTU_Master.h строку
void Tiny_ModBusRTU_Master::errorFrame(byte st); // ошибка кадра
замените на
void errorFrame(byte st); // ошибка кадра
Я слегка ошибся. У меня все работает и ошибку не заметил.

GRAF3377
Сообщения: 3
Зарегистрирован: 22 май 2020, 02:35

Re: Modbus RTU

Сообщение GRAF3377 » 24 май 2020, 00:09

Эдуард писал(а):Здравствуйте!
замените на
void errorFrame(byte st); // ошибка кадра

Большое спасибо. Все заработало. Я сам разные комбинации пробовал, до этой извилины не дошевелились :lol:

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Modbus RTU

Сообщение Эдуард » 24 май 2020, 09:45

Извините, за ошибку. Вечером исправлю на сайте.


Вернуться в «Программирование Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя