Анализатор/регистратор электро-сети с интерфейсом MODBUS

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Анализатор/регистратор электро-сети с интерфейсом MODBUS

Сообщение Тима »

Доброго времени суток.
Есть необходимость сделать некий анализатор/регистратор электро-сети.
Имеем тот-же МВА8, дуина, ОЛЕД-экран, 3 трансформатора тока с выходом 4..20 мА, трансформатор 220/9 вольт.
Необходимо собрать регистратор, сохраняющий максимальный ток по 3 фазам и минимальное напряжение.
В принципе со схемой соединения приборов проблем нет, как и с настройками МВА8.
Проблема со скетчем... Необходимо считать данные с ячеек 1, 7, 13, 19 и присвоить их reg[0], reg[1], reg[2], reg[3].
Данные со всех ячеек почему-то поочередно присваиваются reg[0]. Остальные остаются нулями.
Т.е. на экране одно значение меняется 1 раз в секунду, перебирая значения 4х ячеек.
Вот скетч:

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

#include <SimpleModbusMaster.h>
#include <Arduino.h>
#include <Wire.h>
#include <MicroLCD.h>
int A,B,C,U;

LCD_SSD1306 lcd; 
 
// Настройки интерфейса
#define baud 9600       // Скорость
#define timeout 1000    // Длительность ожидание ответа
#define polling 200     // Длительность паузы между запросами
#define retry_count 10  // Количество попыток обмена до отключения канала
 
// Выход контроллера для управления направлением драйвера
#define TxEnablePin 2
 
// Выход для управления светодиодом
#define LED 13
 
// Количество регистров на стороне ведущего устройства для хранения данных
#define TOTAL_NO_OF_REGISTERS 4
 
// Простой способ подсчета количтества создаваемых объектов packet.
// TOTAL_NO_OF_PACKETS обновляется автоматически.
enum
{
  PACKET1,
  PACKET2,
  PACKET3,
  PACKET4,
  TOTAL_NO_OF_PACKETS // Этот элемент должен быть последним
};
 
Packet packets[TOTAL_NO_OF_PACKETS];
 
unsigned int regs[TOTAL_NO_OF_REGISTERS];
 
void setup()
{
  // Инициализируем каждый обект packet
  modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 1, 1, 0); 
  modbus_construct(&packets[PACKET2], 1, READ_HOLDING_REGISTERS, 7, 1, 0);
  modbus_construct(&packets[PACKET3], 1, READ_HOLDING_REGISTERS, 13, 1, 0);
  modbus_construct(&packets[PACKET4], 1, READ_HOLDING_REGISTERS, 19, 1, 0);
  // Инициализируем конечный автомат протокола MODBUS
  modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
 
  // Инициализируем последовательный порт для отладочного вывода
 lcd.begin();
 
  // Настраиваем порт для светодиода
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}
 
void loop()
{
  modbus_update();
 
        lcd.setFont(FONT_SIZE_MEDIUM);
        lcd.setCursor(0, 0); lcd.print("ANALIZATOR");
        lcd.setCursor(0, 2); lcd.print(regs[0]); 
        lcd.setCursor(40, 2); lcd.print(regs[1]); 
        lcd.setCursor(80, 2); lcd.print(regs[2]); 
        lcd.setCursor(0, 6); lcd.print(regs[3]); 
        U=250;
    if (A < regs[0])  { A=regs[0]; }
    if (B < regs[1])  { B=regs[1]; }
    if (C < regs[2])  { C=regs[2]; }
    if (U > regs[3])  { U=regs[3]; }
        lcd.setCursor(0, 4); lcd.print(A); 
        lcd.setCursor(40, 4); lcd.print(B); 
        lcd.setCursor(80, 4); lcd.print(C); 
        lcd.setCursor(40, 6); lcd.print(U); 
}
 
Как это исправить?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1016
Зарегистрирован: 22 окт 2010, 23:57

Re: Анализатор/регистратор электро-сети с интерфейсом MODBUS

Сообщение Mr.Kubikus »

Перенес в отдельную тему
С уважением, Григорий
GitHub FB ВК
Тима
Сообщения: 131
Зарегистрирован: 16 ноя 2012, 21:03

Re: Анализатор/регистратор электро-сети с интерфейсом MODBUS

Сообщение Тима »

Разобрался.
copy/paste конечно штука удобная, но иногда сбивает с толку. Вот и я докопипастился.... :lol:
В строках:

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

  modbus_construct(&packets[PACKET1], 1, READ_HOLDING_REGISTERS, 1, 1, 0); 
  modbus_construct(&packets[PACKET2], 1, READ_HOLDING_REGISTERS, 7, 1, 0);
  modbus_construct(&packets[PACKET3], 1, READ_HOLDING_REGISTERS, 13, 1, 0);
  modbus_construct(&packets[PACKET4], 1, READ_HOLDING_REGISTERS, 19, 1, 0);
последние параметры "0", а это адрес ячейки, куда записываются считанные данные. Вот он и записывал все считанное в regs[0] поочередно.
Поменял адреса на соответствующие и все встало на свои места.
Последний раз редактировалось Тима 22 авг 2016, 19:48, всего редактировалось 2 раза.
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1016
Зарегистрирован: 22 окт 2010, 23:57

Re: Анализатор/регистратор электро-сети с интерфейсом MODBUS

Сообщение Mr.Kubikus »

Копипаста она такая :).

Кстати, если при публикации исходников к тегу code добавить параметр =сpp, то тогда появляется подсветка синтаксиса и нумерация строк. За счет этого удобнее ссылаться на конкретные места в коде.
С уважением, Григорий
GitHub FB ВК
Ответить