Winsock-Steuerelmnt ähnlich Kommunikation unter TwinCAT

borsti87

Level-1
Beiträge
71
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Winsock-Steuerelement ähnlich Kommunikation unter TwinCAT

Hi,

momentan kommuniziere ich mit meinem SolarMax Wechselrichter mit einem VB Programm mit integriertem Winsock Steuerelement über das Netzwerk.
Nun möchte ich diese Kommunikation in ein TwinCAT Programm übernehmen, kann mir jemand sagen wie ich dass erreichen kann?

Das Programm sieht in etwa wie folgt aus:

Beim laden des Programms wird der Wechselrichter verbunden
Code:
Winsock.Connect <IPadresse>, <Port>
steht die Verbindung wird ein String gesendet
Code:
Winsock.SendData <Sendstring>
Gruß
Borsti87
 
Zuletzt bearbeitet:
Es gibt den TwinCAT TcpIp Server. Der ermöglicht es, aus der PLC herraus auf Sockets (Tcp und Udp) zuzugreifen. Das ist ein Produkt und kann bei Beckhoff bestellt werden. Weitere Informationen dazu findest du im InformationSystem (infosys.beckhoff.de) unter TwinCAT Supplements.
 
Dann guck mal richtig nach, was du da für Links geschickt hast. Da steht drunter:
Installation: Die SPS-Bibliothek wird mit dem TwinCAT TCP/IP Connection Server mitgeliefert und während der Installation in den ...\TwinCAT\PLC\Lib-Ordner kopiert.

Das Problem ist ja, aus der PLC herraus (Echtzeit) einen Socket anzusteuern, der andauernd irgend welche Ressourcen blockt und Wartezeiten hat. Daher die Umsetzung über einen gesonderten Server (Service) welcher ausserhalb der Echtzeit ein Ansteuerung von Sockets ermöglicht.
 
Hi,
hab jetzt die TwinCAT TCP/IP Connection Server installiert nun ist das ganze natürlich wesentlich umfangreicher wie das Winsock Steuerelement unter VB ;)
Kann mir wer sagen wie ich am einfachsten eine TCP Verbindung zwischen meinem Rechner und meinem SolarMax Wechselrichter hinbekomme?

Folgende Eckdaten sollen erfüllt werden:

Steuerung IP : 192.168.1.1
Wechselrichter IP : 192.168.1.2
Kommunikationsport : 12345

Es soll ein String wie folgender von der Steuerung an den Wechselrichter gesendet werden

Code:
sSendString := {FB;01;66|64:UDC;PAC;KYR;KMT;KT0;PRL;UL1;IDC;IL1;TKK;KDY;KLD;SWV;TYP;SYS;SAL;SE1;SE2;SPR;SCD;PIN|1A8C};
dannach soll vom Wechselrichter die Antwort abgewartet werden (TimeOut = 3s) und in eine String-Variable geladen werden.

Ich hab mir schon versucht etwas aus den Kopf zu drücken aber irgendwie denke ich oder Beckhoff zu kompliziert ;)
Unter VB-Habe ich dass schon, zwar ohne Timeout, hinbekommen.

Hier mal als bespiel mein kleines VB-Testprogramm:
Code:
Private Sub Form_Load()
Command1.Enabled = False
Winsock1.Connect "192.168.1.123", 12345
End Sub

Private Sub Winsock1_Connect()
Command1.Enabled = True
End Sub

Private Sub Command1_Click()
  On Error Resume Next
  Winsock1.SendData txtSendstring.Text
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim sData As String
 
  ' Die ankommenden Daten werden in einer Variable
  ' (strDaten) gespeichert
  Winsock1.GetData sData
 
  ' Und in einer MutliLine-TextBox ausgegeben
  With txtMsg
    .SelStart = Len(.Text)
    .SelText = sData
  End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Winsock1.Close
End Sub
Gruß
borsti87
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
Private Sub Form_Load()
Command1.Enabled = False
Winsock1.Connect "192.168.1.123", 12345
End Sub

Private Sub Winsock1_Connect()
Command1.Enabled = True
End Sub

Private Sub Command1_Click()
  On Error Resume Next
  Winsock1.SendData txtSendstring.Text
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim sData As String
 
  ' Die ankommenden Daten werden in einer Variable
  ' (strDaten) gespeichert
  Winsock1.GetData sData
 
  ' Und in einer MutliLine-TextBox ausgegeben
  With txtMsg
    .SelStart = Len(.Text)
    .SelText = sData
  End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Winsock1.Close
End Sub
Gruß
borsti87

Winsock1.Connect -> FB_SocketConnect
Winsock1.SendData -> FB_SocketSend
Winsock1.GetData -> FB_SocketReceive
Winsock1.Close -> FB_SocketClose

Bei Connect gibst du IP und Port an, kriegst bei erfolgreicher Verbindung ein Handle auf den Socket (hSocket : T_HSOCKET). An die anderen Bausteine gibst du einfach immer dieses Handle weiter.

Im InfoSys von Beckhoff findest du dazu auch mehrere Beispiele: http://infosys.beckhoff.com/content.../tcplclibtcpip_sample01_overview.htm?id=18340
 
By the Way,

erst mal einen Dank an Neals jetzt hab ichs endlich ;)

nun möchte ich TwinCAT dazu bringen das zu jeder vollen 5. Minute (also um 5 nach, um 10 nach, um 15 nach usw.) auszuführen ich hole mir die eit mit NT_GetTime nur wie bekomme ich es sauber hin das ich dann passend eine boolsche Variable aud TRUE setze?

Gruß
Borsti87
 
NT_GetTime liefert als Ausgang ein TimeStruct, aus dem kannst du die Minuten einzeln abfragen (xxx.wMinute) und dann wie folgt auswerten:

Code:
VAR
    f_trig_1: F_TRIG; (* f_trig_1.Q ergibt eine positive Flanke bei jeder vollen 5. Minute *)
    wMinute: WORD; (* Im Programm durch den w.Minute-Wert von NT_GetTime ersetzen! Diese Deklaration ist dann nicht erforderlich. *)
END_VAR

______________________

f_trig_1(CLK:= WORD_TO_BOOL (wMinute) AND WORD_TO_BOOL ( wMinute MOD 5 )) ;

 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

nach längerer zeit melde ich mich mal wieder zu dem Thema.
Ich hab das Projekt aus zeitlichen gründen eine weile ruhen lassen und wollte mich jetzt wieder daran begeben. Nur war und ist mein Problem die automatische wieder aufnachme der Verbindung des TCP/IP Servers mit dem Endgerät wenn dieses sich abschaltet oder die LAN-Verbindung zum Gerät unterbrochen wird.
Ich weis noch nicht genau wie ich dass realisieren kann und bin desshalb für jeden rat dankbar!

Gruß
Borsti
 
Hi,
ich stehe grade total auf dem Schlauch.

versuche grade eine Verbindung mit meinem Wechselrichter aufzubauen doch iwie geht das grade nicht. Hier mal das Programm:

Code:
[FONT=Courier New]VAR
    fbSocketCloseAll     : FB_SocketCloseAll;
    bCloseAll            : BOOL := TRUE;
    fbSocketConnect      : FB_SocketConnect;
END_VAR[/FONT]
Code:
[FONT=Courier New]IF bCloseAll then
    fbSocketCloseAll(bExecute := TRUE);
    [/FONT][FONT=Courier New]bCloseAll := FALSE;
[/FONT][FONT=Courier New]ELSE
    [/FONT][FONT=Courier New]fbSocketCloseAll(bExecute := FALSE);
END_IF

IF NOT [/FONT][FONT=Courier New]fbSocketCloseAll.bBusy THEN
    [/FONT][FONT=Courier New]fbSocketConnect[/FONT][FONT=Courier New](sRemoteHost:= '192.168.1.123',
                    nRemotePort:= 12345,
                    bExecute := TRUE)[/FONT]
[FONT=Courier New]End If[/FONT]
Das Problem ist das kein neues Socket aufgebaut wird und als die nErrId der Wert 6 annimmt.

Ich habe die Verbindung zuvor mit Winsock geprüft Port und IP sind korrekt und es konnte eine Verbindung aufgebaut werden.

Worin liegt das Problem?

MfG
borsti87
 
Zurück
Oben