+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 15
  1. #1
    Registriert seit
    Aug 2011
    Beiträge
    8

    Standard 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.

    Anhang 12848

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

    Anhang 12849

    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.

    Anhang 12850

    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.

    Anhang 12851

    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.

    Anhang 12852

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

    Anhang 12853

    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“.

    Anhang 12854

    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.

    Anhang 12855

    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.

    Anhang 12856
    Anhang 12857

    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:

    PHP-Code:
    <?
    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!

  2. #2
    Registriert seit
    Mar 2011
    Ort
    Niederbayern
    Beiträge
    17

    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

  3. #3
    Registriert seit
    Aug 2011
    Beiträge
    8

    Hallo Marcus,

    vielen Dank für das Feedback.

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

    PHP-Code:
    <? 
    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.

    Anhang 14032

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

    Anhang 14033

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

    Anhang 14034

    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

  4. #4
    Registriert seit
    Apr 2011
    Beiträge
    83

    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

  5. #5
    Registriert seit
    Aug 2011
    Beiträge
    8

    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

  6. #6
    Registriert seit
    Aug 2011
    Beiträge
    8

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

    PHP-Code:
    <?  

    $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 == && !$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 == && !$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 ------------------- 

    ?>

  7. #7
    Registriert seit
    Apr 2011
    Beiträge
    83

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

  8. #8
    Registriert seit
    Jun 2009
    Beiträge
    174

    Standard ...

    Frohes Neues ...

    Hab das mal wieder ausm Keller geholt

    Nutzt das jemand ?

    Grüße

  9. #9
    Registriert seit
    Dec 2012
    Ort
    Großraum Stuttgart ...
    Beiträge
    426

    Hi,

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

    Gruß

  10. #10
    Registriert seit
    Dec 2014
    Beiträge
    16

    Standard TcScript.dll funktioniert nicht unter Win10 64Bit

    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 ?

Ähnliche Themen

  1. Beckhoff CX1010 und IPS. Problem mit Modbus Server
    Von Astro9481 im Forum SPS Automatisierungstechnik
    Antworten: 19
    Letzter Beitrag: 14.08.13, 11:35
  2. Moeller SPS Mit Modbus RTU
    Von Professorakiera im Forum SPS Automatisierungstechnik
    Antworten: 4
    Letzter Beitrag: 10.04.11, 17:35
  3. Keine Modbus Kommunikation mit ICPDAS PET 7060
    Von Herr-W im Forum SPS Automatisierungstechnik
    Antworten: 7
    Letzter Beitrag: 11.05.10, 14:11
  4. Vituelle Modem für Kommunikation Zwischen PC(Server) und ISDN-Modem
    Von metti30 im Forum Audio & Video, TK-Anlagen, ISDN
    Antworten: 0
    Letzter Beitrag: 27.04.10, 09:35

Stichworte