Step 7 S7-mEC mit TCP/IP

gorny

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Ich muss im Rahmen meiner Abschlussarbeit ein kleines Programm schreiben, das per TCP/IP Kommunikation Integer Variablen an eine S7-mEC schickt. Dort sollen diese verarbeitet werden und anschließend direkt wieder an das Programm zurück gesendet werden.

Jetzt hänge ich allerdings an dem Punkt eine Verbindung erfolgreich aufzubauen. Dabei weiß ich nicht, ob ich irgendwas grundlegendes vergessen habe oder es nur an der Konfiguration liegt und hoffe, dass hier einer Erfahrung damit hat und mir weiter helfen kann:

Folgendes ist schon erledigt:
-Programm mit C++/Qt geschrieben, welches letzt endlich den aktiven Verbindungsaufbau durchführen soll. Hierfür wird QTcpSocket genutzt.
-S7-mEC in Step7 als PCStation mit WinAC RTX projektiert
-Mit Open Communication Wizard die Verbindungsdatenbank erstellt.
-Versuch sowohl mit eigenem S7-Programm als auch mit dem Beispiel-Programm OpenTCP eine Verbindung zwischen S7 und Programm aufzubauen. Hierfür beim OpenTCP-Beispiel die Verbindungseinstellungen geändert und eine neue Instanzdatenbank erstellt.
-Genutzt werden die Funktionsbausteine FB63-66

Wenn ich jetzt mit einem TCP-Client Test-Programm versuche eine Verbindung aufzubauen, wird diese jedes mal von der S7 zurück gewiesen. Nutze ich das angepasste OpenTCP Beispiel ändert sich am Status vom FB65 aber nichts.
Somit habe ich die Vermutung, dass das ganze garnicht ohne weiteres funktioniert. Habe jetzt schon desöfteren von libnodave gelesen. Nutze ich mein eigenes Programm, erhalte ich einen Error-Code am Status, den ich in der Tabelle aber leider nicht finden kann.

Somit stellen sich mir folgende Fragen:
-Ist so eine Bibliothek wie libnodave nötig oder reicht auch die von Qt? Dachte die von Qt reicht aus, da sowohl S7 und als auch Qt TCP-Sockets nutzen.
-Weiß jemand wo ich die komplette Status-Tabelle des FB65 finde?
-Sind FB63-FB66 überhaupt die richtigen Bausteine für die S7-mEC oder bin ich da evtl völlig falsch?

Sofern ihr mehr Informationen braucht oder evtl Tipps habt was man gerne mal falsch macht, immer her damit ;)

Viele Grüße
Philipp
 
Auch wenn ich keine Antwort bekommen habe, gibt es von mir eine Rückmeldung ;)

1. Nein, libnodave ist nicht nötig. Das Programm lässt sich problemlos mit der S7 verbinden.
2. Status-Tabelle nicht gefunden, allerdings ist das Problem "von alleine" verschwunden, somit zZ kein Bedarf
3. Ja, es sind die richtigen Bausteine.

Senden von Daten von Programm zu S7 funktioniert soweit problemlos, zurücksenden so wie es aussieht auch. Jetzt brauche ich nur einen passenden Datentyp mit dem ich auch vernünftig arbeiten kann. Vielleicht hat da jemand Erfahrung und kann meine Suche ein wenig beschleunigen.
Nochmal anders gefragt: Welcher Datentyp eignet sich um Daten zwischen S7 und Programm hin und her zu schicken?! Nutze ich zb einfach Integer, kommt was völlig anderes an als geschickt wurde.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine S7 besitzt eine andere Endianess als z.B. ein x86 System. Bei einem Zwei-Byte Wert wie Integer müsstest du High- und Low-Byte vertauschen um den identischen Wert zu erhalten. Der Real-Datentyp in der SPS ist vom Prinzip her identisch mit einem float auf einem PC, aber auch hier muss die Bytereihenfolge angepasst werden.

Bei libnodave sind diese Funktionen alle schon integriert, außerdem musst du mit libnodave auf SPS-Seite nichts mehr programmieren, weil das Handling der Daten das Betriebssystem der SPS übernimmt.
 
Ok, danke für die Antwort erst einmal.
Das heißt also entweder Byteorder verdrehen oder aber den kompletten Clienten nochmal mit libnodave aufsetzen. Ist die Frage was weniger Aufwand ist.
Gibt es zu libnodave irgendwo eine Dokumentation? Habe da auf die schnelle nichts gefunden..
 
Bei libnodave sind Beispielprogramme dabei, damit sollte man relativ schnell zu einem Ergebnis kommen.
Wenn du C++ verwendest kannst du dir auch mal Snap7 ansehen. Das macht prinzipiell das Gleiche wie libnodave, aber mit einer objektorientierten Schnittstelle. Ebenfalls Opensource unter der LGPL.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder du kommunizierst über die TCP-Verbindung mit ASCII zeichen.

Dann steht dort ASCII Kodiert 12345.
Damit hast du dann nur den Aufwand die Zahlen jeweils in ASCII zu konvertieren und zurück.
Auf der Siemens-Seite geht dies mit I_STRING und STRING_I ganz gut (falls es DI sind schreibt statt I DI).

Grüße

Marcel
 
Das mit den ASCII Zeichen hört sich auf Anhieb am besten an, da müsste ich nämlich nichts neu programmieren und könnte alles bisher programmierte weiterhin nutzen. Werde ich gleich direkt mal testen.
Ansonsten werde ich mich mal mit Snap7/libnodave ausprobieren.

Kurze Frage noch dazu: Werden dann weiterhin FB63&FB64 genutzt oder muss ich dann wieder andere Kommunikationsbausteine nutzen?!
 
Lies den Beitrag vom Thomas, der hat schon gesagt das du bei Libnodave auf der SPS Seite nichts programmieren musst.

Du kannst dann in deinem C# Programm angeben was du lesen/schreiben willst (Eingänge, Ausgänge, Merker, DBs, etc)

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, dann kommt das aber für mich wohl nur im Notfall in Frage. Das angesprochene Programm soll eine kleine Simulation sein, welche nur gewisse Temperatur-Sensoren simuliert und die Daten an die SPS weiter gibt und von der SPS Daten erhält wie die dazugehörigen Ventile zu stellen sind. Somit soll so wenig wie möglich von dem Programm gesteuert werden.

Der Ansatz mit den ASCII Zeichen funktioniert soweit schonmal. Zumindest in die Richtung von Simulation zu SPS. Jetzt muss ich nur noch die andere Richtung hinbekommen und es ist fertig.

Vielen Dank bis hier hin
 
Zurück
Oben