Real per Modbus auslesen

cali
2009-08-02
2009-08-14
  • cali - 2009-08-02

    Hallo,

    ich verwende die Wago 750-841 zusammen mit der mbt.dll. Ich lese mittels c# die digitalen eingange aus. Das funktioniert. Aber wie lese ich Realwerte aus der Wago? Es handelt sich scheinbar um 32 Bit Werte, von denen immer nur 16 Bit ausgelesen werden können. Wie wandel ich diese in double um? Evt hat jemand eine Stück Code greifbar.

    Danke & Grüße

    Cali

     
  • cmoeller - 2009-08-07

    Hallo Cali,

    der Datentyp "REAL" in CoDeSys ist ein 32BitWert und besteht aus Vorzeichen(1 Bit), Exponent(8 Bit) und Mantisse(23).

    Es handelt sich um eine Gleitkommazahl mit einfacher Genauigkeit.

    In der dotnet Welt entspricht das dem Datentyp "Single" bzw. "float".

    Um aus C# per Modbus einen REAL-Wert zu lesen müssen zwei Register-Werte(16Bit) geholt, die Byteorder zurecht gebogen und ein Typecast nach "Single" durchgeführt werden.

    if (i % 4 == 0)
    {
       MyByteArray[0] = this.m_readBuffer[i + 1];
       MyByteArray[1] = this.m_readBuffer[i + 0];
       MyByteArray[2] = this.m_readBuffer[i + 3];
       MyByteArray[3] = this.m_readBuffer[i + 2];
       RealData[i / 4] = BitConverter.ToSingle(MyByteArray, 0);                         
    }
    

    Persönlich arbeite ich lieber mit Ganzzahlen, bei denen ich das Komma durch anschliessendes multiplizieren oder dividieren einfüge.

    Gruss Christoph

    VC7App1.zip [122.13 KiB]

     
  • cali - 2009-08-13

    Hier die Lösung:

    damit werden die ersten 10 Merkerwörter in das Array ushort gelesen und anschließend als double ausgegeben.

    ushort[] registers = master.ReadHoldingRegisters(12288,10);
    double value = ModbusUtility.GetSingle(registers[1], registers[0]);
    System.Console.WriteLine("Gelesener Wert:");
    System.Console.WriteLine(value);
    

    Frage: Warum funktioiniert das nur bis Wort 86? Laut Wago Doku sollte das bis Wort 4095 funktionieren. Auch das einlesen ab einem höheren Startregister klappt nicht.

    Grüße

    Cali

     

    Related

    Talk.ru: 1

  • cmoeller - 2009-08-14

    Hallo Cali,

    schön das du auch eine Lösung gefunden hast.

    Um deine Frage zu beantworten wäre es hilfreich zu wissen wo man die Klasse ModbusUtility findet und von welchem Typ "master" ist.

    Gruss cmoeller

     
  • cali - 2009-08-14

    Der Einwand ist völlig berechtigt.

    Ich habe diese Modbus-DLL eingebunden: http://www.nmodbus.com

    using (TcpClient client = new TcpClient("192.168.1.1", 502))
    {
    ModbusIpMaster master = ModbusIpMaster.CreateIp(client);      
    ...
    

    Beispiele findet man auch unter dem Link! Leider kann ich nur bis Merkerwort 86 auslesen. Unterstützt werden sollten 4095. Lösung habe ich noch keine.

    Gruß

    Cali

     

Log in to post a comment.