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

Ergebnis 1 bis 4 von 4

Thema: Array von Integerwerten mit LibNoDave schreiben

  1. #1
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    wieder mal gibt es ein Problem mit LibNoDave. Ich will aus VB2005 heraus 100 Integerwerte in den DB1 der S7-CPU schreiben. Im DB1 habe ich eine Array von 100 Integerwerten angelegt.
    Der nachfolgende Code schreibt auch 100 Werte in den DB1, aber nicht 0, 2, 4, 6, usw. wie gefordert, sondern 0, 512, 1024, 1536, usw.
    Ich vermute, die VB-Short-Werte müssen noch Byteweise gedreht werden mit "libnodave.daveSwapIed_16(i)"
    bevor sie in den DB1 geschrieben werden können.
    Meine diesbezüglichen Versuche sind allerdings immer gescheitert.

    Private Sub btnWerteInDB1Schreiben_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWerteInDB1Schreiben.Click
    Dim buf(19 As Byte, i As Short
    If fds.rfd > 0 Then
    For i = 0 To 198 Step 2
    buf(i) = i
    'BitConverter.GetBytes(libnodave.daveSwapIed_16(buf))
    Next
    res = dc.writeBytes(libnodave.daveDB, 1, 0, 200, buf)
    End If
    End Sub
    Frohe Weihnachten
    Earny
    Zitieren Zitieren Array von Integerwerten mit LibNoDave schreiben  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Richtig, du mußt die Bytes tauschen!
    Ich hab die Funktion noch nie genutzt, denn das kannst du doch auch selbst machen. buf ist doch byteweise organisiert, was hindert sich daran die Bytes selbst zu tauschen, du benötigt doch die libnodave-Funktion gar nicht dazu, sondern nur eine Hilfsvariable zum Zwischenmerken eines Bytes.

    in der Schleife so etwa:

    Hilfsvar = buf(i)
    buf(i) = buf(i+1)
    buf(i+1) = Hilfsvar
    Vielleicht gibts sogar ne einfachere Möglichkeit zum tauschen, aber so sollte es direkt mit buf gehen.
    Geändert von Ralle (25.12.2008 um 20:18 Uhr)
    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. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Earny (26.12.2008)

  4. #3
    Registriert seit
    07.07.2004
    Beiträge
    3.285
    Danke
    38
    Erhielt 584 Danke für 382 Beiträge

    Reden

    Hallo,

    Zitat Zitat von Ralle
    denn das kannst du doch auch selbst machen.
    Warum muss man immer alles selber machen ? Ein OPC-Client liefert mir zum Beispiel jedes S5/S7 Item als Datentyp Variant bereits im richtigen Format in der von mir benutzten Hochsprache.
    Und der AGLink von Deltalogic hat bereits integrierte Funktionen zur Formatwandlung von Hause aus 'im Bauch'.
    Vielleicht hat LibNoDave auch diese Funktionen drin ? Aber das wird hoffentlich der Zottel beantworten. Nach der heutigen, weihnachtlichen Fressorgie habe ich keine Lust mehr, selber nachzusehen

    Gruß

    Question_mark
    ''Ich habe wirklich keine Vorurteile.
    Meine Meinung ist nur die Summe der Erfahrungen" ... (Question_mark)
    Zitieren Zitieren Wenn ich wollte, könnte ich. Aber ich will nicht  

  5. #4
    Earny ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    04.04.2008
    Beiträge
    389
    Danke
    85
    Erhielt 39 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Ralle,
    hallo Question_mark,
    mit der Hilfskonstruktion von Ralle hat es sofort funktioniert. Ich hatte vorher immer die LibNoDave-Funktionenen benutzt, um einzelene 16 Bit (Short), 32 Bit (Integer) und 32 Bit (Single) -Werte in die S7 zu schreiben. Die Bytes ließ ich von der entsprechenden LibNoDave-Funktion drehen.
    Z.B. das Schreiben eines einzelnen Short-Wertes:
    res = dc.writeBytes(libnodave.daveFlags, 0, 22, 2, _
    BitConverter.GetBytes(libnodave.daveSwapIed_16(MW22)))
    Die "libnodave.daveSwapIed_16(Short-Wert)"-Funktion dreht die Bytes, so dass sie in der S7 richtig ankommen (Little Endian nach Big Endian)

    Nur beim Schreiben eines Arrays wollte die Sache nicht klappen. Aber das hat sich ja nun erledigt.

    Erstaunlicherweise ist die Dreherei beim Lesen von S7-Werten nicht erforderlich.
    Z.B. kann ich aus einem Datenbaustein ein Array von 100 Integerwerten lesen, ohne irgendwas zu drehen:
    Ich benutze
    res = dc.readBytes(libnodave.daveDB, 1, 0, 200, buf)
    und lese den Speicher mit
    dc.getS16At(i * 2)
    aus. Da muss nichts gedreht werden.
    Ich hatte bisher vermutet, dass dies durch die getS16At( )-Funktion (und auch andere Lesefunktionen) von LibNoDave automatisch gemacht wird und nicht vom jeweiligen Adapter erledigt wird.
    Erstaunlich bleibt, dass das beim Lesen aus der S7 automatisch passiert, beim Schreiben aber extra programmiert werden muss.
    Hauptsache, es funktioniert!

    Gruß
    Earny









    Nur beim Schreiben

Ähnliche Themen

  1. Wago 750 Messwerte in Array schreiben
    Von emsbootsmann im Forum Sonstige Steuerungen
    Antworten: 14
    Letzter Beitrag: 21.10.2012, 16:30
  2. Array in DB schreiben(any-pointer)
    Von Limette im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 28.10.2011, 22:17
  3. Antworten: 8
    Letzter Beitrag: 22.04.2011, 22:58
  4. Daten In Array schreiben
    Von MatthiasH24 im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 04.09.2008, 11:08
  5. Array von Bytes per OPC in SPS schreiben
    Von ingmar im Forum Hochsprachen - OPC
    Antworten: 2
    Letzter Beitrag: 02.11.2006, 08:51

Lesezeichen

Berechtigungen

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