Страница 1 из 1

Modbus RTU

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

Re: Modbus RTU

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

Re: Modbus RTU

Добавлено: 29 янв 2018, 20:43
Solmik
вот я и спрашивал КАК эту задержку сделать?

Re: Modbus RTU

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

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

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

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); // ошибка кадра

Re: Modbus RTU

Добавлено: 22 май 2020, 02:42
GRAF3377
Пенсионер писал(а):#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 нет. Не могу запустить из-за этой ошибки проект((

Re: Modbus RTU

Добавлено: 22 май 2020, 02:49
GRAF3377
Всегда ссылается на 47 строку, вне зависимости от ее содержимого

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); // ошибка кадра
Я слегка ошибся. У меня все работает и ошибку не заметил.

Re: Modbus RTU

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

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

Re: Modbus RTU

Добавлено: 24 май 2020, 09:45
Эдуард
Извините, за ошибку. Вечером исправлю на сайте.