Problem mit Libnodave unter VB

Buster

Level-2
Beiträge
24
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
habe ein Problem mit Libnodave unter Visualbasic 6. Habe das Exel-VBA Beispiel als Grundlage benutzt. Das Auslesen einer S7-300 317DP über CP341Lean und ISOoverTCP funktioniert auch problemlos. Das VB-Programm läuft auf einem Server und holt regelmäßig Daten aus der CPU. Nur werden
bei jeder Abfrage 2 Handles an Windows nicht zurückgegeben (Taskmanager/Systemleistung/Handles) und der verfügbare Systemspeicher schwindet langsam aber sicher dahin, bis der Server abschmiert.
Folgende Sequence wird alle paar Sekunden abgearbeitet (vereinfacht)

Unterprogamm initialize(...)
ph = openSocket(102, peer$) ' for ISO over TCP
di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
res = daveInitAdapter(di)
dc = daveNewConnection(di, MpiPpi, Rack, Slot)

Unterprogramm Daten lesen
res2 = daveReadBytes(dc, daveDB, DB, Startbyte, AnzahlBytes, 0)

Unterprogramm CleanUp(...)
res = daveDisconnectPLC(dc)
Call daveFree(dc)
res = daveDisconnectAdapter(di)
Call daveFree(di)
res = closePort(ph)

Wie gesagt es funktioniert, ich bekomme alle gewünschten Daten. Im Unterprogramm CleanUp meldet die letzte Funktion "closePort(ph)" einen Rückgabewert von 1. Ansonsten sind alle Rückgabewerte 0 = kein Fehler.
Wer kann mir einen Tip geben ?

Gruß Buster
 
Buster schrieb:
Hallo zusammen,
habe ein Problem mit Libnodave unter Visualbasic 6. Habe das Exel-VBA Beispiel als Grundlage benutzt. Das Auslesen einer S7-300 317DP über CP341Lean und ISOoverTCP funktioniert auch problemlos. Das VB-Programm läuft auf einem Server und holt regelmäßig Daten aus der CPU. Nur werden
bei jeder Abfrage 2 Handles an Windows nicht zurückgegeben (Taskmanager/Systemleistung/Handles) und der verfügbare Systemspeicher schwindet langsam aber sicher dahin, bis der Server abschmiert.
Folgende Sequence wird alle paar Sekunden abgearbeitet (vereinfacht)

Unterprogamm initialize(...)
ph = openSocket(102, peer$) ' for ISO over TCP
di = daveNewInterface(ph, ph, "IF1", 0, daveProtoISOTCP, daveSpeed187k)
res = daveInitAdapter(di)
dc = daveNewConnection(di, MpiPpi, Rack, Slot)

Unterprogramm Daten lesen
res2 = daveReadBytes(dc, daveDB, DB, Startbyte, AnzahlBytes, 0)

Unterprogramm CleanUp(...)
res = daveDisconnectPLC(dc)
Call daveFree(dc)
res = daveDisconnectAdapter(di)
Call daveFree(di)
res = closePort(ph)

Wie gesagt es funktioniert, ich bekomme alle gewünschten Daten. Im Unterprogramm CleanUp meldet die letzte Funktion "closePort(ph)" einen Rückgabewert von 1. Ansonsten sind alle Rückgabewerte 0 = kein Fehler.
Wer kann mir einen Tip geben ?

Gruß Buster
Du trennst und schließt also die Verbindung dauernd? Wieso hälst du sie nicht offen?

Gruß Sebastian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
seeba schrieb:
Du trennst und schließt also die Verbindung dauernd? Wieso hälst du sie nicht offen?

Gruß Sebastian

Die Abfrage erfolgt ca. alle 30 Sekunden und ich bin kein Freund von unnötig geöffneten Verbindungen. Außerdem besteht die Möglichkeit das Anlagenbediener den Hauptschalter ausschalten oder die Netzwerkverbindung unterbrochen wird. Ich habe noch nicht getestet wie sich das Programm bei einer geöffneten Verbindung verhält, wenn sie getrennt wird. So wie oben macht das nichts.

Gruß Buster
 
Buster schrieb:
Die Abfrage erfolgt ca. alle 30 Sekunden und ich bin kein Freund von unnötig geöffneten Verbindungen. Außerdem besteht die Möglichkeit das Anlagenbediener den Hauptschalter ausschalten oder die Netzwerkverbindung unterbrochen wird. Ich habe noch nicht getestet wie sich das Programm bei einer geöffneten Verbindung verhält, wenn sie getrennt wird. So wie oben macht das nichts.

Gruß Buster
Versuch es, es wird dein Problem beheben.
 
Eigentlich sollte closePort die handles zurückgeben....muß ich mir gelegentlich ansehen. Die Verbindung solltest du offenlassen, weil openSocket() und daveConnectPLC() Zeit fressen. Wenn jemand den Stecker zieht oder die SPS ausschaltet, wirst du es daran merken, daß deine nächste Abfrage mit timeout ended. Dann ist es Zeit, eine neue Verbindung aufzubauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Funzt

Habe das Programm umgestrickt. Halte die Verbindung offen und es gibt kein Problem mehr mit den Handles . Aber grundsätzlich werden anscheinend bei ClosePort() nicht alle Handles zurückgegeben. Dadurch das ich ClosePort nur noch bei Programmende ausführe ist es nicht mehr so tragisch. Danke für den Tip.

Gruß Buster
 
Neue Verbindung ?

Zottel schrieb:
Eigentlich sollte closePort die handles zurückgeben....muß ich mir gelegentlich ansehen. Die Verbindung solltest du offenlassen, weil openSocket() und daveConnectPLC() Zeit fressen. Wenn jemand den Stecker zieht oder die SPS ausschaltet, wirst du es daran merken, daß deine nächste Abfrage mit timeout ended. Dann ist es Zeit, eine neue Verbindung aufzubauen.
Hallo Zottel
Eine komplett neue Verbindung OpenSocket(),daveNewInterface(), daveInitAdapter() und daveNewConnection(), oder nur daveNewConnection() ?

Gruß Buster
 
Zurück
Oben