VB libnodave Read multiple items

Rmorasch

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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?
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn es nur darum geht, mehrere Speicherbereiche, beispielsweise aus dem Bereich der Merker, zu lesen, benutze ich dc.readBytes.

Ohne Absicherung gegen Lesefehler:
Code:
[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
 
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.
 
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
 
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.:D
 
Zurück
Oben