Auslesen eines Temperatursensors über MODBUS an WAGO SPS

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, vielen Dank für die Erläuterung.

Das mit dem Drehen der Werte kann ich mir dann halbwegs vorstellen.Ich fass den Datentyp "FLOAT INVERS" dann so auf, dass er sich aus dem High- und Low Byte zusammensetzt, und zwar in genau "entgegengesetzter" Richtung zu der Schreibweise in dem Array.
Jetzt weiss ich aber immer noch nicht ganz genau was ich in dem Hauptprogramm anpassen muss. Dot wird ja das Array "WERT" beschrieben, aus dem die Messwerte dann herausbekommen werden. In der Funktion DW_TO_R wird ja ein neues Array "w" mit den beiden Werten "w1" und "w2" aufgespannt und über den Pointer wieder auf w gezeigt. Dieses hat aber so in meinen Augen noch keine Verbindung zu dem Hauptbaustein mit der Modbus-Kommunikation etc., die Schrift der Funktion ist in der Bausteinübersicht auch grau. Müsste ich jetzt nicht erst zusehen die einzelnen Werte aus dem Array "WERT" irgendwie in die Funktion rüber zu bekommen (z.B. als globale Variablen definieren!?), damit diese dann in der Funktion DW_TO_R als w[1], w[2] etc. geladen werden können? Sonst macht die Funktion ja noch nichts mit den gelsenen Werten.
 
Ich hatte gedacht, mein Hinweis auf die Anwendung der Funktion wäre im früheren Post ausreichend gewesen:

Was du benötigst, ist folgende Funktion "DW_TO_R" (geschrieben in ST), die zwei WORD in einen REAL verwandelt. Dabei kann man die WORDs als Eingangsparameter beliebig setzen. In deinem Fall ist die Reihenfolge der Werte jeweils 1-0, 3-2 und 5-4. Das Ergebnis der Funktion ist schon der REAL-Wert und kann direkt den Variablen CO2, Temperatur und Feuchtigkeit zugewiesen werden.

Was dir noch fehlt, ist der 3fache Aufruf der Funktion gemäß nachfolgendem Bild:

Forum_FB-Aufruf.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles klar, jetzt hats "klick" gemacht auch bei mir im Gehirn! ;) Vielen Dank für den letzten Hinweis. Das Senden von Anforderungen und Empfangen scheint ja somit zu klappen. Ich hab hier noch einen anderen CO2-Sensor der auch das MODBUS Protokoll unterstützt, jedoch anders adressiert wird, andere Baudrate etc. hat. Ich werd morgen probieren diesen dann ans Laufen zu kriegen und dann probieren 2 Sensoren vom gleichen Typen in "Reihe" zu schalten. Ich poste die nächsten Schritte natürlich gerne hier weiter.
 
Mit deinem frisch erworbenen Wissen sollte das Prinzip zumindest jetzt klar sein. Wie immer steckt der Teufel im Detail... bin mal gespannt... ;)
 
Das Prinzip ist halbwegs klar, vielen Dank nochmals für die Erläuterungen und die geduld, aber wie erwartet gibt es auch bei dem zweiten Sensor Schwierigkeiten auf den "richtigen" Wert zu kommen. Mit dem Teufel im Detail liegst du auf jeden Fall richtig ;)

Also, es handelt sich wieder um einen CO2-Sensor, hier mal der Link zum Datenblatt:

http://www.syxthsense.com/product/product_pdf/SN1.76-HDH-M.pdf

Das relevante steht ja auf Seite 4:

Baudrate 9600, 8 Datenbits, keine Parität und 1 Stop Bit, Slave Adresse wieder 1. Diese Sachen habe ich dann in der Konfiguration des Masterbausteins eingegeben. Als Funktioncode wieder 4, als "Read_Quantity" hätte ich gedacht 13, um prinzipiell alle Register des Codes zu lesen. Dann eingeloggt, was auch klappt. Im Array werden dann folgende Werte angezeigt:

Screen_MODBUS_6.jpg

Datentyp ist für die Messewrte CO2, Temperatur und RH ja "Signed 16", also der Bereich von -32768 bis 32767. Jetzt würde ich versuchen beispielsweise den Wert aus dem Register 30010 (CO2) auszulesen. Dazu habe ich Eingangsblöcke erstellt, diese mit "INT_TO_REAL" verknüpft und auf die Variable geschickt:

Screen_MODBUS_7.jpg

Diese zeigen also nichts anderes an, als den zugehörigen Wert aus dem Array. Die Werte sehen zwar schön aus, aber so wirklich können das ja noch nicht die Daten sein. Jetzt komme ich nicht drauf, wie die Werte aus dem Array konvertiert werden müssen. ich hätte gedacht, dass es in diesem Fall einfacher ist, da der Datentyp nicht Float Inverse ist, sondern ein einfacher Integer. Aber da habe ich wohl zu simpel gedacht :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist doch alles bestens! Die Daten, die du liest, machen richtig Sinn, wenn man das Handbuch des Sensors daneben hält.

Im Detail:

Die Adressen wie "30001" sind in (alter) AEG/Schneider-Notation angegeben. Zumindest kenne ich sie von dort. Dort spricht man von sog. 4er-Adressen (Merker) und 3er-Adressen (Analogeingang). In der WAGO-Welt kann man diese Adressen so nicht verwenden. Die 3er-Adressen beginnen bei 30001 (nicht bei 30000!!!). Diese Adresse entspricht in der WAGO-Welt der Adresse "0" (bei passendem Funktionscode). Du musst also dein Auslesen bei "0" beginnen und dann 13 Wort lesen. Für dein Wert-Array bedeutet das, dass sich alle bisher gelesenen Werte um ein Wort verschieben. Damit liegen sie dann an der richtigen Stelle. Um dann z.B. den CO2-Wert zu lesen, brauchst du Adresse 30010, was bei WAGO "9" ist. Also steht der Wert in Wert[9]. Und so, wie ich das im Bild erkenne, steht dort auch ein plausibler Wert drin ("568").

Um jedoch alle Werte korrekt zu deuten, musst du dir mal den Wertebereich anschauen. Für CO2 ist das einfach. Der Wertebereich 0..2000 entspricht exakt dem physikalischen Bereich 0..2000 ppm. Hier ist also keine Umwandlung erforderlich. Anders sieht es bei der Temperatur aus. Als Wertebereich ist 0..500 angegeben. Physikalisch ist das aber 0..50,0 °C. Daher ist der gelesene Wert (Wert[10]) durch 10 zu teilen. In deinem Bild steht der Wert 255, also hast du es mit 25,5°C nett warm. Wenn man sich die Wertebereiche und die physikalischen Wertebereiche anschaut, ist entweder nichts mit dem Wert zum machen oder allenfalls durch 10 zu teilen.
 
Hallo, stimmt, ich hatte mich glaub ich von dem letzten Wert verwirren lassen, der dem Feuchtewert gleich ist. So passt das ja auf jeden Fall dann. Am Montag gehts dann weiter mit dem Einbinden von 2 Sensoren, mal gespannt wie gut das dann klappen wird. In meiner Überlegeung muss es eigentlich nur zu schaffen sein, einem Sensor eine andere ID zu vergeben. :D Ein schönes Wochenende erst einmal und vielen Dank für die Tipps, Grüße
 
Hallo zusammen,

Entschuldigung erstmal für die lange Dauer bis zur nächsten Antwort, ich bin leider erst heute wieder dazu gekommen mich mit dem Thema zu beschäftigen. ich wollte mich daran machen, dem Sensor eine andere ID zu geben. Dazu habe ich folgenden im Screenshot ersichtlichen Aufbau aufgesetzt:
Screen_MODBUS_9.jpg

Ich rufe dann also den Sensor mit der ID 1 auf, Function Code 6 für Write Single Register, Schreibe Adresse 2. Als Antwort soll dann die "neue" Slave Adresse rausspringen und der Function Code. Das klappt so leider nicht. Der Error "MB_NO_ERROR" wechselt nach ein paar Sekunden ganz kurz auf "EXTENDED_SLAVE_ERROR" und dann wieder zurück auf "MB_NO_ERROR". So ganz weiß ich gerade nicht, was man dort alternativ testen könnte um das Register Adresse zu schreiben. Hat vielleicht jemand (Snert :D ) eine rettende Idee?

Vielen Dank schon einmal für das Interesse, viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute, ich müsste dringend das Schreiben der Slave ID hinbekommen. Daher wollte ich eben nachfragen, ob ich mein Problem und meinen bisherigen Ansatz verständlich rüberbringen konnte?

Viele Grüße

edit: Ein kleiner Nachtrag, ich habe es gerade mit folgendem Code versucht:

Fehler.jpg

Der Fehlercode der kommt ist ja "15", also ein interner Fehler. Vielleicht hilft dies schon mal weiter!?

Viele Grüße
 
Zuletzt bearbeitet:
Hallo SPS_A,

wenn du die "Modbus Address" des Sensors ändern willst, musst du die gewünschte neue Adresse ins Register 0 des Sensors schreiben.

"SlaveAddress" bleibt zunächst "1",
"FunctionCode" ist "6",
"Read_StartAddres" und "Read_Quantity" sind irrelevant (weil Schreiben gewünscht),
"Write_StartAddress" muss gem. Beschreibung "0" sein (nicht "2"!!! In "2" schreibst du "Parity/Stop-Bit".),
"Write_Quantity" ist "1".

Die neue "Modbus Address" ist in "REQ.Write_Data[0]" einzutragen. Wenn die neue Adresse also z.B. 13 sein soll, ist die Zuordnung "REQ.Write_Data[0]:=13;" anzuwenden. Oder besser: Wd[0]:=13, weil du ja "Wd" definiert hast und dieses Array an REQ.Write_Data übergeben wird.

Wenn du dieses Telegramm absetzt, bin ich mir nicht sicher, ob noch eine korrekte Antwort kommt, da ja die Modbus-Adresse dann geändert ist. Vielleicht wird aber auch die neue Adresse nach einem Neustart des Sensors aktiv. Das bleibt zu prüfen. Wenn das Telegramm erfolgreich war, funktioniert das Lesen von Daten nun auf der neuen Modbus-Adresse und nicht mehr auf der alten.
 
Hallo,

vielen Dank für deine Antwort. Ich hatte es gestern parallel zu deiner Antwort noch mal selber probiert und es hat tatsächlich geklappt. Der Sensor war dann nach dem Ausloggen nur noch über die "neue" Adresse erreichbar. Ich habe dann in dem Programm zur Abfrage der Messwerte die neue Adresse eingetragen, womit dann auch Werte kamen. Wenn im laufenden Betrieb dann ein Sensor mit einer anderen Adresse angedockt wurde, sind die Messwerte "eingefroren", sobald dann der Sensor mit der richtigen ID angeschlossen wurde hat es dann wieder funktioniert.
 
Zurück
Oben