VB6 und S7 über Ethernet

ssound1de

Level-2
Beiträge
351
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Leute,

ich suche seit Wochen einen Fehler und verzweifle langsam...
Ich hoffe Ihr könnte mir ein paar Tipps geben, was ich noch weiter unternehmen kann.

Folgender Aufbau...
Auf einem Rechner läuft ein VB6 Programm das Daten über Ethernet mit einer S7 austauscht (über CP343-1 LEAN).
Das VB6-Proggie ist von mir, und läuft seit 6 Monaten problemlos.
Rechner ist Server - S7 ist Client.
In der CPU ist nur eine Verbindung projektiert.

Der Rechner sendet an die S7
- ca. alle 5 Min. ein Paket mit 14 Bytes

Die S7 sendet an den Rechner
ca. alle 5 Min. 128 Bytes
ca. alle 1,5 Min. 160 Bytes - dieses Paket wurde vor ca. 3 Wochen neu integeriert
ca. alle 1 Min. 22 Bytes
Dabei vergeht zwischen den einzelnen Sendeaufträgen (nach deren Abschluss durch den LEAN = DONE) mind. 2 Sek.
Das ist über das S7-Prog abgesichert.

Im VB6 Programm ist ein Eventhandler auf den Ethernetport eingerichtet, der auf ankommende Daten reagiert.
Das Ganze funktioniert oft tagelang einwandfrei.
Aber aus unersichtlichem Grund reagiert der Eventhandler plötzlich nicht mehr auf die größeren Pakete (128 und 160 Bytes)
Die Verbindung steht, es werden keine Fehler gemeldet, die kleineren Pakete funktionieren in Sende- und Empfangsrichtung problemlos.
Die S7 sendet alle Pakete ohne Fehler.

Ich habe schon mit Wireshark die Kommunikation überprüft - alle Pakete tauchen in Wireshark auf.
Ich habe die kleinen Pakete mit den großen verglichen.
IP stimmt, Port stimmt, alle Flags stimmen überein.
Die Pakete unterscheiden sich lediglich in Uhrzeit, Paket-Nummer und Länge.

Im VB6 Eventhandler hab ich schon loggings integriert. Alle Pakete von der S7 kommen rein, werden geloggt.
Aber irgendwann fehlen die großen Pakete (128 und 160 Bytes), und zwar dauerhaft bis zum Neustart des VB6-Programms.

Ich hoffe Ihr habt irgendeine Idee, was ich zur Fehlersuche noch tun kann.

Danke im Voraus.
Gruß
 
Hallo ssound1de,

wenn ich mich recht an meine Anfangszeit mit S7-TCP Communikation mit PC-Winsocks errinnere, hatte ich ein ähnliches Verhalten.
Damals übermittelte ich unter anderem Integer- und DoubleInteger-Zahlen direkt ohne Wandlung.
Seit ich alles in Ascii-Strings umwandle (um damals die Daten mit Wireshark zu beobachten zu können), war das Phänomen weg.

Ich erkläre mir das so, dass die Zahlen, bytemäßig betrachtet auch Werte unter 20Hex habe können, die dann
Sowas wie EOT (End Of Text, Carrige Return, ..., sieh mal auf eine ASCII-Tabelle) enthalten können,
kann eventuell dies, insbesonders, bei Kombinationen aus mehreren Zahlen zu Fehler kommen (muß nicht).

Jedenfalls übermittle ich alle Werte nur in ASCII-Strings und seitdem ist das Gut.

Viel Erfolg,
S7_Programmer
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi S7_Programmer,

Vielen Dank für Deine Antwort.

Das Problem das Du ansprichst tritt wohl eher in der S7-PtP Kommunikation (z.B. 3964R-RK512) - also über serielle Schnittstelle (RS232, TTY...).
Bei TCP ist das anders.

Ausserdem ist das komische ja, dass im VB6-Programm das Event für die ankommenden Daten nicht mehr ausgelöst wird - aber eben nur bei den größeren Blöcken.
Die kleineren funktionieren nach wie vor.
Dazu kommt, dass die Pakete oft identisch sind -> z.B. Paket 1213 kommt an, Paket 1214 kommt nicht an (obwohl identisch mit Paket 1213)

Es ist fast so als würde die Firewall plötzlich diese Pakete blocken.
Weiß jemand wo sich Wireshark reinhängt? Noch vor der Firewall, oder danach?
 
Da müßte man jetzt wahrscheinlich doch mehr von deinem PC-Programm wissen.
Was machst du, wenn das Event ausgelösst wurde ? Was machst du, wenn die Paketgröße nicht passt ?
 
Es wird grundsätzlich geloggt...
Code:
Private Sub RecTCP()  'Event wird ausgelöst, wenn neue Daten am TCP-Port angekommen sind
  'Receive bearbeiten
  Dim i&, t&, e$
  Dim WSAError As Long
  Dim RecStr As String
  Dim S7SockID As Long
  BytesRec = -1
  RecStr = ""
  
  Call LogTCPData("Rising Event 'RecTCP'")
  ...

In LogTCPData wird der übergebene String ins LogFile geschrieben (hier vereinfacht dargestellt).
Das läuft eine ganze Zeit i.O., bis dann plötzlich bei den 128 und 160 Byte Blöcken kein Eintrag mehr im LogFile erscheint.
Der kleinere 22 Byte Block ist immer noch da.

Auch wenn die Blockgröße nicht stimmt wird geloggt. Es sollte also auf jeden Fall was im LogFile stehen.
Was ich an dieser Stelle nochmal überprüfen könnte, wäre das Errorhandling.
Evtl. hab ich an anderer Stelle das Errorhandling nicht sauber aufgeräumt, und es tritt hier ein Fehler auf,
wodurch es erst garnicht zum Logging kommt. Hmm... :roll:
 
Zurück
Oben