Vyčítání dat z BELu

Automatizace, řízení, měření, logování a programování s využitím platformy Arduino.
Uživatelský avatar
TadeasD
Příspěvky: 1
Registrován: stř led 18, 2023 8:19 am
Lokalita: Přerov

Vyčítání dat z BELu

Příspěvek od TadeasD »

V první řadě děkuji p. Ing. Budinskému za informace a rady.
Zkonstruoval jsem modul pro vyčítání údajů z BEL regulátoru. (Regulátor MR4316AC NG do rozvaděče)
Převodník
Převodník
BEL má na horní straně UART rozhraní vyvedené do konektoru RJ12 nebo na 4p šroubovací svorkovnici, která není součástí ale lze dopájet.
Přenosová rychlost 9600 Bd. Data se posílají každou sekundu.
Hlavní součástí převodníku je Arduino Nano, modul UART na RS485, optočlen 6N137, DC/DC na 5V a pár kondenzátorů.
Převodník je připojen přes svorku +5V a TX.
Na vstupu převodníku je optočlen s rezistorem, výstup optočlenu je zapojen na pin RX Arduino Nano.
Protože ATmega328p má jen jeden HW UART (BEL regulátor), tak modul RS485 je připojen na SW UART přes piny D2, D3.
Z převodníku lze data vyčítat přes RS485 ModbusRTU.
Pro prvotní testování jsem použil LAN Controller V4.
Testovací zapojení s LAN Controllerem V4
Testovací zapojení s LAN Controllerem V4
Některé hodnoty nejsou správné, aktuálně v kódu arduina opraveno.
Některé hodnoty nejsou správné, aktuálně v kódu arduina opraveno.
Aktuálně data vyčítám do Siemens Loga přes USR-DR302.
Zatím mám LOGO v8.2, ale čekám na LOGO v8.4, které bude mít otevřené MQTT. Mělo by být v prodeji snad do měsíce.

Nejsem programátor, kód funguje ale neznamená to, že je to správně napsané. Za případné rady budu rád.
Použitá Arduino knihovna: https://github.com/CMB27/ModbusRTUSlave

Kód: Vybrat vše

const int BUFFER_SIZE = 32;
uint8_t buf[BUFFER_SIZE];

uint8_t VerComProt = 0;
uint8_t VelikostDat = 0;
uint8_t VerzeFirmw = 0;
uint8_t DruhZar = 0;
uint8_t VstupU1 = 0;
uint8_t VstupU2 = 0;
uint16_t VstupU = 0;
uint8_t VystupU1 = 0;
uint8_t VystupU2 = 0;
uint16_t VystupU = 0;
uint8_t Teplota1 = 0;
uint8_t Teplota2 = 0;
uint8_t RezimCin = 0;
uint8_t StavReg = 0;
uint8_t PeriodaPanelu = 0;
uint8_t PeriodaTermostatu = 0;
uint8_t MaxVystupU = 0;
uint8_t PrikonBoileru1 = 0;
uint8_t PrikonBoileru2 = 0;
uint8_t DenniSpotVody = 0;
uint8_t MinTeplotaVody = 0;
uint8_t MinUPanelu = 0;

#include <SoftwareSerial.h>
#include <ModbusRTUSlave.h>

const uint8_t rxPin = 3;
const uint8_t txPin = 2;

SoftwareSerial mySerial(rxPin, txPin);
ModbusRTUSlave modbus(mySerial);
uint16_t inputRegisters[18];

void setup() {
  Serial.begin(9600);
  modbus.configureInputRegisters(inputRegisters, 18);     // unsigned 16 bit integer array of input register values, number of input registers
  modbus.begin(2, 9600);                                // slave id, baud rate, config (optional)

}

void loop() {
  // check if data is available
  if (Serial.available() > 0) {
    // read the incoming bytes:
    int rlen = Serial.readBytes(buf, BUFFER_SIZE);

      VerComProt = buf[1];
      VelikostDat = buf[2];
      VerzeFirmw = buf[3];
      DruhZar = buf[4];
      VstupU1 = buf[5];
      VstupU2 = buf[6];
      VstupU = ((VstupU2 << 8) + VstupU1) * 41.7;
      VystupU1 = buf[7];
      VystupU2 = buf[8];
      VystupU = ((VystupU2 << 8) + VystupU1) * 41.7;
      Teplota1 = buf[9];
      Teplota2 = buf[10];
      RezimCin = buf[11];
      StavReg = buf[12];
      PeriodaPanelu = buf[13];
      PeriodaTermostatu = buf[14];
      MaxVystupU = buf[15];
      PrikonBoileru1 = buf[16];
      PrikonBoileru2 = buf[17];
      DenniSpotVody = buf[18];
      MinTeplotaVody = buf[19];
      MinUPanelu = buf[20];
  }

  inputRegisters[0] = VerComProt;
  inputRegisters[1] = VelikostDat;
  inputRegisters[2] = VerzeFirmw;
  inputRegisters[3] = DruhZar;
  inputRegisters[4] = VstupU;
  inputRegisters[5] = VystupU;
  inputRegisters[6] = Teplota1;
  inputRegisters[7] = Teplota2;
  inputRegisters[8] = RezimCin + 1;
  inputRegisters[9] = StavReg;
  inputRegisters[10] = PeriodaPanelu;
  inputRegisters[11] = PeriodaTermostatu;
  inputRegisters[12] = MaxVystupU * 41.7; 
  inputRegisters[13] = PrikonBoileru1 * 100;
  inputRegisters[14] = PrikonBoileru2 * 100;
  inputRegisters[15] = DenniSpotVody * 10;
  inputRegisters[16] = MinTeplotaVody;
  inputRegisters[17] = MinUPanelu * 4.17;
  modbus.poll();
}
Hodnoty pod Teplota2 jsou parametry regulátoru, které se nastavují pomocí tlačítka na regulátoru.
Vstupní a výstupní napětí je nutné vydělit 100.
Aktuální stav regulátoru:
0 - zapnutý AC výstup (režim 1)
1 - zapnutý DC výstup (režim 1)
2 - zapnutý DC výstup (režim 2)
3 - zapnutý AC výstup (režim 2)
4 - zapnutý AC výstup - spotřebič 1 (režim 3)
5 - zapnutý AC výstup - spotřebič 2 (režim 3)
6 - napájení spotřebiče z panelů (režim 4)
7 - napájení spotřebiče ze sítě (režim 4)

  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek