Добрый день Эдуард!
Спасибо вам за ваши уроки.
Вопрос возник когда я попытался передать по modbus (RS485) несколько команд с master на slave, не знаю почему выполняется только последняя команда которая была отправлена на slave.
Использую библиотеки Tiny_ModBusRTU_Master_1.h и Tiny_ModBusRTU_Slave.h, в качестве master ARDUINO MEGA, в качестве slave ARDUINO UNO, программы
///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 12 // кондционер подключен к выводу 12
#define LIGHT2_PIN 11 // кондционер подключен к выводу 11
#define LIGHT3_PIN 10 // кондционер подключен к выводу 10
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);
}
///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); // кнопка 1 подключена к выводу 5
Button button3(7, 30); // кнопка 1 подключена к выводу 6
void setup() {
Timer1.initialize(500); // инициализация таймера 1, период 500 мкс
Timer1.attachInterrupt(timerInterrupt, 3000); // задаем обработчик прерываний 3000 mSec
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++;
}
Помогите пожалуйста разобраться.
С уважением,
Василий
комуникация по MdBus
Re: комуникация по MdBus
Здравствуйте!
Библиотека не рассчитана на плату Мега. Сейчас возобновляются статьи на тему Умный дом. Центральный контроллер планируется сделать на Меге 2560. Мне придется разбираться с этой проблемой, но когда это будет точно не знаю.
Библиотека не рассчитана на плату Мега. Сейчас возобновляются статьи на тему Умный дом. Центральный контроллер планируется сделать на Меге 2560. Мне придется разбираться с этой проблемой, но когда это будет точно не знаю.
Re: комуникация по MdBus
Добрый вечер,
Спасибо за Ваш ответ, буду ждать выхода новой библиотеки для Arduino MEGA.
С уважением,
Василий
Спасибо за Ваш ответ, буду ждать выхода новой библиотеки для Arduino MEGA.
С уважением,
Василий
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей