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

Ergebnis 1 bis 7 von 7

Thema: Libnodave - writebits - Verständnisproblem

  1. #1
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hab da (mal wieder) ein kleines Problem

    folgender Code
    Code:
    Dim a As Integer = 1
                        Dim aa(0) As Byte
                        aa(0) = 1
                        res = dc.writeBits(libnodave.daveDB, 123, 4, 1, aa)
                        res = dc.writeBits(libnodave.daveDB, 123, 3, 1, BitConverter.GetBytes(libnodave.daveSwapIed_32(a)))
    liefert mir bei beiden Schreibbefehlen eine 0 zurück, doch gesetzt wird nur das bit 0.4 in dem DB.
    Der zweite Schreibbefehl steht so in der testMPI.cs und sollte ja funktionieren.

    Könnte mir jemand sagen welche die richtige schreibweise ist, den scheinbar funktioniert ja nur die erste und die die im Beispiel in der TestMPI.cs aufgeführt ist nicht.

    wenn bei der startadresse eine 4 steht ist doch das Bit 0.4 gemeint oder lieg ich da falsch ?

    Sprache ist übrigens VB.net
    Zitieren Zitieren Libnodave - writebits - Verständnisproblem  

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

    Standard

    Zitat Zitat von MW Beitrag anzeigen
    Ich hab da (mal wieder) ein kleines Problem

    folgender Code
    Code:
    Dim a As Integer = 1
                        Dim aa(0) As Byte
                        aa(0) = 1
                        res = dc.writeBits(libnodave.daveDB, 123, 4, 1, aa)
                        res = dc.writeBits(libnodave.daveDB, 123, 3, 1, BitConverter.GetBytes(libnodave.daveSwapIed_32(a)))
    liefert mir bei beiden Schreibbefehlen eine 0 zurück, doch gesetzt wird nur das bit 0.4 in dem DB.
    Der zweite Schreibbefehl steht so in der testMPI.cs und sollte ja funktionieren.
    Echt? So und nicht anders? Das wäre ein bischen skandalös!
    Wenn du auf einer little endian Maschine
    Dim a As Integer = 1
    schreibst und dein Compiler mit 32 Bit Integer arbeitet, steht im Speicher:
    0x01 0x00 0x00 0x00
    Jetzt macht
    daveSwapIed_32(a) daraus:
    0x00 0x00 0x00 0x01
    writebits setzt das Bit auf 1 wenn das erste Byte im Puffer ungleich 0 (oder war es >0) ist. Hier ist es jedenfalls 0.
    Zitat Zitat von MW Beitrag anzeigen
    Könnte mir jemand sagen welche die richtige schreibweise ist, den scheinbar funktioniert ja nur die erste und die die im Beispiel in der TestMPI.cs aufgeführt ist nicht.
    Die Schreibweise ist schon in Ordnung. Dein Problem ist, daß du einen 32-Bit-Wert übergibst, wo nur ein Byte erwartet wird.
    Im 1. Fall
    res = dc.writeBits(libnodave.daveDB, 123, 4, 1, aa)
    funktioniert es, weil du von dem glücklichen Zufall profitierst, daß in little endian Zahlen verschiedener Länge mit dem gleichen Bitmuster beginnen:
    0x01 0x00 0x00 0x00 = 1(32bit)
    0x01 0x00 = 1(16bit)
    0x01 = 1(8bit)
    Zitat Zitat von MW Beitrag anzeigen
    wenn bei der startadresse eine 4 steht ist doch das Bit 0.4 gemeint...
    Ja. Und bevor noch wer fragt: Das Bit 47.1 würde durch die Startadresse 47*8+1 = 377 adressiert.

  3. Folgende 2 Benutzer sagen Danke zu Zottel für den nützlichen Beitrag:

    MW (14.06.2008),rebbi (01.10.2008)

  4. #3
    Avatar von MW
    MW ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.11.2005
    Ort
    im Osten
    Beiträge
    1.183
    Danke
    141
    Erhielt 271 Danke für 248 Beiträge

    Standard

    Danke Zottel

    Zitat Zitat von Zottel Beitrag anzeigen
    Echt? So und nicht anders? Das wäre ein bischen skandalös!
    hier ca. Zeile 500
    Code:
    a=1;
    Console.WriteLine("Trying to set single bit E0.5\n");
    res=dc.writeBits(libnodave.daveOutputs, 0, 5, 1, BitConverter.GetBytes(libnodave.daveSwapIed_32(a)));


    Zitat Zitat von Zottel Beitrag anzeigen
    Wenn du auf einer little endian Maschine
    Dim a As Integer = 1
    schreibst und dein Compiler mit 32 Bit Integer arbeitet, steht im Speicher:
    0x01 0x00 0x00 0x00
    Jetzt macht
    daveSwapIed_32(a) daraus:
    0x00 0x00 0x00 0x01
    writebits setzt das Bit auf 1 wenn das erste Byte im Puffer ungleich 0 (oder war es >0) ist. Hier ist es jedenfalls 0.
    MIST !!!, und wieder war der Fehler vor dem PC zufinden, wie kamm ich eigentlich darauf, dass das erste Byte rechts steht ??? vermutlich weils bei der SPS so ist (zumindest bei den Zahlen) ??



    Zottel: kannst du die beiden kleinen Funktionen "daveclrbit" und "davesetbit" bei einer der nächsten Versionen von Libnodave auch noch in die Net.DLL reinnehmen ??

  5. #4
    Registriert seit
    17.02.2006
    Ort
    Holland
    Beiträge
    47
    Danke
    23
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Mann Kann das auch direct in vb.net machen.
    Ohne die net.dll

    Beispiel:
    Private Declare Function daveClrBit Lib "libnodave.dll" (ByVal dc As Integer, ByVal area As Integer, ByVal areaNumber As Integer, ByVal start As Integer, ByVal bitAddress As Integer) As Integer

    Private Declare Function daveSetBit Lib "libnodave.dll" (ByVal dc As Integer, ByVal area As Integer, ByVal areaNumber As Integer, ByVal start As Integer, ByVal bitAddress As Integer) As Integer

    gruss Ruud
    **gruss aus Holland** Wieso SchreibFehler???

  6. #5
    Registriert seit
    22.09.2008
    Beiträge
    8
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi zusammen!

    Trotz aller Erklärungen von Zottel in diesem Thread ists mir nicht gelungen, das Bit an Stelle 100.1 zu setzen.

    Ich versuchs mit folgendem Befehl:

    Code:
    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, BitConverter.GetBytes(libnodave.daveSwapIed_32(readyStored)));
    Wobei ich's jeweils schon mit
    Code:
    int readyStored = 0x01;
    int readyStored = 1;
    byte readyStored = 1;
    probiert hab.

    Und leider findet sich weder in der Doku noch in den Testprogrammen (ausser eben TestMPI) näheres dazu.

    Irgendwie hab ich glaub ich die Vorgehensweise noch nicht ganz verstanden, sonst müsst ich von selbst drauf kommen - oder?


    mfG Andi

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

    Standard

    Laß mal den BitConverter-Stuß und swapIed() weg! Hier gibt's eh nur ein Bit! Und wo das beim swappen hinswappt habe ich weiter oben ausgeführt!

    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 1);
    oder auch:
    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 127);
    und vielleicht auch:
    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 128 );
    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 255);
    solten dein Bit setzen, während:
    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, 0);
    Es löschen sollte.

  8. Folgender Benutzer sagt Danke zu Zottel für den nützlichen Beitrag:

    rebbi (02.10.2008)

  9. #7
    Registriert seit
    22.09.2008
    Beiträge
    8
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wunderbar, Danke für deine Hilfe & Geduld!


    *Tante Edith meint:

    Hier noch die "komplette" Lösung, falls später noch jemand das selbe Problem und ebenfalls n Brett vorm Kopf hat:

    Code:
    byte[] readyStored = new byte[1];
    readyStored[0] = 1;
    result = dc.writeBits(libnodave.daveDB, 50, 801, 1, readyStored);

Ähnliche Themen

  1. Verständnisproblem bei DB aufruf im FC
    Von S7online im Forum Simatic
    Antworten: 17
    Letzter Beitrag: 13.02.2017, 13:57
  2. Verständnisproblem S7 400 H FH usw.
    Von Bender25 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 09.06.2015, 21:24
  3. Zyklus-Verständnisproblem in SCL
    Von anne im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 02.02.2011, 16:25
  4. AWL Verständnisproblem
    Von invoices im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 12.08.2010, 11:35
  5. Verständnisproblem mit pointer ?
    Von Waelder im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.08.2009, 09:02

Lesezeichen

Berechtigungen

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