Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

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

Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:32

Здравствуйте!
Библиотеки Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave были созданы для уроков о протоколе ModBus RTU. Предназначены для работы только на аппаратном UART плат Arduino c микроконтроллерами Atmega328/168.

Мне посыпались вопросы об использовании библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на контроллере Mega2560. В этой теме я публикую переписку с Валерием и Романом, которые пытались использовать библиотеки в такой конфигурации.


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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:33

Роман:
Добрый день Эдуард! Спасибо вам за ваши уроки очень толково изложено . Вопрос возник когда я попытался использовать ваши
библиотеки modbus master , modbus slave. в качестве мастера ардуино мега, в качестве слейва ардуино нано. Получилось следующее: команды с мастера доходят до слейва , но со слейва ни чего не приходит к мастеру. я попробовал поменять платы , теперь мастер это нано а слейв мега. в таком варианте все заработало. И второй вопрос : в вашей библиотеки задействован единственный ком порт ардуино, я попытался изменить в библиотеки мастера Serial на Serial1 (для меги) не заработало . помогите разобраться в данном вопросе.
Цель использования вашей библиотеки связь плат с главным контролерам для обмена данными по сети рс485 нужно чтобы мастер получал состояние концевиков ворот , калитки данные с дальномеров (сантиметры) и мастер должен отпровлять некие инструкции типа открыть закрыть заблокировать и тп. не чегосверх естественного. до использования вашей библиотеки я пробовал это делать на софтварном порту.
пакет выглядел так:
byte Id
byte start
byte a
byte b
byte c
byte e
stop byte
передавал и принимал несколько байт и в каждом из них было состояния того или иного датчика, но работоло все это криво.
вот хотелось бы все тоже самое делать но вместо пачки байт забивать ваш масив reg Table и отправлять мастеру.
например regTable[10] c 0 по 5 команды мастера с 6 по 10 ответы слейва. прошу помочь мне в этой затеи. Спасибо, всего вам хорошего.

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:34

Роман, здравствуйте!
По поводу переделки библиотеки на Serial1. Библиотека использует функции класса Serial, за исключением места, где определяется окончание передачи данных из буфера. Такой функции в Serial нет. Поэтому я использовал прямую проверку флага аппаратного последовательного порта.
// ожидание окончания передачи
if( (UCSR0A & 64) != 0 ) {

Вам необходимо кроме замены Serial на Serial1 изменить контроль этого флага. Найти в описании микроконтроллера соответствующий бит. Возможно это будет UCSR1A, но я не уверен. Переправить необходимо в обеих библиотеках.

Почему не работает Мега я не знаю. Я не пробовал. Прежде всего попробуйте увеличить на мастере время тайм-аута ответа. Это второй аргумент конструктора timeOutRecieve. Для отладки надо определять, где виснет программа слейва. Почему слейв не отвечает. Или он отвечает. В интервала типа else if(_mode == 2) { надо по очереди вставлять, например, инверсию светодиода и смотреть до какого интервала программа не доходит.
Попробуйте, соберите больше информации и пишите. Можете открыть тему на форуме сайта.

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:35

Роман:
Эдуард ! А чем объясняется что переправлять нужно в обоих библиотеках - как это касается Slave ?

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:35

Там тоже необходимо ждать, пока закончиться передача последнего бита.

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:36

Валерий:
Эдуард ! на железном уровне разобрался с проблемой Master MAGA2560 <<<<< Slave NANO - все дело в чипе USB CH340 его RX TX подтянуты к +5в через резисторы номиналом ВНИМАНИЕ 49 Ом - ну какая 485 их перетянет в ноль ! Залил скетч в MEGA выпаял резисторы и все заработало !
Просим все-таки сделать вашу библиотеку более универсальную для работы и на выводах TR1 / RX1, TX2 / RX2 и TX3 RX3 !

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:36

На счет переделки библиотеки на другие выводы подумаю. Надо переправить номера Serial и подправить строчки
// ожидание окончания передачи
if( (UCSR0A & 64) != 0 ) {
Возможно UCSR0A надо заменить на UCSR1A.

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:37

Валерий:
Я пробовал мернять - но у меня после редактирования библиотека в среде IDE отмечается как неправильная ! У меня MAC OS - может из за этого ! MAC - всегда делает пометки какие-то в каждой папке и каждого файла при редактировании и ли просто при сохранении !

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:38

Валерий, здравствуйте!
Я сделал формальные изменения в библиотеке Tiny_ModBusRTU_Master. Теперь библиотека называется Tiny_ModBusRTU_Master_1 и настроена на Serial 1. У меня в Arduino IDE компилируется без ошибок. Попробуйте. Напишите мне о результате.
Tiny_ModBusRTU_Master_1.zip
(4.31 КБ) 210 скачиваний

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 02 фев 2018, 21:38

Валерий:
Компилируется без ошибок в 1_67 нормально , но MEGA2560 зависает при первом обращении к Serial !

FreeDoom
Сообщения: 1
Зарегистрирован: 18 фев 2018, 17:39

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение FreeDoom » 18 фев 2018, 17:47

Скажите, чем-то закончилась эта история с переделкой библиотек для работы в качестве Master - Mega2560?
Вопрос весьма актуальный в связи с тем, что именно Mega удобнее использовать в качестве центрального контроллера сети RS485 и иных к ней навешанных на многочисленные порты устройств.
Просто выпаивание резисторов не самый удобный способ :-(

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 18 фев 2018, 21:39

Здравствуйте!
У меня нет меги попробовать. Заказал, когда придут проверю и подкорректирую библиотеку, если надо.

lacika
Сообщения: 3
Зарегистрирован: 18 ноя 2018, 10:57

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение lacika » 21 ноя 2018, 22:57

Здравствуйте Эдуард,

Отличные статьи, отличные уроки. Один вопрос. Подскажите пожалуйста почему не могу переслать с master-а на slave боле одной команды? При отправке больше, чем одной команды отправляется и исполняется только последняя. В качестве master-а использую Arduino MEGA, а в качестве slave-а Arduino UNO, библиотеки <Tiny_ModBusRTU_Master_1.h> и <Tiny_ModBusRTU_Slave.h>, программы контроллеров ниже.

На перёд благодарю Вас за помощь,
С уважением,
Василий

////////Master/////////
#include <TimerOne.h>
#include <Button.h>
#include <Tiny_ModBusRTU_Master_1.h>

#define ADR_CONTR_1 51 // адрес контроллера 1

unsigned int regTable[12]; // таблица регистров
unsigned int cyclCount = 0; // счетчик циклов
unsigned int errorCount = 0; // счетчик ошибок
byte mode = 0; // режим
int timeCount = 0; // счетчик времени

Tiny_ModBusRTU_Master_1 master(8, 30, 2); // создаем объект, времена тайм-аутов 4 и 15 мс, управляющий вывод 2
Button button1(5, 30); // кнопка 1 подключена к выводу 4
Button button2(6, 30); // кнопка 2 подключена к выводу 5
Button button3(7, 30); // кнопка 3 подключена к выводу 6


void setup() {
Timer1.initialize(500); // инициализация таймера 1, период 500 мкс
Timer1.attachInterrupt(timerInterrupt, 3000); // задаем обработчик прерываний
Serial.begin(9600);
Serial1.begin(9600);
}

void loop() {
if (mode == 0) {
if (timeCount > 1000) {
timeCount = 0;

// вывод счетчиков на дисплей
cyclCount++; // счетчик циклов

Serial.print("C=");
Serial.print(cyclCount);
Serial.print('\t');
Serial.print("E=");
Serial.println(errorCount);

mode = 1;
master.read(ADR_CONTR_1, regTable, 0, 9); // чтение регистров контроллера 1 9=regTable[10]-1
}
}

if (mode == 1) {
// ожидание данных контроллера 1
if (master.state != 1) {
if (master.state == 0) {
// данные получены

Serial.print("The floor temperature in room 1 is: ");
Serial.println(*((float *)regTable), 1);
Serial.print("The air temperature in room 1 is: ");
Serial.println(*(((float *)regTable) + 1 ), 1);
Serial.print('\n');
}
else {
// ошибка обмена
errorCount++;
Serial.println ("ERROR");
}
mode = 0;
master.writeSingle(ADR_CONTR_1, (unsigned int)button1.flagPress, 5); // !!! запись регистра хранения (светодиод)
master.writeSingle(ADR_CONTR_1, (unsigned int)button2.flagPress, 6);
master.writeSingle(ADR_CONTR_1, (unsigned int)button3.flagPress, 7);
}
}
}

//--------------------------- обработчик прерывания 500 мкс
void timerInterrupt() {
master.update(); // проверка данных обмена
button1.scanState(); // обработка сигнала кнопки 1
button2.scanState(); // обработка сигнала кнопки 2
button3.scanState(); // обработка сигнала кнопки 3
timeCount++;
}

////////Slave/////////

#include <TimerOne.h>
#include <Button.h>
#include <Tiny_ModBusRTU_Slave.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define TEMPSENSOR_DQ_PIN 8 // thermometer data pin
#define LIGHT1_PIN 10 // подключен к выводу 10
#define LIGHT2_PIN 11 // подключен к выводу 11
#define LIGHT3_PIN 12 // подключен к выводу 12

int timeCount = 0; // счетчик времени
unsigned int regTable[20]; // таблица регистров
int buttonState = 0;
boolean LED_state[5] = {0};
int flag = 0;

Tiny_ModBusRTU_Slave slave(51, 8, regTable, 20, 2); // создаем объект ModBus, адрес 51, таймаут 4 мс, массив regTable, размер 20

OneWire oneWire (TEMPSENSOR_DQ_PIN);
DallasTemperature ds(&oneWire);
DeviceAddress Sensor0 = { 0x28, 0xB1, 0x85, 0xD0, 0x02, 0x00, 0x00, 0x79 }; // floor temperature 28 B1 85 D0 02 00 00 79
DeviceAddress Sensor1 = { 0x28, 0xC0, 0xAA, 0x26, 0x00, 0x00, 0x80, 0xFA }; // air temperature 28 C0 AA 26 00 00 80 FA

void setup() {
Timer1.initialize(500); // инициализация таймера 1, период 500 мкс
Timer1.attachInterrupt(timerInterrupt, 500); // задаем обработчик прерываний
//ds.setResolution(Sensor0, 12);
//ds.setResolution(Sensor1, 12);
Serial.begin(9600);
pinMode(LIGHT1_PIN, OUTPUT);
digitalWrite(LIGHT1_PIN, LOW);
pinMode(LIGHT2_PIN, OUTPUT);
digitalWrite(LIGHT2_PIN, LOW);
pinMode(LIGHT3_PIN, OUTPUT);
digitalWrite(LIGHT3_PIN, LOW);
}

void loop() {
Climate();
Light();
// перегрузка состояния кнопки в таблицу регистров
//noInterrupts();

//interrupts();
}

//--------------------------- обработчик прерывания 500 мкс
void timerInterrupt() {
slave.update(); // проверка данных обмена
timeCount++;
}

void Climate() {

ds.requestTemperatures(); // read temperature
noInterrupts();
*(float *)regTable = ds.getTempC(Sensor0);
*(float *)(regTable + 2) = ds.getTempC(Sensor1);
interrupts();
}

void Light()
{
if ( (regTable[5] & 1) == 0) digitalWrite(LIGHT1_PIN, LOW);
else digitalWrite(LIGHT1_PIN, HIGH);
if ( (regTable[6] & 1) == 0) digitalWrite(LIGHT2_PIN, LOW);
else digitalWrite(LIGHT2_PIN, HIGH);
if ( (regTable[7] & 1) == 0) digitalWrite(LIGHT3_PIN, LOW);
else digitalWrite(LIGHT3_PIN, HIGH);
delay(2);
}

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

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение Эдуард » 21 ноя 2018, 23:19

Здравствуйте!
Я уже забыл, там какие-то проблемы работы с Мегой. В цикле Умный дом в качестве центрального контроллера планируется использовать Мегу 2560. Мне придется проверять и дорабатывать эти библиотеки. Когда - точно не знаю. Скорее всего сейчас сделаем несколько локальных контроллеров и перейдем к центральному.

saf47
Сообщения: 2
Зарегистрирован: 14 окт 2019, 16:53

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение saf47 » 14 окт 2019, 17:01

Здравствуйте, я на данной библиотеке сделал себе сеть, но у меня не получается широковещательный режим, он точно обрабатывается в библиотеке? Я в мастере передаю массив, в качестве устройства указываю 0, в slave нечего не делаю, он имеет например номер 2, но массив не обновляется на slave. Может что не так делаю?

saf47
Сообщения: 2
Зарегистрирован: 14 окт 2019, 16:53

Re: Работа библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave на Mega2560.

Сообщение saf47 » 15 окт 2019, 16:29

saf47 писал(а):Здравствуйте, я на данной библиотеке сделал себе сеть, но у меня не получается широковещательный режим, он точно обрабатывается в библиотеке? Я в мастере передаю массив, в качестве устройства указываю 0, в slave нечего не делаю, он имеет например номер 2, но массив не обновляется на slave. Может что не так делаю?


Разобрался сам,все работает.


Вернуться в «Уроки Ардуино»

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

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