Probleem data uitlezen Hobut Power Meter met Modbus protocol

Beste Mensen,

Ik loop al een tijdje tegen een probleem aan met mijn hobby projectje. Ik wil een powermeter via het Modbus protocol (serieel) uitlezen, maar de data dat ik ontvang is niet wat ik verwacht. Daarom vraag ik om jullie hulp.

Mijn systeem bestaat uit:

  • Arduino Mega 2560 V3
  • Multifunctionele Power meter: Hobut M850 MP1 (Power Meters - Hobut Ltd.)
    (met modbus uitbreidingsmodule)
  • RS484 chip: Maxim MX485
  • LCD shield voor arduino
    (om data van power meter weer te geven, puur voor testdoeleinden)
  • DC Voeding 12V voor arduino, 5V voor Maxim MX485
  • Laptop met nieuwste versie Mpide met Modbus Master library (Arduino Playground - ModbusMaster Library)

De MX485 chip zit tussen de arduino en power meter, zie onderstaande afbeelding. TX (arduino pin 0) op driver input MX485, RX (arduino 1) op receiver output MX485. Output A en B van MX485 zit aangesloten op respectievelijk A en B pinnen van powermeter. Om de MX485 chip te switchen tussen driver/receiver, wordt pin D3 gebruikt (softwarematig aangestuud). Tijdens programmeren van Arduino, is de RX en TX losgekoppeld. Na programeren wordt de usb losgekoppeld, voeding ingeschakeld en zou het LCD shield de data van de power meter moeten weergeven.

Dit project is geïnspireerd op een reeds bestaand project, zie rs485 - Arduino as Modbus client with MAX485 doesn't get any response - Electrical Engineering Stack Exchange. Pin D3 is namelijk hardware coded in de Modbus library, dit omdat op juiste moment van switchen tussen driver/receiver MX485 chip (zoals beschreven op deze site).

Dit is de code van mijn testprogramma, om enkel een register van de power uit te lezen.

#include <ModbusMaster.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
ModbusMaster node(1);

void setup() {
  pinMode(3, OUTPUT);
  digitalWrite(3, LOW);
  node.begin(9600);
  lcd.begin(16, 2);
}

void loop() {
uint16_t m_startAddress=0x07D6;
uint8_t m_length=2;
uint8_t result;

  lcd.clear();

  result = node.readHoldingRegisters(m_startAddress, m_length);
  //result = node.readInputRegisters(m_startAddress, m_length);
  
  if (result == node.ku8MBSuccess) {
    lcd.print("DATA: ");
    for (uint8_t j = 0; j < m_length; j++)
       {
       lcd.print(node.getResponseBuffer(j));//, HEX);
       }
  } 
  else {
    lcd.print("ERR ");
    lcd.print(result, HEX);
  }
  delay(1000);
}

De beschrijving van de registers zijn opgenomen in manual van power meter (http://www.hobut.co.uk/images/M850%20Comprehensive%20User%20Manual_03%202011a.pdf). Het probleem zit in het feit dat als ik registers uitlees de ontvangen hex data of 00 (=2x0) of FFFF FFFF (=8xF) weergeeft. 8xF betekent dat het gevraagde register niet applicable (toepasbaar) is. En het is geen error dat wordt weergegeven, want de gevraagde registerwaarde is succesvol (result=succes). Haal ik een kabel los of (A&B omdraaien of iets dergelijks) komt de error melding ERR E2 (time out) in beeld. Dus het lijkt mij geen hardware probleem.

De data kan uit 2 verschillende soorten register uit gelezen worden, te weten:

  • Input registers met adres 3X (volgens power meter manual) en modbus functie code 04
  • Holding registers met adres 4X (volgens power meter manual) en modbus functie code 03
    Zie in mijn software de functies readInputRegisters en readHoldingRegisters. Welke registers il moet gebruiken staan in de bijlage van de power meter manual. Ik heb beide registers geprobeerd, maar geen goed resultaat. Ik ontvang of 2x0 of 8xF. Voor resultaten volgende lijst:

[Registernaam] [register] [binnengekregen data]
Met functie ReadInputRegister (functie 04):

  • Spanning V1, 0x0006, FFFF FFFF
  • Spanning V2, 0x0008, FFFF FFFF
  • Spanning V3, 0x000A, 00
  • Frequentie, 0x001E, 00
    Met functie ReadHoldingRegister (functie 03):
  • Spanning V1, 0x07D6, FFFF FFFF
  • Spanning V2, 0x07D8, 00
  • Spanning V3, 0x07DA, 00
  • Frequentie, 0x07EE, 00

De Hobut power meter is nieuw, en werkt stand alone helemaal prima. Meet correct 3 fasespanningen en 3 stromen dmv current transformers (meet natuurlijk ook power en energie). Nu gemakshalve stroommeting achterwege gelaten. Tijdens het testen is de power meter aangesloten met alle 3 spanningsingangen aan 240 Vac. De power meter geeft continu veranderen spanningswaarden rond 240 V, maar de data wat ik met mijn arduino ontvangen lijkt op geen enkel geval op veranderlijke spanningswaarden. Wat kan de oorzaak hiervan zijn? Iemand suggesties? Ik hoor het graag!