daveManyReadBytes nicht gefunden in Libnodave.DLL

mulderm

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Ich habe Libnodave getest mit : res2 = daveReadBytes(dc, daveDB, 4, 0, 220, 0) und functioniert gut
aber bis max 220 lange bytes.
Ich muss 2000 data bytes holen uber die datablock DB4.
So ich habe geandert: res2 = daveManyReadBytes(dc, daveDB, 4, 0, 2000, 0)
Aber dann habe ich die meldung: daveManyReadBytes nicht in Libnodave.dll
Ist diese function nicht in Libnodave.dll?
Und kann ich die inhalt von Libnodave.dll nicht sehen?

Grussen,

mulderm
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In Libnodave steht die function:
Private Declare Function daveManyReadBytes Lib "libnodave.dll" (ByVal dc As Long, ByVal area As Long, ByVal areaNumber As Long, ByVal start As Long, ByVal numBytes As Long, ByVal buffer As Long) As Long

Ich habe das geandert aber selbe fehler.

mulderm
 
Zuletzt bearbeitet:
Ändere mal das Private zu Public.

Code:
Public Declare Function daveReadManyBytes Lib "libnodave.dll" (ByVal dc As Long, ByVal area As Long, ByVal areaNumber As Long, ByVal start As Long, ByVal numBytes As Long, ByVal buffer As Long) As Long

Pylades
 
Pylades,

Ich habe ihre code gebraucht und ich habe kein fehler gehat.
Aber nur ist die probleme das die data DB4 nicht in Excel eingetragen wurde.
Die variabele : res2 gibt ein werte -130
Was meins das?

Die code:

Sub readFromPLC()

Dim ph As Long, di As Long, dc As Long
Dim Teller As Long
Dim v(500)

Sheets("Tabelle1").Activate
Cells(1, 2) = "Testing PLC read"

res = initialize(ph, di, dc)
If res = 0 Then

res2 = daveReadManyBytes(dc, daveDB, 4, 0, 500, 0)


Cells(5, 1) = "result from readBytes:"
Cells(5, 2) = res2

If res2 = 0 Then

Sheets("Log").Activate
For Teller = 1 To 500
v(Teller) = daveGetU8(dc)
Cells(Teller + 2, 2) = v(Teller)
Next


Sheets("Tabelle1").Activate

Else
e$ = daveStrError(res)
Cells(9, 4) = "error:"
Cells(9, 5) = e$
End If
End If
Call cleanUp(ph, di, dc)
End Sub


mulderm
 
Ist das nicht 0?

Fur die andere funktione: res2 = daveReadBytes(dc, daveDB, 4, 0, 200, 0)
funtioniert das gut.
Was muss dann die buffer sein?
Was ist

#define daveResNoBuffer -130 ?

Das ist nicht vba-code aber C/C++?

mulderm
 
Zuletzt bearbeitet:
Nein
Fur die andere funktione: res2 = daveReadBytes(dc, daveDB, 4, 0, 200, 0)
funtioniert das gut.
Es ist ein interner Puffer vorhanden. Dieser hat 1024 byte, wenn ich mich recht erinnere.
Was muss dann die buffer sein?
Ein Zeiger auf den Anfang eines genügend großen Speicherbereichs.
Was ist

#define daveResNoBuffer -130 ?

Das ist nicht vba-code aber C/C++?

mulderm
Ja, das ist C. Es ist C, weil Libnodave in C geschrieben ist. Du findest es in nodave.h. Dort kannst du nachschauen, was die Fehlercodes bedeuten.

Obwohl ich Libnodave geschrieben habe, ist mir nicht mehr jedes Detail geläufig. Und die VBA und .Net-Anbindungen beruhen auf dem, was ich 200x zur Verfügung hatte.
Einen Speicherbereich zu reservieren und dessen Adresse an Libnodave zu übergeben, widerspricht der Idee, dass VBA oder .Net den Speicher mit ihren Schutzmechanismen verwalten sollen.
Ich weiß nicht, ob es in allen neueren Versionen von VBA oder .Net immer noch geht...
Wenn ja, mußt du nachher noch z.B. daveGetU8From(buffer) verwenden anstatt daveGetU8(), weil daveGetU8() vom internen Puffer liest.
Du könntest diese "Schwierigkeiten" vermeiden, indem du 5 mal daveReadBytes() ausführst.
daveReadManyBytes tut das intern auch.

Also:
daveReadBytes(dc, daveDB, 4, 0, 200, 0)
dann alle gelesenen Werte holen und anderswo speichern, z.B. in Excel-Zellen
und dann:
daveReadBytes(dc, daveDB, 4, 200, 200, 0)
wieder alle gelesenen Werte holen und anderswo speichern, z.B. in Excel-Zellen
daveReadBytes(dc, daveDB, 4, 400, 200, 0)
und so weiter...
 
"5 mal" war auch nur ein Beispiel.
Wenn du 2000 Bytes brauchst (und die maximale PDU-Länge bei deiner Verbindung 220 ist), mußt du natürlich 10 mal daveReadBytes aufrufen, entweder 9x für je 220 Bytes und noch 1 mal für 20 Bytes, oder aber 10 mal für je 200 Bytes.
Und noch was: Wenn du Variablen liest, die mehrere Bytes umfassen (DINT, REAL, usw.), mußt du darauf achten, dass sie vollständig mit dem einen oder dem anderen Aufruf erfasst werden.
 
Was ist dann, wenn ich DINT gebraucht (daveGetS32) die max aufruf von PDU fur 2000 DINT?
Ist das max 8000 bytes ?
So ich muss dann 40x daveReadBytes aufrufen?

Grussen

mulderm
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist zu beachten, dass die Paketgröße so gewählt wird, dass sich das ganze DINT in einem Paket befindet. Sonst kann es Chaos geben, da die beiden Hälften aus unterschiedlichen Zyklen stammen und somit unterschiedliche Werte haben können.
Aus diesem Grund: Datentypgröße * Int(222 / Datentypgröße) ist die maximale Paketgröße bei einer 300er ohne Trennung eines Datentyps. Am Beispiel von DINT ergibt sich 4 * (222/4) = 4 * 55 = 220.
 
Zurück
Oben