# VB libnodave Read multiple items



## Rmorasch (16 Oktober 2009)

Hallo Zusammen,

Ich benötige hilfe bei der Funktion Read multiple items.

Ich benutze VB 2005 und libnodave-0.8.4.5, das Verbinden (TCP-IP) und
lesen,schreiben einzelner Bits klappt prima.
Nun möchte ich aber mehrere Items(Eingänge) mit der Funktion
Read multiple items einlesen. Anscheinen habe ich Probleme mit der Deklaration da alle was ich bisher gefunden habe nicht in Vb war habe ich leider Probleme dies entsprechen umzusetzten. Es wäre toll wenn mir jemand einen Code-Ausschnitt aus seinem Programm schreiben könnte bitte mit Deklaration.

MFG
René Morasch


----------



## vierlagig (16 Oktober 2009)

Rmorasch schrieb:


> da alle was ich bisher gefunden habe nicht in Vb war



willkommen im forum (<- das mach ich nicht oft!)

welche sprachen hatten denn die anderen beispiele?
der prozedur-aufruf sollte (eigentlich) bei der übergabe der argumente gleich sein ...

mach mal beispiel und mach mal, wie du gemacht hast... hier, in diesem forum ... am besten mit den code-tags ... ist das # im antwort-editor


----------



## Rmorasch (16 Oktober 2009)

*Libnodave Read multiple items*

Hey,
Vielen dank für die schnelle Antwort also
das einzige was ich der Doku entnehmen kann ist dieses hier, ich
denke es müsste Delphi sein oder ???
Ohne die Deklaration bekomme ich aber schon bei schreiben Probleme.

PDU p;
    daveResultSet rs;
    davePrepareReadRequest(dc, &p);
    daveAddVarToReadRequest(&p,daveInputs,0,0,1);
    daveAddVarToReadRequest(&p,daveFlags,0,0,4);
    daveAddVarToReadRequest(&p,daveDB,6,20,2);
    daveAddVarToReadRequest(&p,daveFlags,0,12,2);
    res=daveExecReadRequest(dc, &p, &rs);


Meine Deklaration sieht so aus:

Public localMPI As Integer = 0, plcMPI As Integer = 2
Public fds As libnodave.daveOSserialType
Public di As libnodave.daveInterface
Public dc As libnodave.daveConnection
Public res As Integer
Public buf(1000) As Byte

Public Sub S7_Verbinden() 'Verbindung herstellen mit S7-CPU
If S7_Online = False Then
fds.rfd = openSocket(102, "192.168.15.191")
fds.wfd = fds.rfd
fds.wfd = fds.rfd
If fds.rfd > 0 Then
di = New libnodave.daveInterface(fds, "My Interface 1", localMPI, libnodave.daveProtoISOTCP, libnodave.daveSpeed1500k)
di.setTimeout(1000000)
res = di.initAdapter
If res = 0 Then
dc = New libnodave.daveConnection(di, plcMPI, 0, 2) ' rack amd slot don't matter in case of MPI
res = dc.connectPLC()
If res = 0 Then
Me.Button_Verbingung_herstellen.BackColor = Color.LightGreen
S7_Online = True
Else
Me.Button_Verbingung_herstellen.BackColor = Color.LightSalmon
End If
End If
End If
End If
End Sub
Public Sub S7_Abrechen() ' Verbindung abrechen mit S7-CPU
Offline = True
If S7_Online = True Then
dc.disconnectPLC()
di.disconnectAdapter() ' End connection to adapter
libnodave.closePort(fds.rfd) ' Clean up
Me.Button_Verbingung_herstellen.BackColor = Color.LightSalmon
S7_Online = False
End If
End Sub


----------



## vierlagig (16 Oktober 2009)

ok, code-tags sauberst ignoriert, feiner einstand ...

an welcher stelle DEINER programmierung klemmt es? hast du evtl. einen memeber nicht richtig deklariert, versuchst ihn aber trotzdem der prozedur überzubügeln?


----------



## Rmorasch (16 Oktober 2009)

Also ich versuchs mal Zeile für Zeile

PDU p; müsste in VB Dim p As New PDU sein
daveResultSet müsste in VB Dim rs As resultSet

Und hier mein erstes Problem
davePrepareReadRequest(dc, &p); müsste in VB ???

dc.prepareReadRequest() kann wohl nicht sein


----------



## Earny (16 Oktober 2009)

wenn es nur darum geht, mehrere Speicherbereiche, beispielsweise aus dem Bereich der Merker, zu lesen, benutze ich dc.readBytes.

Ohne Absicherung gegen Lesefehler:

```
[SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]Public [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]Sub[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1] Merkerbereich()[/SIZE]
[SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]Dim[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1] a, b, c [/SIZE][SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]Integer[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=1]res = dc.readBytes(libnodave.daveFlags, 0, 0, 7, buf)[/SIZE]
[SIZE=1]a = dc.getU8 [/SIZE][SIZE=1][COLOR=#008000][SIZE=1][COLOR=#008000]'8 Bit-Wert ohne Vorzeichen[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=1]b = dc.getS16 [/SIZE][SIZE=1][COLOR=#008000][SIZE=1][COLOR=#008000]'16 Bit-Wert mit Vorzeichen[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=1]c = dc.getS32 [/SIZE][SIZE=1][COLOR=#008000][SIZE=1][COLOR=#008000]'32 Bit-Wert mit Vorzeichen[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=1]txtMB0.Text = a[/SIZE]
[SIZE=1]txtMW1.Text = b[/SIZE]
[SIZE=1]txtMD3.Text = c[/SIZE]
[SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]End [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#0000ff][SIZE=1][COLOR=#0000ff]Sub[/COLOR][/SIZE]
[/COLOR][/SIZE]
```
 
Ich lese 7 Bytes und schreibe sie in den Speicher buf. 
Die formweit gültige Deklaration für buf muss mindestens sein:
Dim buf(6) as Byte

Die drei Werte werden dann in Textboxen geschrieben. Der Programmcode kann natürlich auch dem Click-Ereignis eines Buttons zugeordnet werden.


Gruß
Earny


----------



## Rmorasch (16 Oktober 2009)

Vielen Dank für die Antwort,

Leider hatte ich vergessen das ich sämtliche Typen lesen möchte
bzw. der Benutzer übergibt die Variablen(Eingänge,Ausgänge,Merker usw.)
deshalb kann ich Dein Vorschlag so nicht übernehmen.


----------



## Earny (16 Oktober 2009)

habe das mit den "sämtlichen" Typen möglicherweise nicht ganz verstanden.
Die dc.readBytes-Methode geht natürlich nicht nur mit Merkern, sondern auch z.B. mit:

Eingängen: daveInputs
Ausgängen: daveOutputs
Timer: daveTimer
Zähler: daveCounter
Datenbaustein: daveDB
Peripherieeingänge: daveP

Gruß
Earny


----------



## Jochen Kühner (16 Oktober 2009)

*ja...*

ja das geht schon mit den ganzen sachen, aber dann ist ja für jede anfrage eine extra pdu nötig, oder?

so wie er es vorhat nicht, odr?


----------



## Rmorasch (19 Oktober 2009)

Hallo Zusammen,
Und erst einmal vielen Dank für die Antworten.
readBytes macht keinen Sinn. Stellt euch einfach den Variablen-Editor in Step7
vor dort sind ja Eingänge, Ausgänge usw. gemixt in einer Liste und nun sollte ich
halt die Möglichkeit haben diese Varaiblen auch alle auf einmal einzulesen mti dem
Befehl *Read multiple items.* Ich sehe hierzu keine andere Möglichkeit.
Sollte also jemand ein brauchbaren Code-Ausschnitt haben nur her damit bin für alles
dankbar was mich etwas weiter bring.


----------

