libnodave: Zugriffskonflikte lösen?

Kandiszucker

Level-1
Beiträge
19
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

in einem Projekt haben wir auf einer S7 einen DB mit ca. 100 Bytes.
Jedes einzelne Byte repräsentiert eine Maschine, Bitbedeutungen sind identisch. Die meisten Bits innerhalb jedes Bytes werden von der SPS geschrieben, ich lese sie per libnodave aus und zwar lese ich immer 100 Bytes auf einmal.

Bit 7 und Bit 6 jedes Bytes muß ich vom PC aus setzen und "warten", bis die SPS diese Bits zurücksetzt.

Wie macht man das am besten mit der libnodave?

Ich könnte die Bits in meinem Prozessabbild im PC entsprechend setzen und die 100 Bytes in den DB zurückschreiben, aber das wäre ja im Konflikt zur SPS, da diese innerhalb der Bytes ja andere Bits beeinflussen kann.

Kann man innerhalb von Datenbytes einzelne Bits setzen?


PS: in der Doku (gettingStarted.html) wird auf das html-File "bitfunctions.html" verwiesen. Das ist in der Doku aber leider nicht enthalten....
 
Zuletzt bearbeitet:
Ich denke nicht, daß das so geht.
Deine Aufteilung ist eigentlich für diesen Zweck ungünstig. Einzige Chance für dich wäre m.M., einen jeweils getrennten Lese- und Schreibbereich zu haben. Die SPS schreibt auf den PC-Lesebereich. Der PC liest die Daten, manipuliert sie und schreibt sie auf den PC-Schreibbereich. Die SPS muß dann über Masken, sowie Und+Oder-Operationen die Daten wieder vom Schreibbereich des PC in den Lesebereich kopieren, also nur die relevanten Bits.
Es ginge auch noch mit einem Handshake. D.h. die SPS gibt die Daten für den PC frei, schreibt selbst nichts mehr in den DB und wartet, bis der PC eine Fertigmeldung zurückgibt. Dann könnte dieser den gesamten DB beschreiben, da dieser solange für die SPS gesperrt ist. Vielleicht hat noch jemand eine bessere Idee.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

in einem Projekt haben wir auf einer S7 einen DB mit ca. 100 Bytes.
Jedes einzelne Byte repräsentiert eine Maschine, Bitbedeutungen sind identisch. Die meisten Bits innerhalb jedes Bytes werden von der SPS geschrieben, ich lese sie per libnodave aus und zwar lese ich immer 100 Bytes auf einmal.

Bit 7 und Bit 6 jedes Bytes muß ich vom PC aus setzen und "warten", bis die SPS diese Bits zurücksetzt.

Wie macht man das am besten mit der libnodave?

Ich könnte die Bits in meinem Prozessabbild im PC entsprechend setzen und die 100 Bytes in den DB zurückschreiben, aber das wäre ja im Konflikt zur SPS, da diese innerhalb der Bytes ja andere Bits beeinflussen kann.

Kann man innerhalb von Datenbytes einzelne Bits setzen?


PS: in der Doku (gettingStarted.html) wird auf das html-File "bitfunctions.html" verwiesen. Das ist in der Doku aber leider nicht enthalten....

Tut mir leid, daß es "bitfunctions.html"nicht gibt. Die Funktionen an sich gibt es sehr wohl: daveReadBits, daveWriteBits. Beispiele zur Anwendung findest du im Quelltext von testMPI.c (testMPI.c ist das umfangreichste der Testprogramme).
Ob dir diese Funktionen nützen, ist etwas anderes. Mit daveWriteBits kannst du ein einzelnes Bit schreiben. Wenn du immer Bit 6 und Bit 7 schreiben mußt, brauchst du zwei Zugriffe (Aufrufe von daveWriteBits) mitsamt den Wartezeiten auf Antworten der SPS.
Erweitere doch deinen DB auf 2x100 Byte, die ersten 100 enthalten das was heute in Bits 0 bis 5 steht, die zweiten nur Bits 6 und 7. Diese Idee ist nicht gut, wenn du später auf mehr Maschinen erweitern willst, da sich der Anfang des zweiten Blocks verschiebt. Also nimmst du dafür noch besser einen 2. DB.
Jetzt bleibt noch, daß du "aktiv warten" mußt, d.h. immer wieder den DB lesen, ob die SPS schon zurückgesetzt hat oder nicht. Bei 100 Byte und wenn du sonst nichts von der SPS liest, ist es egal ob du zum "nachschauen" jedesmal den ganzen DB liest. Wenn du aber:
- zyklisch sowieso andere Daten liest
- der DB mit daveReadBytes nicht in einem Stück gelesen werden kann
biete es sich an, im SPS-Programm eine Kennung zu setzen, wann immer die SPS irgendeines der Bits vom PC zurückgesetzt hat und nur dann den DB zu lesen.
Damit der PC nicht diese Kennung auch noch zurücksetzen muß, bietet sich an, die Kennung als Zählerstand auszuführen:
1. PC schreibt Bits
2. SPS merkt das, führt Aktion aus, löscht Bits, zählt Kennung hoch
3. PC liest fortlaufend Kennung. Falls Kennung ungleich Kennung_beim_letzten Lesen liest PC den DB.
 
Hallo Zottel!

Vielen Dank, Zottel!

Kein Problem wegen der fehlenden "bitfunctions"!

Ich hatte mir nicht die Mühe gemacht, alle Quellen zu durchsuchen......

Ich lese immer den kompletten DB (100 Bytes) auf einen Rutsch aus, damit habe ich ein Abbild.

Je nachdem was passiert, setze oder lösche ich "vereinzelte" Bits im DB.

Das Programm der SPS reagiert auf ein Bit im Byte und löscht dieses, sobald die Operation beendet ist.

Insofern reicht das völlig, wenn ich alle 10 oder 20 Sekunden den DB lese und bei Bedarf einzele Bits setze.

Vielen Dank nochmal!:)
 
Zurück
Oben