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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
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.
using(TcpClientclient=newTcpClient("192.168.1.1",502)){ModbusIpMastermaster=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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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.
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]
Hier die Lösung:
damit werden die ersten 10 Merkerwörter in das Array ushort gelesen und anschließend als double ausgegeben.
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
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
Der Einwand ist völlig berechtigt.
Ich habe diese Modbus-DLL eingebunden: http://www.nmodbus.com
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