Есть необходимость сделать некий анализатор/регистратор электро-сети.
Имеем тот-же МВА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);
}