Здравствуйте!
Подскажите, пожалуйста: Modbus RTU - в начале и конце кадра сообщения передаётся маркерный интервал с длительностью равной времени передачи 4-х символов. Как передать такой интервал? Если пин определён как последовательный порт, то его нельзя включить на заданный промежуток времени? или через диоды (монтажное ИЛИ) можно вместе 2 пина включить?
Modbus RTU
Re: Modbus RTU
Здравствуйте!
Эти интервалы передаются неактивным состоянием. Попросту говоря это паузы в передаче. Когда UART заканчивает передачу, его выход переходит в состояние лог. 1. Т.е. в начале и в конце кадра необходимо сделать задержку в передаче данных длительностью не менее времени, необходимого на передачу 3,5 символов.
Эти интервалы передаются неактивным состоянием. Попросту говоря это паузы в передаче. Когда UART заканчивает передачу, его выход переходит в состояние лог. 1. Т.е. в начале и в конце кадра необходимо сделать задержку в передаче данных длительностью не менее времени, необходимого на передачу 3,5 символов.
Re: Modbus RTU
вот я и спрашивал КАК эту задержку сделать?
Re: Modbus RTU
Здравствуйте!
Задержку перед передачей пакета реализовать достаточно просто. В библиотеке Tiny_MODBUS_RTU_Slave я формирую задержку, отсчитывая вызовы прерывания по таймеру. Но эта библиотеке работает параллельным процессом. Если вас устроит зависание программы при передаче или приеме, то можете использовать другие стандартные функции задержки.
С реализацией задержки в конце кадра несколько сложнее. Передача данных происходит с помощью стандартного класса Serial. А в этом классе передача данных происходит из буфера по прерыванию, и нет функции проверки окончания передачи. Поэтому я проверяю бит UART, который говорит о том, что все данные из аппаратного UART переданы.
Задержку перед передачей пакета реализовать достаточно просто. В библиотеке Tiny_MODBUS_RTU_Slave я формирую задержку, отсчитывая вызовы прерывания по таймеру. Но эта библиотеке работает параллельным процессом. Если вас устроит зависание программы при передаче или приеме, то можете использовать другие стандартные функции задержки.
С реализацией задержки в конце кадра несколько сложнее. Передача данных происходит с помощью стандартного класса Serial. А в этом классе передача данных происходит из буфера по прерыванию, и нет функции проверки окончания передачи. Поэтому я проверяю бит UART, который говорит о том, что все данные из аппаратного UART переданы.
Код: Выделить всё
// ожидание окончания передачи
if( (UCSR0A & 64) != 0 ) {
// передача закончена
}
Re: Modbus RTU
Здравствуйте!
Не могу понять причину ошибки при компиляции.
Проверено на нескольких компьютерах с разными ОС.
#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); // ошибка кадра
Не могу понять причину ошибки при компиляции.
Проверено на нескольких компьютерах с разными ОС.
#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
Пенсионер писал(а):#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
Всегда ссылается на 47 строку, вне зависимости от ее содержимого
Re: Modbus RTU
Здравствуйте!
Только что еще раз попробовал. Компилируется без ошибок. У меня версия Arduino 1.8.1.
Может в этом дело.
Попробуйте в файле Tiny_ModBusRTU_Master.h строку
void Tiny_ModBusRTU_Master::errorFrame(byte st); // ошибка кадра
замените на
void errorFrame(byte st); // ошибка кадра
Я слегка ошибся. У меня все работает и ошибку не заметил.
Только что еще раз попробовал. Компилируется без ошибок. У меня версия Arduino 1.8.1.
Может в этом дело.
Попробуйте в файле Tiny_ModBusRTU_Master.h строку
void Tiny_ModBusRTU_Master::errorFrame(byte st); // ошибка кадра
замените на
void errorFrame(byte st); // ошибка кадра
Я слегка ошибся. У меня все работает и ошибку не заметил.
Re: Modbus RTU
Эдуард писал(а):Здравствуйте!
замените на
void errorFrame(byte st); // ошибка кадра
Большое спасибо. Все заработало. Я сам разные комбинации пробовал, до этой извилины не дошевелились
Re: Modbus RTU
Извините, за ошибку. Вечером исправлю на сайте.
Вернуться в «Программирование Ардуино»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей