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

Ergebnis 1 bis 6 von 6

Thema: Mehrere Bits gleichzeitig setzen bzw. rücksetzen

  1. #1
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo.
    Ich schaffe es nicht mittels daveWriteBits mehrere Bits gleichzeitig zu setzen, oder rückzusetzen. Ein Bit funktioniert tadellos, aber wenn ich 2 gleichzeitig setzen will funktioniert auch das erste nicht mehr. Das sollte doch möglich sein, zumindest gibtr es ja den Parameter 'len'.

    Hat da jemand einen Tip für mich? Oder ein wirklich funktionierendes Beispiel in dem mehrere Bits gesetzt werden?

    Danke.

    Edit: Hab gerade in der faq.txt gefunden, dass das leider nicht möglich ist, schade! Der Parameter ist also umsonst.
    Geändert von funkey (13.01.2011 um 21:48 Uhr)
    Zitieren Zitieren Mehrere Bits gleichzeitig setzen bzw. rücksetzen  

  2. #2
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    673
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    hi,

    dein Bild macht Kopfschmerz!
    "arbeite klug, nicht hart" - deutsches Sprichwort

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.322
    Danke
    932
    Erhielt 3.331 Danke für 2.689 Beiträge

    Standard

    Hallo,

    wenn die zu setzenden Bits im selben Byte/Word/Doppelword liegen, dann könntest Du das ganze Byte/Word/Doppelword schreiben. So ist vor allem gesichert, daß die Bits wirklich GLEICHZEITIG gesetzt werden.

    Wenn die anderen Bits ihren unbekannten Zustand behalten sollen, dann könntest Du zuerst das Byte/Word/Doppelword auslesen, die gewünschten Bits setzen, und dann wieder zurückschreiben. So machen das viele Operatorpanels (Stichwort: Bit_setzen_in_Variable). Weil dabei aber Zeit vergeht zwischen dem lesen und dem zurückschreiben, muß dafür gesorgt werden, daß sich der Wert in der SPS in dieser Zeit nicht ändert - also am besten die Variable in der SPS grundsätzlich nur gelesen wird.

    Wenn es auf das GLEICHZEITIG ankommt und die Bits mehr als 4 Byte auseinander liegen, dann müßtest Du zunächst den Datenbereich mit den Bits in einen Puffer in der SPS schreiben und danach ein "Übernehmen"-Bit setzen, woraufhin das SPS-Programm die Bits aus dem Puffer zur eigentlichen Speicherstelle kopiert. Stichworte: Rezepturen + SchreibeDatensatz oder implementiere ein eigenes Protokoll mit Handshake. Oder setze überhaupt nur 1 Signal-Bit und das SPS-Programm setzt daraufhin die gewünschten Bits.

    PS: Nachdem ich Dein Benutzerbild weggescrollt hatte, konnte ich Deinen Beitrag relativ kopfschmerzfrei lesen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #4
    Registriert seit
    13.10.2007
    Beiträge
    12.066
    Danke
    2.794
    Erhielt 3.288 Danke für 2.168 Beiträge

    Standard

    Wenn ich auf das Bild schaue denke ich die ganze Zeit, was ich
    gestern gesoffen habe
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  5. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.709 Danke für 1.240 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    wenn die zu setzenden Bits im selben Byte/Word/Doppelword liegen, dann könntest Du das ganze Byte/Word/Doppelword schreiben. So ist vor allem gesichert, daß die Bits wirklich GLEICHZEITIG gesetzt werden.

    Wenn die anderen Bits ihren unbekannten Zustand behalten sollen, dann könntest Du zuerst das Byte/Word/Doppelword auslesen, die gewünschten Bits setzen, und dann wieder zurückschreiben. So machen das viele Operatorpanels (Stichwort: Bit_setzen_in_Variable). Weil dabei aber Zeit vergeht zwischen dem lesen und dem zurückschreiben, muß dafür gesorgt werden, daß sich der Wert in der SPS in dieser Zeit nicht ändert - also am besten die Variable in der SPS grundsätzlich nur gelesen wird.
    Und was hat das Geschriebene mit libnodave und Bits setzen zu tun?

    Um mit libnodave mehrere Bits (und hier werden nur einzelne Bits gesetzt, das ist kein Byte/Word-Ausmaskier-Gebastel) in einem Telegramm zu setzen, muss du mit PrepareRequest arbeiten.

    Beispiel für den Programmablauf:

    Code:
    int setVal = 1;
    
    // Telegramm vorbereiten
    davePrepareWriteRequest(dc, &p);
    
    // In Telegramm das Setzen von DB1.DBX1.0 eintragen
    daveAddBitVarToWriteRequest(&p, daveDB, 1, 8, 1, &setVal);
    
    // In Telegramm das Setzen von DB1.DBX1.2 eintragen
    daveAddBitVarToWriteRequest(&p, daveDB, 1, 10, 1, &setVal);
    
    // Telegramm abschicken
    daveExecWriteRequest(dc, &p, &rs);

  6. #6
    Registriert seit
    21.10.2010
    Beiträge
    158
    Danke
    21
    Erhielt 29 Danke für 17 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Vielen Dank für die Antworten.

    Fazit der Sache ist, dass die Funktion 'daveWriteBits' eigentlich 'daveWriteBit' heißen sollte und ich werde mir deshalb Dank der Anweisungen von Thomas_v2.1 eine richtige 'daveWriteBits'-Funktion schreiben, der ein Array übergeben werden kann.

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 30.12.2010, 00:10
  2. Ausgang setzen und rücksetzen
    Von Andreas k im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 26.07.2010, 16:39
  3. WINCC V6.2 Bit setzen/rücksetzen
    Von HarbichC im Forum HMI
    Antworten: 19
    Letzter Beitrag: 03.05.2010, 10:12
  4. WinCC 6.0 Bit setzen/rücksetzen
    Von zwerg77 im Forum HMI
    Antworten: 6
    Letzter Beitrag: 07.12.2008, 22:48
  5. Bit setzen/rücksetzen bei Tastendruck
    Von tantrum13 im Forum HMI
    Antworten: 0
    Letzter Beitrag: 15.12.2006, 07:54

Lesezeichen

Berechtigungen

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