комуникация по MdBus

Обсуждение и вопросы по урокам Ардуино
lacika
Сообщения: 3
Зарегистрирован: 18 ноя 2018, 10:57

комуникация по MdBus

Сообщение lacika » 18 ноя 2018, 12:00

Добрый день Эдуард!
Спасибо вам за ваши уроки.
Вопрос возник когда я попытался передать по 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++;
}

Помогите пожалуйста разобраться.

С уважением,
Василий


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

Re: комуникация по MdBus

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

Здравствуйте!
Библиотека не рассчитана на плату Мега. Сейчас возобновляются статьи на тему Умный дом. Центральный контроллер планируется сделать на Меге 2560. Мне придется разбираться с этой проблемой, но когда это будет точно не знаю.

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

Re: комуникация по MdBus

Сообщение lacika » 26 ноя 2018, 22:05

Добрый вечер,

Спасибо за Ваш ответ, буду ждать выхода новой библиотеки для Arduino MEGA.

С уважением,
Василий


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

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

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