TIA Mittels VBA und AGLink symbolisch einen String aus einer 1500er auslesen

Joline

Level-1
Beiträge
42
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich probiere gerade die AGLink-Bibliothek von Deltalogic aus und möchte Daten aus einem optimierten Baustein aus einer S7-1500 auslesen. Numerische Werte funktionieren auch, aber an Strings scheitere ich momentan noch. Ich habe mir das Beispiel (AGL5 TIA Erste Schritte.xlsm) genommen. Dort ist folgende Code-Stelle:
Code:
Case ValueType_t.eVALUETYPE_STRING8    Dim string_sizeSTRING8 As Long
    string_sizeSTRING8 = 0
    RetVal = AGL_Symbolic_GetAccessStringSize(RWStruct.AccessHandle, string_sizeSTRING8)
    If RetVal <> AGL40_SUCCESS Then
        docSTart = docSTart + 1
        Call ausgabe(docSTart, AGL_GetVBErrorMsg(RetVal))
    End If
    Dim buffer_size As Long
    Dim CharCount As Long
    buffer_size = string_sizeSTRING8 + 1
    Dim valueSTRING8 As Long
    valueSTRING8 = (buffer_size)
    CharCount = 0
    RetVal = AGL_Symbolic_GetAccessBufferString8(RWStruct.AccessHandle, RWStruct.Buffer, RWStruct.BufferLen, _
    elementIndex, valueSTRING8, buffer_size, CharCount)
    If RetVal = AGL40_SUCCESS Then
        docSTart = docSTart + 1
        Call ausgabe(docSTart, "Value" & elementIndex & " (String8): " & valueSTRING8)
    Else
        docSTart = docSTart + 1
        Call ausgabe(docSTart, AGL_GetVBErrorMsg(RetVal))
    End If
zum Auslesen eines Strings. Das liefert aber nur die Länge des Strings und nicht den Inhalt (da müsste 'hallo1' stehen):
Code:
AGL_Symbolic_GetAccessElementValueType is calledSuccess
AGL_Symbolic_GetAccessElementSystemType is called
Success
AGL_Symbolic_GetAccesBufferElementCount is called
Success
Value0 (String8): 7

Was mich dabei wundert: valueSTRING8 wird als Long definiert, aber die Funktion AGL_Symbolic_GetAccessBufferString8 erwartet an dieser Stelle den Typ String. Aber auch ein Ändern des Typs in String liefert nur den ersten Buchstaben.

Irgendwas ist da noch falsch...

P.S. In C# muss man an dieser Stelle ein entsprechend großes Array übergeben und dann funktioniert das auch. Aber in VBA wird da kein Array akzeptiert. :(
 
Zuletzt bearbeitet:
Grundsätzlich ist ein String in VB und ich denke auch ein VBA ein Zeiger auf einen Stringdescriptor. Dieser beinhaltet die Länge und einen Zeiger auf den eigentlichen Inhalt. Dadurch wird für VB das verschieben der Stringdaten bei Größenänderung einfach möglich, ohne dass die Applikation davon etwas mitbekommt.
In den anderen Programmiersprachen ist ein String normalerweise direkt ein Zeiger auf den eigentlichen Inhalt. Die Länge muss dann separat ermittelt werden.
Rest schaue ich mir nachher noch an.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab's rausgefunden. Das Problem liegt an dieser Stelle:
Code:
[COLOR=#333333][FONT=Courier]Dim valueSTRING8 As Long
[/FONT][/COLOR][COLOR=#333333][FONT=Courier]    valueSTRING8 = (buffer_size)[/FONT][/COLOR]

Die Variable muss als String definiert sein und dieser muss schon die Ziellänge haben, wenn er an die GetAccessBuffer Funktion übergeben wird. Also in etwa so:
Code:
Dim valueSTRING8 As String
valueSTRING8 = String(buffer_size, Chr(0))

Jetzt funktioniert es auch. ;)
 
Zuletzt bearbeitet:
Scheint ein Fehler im Beispielprogramm zu sein (VBA ist bei uns nicht die hauptsächliche Programmiersprache ;-))

Code:
Dim buffer_size As Long
Dim CharCount As Long
buffer_size = string_sizeSTRING8 + 1
Dim valueSTRING8 As Long
valueSTRING8 = (buffer_size)
CharCount = 0
RetVal = AGL_Symbolic_GetAccessBufferString8(RWStruct.AccessHandle, RWStruct.Buffer, RWStruct.BufferLen, _
elementIndex, valueSTRING8, buffer_size, CharCount)

sollte eher so lauten (habe ich nicht getestet, nur geschrieben):

Code:
Dim buffer_size As Long
Dim CharCount As Long
buffer_size = string_sizeSTRING8 + 1
Dim valueSTRING8 As String
valueSTRING8 = Space$(buffer_size)
CharCount = 0
RetVal = AGL_Symbolic_GetAccessBufferString8(RWStruct.AccessHandle, RWStruct.Buffer, RWStruct.BufferLen, _
elementIndex, valueSTRING8, buffer_size, CharCount)

Bitte einmal testen und Rückmeldung geben.
Vielen Dank für den Hinweis, wenn alles passt werden wir das ins nächste Release übernehmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Joline,

Ist übrigens egal, ob der Platz mit String$ oder Space$ initialisiert wird. Es unterscheidet sich nur, womit der String initialisiert wird. Wenn danach alles überschrieben wird, es es ja egal.
 
Zurück
Oben