Libnodave Bausteinliste auslesen nur bis 255

markham

Active member
Beiträge
29
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

mit folgendem Code lese ich die vorhandenen Datenbausteine aus der SPS aus:

Code:
Private Sub ReadProgramBlocks_Click()
    
    Dim buf(1000) As Byte
    Dim res As Integer
    Dim res1 As Integer
    Dim ph As Long
    Dim di As Long
    Dim dc As Long
    Dim i As Integer

    res = initialize(ph, di, dc)
               
    res1 = daveListBlocksOfType(dc, 65, buf(0))
        For i = 0 To 280 Step 4
        Range("H" & i / 4 + 6).Select
        ActiveCell.FormulaR1C1 = buf(i)
        Next i
        Range("H4").Select
        ActiveCell.FormulaR1C1 = res1
         
    Call cleanUp(ph, di, dc)
  
End Sub

Das funktioniert dann soweit bis DB255. Ab DB 256 fängt er aber wieder bei 0 an, also mein DB260 wird mit 4 ausgegeben. Ursache habe ich auch schon gefunden, da buf(i) als byte festgelegt wurde und byte nur bis 256 kann. Ändere ich die variable probeweise auf Integer, kann ich zwar auslesen, aber die Werte die dann rauskommen sind unsinning.
Der Fehler liegt meiner Meinung nach in der libnodave.dll, oder? Dort müsste man doch von Byte auf Integer umstellen?

Danke schon mal im Voraus.
markham
 

Thomas_v2.1

Well-known member
Beiträge
8.126
Punkte Reaktionen
2.454
Ein Block-Eintrag ist so aufgebaut:
Code:
typedef struct {
    unsigned short number;
    uc type[2];
} daveBlockEntry;

D.h. du musst die Baustein-Nummer aus zwei Bytes zusammensetzen.
Nummer = High-Byte * 256 + Low-Byte
 

PN/DP

User des Jahres 2011 - 2013; 2015 - 2017; 2020
Beiträge
17.557
Punkte Reaktionen
5.165
Zuviel Werbung?
->Hier kostenlos registrieren
Der Fehler liegt natürlich nicht in der libnodave.dll. Die Blocknummer kommt als Integer, ein Integer besteht aus 2 Byte, zuerst kommt das L-Byte dann das H-Byte. Du kannst den Integer einfach wieder zusammensetzen:
Code:
    res1 = daveListBlocksOfType(dc, 65, buf(0))
        For i = 0 To 280 Step 4
        Range("H" & i / 4 + 6).Select
        ActiveCell.FormulaR1C1 = [COLOR="#FF0000"]buf(i) + buf(i + 1) * 256[/COLOR]
        Next i
Übrigens: res1 enthält die Anzahl Einträge in der gelesenen Blockliste und kann zur Begrenzung der For-Durchläufe benutzt werden.

Tip: Um in eine Excel-Zelle zu schreiben, muß die Zelle nicht selektiert werden. Du kannst auch direkt schreiben:
Range("H" & i / 4 + 6) = buf(i) + buf(i + 1) * 256
oder
Cells(i / 4 + 6, 8) = buf(i) + buf(i + 1) * 256

Harald
 
Oben