Step 7 Umkopieren von Modbus Daten

Transistorfips

Level-1
Beiträge
89
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe die Aufgabe mal auf ein einfaches Problem heruntergebrochen: Es sollen zwei Register von einem Modbus-Slave (Stromzähler) gelesen werden. Die Register liegen weit auseinander und die Baudrate ist niedrig, sodaß hier das Abholen eines gesamen Datenblocks von zB. 1000x2 Wörtern keinen Sinn macht. Stattdessen sollen die zwei Register einzeln abgefragt werden. Eigentlich das 'tägliche Brot' im Umgang mit nem Modbus Device.

Das Konzept:
Um die zwei (später 10) Register abzufragen zählt ein von einem Timer angestoßener Zähler zyklisch von 0 bis 1 und wird bei 2 resettet. Der Zählerstand wird auf den Auswahleingang eines Multiplexers gelegt. Beim Erreichen eines entsprechenden Zählerstandes wird die Nummer eines Modbus-Registers in ein Merkerwort am Ausgang des Multiplexers kopiert. Mit dem gleichen Zählerstand wird ein Demultiplexer gesteuert. Der Eingang ist das von Modbus-Wort das ich empfangen habe; der Demultiplexer schreibt in zwei Elemente einer Struktur.

Der Multiplexer schaltet immer nur EINEN Eingang auf den Ausgang, analog dazu verhält sich der Demultiplexer. Trotzdem habe ich in meinen beiden Ausgangsregistern (die Elemente einer meiner Datenstruktur) die gleiche Werte drinstehen.

Ich habe jetzt schon alles mögliche probiert, zB. von Hand mit Schaltern die Zählstände erzeugt, die Geschwindigkeit meines Zählers variiert - aber selbst bei einer Geschwindigkeit von 0.625Hz ist der Fehler reproduzierbar. Es könnte vielleicht sein, daß ich Daten zweimal abhole. Aber mit einem Flankenmerker für eine Taste am Request-Eingang will der Baustein MB_Master nicht aktiv werden.

Igendetwas scheint grundsätzlich falsch zu sein. Warum funktioniert diese Idee nicht?
 
Wie hast du deinen Zähler aufgebaut? nicht dass der bei in 3 Zyklen durchläuft und dir immer wieder mal was niederschreibt und du nur durchs langsame Beobachten das nicht mitbekommst.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm... ich glaube ich habe da einen Denkfehler gemacht. Das Problem ist, daß die alten Daten immer am Bausteinausgang anstehen, d.h. ich lade sie bei jedem schreiben in die Struktur zuvor nochmal ein. Weiterhin ergibt sich wohl durch mein nicht-synchrones Datenabholen und in-die-Struktur-schreiben ein Timing-Problem. Als ich das Problem noch weiter runtergebrochen und in Zeitlupe angeschaut habe, ist mir mein Fehler bewusst geworden.
In der Programmiersprache C gibt es Befehle mit denen man Puffer von Funktionen leeren kann (flush(), fflush() ) - da hatte ich mal fast das gleiche Problem und das hat sich (elegant) lösen lassen. Das SPS-Zeug hier ist aber ganz anders, es gibt nur das was es eben gibt, und einen Puffer leeren ist halt nicht vorgesehen.
Ich habe das Problem jetzt anders gelöst und einfach mehrer Bausteine (Instanzen?) vom Typ MB-Master angelegt. Der entsprechende Baustein wird je nach Zählerstand aufgerufen. Nicht elegant weil Speicherplatz fressend, aber es geht...
 
Puffer leeren ist unnötig, wenn neue Daten die alten überschreiben.
Überträgst Du in Deiner Struktur nicht auch die Multiplex-Nummer? Woher weiß der Demultiplexer, zu welcher Mux-Gruppe die empfangenen Daten gehören?
Hast Du Dein Demultiplex-Programm vielleicht in AWL geschrieben und überspringst die L- und T-Anweisungen nicht?

Harald
 
Hallo Harald,
Danke für deine Antwort. Du nimmst wirklich zu jedem Post, und ist der Sachverhalt noch so kompliziert, Stellung. Großes Lob für deine Mühe.

Nee, ich glaub' ich hab da nen Denkfehler gemacht. Ich hab das Ganze gestern abend mal händisch durchgespielt und mir meinen eigenen Multi/Demultiplexer gebaut. Da gab es genau das gleiche Problem.

Den Sachverhalt verstyndlich exemplyfiziert ausgedrückt, passiert wohl folgendes:
Der Baustein wird angestoßen (neudeutsch: getriggert), um Daten vom Modbus Teilnehmer abzuholen. Im nächsten Netzwerk frage ich aber bereits den Ausgang DATA_PTR ab - so schnell kann aber der Modbus Baustein MB_MASTER die Daten selbst bei einer Zykluszeit von aktuell ca 2ms natürlich nicht bereitstellen. Hab gerade eben mal überschlagen: Laut dem Datenblatt des Stromzählers benötigt eine Anfrage für ein Holding-Register 9 Bytes und die Antwort nochmal genauso viel. 18 Bytes bei 9k6 und 9N1 benötigen aber alleine schon 16ms. Hinzu kommt die Rechenzeit. Ich muß zwei Register abholen, da die Zahl als Real in zwei 16-bit Registern abgelegt ist.

Dadurch lese ich zwangsläufig die alten Daten ein. Ich vermute mal, daß man durch cleveres abfragen des Bits BUSY oder DONE das Problem übergehn könnte. Ich hatte gestern noch mit BUSY experimentiert, was aber aus mir nicht erfindlichen Gründen nicht zum gewünschten Ziel führte, warum auch immer.
Das Problem saß nicht in der SPS sondern davor. Genauer: Vor der Tastatur.
 
Zurück
Oben