Kommunikation zwischen IP-Symcon und Beckhoff ohne Modbus

Hallo Community,
ich bin seit letzter Woche ebenfalls IP-Symcon Besitzer und möchte euch heute vorstellen, wie ich die Kommunikation zwischen IP-Symcon und einer Beckhoff Steuerung ohne Modbus Server realisiert habe.

Meine Konfiguration sieht wie folgt aus:

Beckhoff Steuerung:
Modell: CX9000-1001
Image: CX9000 LF 3.09f
IP Adresse: 192.168.178.111

Windows Virtual PC (Windows XP-Mode) auf Windows 7 Ultimate x64
IP Adresse: 192.168.178.50

Installierte Software:
IP-Symcon
Version: 2.4 #1984, 30.06.11

Twincat
Version: 2.11 R2, Build 2034

Grundvoraussetzung um zwischen IP-Symcon und einer Beckhoff Steuerung zu kommunizieren ist eine funktionierende Netzwerk und ADS Verbindung. ADS steht hier für das Beckhoff eigene Kommunikationsprotokoll, welches durch Message Router im Netzwerk gemanagt wird. Als Message Router kommt auf dem VirtualPC TwinCAT und auf dem CX die TwinCATCE PLC zum Einsatz.

Nachdem der Virtual PC in meiner Umgebung die feste IP Adresse „192.168.178.50“ erhalten hat und der CX unter der „192.168.178.111“ erreichbar ist kann die ADS Konfiguration beginnen.

Dazu verbindet man sich mit dem Tool „CeRHost.exe“, welches man von der Beckhoff Website laden muss, auf den CX.

Unter “My Device\Hard Disk\System” befindet sich das Programm “TcAmsRemoteMgr”, mit dem man die lokale AMS Net Id des CX einstellen kann. Da die IP Adresse des CX „192.168.178.111“ lautet habe ich die AMS Net Id “192.168.178.111.1.1“ gewählt. Unter „Remote Computers“ muss der Virtual PC auf dem IP Symcon läuft eingetragen werden. Da die IP Adresse für den Virtual PC „192.168.178.50“ lautet habe ich die AMS Net Id „192.168.178.111.1.1“ gewählt.

Nachdem die Einstellungen vorgenommen wurden muss der CX neugestartet werden. Ob die Ams Net Id korrekt übernommen wurden kann man mit dem Tool „CxConfig“ unter “My Device\Hard Disk\System” prüfen.

Als nächster Schritt muss auf dem Virtual PC TwinCAT als ADS Message Router eingerichtet werden.

Wer die Vollversion von Twincat nicht besitzt kann die Demo installieren oder alternativ die kostenlos TwinCAT ADS Communication Library bestellen.

Um Twincat als ADS Message Router für PHP zu konfigurieren öffnet man TwinCAT System Manager und wählt im linken Baum „SYSTEM-Konfiguration“ -> Reiter „Allgemein“ -> Schaltfläche „Zielsystem wählen…“ -> Schaltfläche „Suchen (Ethernet)…“ -> Schaltfläche „Broadcast Search“. Wenn der CX in der Liste erscheint einfach auf die Schaltfläche „Route zufügen“ klicken und eine statische Route zwischen TwinCAT und dem CX besteht.

Ob die Route korekt angelegt wurde kann man unter „SYSTEM-Konfiguration“ -> „Routing Einstellungen“ -> Reiter „Aktuelle Routes“ prüfen.

Um die lokalen AMS Net Id zu prüfen und gegebenen falls zu ändern findet man unter „C:\TwinCAT\ADS Api\TcAdsDll“ ein Tool namens „TcAmsRemoteMgr.exe“.

Um die ADS Verbindung zu testen findet man unter dem selben Pfad „C:\TwinCAT\ADS Api\TcAdsDll“ ein kleines Tool namens „TcAdsTest.exe“ mit dem man einen ADS Port öffnen und anschließend einen Test Transfer ausführen kann.

Um nun per PHP eine Verbindung zur entfernten SPS aufbauen zu können muss die Beckhoff Twincat ADS-Script-DLL von „C:\TwinCAT“ nach „C:\WINDOWS\system32“ kopiert werden und mit „regsvr32 c:\Windows\System32\TcScript.dll“ registriert werden.


Die ADS-Script-DLL dient als Schnittstelle zwischen PHP und dem TwinCAT Message Router.

Das eigentliche PHP Script, welches ich im Sekundentakt und bei einem Schaltflächen Event durch IP-Symcon aufrufen lasse sieht folgender maßen aus:


<?
try{
	//Neues Objekt von TcScript.dll anlegen
	$tcscript = new COM('TcScript.TcScriptSync');
}catch (Exception $error) {
	echo "Es konnte kein Objekt von TcScript.dll angelegt werden!";
}

try{
	//Verbindung zur SPS aufbauen
	$tcscript->ConnectTo("192.168.178.111.1.1", 801);
}
//Prüfen ob ein Fehler aufgetreten ist
catch (Exception $error) {
	echo "Keine Verbindung zur SPS!";
}

try{
	//ADS Status lesen
	$tcscript->ReadAdsState();
}
//Prüfen ob ein Fehler aufgetreten ist
catch (Exception $error) {
	echo "Keine ADS Kommunikation!";
}

//Auf Betätigung von Schaltflächen prüfen
if($IPS_SENDER == "WebFront"){

	//Schaltfläche identifizieren
	if($IPS_VARIABLE == 31881){

		//Wenn Wert 1
		if ($IPS_VALUE == 1){
			$tcscript->WriteVar(".in_start", true);
			$tcscript->WriteVar(".in_start", false);
		}
	}	
}

//Status Variablen abfragen
try{
	//Variable lesen
	$read_var = $tcscript->ReadVar(".out_on_off");

	//Wenn Wert true
	if ($read_var == true){
		//Schaltfläche makieren
		SetValue(33136,1);
	}
	//Wenn Wert false
	if ($read_var == false){
	   //Schaltfläche makieren
		SetValue(33136,0);
	}
}
//Prüfen ob ein Fehler aufgetreten ist
catch (Exception $error){
	//Makierung der Schaltfläche entfernen
	SetValue(33136,-1);
}

?>


Ich hoffe, ich konnte dem einen oder anderen helfen.

Fragen oder Anregungen bitte Posten.

Viel Spaß beim Testen!

Hallo FFischer,

dein Script interessiert mich sehr, da ich fast immer die Beckhoff Steuerungen in der GA einsetze. Da ich aber kein PHP Freek bin verstehe ich den Code natürlich nicht. Du schreibst, daß du das Script im Sekundentakt und bei einen Schaltflächen Event ausführst. Muß man das für jede SPS Variable separat machen oder werde da alle SPS Variablen auf einmal übertragen?
Wie sieht es da mit der Netzwerklast bzw. der IPS Auslastung aus wenn ich im Sekundentakt 1000 Variablenstatusabfragen habe? Ist es vielleicht sinnvoll den Status in eine große Struktur zu packen und diese in IPS wieder zu zerlegen? Wie mache ich den Aufruf bei einer Visutastenbetätigung in IPS?

Vielleicht kannst du mir hierbei ein wenig auf die Sprünge helfen.

Gruß
Markus

Hallo Marcus,

vielen Dank für das Feedback.

Du kannst natürlich das Script um weitere Variablen wie folgt erweitern:


<? 
try{ 
    //Neues Objekt von TcScript.dll anlegen 
    $tcscript = new COM('TcScript.TcScriptSync'); 
}catch (Exception $error) { 
    echo "Es konnte kein Objekt von TcScript.dll angelegt werden!"; 
} 

try{ 
    //Verbindung zur SPS aufbauen 
    $tcscript->ConnectTo("192.168.178.111.1.1", 801); 
} 
//Prüfen ob ein Fehler aufgetreten ist 
catch (Exception $error) { 
    echo "Keine Verbindung zur SPS!"; 
} 

try{ 
    //ADS Status lesen 
    $tcscript->ReadAdsState(); 
} 
//Prüfen ob ein Fehler aufgetreten ist 
catch (Exception $error) { 
    echo "Keine ADS Kommunikation!"; 
} 

//Auf Betätigung von Schaltflächen prüfen 
if($IPS_SENDER == "WebFront"){ 

    //Schaltfläche 1 identifizieren 
    if($IPS_VARIABLE == 31881){ 

        //Wenn Wert 1 
        if ($IPS_VALUE == 1){ 
            $tcscript->WriteVar(".in_start", true); 
            $tcscript->WriteVar(".in_start", false); 
        } 
    } 

//------------------ zweite Variable -------------------

    //Schaltfläche 2 identifizieren 
    if($IPS_VARIABLE == 31882){ 

        //Wenn Wert 1 
        if ($IPS_VALUE == 1){ 
            $tcscript->WriteVar(".in_start_2", true); 
            $tcscript->WriteVar(".in_start_2", false); 
        } 
    }
	
//------------------ zweite Variable -------------------			    

} 

//Status Variable 1 abfragen 
try{ 
    //Variable lesen 
    $read_var = $tcscript->ReadVar(".out_on_off"); 

    //Wenn Wert true 
    if ($read_var == true){ 
        //Schaltfläche makieren 
        SetValue(31881,1); 
    } 
    //Wenn Wert false 
    if ($read_var == false){ 
       //Schaltfläche makieren 
        SetValue(31881,0); 
    } 
} 
//Prüfen ob ein Fehler aufgetreten ist 
catch (Exception $error){ 
    //Makierung der Schaltfläche entfernen 
    SetValue(31881,-1); 
} 

//Variablen löschen
unset($read_var);
unset($error);

//------------------ zweite Variable -------------------

//Status Variable 2 abfragen 
try{ 
    //Variable lesen 
    $read_var = $tcscript->ReadVar(".out_on_off_2"); 

    //Wenn Wert true 
    if ($read_var == true){ 
        //Schaltfläche makieren 
        SetValue(31882,1); 
    } 
    //Wenn Wert false 
    if ($read_var == false){ 
       //Schaltfläche makieren 
        SetValue(31882,0); 
    } 
} 
//Prüfen ob ein Fehler aufgetreten ist 
catch (Exception $error){ 
    //Makierung der Schaltfläche entfernen 
    SetValue(31882,-1); 
} 

//------------------ zweite Variable -------------------

?> 

Es ist jedoch sinnvoll nicht alle Variablen in einem Script abzufragen, da sich sonst IP-Symcon in einer Endlosschleife aufhängt. Ich habe bei meinen Tests die Variablen Abfrage immer den realen Seiten in IP-Symcon zugeordnet.

Bei 1000 Variablen in einem Script würde die Kommunikation wahrscheinlich gleich zusammenbrechen.

Bezüglich Button Aufruf aus IP-Symcon möchte ich erst einmal etwas grundlegendes erklären.

Bei meinen Visualisierungen liegt die Logik immer allein in der SPS, dass bedeutet das zum Beispiel der Button „Start“ immer zwei Variablen benötigt. Die erste Variable im Beispiel die globale Variable „.in_start“ wird bei Aufruf durch IP-Symcon erst auf true und sofort danach wieder auf false gesetzt. Sie soll sich wie ein Taster verhalten, der kurz gedrückt wird.

Soll nun bei jeder Button Betätigung ein Flankenwechsel an einem Ausgang realisiert werden so lege ich die Variable im SPS Programm auf einen Binäruntersetzer (Stromstoßschalter), dieser wirkt dann auf die Ausgangsvariable im Beispiel „.out_on_off“ und schaltet diese um.

Um nun den Status zu visualisieren lese ich die Ausgangsvariable „.out_on_off“ in IP-Symcon zurück und ändere je Inhalt der Variable die Farbe und Beschriftung des Buttons:

.out_on_off == true -> Buttonfarbe grün und mit EIN beschriftet
.out_on_off == false -> Buttonfarbe rot und mit AUS beschriftet
.out_on_off == NULL-> Buttonfarbe zurücksetzen und Beschriftung entfernen

Warum ich diesen Aufwand betreibe hat mehrere Gründe, einer ist zum Beispiel das ich zusätzlich zu den Visu Button in der SPS auch noch normale Taster einlese, welche ODER verknüpft auf den BINU wirken und sich somit der Status unabhängig von der Variable „.in_start“ verändern kann.

Um nun per IP-Symcon das Script aufzurufen musst du wie folgt einen Button anlegen:

Als erstes musst du eine neue Integer Variable anlegen, da nur bei Integer Variablen die Assoziationen verändert werden können.

1.png

Als nächstes legst du die Werte Grenzen fest und wählst unter „Eigene Aktion:“ dein PHP Script aus.

2.png

Als letzten Schritt musst du die Assoziationen deiner Variable (Button) anlegen:

3.png

Nun kannst du mit dem Button deine SPS Variable steuern, vorausgesetzt deine Variablen ID (im Beispiel 31881) steht korrekt im PHP Script.

Hoffe ich konnte etwas Klarheit schaffen.

Fragen bitte posten.

Gruß Fabian

Hi,

ich hab mal ein wenig weiter gebastelt. Unter anderem habe ich einen neuen Server installiert mit Windows 7 Professional. Da brauchst du aber nicht unbedingt den virtual PC. Ich habe das auch so installiert bekommen.
Jetzt muss ich nochmal weiter gucken.
Wie hast du das denn gemacht das du ein Script nur aufrufst wenn du in dem dementsprechenden Menü bist? Mit welchem befhel kann ich abfragen welches Menu gerade aufgerufen ist??

Gruss Marco

Hallo Marco,

den Virtual PC habe ich nur installiert da ich mit Windows 7 64bit arbeite und TwinCat 2 nicht auf 64bit Systemen läuft.

In welchen Menü sich ein User befindet kann nicht abgefragt werden, ich habe lediglich die Lese- und Schreibvorgänge der Menüstruktur zugeordnet.

Zum Beispiel:

Menüpunkt Wohnzimmer

Deckenlicht -> Variable schreiben/ lesen
Raumtemperatur Sollwert -> Variable schreiben/ lesen
Raumtemperatur Istwert -> Variable lesen

Zugehöriges Script: wohnzimmer.php

Menüpunkt Badezimmer

Licht -> Variable schreiben/ lesen
Heizung Sollwert -> Variable schreiben/ lesen
Heizung Istwert -> Variable lesen

Zugehöriges Script: badezimmer.php

Die beiden Scripte wonzimmer.php und badezimmer.php werden jeweils über separate Timer im Sekundentakt aufgerufen. Durch die Aufteilung der Variablen Abfragen auf verschiedene Scripte wird die Last besser verteilt und die Wahrscheinlichkeit das sich IPSymcon aufhängt ist geringer.

Gruß Fabian

Hab nochmal das Script insbesondere die Fehler-Behandlung überarbeitet:


<?  

$error = false;

try{
	//Neues Objekt von TcScript.dll anlegen
	$tcscript = new COM('TcScript.TcScriptSync');
}catch (Exception $error) {
	echo "Es konnte kein Objekt von TcScript.dll angelegt werden!";
	$error = true;
}

try{
	//Verbindung zur SPS aufbauen
	$tcscript->ConnectTo("192.168.178.111.1.1", 801);
	$tcscript->ReadAdsState();
}
//Prüfen ob ein Fehler aufgetreten ist
catch (Exception $error) {
	echo "Keine Verbindung zur SPS!";
	$error = true;
} 

//Auf Betätigung von Schaltflächen prüfen  
if($IPS_SENDER == "WebFront"){  

    //Schaltfläche 1 identifizieren  
    if($IPS_VARIABLE == 31881){  

        //Wenn Wert 1 und kein Kommunikationsfehler
        if ($IPS_VALUE == 1 && !$error){  
            $tcscript->WriteVar(".in_start", true);  
            $tcscript->WriteVar(".in_start", false);  
        }  
    }  

//------------------ zweite Variable ------------------- 

    //Schaltfläche 2 identifizieren  
    if($IPS_VARIABLE == 31882){  

        //Wenn Wert 1 und kein Kommunikationsfehler
        if ($IPS_VALUE == 1 && !$error){  
            $tcscript->WriteVar(".in_start_2", true);  
            $tcscript->WriteVar(".in_start_2", false);  
        }  
    } 
     
//------------------ zweite Variable -------------------                 

}  

//Status Variable 1 abfragen  
try{ 
 
	//Wenn ein Kommunikationsfehler besteht wird direkt in die Exception gesprungen
	if ($error){
	throw new Exception();
	}
	 
    //Variable lesen  
    $read_var = $tcscript->ReadVar(".out_on_off");  

    //Wenn Wert true  
    if ($read_var == true){  
        //Schaltfläche makieren  
        SetValue(31881,1);  
    }  
    //Wenn Wert false  
    if ($read_var == false){  
       //Schaltfläche makieren  
        SetValue(31881,0);  
    }  
}  
//Prüfen ob ein Fehler aufgetreten ist  
catch (Exception $error){  
    //Makierung der Schaltfläche entfernen  
    SetValue(31881,-1);  
}  

//Variablen löschen 
unset($read_var); 
unset($error); 

//------------------ zweite Variable ------------------- 

//Status Variable 2 abfragen  
try{
 
	//Wenn ein Kommunikationsfehler besteht wird direkt in die Exception gesprungen
	if ($error){
		throw new Exception();
	}
   
    //Variable lesen  
    $read_var = $tcscript->ReadVar(".out_on_off_2");  

    //Wenn Wert true  
    if ($read_var == true){  
        //Schaltfläche makieren  
        SetValue(31882,1);  
    }  
    //Wenn Wert false  
    if ($read_var == false){  
       //Schaltfläche makieren  
        SetValue(31882,0);  
    }  
}  
//Prüfen ob ein Fehler aufgetreten ist  
catch (Exception $error){  
    //Makierung der Schaltfläche entfernen  
    SetValue(31882,-1);  
}  

//------------------ zweite Variable ------------------- 

?>


Ich habe auch Win7 64bit, und das läuft auch so.
Den Rest schaue ich mir mal an.

Frohes Neues …

Hab das mal wieder ausm Keller geholt :slight_smile:

Nutzt das jemand ?

Grüße

Hi,

ich hab meine CX Steuerung bekommen und werde das irgendwann mal testen aber sehr Interessant.

Gruß

Hallo

Musste mir wegen IPS5 einen neunen PC mit Win10 64 Bit zulegen. Jetzt meldet das Script das ich keine Verbindung zur SPS habe. Twincat Systemmanger ist mit der SPS verbunden. Ich habe auch die TCScript.Dll mit
„regsvr32 c:\windows\syswow64\TcScript.dll“ registriert. Trotzdem bekomme ich es nicht mehr zum laufen. Hat jemand einen Tipp für mich was ich noch probieren kann ?

Update.
Wenn ich den IPS Ordner vom alten PC kopiere und die Installation ausführe funktioniert die Kommunikation zur Beckhoff Steuerung noch.
Wenn ich dann das Update auf IPS5 ausführe funktioniert Sie nicht mehr.

Sind deine DLLs denn 64-Bit? IP-Symcon 5.0 gibt es nur noch als 64.Bit Anwendung.

paresy

Ja sind sie.
Nach dem Update kommt die Fehlermeldung „Es konnte kein Objekt von TcScript.dll angelegt werden!“ da ja noch die 32 Bit dll registriert ist.

Wenn ich dann die 64 Bit dll registriere kommt die Meldung „Keine Verbindung zur SPS“.

Nimm mal den try catch Block raus, sodass du die echte Exception sehen kannst. Evtl. gibt es dort mehr Informationen.

paresy

Dann kommt folgendes

Fatal error: Uncaught com_exception: <b>Source:</b> Unknown<br/><b>Description:</b> Unknown in C:\IP-Symcon\scripts\34886.ips.php:28
Stack trace:
#0 C:\IP-Symcon\scripts\34886.ips.php(28): com->ConnectTo(‚5.49.43.2.1.1‘, 801)
#1 {main}
thrown in C:\IP-Symcon\scripts\34886.ips.php on line 28

Bin mehr SPS Programmiere leider sagt mit das Ganze nichts.