Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 4 von 4

Thema: libnodave: Zugriffskonflikte lösen?

  1. #1
    Registriert seit
    16.11.2007
    Ort
    Karlsruhe
    Beiträge
    11
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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....
    Geändert von Kandiszucker (03.01.2008 um 11:05 Uhr)
    Zitieren Zitieren libnodave: Zugriffskonflikte lösen?  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    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.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Kandiszucker Beitrag anzeigen
    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.

  4. #4
    Kandiszucker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    16.11.2007
    Ort
    Karlsruhe
    Beiträge
    11
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Lächeln


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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!
    Zitieren Zitieren Hallo Zottel!  

Ähnliche Themen

  1. Bedienfreigabe? Wie lösen?
    Von detoto im Forum HMI
    Antworten: 3
    Letzter Beitrag: 14.09.2009, 12:44
  2. AX5000 Motorbremse lösen?
    Von Apple64 im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 26.02.2009, 14:24
  3. Produktrückverfolgung wie lösen?
    Von ge_org im Forum Programmierstrategien
    Antworten: 0
    Letzter Beitrag: 18.01.2008, 18:09
  4. Wie Watchdog richtig lösen
    Von Bender25 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 31.10.2007, 22:11
  5. Kann man das so lösen?
    Von plc_tippser im Forum Stammtisch
    Antworten: 7
    Letzter Beitrag: 01.08.2006, 09:46

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •