Modbus TCP

Modbus TCP är ett kommunikationsprotokoll som kan användas för att kommunicera med internetanslutna enheter. Med hjälp av Modbus TCP kan du med andra ord läsa av din elmätare via trådlös eller trådbunden internetanslutning. Våra elmätaravläsare kan agera både som Modbus TCP server och som Modbus brygga för att kommunicera med anslutna elmätare via Modbus RTU (det seriella Modbus protokollet). När elmätaravläsaren agerar som Modbus server så fungerar den som en P1/HAN till Modbus adapter och möjliggör att man kan använda äldre utrustning för att läsa av moderna elmätare.

OBS! Denna funktionalitet kräver en Modbus TCP-licens.

Hur det fungerar

När enheten agerar som Modbus server kommer den att lyssna på Modbus anrop på en TCP port och svara med det senast mottagna värdet för den förfrågade parametern från P1 porten. Alla parametrar lagras som analoga input register så endast förfrågningar med funktionskod: 4 kommer hanteras. Alla andra förfrågningar kommer att få svar med felkod: 1 (Ogiltig funktion).

Elmätaravläsaren använder en konfigurationsfil på sitt interna filsystem för att kartlägga vilka register parametrarna ska skrivas till. Med andra ord kan användaren själv styra vilka parametrar som ska kunna läsas och vilka register som ska anropas för att läsa dem. Ett register kan bindas till ett data topic eller innehålla ett konstant värde för att imitera en annan enhet (exempelvis för att identifiera sig själv som en elmätare av en viss typ). Om en klient försöker anropa ett register som inte är bundet till något värde eller som ännu inte innehåller något värde, kommer elmätaravläsaren att svara med värdet: 0.

Det kan vara bra att tänka på att enheten har begränsad processorkraft och kan ha svårt att hantera för många modbus parametrar samtidigt. Enheten kommer ta längre tid på sig att behandla data från elmätaren om många parametrar har konfigurerats. Därför rekommenderar vi att ni endast konfigurerar så många parametrar som ni kommer att behöva läsa. För stabil körning rekommenderar vi inte att man konfigurerar fler än 10 parametrar.

För att anropa parametrar i elmätaravläsarens interna minne (när den agerar som Modbus server) behöver anropet ange enhetens interna ID. Detta ID kan ställas in i konfigurationsfilen men har 200 som standardvärde. Om anropet anger ett annat ID kommer det antas att anropet är ämnat för en externt ansluten Modbus server och elmätaravläsaren kommer att agera som Modbus brygga, d.v.s. anropet kommer att skickas vidare till elmätare som är anslutna till enhetens RS485 kontakt och enheten med det ID som angivits kommer att svara.

När enheten agerar som Modbus brygga (alltså när den tar emot ett anrop som är adresserat till en annan enhet) så görs anropet om till ett Modbus RTU anrop och skickas ut genom elmätaravläsarens RS485 port. Notera att alla modeller inte har rs485 kontakt och då går det inte att använd enheten som Modbus brygga. Se till att köpa en enhet med rätt hårdvara om du vill använda den här funktionen.

Datatyper som stöds

följande datatyper stöds när enheten agerar som Modbus server:

  • int16 – 16 bitars heltal
  • uint16 – 16 bitars positiva heltal
  • int32 – 32 bitars heltal
  • uint32 – 32 bitars positiva heltal
  • float32 – 32 bitars flyttal

Dataformat

Eftersom att Modbus protokollet inte specifierar ordningen för bytes och register när dessa överförs så går detta att ställa in för hela systemet samt för enstaka parametrar.

Byte ordningen hänsvisar till den ordning som bytes skickas i varje register. Om man sätter parametern littleEndianByteOrder till true så kommer den minst signifikanta byten att lagras först i registret.

Även registerordningen kan ställas in för värden som sträcker sig över flera register (större än 16 bitar). Om parametern littleEndianWordOrder är satt till true så kommer de minst signifikanta 16 bitarna att lagras i det första registret (med mindre registeradress).

Hur man konfigurerar servern

Servern konfigureras genom enhetens webbgränssnitt. Klicka på fliken ”Modbus TCP” i sidomenyn för att komma till konfigurationssidan. På denna sida kan du aktivera TCP servern, byta TCP port och redigera konfigurationsfilen. För att tillämpa inställningarna man gjort, klickar man på knappen ”Save” längst ner på sidan.

Att skriva en konfigurationsfil

Konfigurationsfilen följer ett YAML format och innehåller information om vilka parametrar som kan läsas och hur de formateras. Följande exempel visar hur filen kan komma att se ut:

Följande fält stöds i konfigurationsfilen:

FältnamnDatatypBeskrivning
addressstringEnhetens interna address för att anropa värden på internminnet.
littleEndianByteOrderbooleanAnger byte ordningen
littleEndianWordOrderbooleanAnger registerordningen
parametersParameter[]Lista med parametrar som Modbus servern tillhandahåller. En parameter är ett enataka värde som kan sträcka sig över flera register. Se nedanstående tabell
Tabell 1. Fält som stöds av konfigurationsfilens rotobjekt

Parameter formatet stödjer följande fält:

FältnamnDatatypBeskrivning
functionCodeintegerModbus funktionskoden som används för att anropa parametern (endast värdet 4 stöds i nuläget).
offsetintegerParameterns första registeradress.
typestringParameterns datatyp. Datatyper som stöds är: int16, uint16, int32, uint32 och float32.
topicstringData topic som parametern är bunden till. Detta fält skall inte finnas för parametrar med konstanta värden.
constantnumberEtt konstant värde som skall finnas på den angivna register adressen. Detta fält får endast finnas för parametrar med konstanta värden.
factornumberDen faktor som värdet skall multipliceras med innan det lagras i registret. Detta kan användas för att lagra värden som heltal utan att tappa decimalplatser. detta fält är inte obligatoriskt och faktorn: 1 kommer att användas om inget annat anges.
littleEndianWordOrderbooleanAnger registerordningen för denna enstaka parameter.
littleEndianByteOrderbooleanAnger byteordningen för denna enstaka parameter.
Tabell 1. Fält som stöds av parameter objekt

Exempel

Modbus TCP server

Detta exempel demonstrerar hur man konfigurerar en Modbus TCP server som tillhandahåller totalt förbrukad energi. Konfigurationsfilen kan då att se ut som följande:

Med denna konfiguration kan vi använda oss av verktyget modpoll för att testa serven. Det kommer då att se ut ungefär som följande:

Så i detta exempel har vi angivit att den interna Modbus TCP servern ska svara på anrop som är adresserade till enhets ID 15. Vi har bundit adress 0 (eller 1 i modpoll då programmet inte använder 0-indexering) till data topic: ”Energy/Active/Positive”. Det innebär alltså att varje gång detta värde tas emot av en ansluten elmätare så sparas det i register 0 och 1 eftersom att ett flyttal sträcker sig över två register.

Om vi bara vill spara värdet i ett enda register eller om vi behöver kunna använda en Modbus klient som inte stödjer datatypen float så skulle vi kunna ändra datatyp till uint16 och sätta faktorn till 1000. Vi skulle då få följande resultat

Konfiguration:

När vi nu kör modpoll får vi följande resultat:

Eftersom att vi har en faktor på 1000 så får vi nu den totalt förbrukade energin som ett heltal i Wh istället för kWh och tappar därför inte några decimalplatser.

Nu när vi förstår hur konfigurationen fungerar är det enkelt att bygga på den. Om vi exempelvis också vill kunna läsa totalt genererad energi så kan vi lägga till en parameter på detta sätt:

Modpoll kan då läsa av båda parametrarna på detta sätt:

Det är viktigt att notera att om en 32-bitars datatyp används så behöver två registeradresser reserveras. Hade vi använt exempelvis datatypen float i ovanstående exempel så hade då den andra parametern behövt ha offset: 2.

Modbus brygga

Att använda elmätaravläsaren som en Modbus brygga är enkelt och kräver inte lika mycket konfiguration. Det räcker med att bara skicka ett anrop som är adresserat till en annan adress än elmätaravläsarens interna adress. I det förra exemplet har vi ställt in den interna adressen till 15. Det innebär att om vi skickar ett anrop som är adresserat till någon annan adress än 15 så kommer elmätaravläsaren att göra om anropet till ett Modbus RTU anrop och skicka det vidare (förutsatt att rs485 hårdvara finns tillgänglig).

Om vi exempelvis kopplar en Garo GNM1D till elmätaravläsarens rs485 kontakt och ställer in Modbus adressen på elmätaren till 1 så kan vi anropa den via Modbus TCP genom att adressera anropet till adress 1. Om vi vill hämta den totala energiförbrukningen kan vi då använda modpoll på följande vis:

I ovanstående exempel ser vi nu att mätarställningen ligger på 3123Wh. Elmätarens manual beskriver vilka parametrar som går att läsa och vilka register de kan läsas från.