Modbus Bits auslesen.

Hallo allerseits.

Mein erster Thread und ich muss zugeben, dass ich schon fast verzweifle…

Ich setze einen Wago-Controller 750-841 mit darauf laufendem Programm ein.

Die Kommunikation läuft.

Über digitale Eingänge bekomme ich ca. 55 Fehlermeldungen in den Wago-Controller.

Diese laufen über die Eingangsworte %IW4 bis %IW7 rein.

Nun habe ich schon wirklich vieles versucht, um die einzelnen Bits in diesen Wörtern auszulesen und mit individuellen Fehlermeldungen zu belegen:

a) erfolglos: Das ganze Wort %IW4 auf %MW0 auslesen und aus dem String „0000 0000 0000 0100“ die Bits mit Wert 1 auslesen und als Alarm anzeigen.

b) erfolglos: Eingangsbit %IX4.0 nach Konversion von „Bool_to_Word“ auf %MW0 schreiben und dann Bit oder testweise auch mal Wort 12288 auslesen.

c) erfolglos: Eingangsbit %IX4.0 auf %MX0.0 schreiben und dann Bit 12288 auslesen.

d)erfolglos: Eingangsbit %IX4.0 auf %MX0.0 schreiben und dann Bit 12289 auslesen.

e) erfolglos: Eingangsbit %IX4.0 auf %MX0.1 schreiben und dann Bit 12288 auslesen.

f) erfolglos: Eingangsbit %IX4.0 auf %MX0.1 schreiben und dann Bit 12289 auslesen.

So, das waren noch LANGE nicht alle Wege, die ich jetzt beschritten habe, aber es klappt NICHTS.

Langsam bin ich gefrustet.

Daher noch mal meine Frage: wie mache ich es möglichst elegant, die einzelnen Bits auszulesen und bei Aktivierung eine Meldung auftauchen zu lassen.
Ich wollte es eigentlich gerne in ganzen Wörtern übergeben um nicht so viel Speicher zu verschwenden, aber mittleerweile wäre ein ganzes Wort für ein BIT auch akzeptabel.

Hauptsache, es läuft irgendwie mal.

Gruss

Zaphod

Hallo Zaphod und willkommen im Forum.

Bin mir nicht sicher ob ich dein Problem richtig verstanden hab. Hilft dir dieser Schnipsel weiter?


  if (getBitState(6, 2))
	echo "gesetzt";
  else
	echo "nicht gesetzt";


  function getBitState($Value, $BitNo)
  {
	return (($Value & pow(2, $BitNo)) != 0);
  }
 

Gruß,

Toni

Hallo Zaphod,

also wenn %IW4 auf %MW0 geschrieben wird, dann liegt der Wert definitiv auf der Modbus-Adresse 12288 (16Bit Word/SmallInt).

Hast Du evtl. %MW0 oder %MD0 noch an anderer Stelle in Verwendung?

Falls nicht, dann gibt möglicherweise doch Probleme mit der Kommunikation. Welche Einstellungen hast Du denn unter IPS? Ist der Port 502 für den Wago Client Socket geöffnet und beim Splitter Modbus TCP ausgewählt?

Schöne Grüße
Roland

PS: Screenshots helfen auch weiter…

Guten Morgen die Herren,

vielen Dank erst mal für die Antworten.

@Tonic1024: Wenn ich das richtig sehe, wertet Dein Schnipsel aus, ob ein Bit gesetzt ist, oder nicht.
Wenn ich das machen kann und das Bit auch im Wort (oder Dword) einzeln als gesetzt oder nicht gesetzt herausfinden kann, wäre mir schon geholfen.
Da ich das bisher nicht kann, hätte ich für jedes einzelne gesetzte Bit ein ganzes Word „verschwendet“.

Ich muss zugeben, dass ich noch ein etwas planloser IP-Symcon Anfänger bin. Wo würde man dieses Script wie einbinden?

@MTEC: %MW0 wird nur an einer einzigen Stelle beschrieben. Im Programmiersystem für den Wago-Controller sehe ich auch die korrekte Zuordnung und Belegung der Bits.
Die Kommunikation ist auch OK. Das hat sich schon gezeigt, als ich versehentlich auf ein falsches-Wago-Gerät verwiesen habe.

Ich weiss einfach nicht, warum ein Word, in dem nur ein BIT true sein kann, nicht sauber angezeigt wird.
Dies ist auch nicht mehr nötig, wenn ich eine Funktion hätte, mit der ich jede Bit-Stelle eines Words auch Zustand überprüfen kann um so gezielt weitere Script-Aktionen auszulösen.

Gibt es was, wo man die per Modbus eingelesenen Rohdaten direkt live einsehen kann?

Gruss

Zaphod

Hallo zaphod,

anbei Unterlagen vom Wago Workshop in Nidda, evtl. helfen die ein wenig weiter.

Modbus.zip (489 KB)

Hallo,

ich habe so etwas ähnliches mit einigen Statusvariablen meiner Heizung gemacht.

Ich speichere die Statusinformationen in der Merkeradresse MW200 (12488)
Die einzelnen Bits kann man wie du schon festgestellt hast mit MX200.Bit schreiben bzw.lesen.

Man kann die Merkeradressen in IPS nur Wordweise auslesen bzw. schreiben. (Ist jedenfalls bei mir so).
Für ein Byte oder ein Bit würde immer mindestens ein Word verbraucht werden.

Ich lesen also die 12488 als Integervariable (ohne Vorzeichen) aus --> siehe Screenshot

Diese frage ich wiederum Bitweise ab um die unterschiedlichen Statusinformationen zu erhalten.

Funktioniert bei mir ohne Probleme.

Als Anhang noch ein paar Screenshots um die Sache noch etwas mehr zu verwirren. :slight_smile:

Ciao
René

Modbus Variable in IPS.png

Hallo Zaphod,

der Bit- bzw. Word-Zugriff von IPS auf den Wago-Controller geht definitiv problemlos, aber ohne nähere Informationen wird Dir keiner wirklich sinnvoll weiterhelfen können.
Mach doch mal ein paar Screenshots von Deinen Einstellungen unter IPS. (Modbus-Modul, Modbus RTU/TCP Splitter und Wago Client-Socket)

Die angezeigten Werte innerhalb von IPS sind mehr oder weniger Modbus-„Rohdaten“ - mehr gibt es nicht… :wink:

Hallo René,

ein bitweiser Zugriff auf Modbus-Adressen ist natürlich auch mit IPS möglich.
MW200 = Modbus 12488 (Register -> 16Bit Datentyp)
MX200.0 = Modbus 15488 (Coil -> 1Bit Datentyp)

Schöne Grüße
Roland

@Roland

Danke für den Hinweis mit dem weiteren Adressbereich um die Daten bitweise auslesen zu können. Das wusste ich bis jetzt noch nicht. Steht aber bestimmt irgendwo in der Wagon Doku. Man ist halt einfach immer zu faul zu lesen. :wink:

Ciao
Rene

Guten Morgen, Ihr Helfer!

Tausend Dankd für die verschiedenen Ansätze mein (Verständnis-)Problem etwas zu erhellen.

@boXer: Die Unterlagen sind Klasse. Danke. Anhand der Grafik auf S. 21 habe sogar ich verstanden, dass die Adressierung im Modbus sich anhand der Funktionscodes (die ja durch Angabe der zu lesenden Variable definiert werden) ändert.

@rene: Genau so hatte ich es mir gedacht, bis ich hier die Info erhalten habe, dass man auch gezielt einzeln lesen kann. Aber so ein CFodeschnipsel ist immer toll, um weiter zu lernen. Vielen Dank.

@MTec: Vielen Dank auch für Deinen Beitrag, auch wenn ich noch Fragen habe. :slight_smile:

Zitat:
Zitat von Zaphod Beitrag anzeigen
Ich weiss einfach nicht, warum ein Word, in dem nur ein BIT true sein kann, nicht sauber angezeigt wird.
Hallo Zaphod,

der Bit- bzw. Word-Zugriff von IPS auf den Wago-Controller geht definitiv problemlos, aber ohne nähere Informationen wird Dir keiner wirklich sinnvoll weiterhelfen können.
Mach doch mal ein paar Screenshots von Deinen Einstellungen unter IPS. (Modbus-Modul, Modbus RTU/TCP Splitter und Wago Client-Socket)

Sicher geht der Zugriff problemlos. Die „konfuse“ Fragestellung lag nur an meiner falschen Auffassung. Aber als Du schriebst, waren schon zwei sinnvolle Antworten gepostet worden.

ein bitweiser Zugriff auf Modbus-Adressen ist natürlich auch mit IPS möglich.
MW200 = Modbus 12488 (Register -> 16Bit Datentyp)
MX200.0 = Modbus 15488 (Coil -> 1Bit Datentyp)

Ähh, das habe ich jetzt noch nicht ganz verstanden. Warum ändert sich die Adresse von 12488 auf 15488?
Ist das eine festgelegte Modbus-Definition?
Oder eine von Wago?
Wo hätte ich das finden können/müssen?
Wäre dann MX200.1 = Modbus 15489 ?

Ich finde es super, dass ich so schnell so viele kompetente Antworten bekommen habe mit mehr als nur einem Lösungsansatz.

Gruss

Zaphod

Hallo Zaphod

Ähh, das habe ich jetzt noch nicht ganz verstanden. Warum ändert sich die Adresse von 12488 auf 15488?
Ist das eine festgelegte Modbus-Definition?
Oder eine von Wago?
Wo hätte ich das finden können/müssen?
Wäre dann MX200.1 = Modbus 15489 ?

Richtig MX200.1 ist Modbusadresse 15489, dies ergibt sich durch das Prozessabbild der SPS. Die Modbusadressen wiederholen sich. Die Unterscheidung erfolgt durch die Abfrage als Word (Register) oder Bit (Coil). Schau Dir doch bitte mal die Seite 20-21 des PDF an, dort ist der Zusammenhang in einer Tabelle aufgezeigt.

@Rene: kannst Du mir mal sagen, wie Du dem Script sagst, Welches Word Du zerlegen willst?
Und wie schreibst Du die einzelnen Boolschen Werte wieder in die zerlegten Bits?

Kannst Du bitte mal weitere Screenshots einstellen? (Variablendeklaration, ect.)

Gruss

Zaphod

Danke boXer. Gibt es denn eigentlich irgendwo einen allwissenden (z.B. Excel-) Modbus-Adressen-Rechner?

Oder anders gefragt: wie kommt Ihr auf die Adressen? Ihre könnt doch nicht den gesamten Modbus-Plan lückenlos im Kopf haben. (Soll kein Zweifeln an individueller Genialität sein.)

Gruss

Zaphod

Hallo Zaphod,
Rechner habe ich nicht, aber eine gut gemeinte Tabelle zum nachschauen.

Oder anders gefragt: wie kommt Ihr auf die Adressen? Ihre könnt doch nicht den gesamten Modbus-Plan lückenlos im Kopf haben. (Soll kein Zweifeln an individueller Genialität sein.)

Ich hatte die Daten/Adressen bisher immer hochgerechnet, ich glaube die Tabelle ist aber einfacher.

@René schau Dir die Tabelle bitte mal an. Deine Vergabe von %MW an Bool und Real hat echt was Guerilla mäßiges, ich wusste bisher nicht, das das so funktioniert.:slight_smile:

Wago_Modbus_Adressen.zip (671 KB)

@boXer: 1000 Dank!

Das ist ne super Hilfe!

Gruss

Zaphod

Hallo zusammen,

ich sitze zur Zeit vor einem ähnlichem Problem allerdings bei einer Beckhoff CX-Steuerung.

Meine Kommunikation läuft über ModBus TCP.

Und über die mb_outptputCoils, die mb_inputCoils und die entsprechenden Register funktioniert auch alles wie es soll.

Nun versuche ich aber mit den „Modbusgeräten“ aus IPS auf die Merkerbereiche in der Steuerung zuzugreifen.
Wordweise geht dies auch.
Adresse in IPS=12288 >> AT%MW0

Wenn ich aber nun ein Modbusgerät anlege mit einem Bit als Datentyp und dann die Adresse 12288 dann passiert in Merker AT%MX0.0 nichts.

Interessanterweise kann ich auf die physikalischen I/O´s Bitweise zugreifen.

IPS Adresse 0 = AT&IX0.0 nur lesen
IPS Adresse 0 = AT&QX0.0 lesen und schreiben

Hat das schon mal jemand mit einer Beckhoff hinbekommen,
oder steht vielleicht sogar vor dem gleichen Problem??

Möchte nur ungern über die Ausgangsbits arbeiten.

MfG Jens

Hallo zusammen,

dies ist mein erster Beitrag hier, deshalb zuerst ein freundliches ‚Hallo‘ in die Runde. Seit einiger Zeit lese ich hier mit und habe viele Anregungen bekommen.

Aktuell versuche ich eine WAGO 750 an Symcon zu koppeln. Erste Versuche waren vielversprechend, aber die Ermittlung der Modbus-Adressen ist mühsam.

In diesem Beitrag wird auf eine Tabelle und ein PDF mit Hintergrundinformationen verwiesen. Allerdings finde ich keinen Weg, diese Dokumente einzusehen oder zu laden.Wie kann ich an diese Infos gelangen?

Sorry für die typische Anfängerfrage, aber ich stehe gerade ‚auf dem Schlauch‘.

Viele Grüsse, Werner

Hallo Michael´s (Lübecker Meista´s)

hier scheint wieder ein Bild zu fehlen (Exceltabelle) SPS: Wago, Beckhoff, ABB — IP-Symcon :: Automatisierungssoftware die Ihr verlinkt habt. Das ist glaube genau die, die hier gesucht wird.
Gibt ja noch den anderen Fred über die verschwundenen Bilder;)

Gruß

Jan

Hallo in die Runde,

ich suche ebenfalls verzweifelt die Tabelle, von der im Vorfeld gesprochen wurde, der Link führt immer wieder zu diesem Beitrag :frowning:
Von der Tabelle weit und breit nichts zu finden.

Gibt es noch eine andere Möglichkeit an die genannte Tabelle zu gelangen?

Lg Basti

Hallo Zusammen,

Ich bin ebenfalls auf der Suche nach der Excel Tabelle, da ich auch gerade meine Wago mit Modbus teste.
Das würde das ganze einfacher machen.

Vll hat sie ja noch eine und möchte sie neu zur Verfügung stellen =)

Dankeschön!

Gruß
Daniel

Ich bin auch gerade dabei, die IPS mit einer Wago zu koppeln.

Bei mir sieht es so aus:

Codesys
RollladenStation AT %MW0: INT := 0; (Adresse kommt von Symcon)
RollladenAktion AT %MW1: INT := 0; (Aktion hoch, runter, stop)

Im Anhang die Einstellungen des Wertes „RollladenAktion“. Das funktioniert bei mir mit einer 750-842.