TC3-TCP-Server/Client mit Python-PC verbinden (über TF6311?)

Kutsubato

Level-1
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

für ein Projekt muss ich eine Steuerung (CX-9020) per TCP kontrollieren, also Werte hin und her tauschen. Auf der anderen Seite ist ein Windows-10-Computer mit TC3.
Die TCP-Verbindung möchte ich zwischen TC3 und Python 3 herstellen, daher habe ich testweise Skripte und Python auf demselben Rechner wie TC3 installiert.
Also kann ich beiderseits die lokale IP wählen und eine Verbindung sollte möglich sein.

Die Python-Software ist hier:
https://github.com/scud3r1a/python-twincat-tcp

Ich kann Python als Server und Client nutzen.
TwinCat braucht auf der anderen Seite verschiedene Blöcke aus der Bibliothek TcpIp.Lib: https://infosys.beckhoff.com/englis...r/html/TcPlcLibTcpIp_FB_SocketConnect.htm&id=.

Im Zuge dessen kam mehrfach folgendes Produkt vor:
https://www.beckhoff.com/german.asp?twincat/tf6311.htm

Worum handelt es sich bei diesem TF...? Ist das eine Software? Falls ja, wie sehe ich, dass sie korrekt installiert ist? Ist ansonsten die Herangehensweise korrekt?

Danke,
Kutsubato
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zur Fragestellung: TFxxxx ist ein meist kommerzielles Add-On.
Für die TF6311 muss man nichts nachinstallieren (im Gegensatz zur TF6310).
TF6310 nutzt den Windows-Stack (TwinCAT geht per ADS auf einen Service der dann mit Windows kommuniziert), bei T6311 wird aus TwinCAT direkt der Adapter angesprochen (unter umgehung von Windows). Je nach Anwendung macht mal das eine oder das andere Sinn.

Bei dir hätte ich gesagt da du von Werten sprichst:
Wenn es sich um eine überschaubare Anzahl handelt nutze das Pub/Sub-Protokoll von TwinCAT. Ist kostenlos, performant und einfach zu konfigurieren.
Ansonsten bei Unmengen von Daten, nutze ADS wo du die lese oder Schreiboperation jeweils manuell triggern musst. Das Handshake/Interface musst du dir selber ausdenken. Du kannst ADS auch aus Python heraus ausführen.

Prinzipiell stimme ich _Eddi_ zu, low-level TCP/IP ist suboptimal.

Guga
 
Danke für die Antworten, Dann kann ich wohl davon ausgehen, dass TF... in TC3 installiert ist.

TCP soll genutzt werden; da habe ich kein Mitspracherecht. Solange es möglich ist, dies mit Python zu koppeln, werde ich das wohl tun.
 
Woher weiß ich denn, dass das Paket TF... korrekt läuft? Ich denke mal, dass ich zumindest mit einer Testlizenz (Trial) starten kann...oder?
 
Ich stehe jetzt an folgendem Punkt. Ich habe mich etwas eingelesen; insbesondere folgende Zeile:

FUNCION_BLOCK FB_ServerClientConnection
[...] Eine minimale Server-Applikation benötigt zusätzlich nur noch jeweils eine Instanz vom FB_SocketConnect und/oder eine Instanz vom FB_Socket Receive Funktionsbaustein.


Dabei wird noch verschwiegen, dass eine T_HSERVER Variable gebraucht wird, für die der Server initialisiert wird.
Ich habe also nun ein Projekt mit lizenziertem TF6311. Zudem habe ich meine Python-Test-Anwendungen. Client und Server in Python funktionieren.
Folgendes möchte ich verbinden:

  • Host und Client auf 127.0.0.1 (beide)
  • Port 30000
  • Datenbreite 1024 Bytes (data = conn.recv(1024) in Python)
  • UTF-8-kodierte Strings zum Übermitteln

Konfiguriere ich in Python beide Teile auf diese Weise, kommt mein String am Ende auch an bzw. kann hin und her geschickt werden. Soweit, so gut.
Auf der anderen Seite ist die SPS. Ich möchte zuerst Folgendes probieren:

  • TwinCat 3 als Server mit TF6311 und TCPIP-Library
  • Python als Client
  • 1 String soll von 1 TwinCat Server empfangen werden, der von 1 Python Client gesendet wurde

In TwinCat sieht das ganze bisher so aus:
TCProblem1.JPG

Folgende Variablen sind gesetzt:
TCProblem3.JPG

Und so in Python:
TCProblem2.JPG

Starte ich TwinCat, so gibt es keinen Fehler im Infocenter. Dann versuche ich Python als Client zu nutzen, aber ich erhalte folgende Antwort:
TCProblem4.JPG

Diese Antwort tritt bei der Verbindung Python -- Python nicht auf, sondern nur, wenn ich TwinCat anspreche. Daher muss es wohl ein Problem beim Empfangen der Daten auf Seiten von TwinCat geben?

Was ich allerdings erhalte ist folgender Fehler am Funktionsbaustein SocketReceive in TwinCat:
TCProblem5.JPG



Weiß jemand, wie ich den Fehler loswerde, und 1 Python Client mit 1 TwinCat Server verbinde, sowie einen String von Python zu TwinCat übertrage (à la Hello World)?

PS: Bitte melden, wenn jemand helfen möchte und mehr Infos braucht.
 
Zuletzt bearbeitet:
Ich würde mal behaupten Deine Remote-Einstellungen sind falsch. Du hast als IP das Loopback-Device angegeben da kann er über die Netzwerkkarte nichts empfangen und der Remote-Port ist auch nicht 30000, Du empfängst zwar mit Deiner CX auf 30000, aber über welchen Port Dein Python-Rechner sendet kannst Du nicht unbedingt wissen, lass die beiden Werte doch mal leer.
 
Das mit dem Sende- / Empfänger-Buffer habe ich auch kaum verstanden. Ist das so richtig, wie ich das gemacht habe?
Nein, das p bei pDest steht für Pointer, an dem Eingang erwartet er einen Pointer (Adresse) auf ein Bytearray in dem die Empfangsdaten gespeichert werden. In Deinem Fall wäre ADR(Buffer[0]) oder ADR(Buffer) richtig. Allerdings ist Dein Array auch zu klein, bei cbLen gibts Du 1024 an, Dein Array ist aber nur 2 Byte groß, da wird es kräftig krachen. Am besten belgst Du den Eingang cbLen mit SIZEOF(Buffer) dann ermittelt er sich die Größe selber.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Also schreibe ich statt Buffer[0] einfach ADR(Buffer[0]) und SIZEOF(Buffer) als cbLen?

Muss ich dann Buffer initialisieren? Ich nehme es an. Gebe ich ADR(Buffer[0]) als Variable an, wird ein Pointer to Byte angelegt. Braucht der Initialwerte?
Und ist Pointer als Variablen-Typ für Buffer korrekt? Ist nicht ADR schon der Pointer?

EDIT: Jetzt sieht das ganze so aus:

problem1.JPG

problem2.JPG

problem3.JPG

Mit einem neuen Error, 6...
 
Zuletzt bearbeitet:
Das SIZEOF sollte direkt am Baustein erfolgen, dafür brauchst Du keine eigene Variable mehr. Der Puffer muss nicht initialisiert werden. ADR(Buffer[0]) ist keine Variable, es wird die Funktion ADR aufgerufen, die die Adresse des Elements 0 des Arrays ermittelt, ADR(Buffer) ermittelt die Startadresse des Arrays, was in Deinem Fall das Selbe ist.
 
Vielen Dank für alle Hinweise!

SPS und Python-Client lassen sich verbinden. Auch einen Receive-Block habe ich eingebunden. Obwohl ich die Array-Einstellungen, die hier vorgeschlagen wurden, alle beachtet habe, funktioniert die Übertragung nicht wirklich.

Einige wenige Male habe ich es geschafft, dass plötzlich die Zahl der erhaltenen Bytes anstieg und sich das Array füllte. Bei identischem Vorgehen hat es dann gar nicht geklappt (es ist einfach nichts passiert). Andere Mal kamen die Fehler 32770, 32772 (https://infosys.beckhoff.com/index....rver/html/tcpipserver_errors_internal.htm&id=).

Mein Vorgehen ist folgendes:
  • Ich starte den Server per Enable
  • Dies startet den Server-Handle usw.
  • Dann verbinde ich in der PowerShell den Python-Client indem ich ihn starte
  • Dieser gibt mir die erfolgreiche Verbindung zurück
  • Dann kann ich Datenworte eingeben
  • Ich aktiviere den Receive-Block und gehe zurück zu Python
  • Ich gebe ein Wort ein, dass als Array von Bytes in UTF-8 übermittelt werden soll

Dann treten z.T. die o.g. Fehler auf. Der Receive-Block sieht jetzt so aus:
problem4.JPG

Weiß jemand Rat? Und sagt mir bitte, was ihr für Informationen braucht. Ich bin etwas ratlos.
 
Zurück
Oben