Autor
|
Thema: Simulation eines Antriebs in eM-Plant, Ansteuerung mit Siemens S7 (1792 mal gelesen)
|
ManRo Mitglied Student
 Beiträge: 4 Registriert: 06.12.2006
|
erstellt am: 06. Dez. 2006 11:39 <-- editieren / zitieren --> Unities abgeben:         
Hallo Zusammen, Ich habe die Tecnomatix Plant Simulation 7.6 Software im Einsatz. Ich steuere mit der Siemens S7 Software einen in eM-Plant dargestellten Motor an. Die Ansteuerung des Motors besteht im Moment nur darin, das ich den Motor vorwärts bzw. rückwärts fahren lasse. Der Datenaustausch zwischen der S7 Steuerung und eM-Plant erfolgt über eine in C# programmierte Schnittstelle. Die für die Simulation benötigten Daten werden in eM-Plant in eine Tabelle geschrieben, auf die eM-Plant dann zugreift. Mein Problem besteht darin, dass die Telegramme von der S7 Steuerung alle 100 Millisekunden gesendet werden sollen. Die Anwendung funktioniert nur solange, solange der Antrieb in eM-Plant mit einer Zykluszeit von 600 Millisekunden von der S7 Steuerung angesteuert wird. Wenn eine Zykluszeit von 100 ms eingestellt ist, ist eM-Plant zu langsam um die Telegramme von der S7 Steuerung auszuwerten. Die Telegramme kommen verzögert an und werden Zeitverzögert ausgewertet. Wäre dankbar für jegliche Unterstützung. ------------------ MfG Manuel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Homer Simpson Mitglied
 
 Beiträge: 345 Registriert: 14.09.2005
|
erstellt am: 06. Dez. 2006 12:39 <-- editieren / zitieren --> Unities abgeben:          Nur für ManRo
Mir ist nicht klar, wie die Schnittstelle auf eM-Plant zugreift. Via Socket, DDE, COM-Schnittstelle, C-Schnittstelle oder auf andere Weise? Was ist ein "Telegramm" in diesem Zusammenhang? (Eigentlich sollten 100ms aber in jeden Fall mehr als genug Zeit sein.) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManRo Mitglied Student
 Beiträge: 4 Registriert: 06.12.2006
|
erstellt am: 06. Dez. 2006 13:02 <-- editieren / zitieren --> Unities abgeben:         
Das Telegramm wird alle 100 ms gesendet. Das Telegramm beinhaltet Daten fürs Vorwärts- bzw. Rückwärtsfahren, Geschwindigkeits- und Beschleunigungswert und verschiedene Bits für die Antriebsfreigabe. Die Telegrammwerte kommen von der S7 Steuerung und werden in C# ausgewertet und konvertiert. Anschließend in jedem Zyklus in ein vorher geöffnetes eM-Plant Projekt in eine Tabelle geschrieben. Auf diese Tabelle wird dann in eM-Plant über eine Methode zugegriffen, mit dieser Methode wird der Antrieb gesteuert. Der Datentransfer zwischen C# und eM-Plant erfolgt dabei Rechnerintern. Die Kommunikation zwischen der S7 Steuerung und C# über eine UDP-Verbindung Rechnerextern. Ich habe in eM-Plant keinen Socket oder ähnliches verwendet. ------------------ MfG Manuel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Homer Simpson Mitglied
 
 Beiträge: 345 Registriert: 14.09.2005
|
erstellt am: 06. Dez. 2006 14:59 <-- editieren / zitieren --> Unities abgeben:          Nur für ManRo
> ... in ein vorher geöffnetes eM-Plant Projekt in eine Tabelle geschrieben. > Der Datentransfer zwischen C# und eM-Plant erfolgt dabei rechnerintern. Wie kommen die Werte von C# in die eM-Plant-Tabelle? > Auf diese Tabelle wird dann in eM-Plant über eine Methode zugegriffen. Wie wird diese Methode aufgerufen? Oder wird in eM-Plant etwa ständig die Tabelle ausgelesen, bis sich etwas ändert (polling)? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManRo Mitglied Student
 Beiträge: 4 Registriert: 06.12.2006
|
erstellt am: 06. Dez. 2006 15:24 <-- editieren / zitieren --> Unities abgeben:         
Vom C# Programm schick ich die Daten über eine COM Schnittstelle an die eM-Plant-Tabelle. Die Methode in eM-Plant wird über den Ereignisverwalter initialisiert und wird dann immer wieder durch sich selbst mit Hilfe des Befehls > ref(MethName).methaufr(takt); aufgerufen. Die Methode liest dann aus der gleichen Tabelle die Werte aus in die C# die Werte schreibt. Die Tabellendaten von C# werden aber nur geschickt, wenn das Telegramm ungleich dem vorhergehenden Telegramm ist. ------------------ MfG Manuel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Homer Simpson Mitglied
 
 Beiträge: 345 Registriert: 14.09.2005
|
erstellt am: 06. Dez. 2006 16:52 <-- editieren / zitieren --> Unities abgeben:          Nur für ManRo
Ich vermute, die Werte werden mittels der COM-Funktion "SetValue" in die Tabelle geschrieben. Die COM-Schnittstelle von eM-Plant besitzt auch eine Funktion namens "ExecuteSimTalk", mit der man beliebigen Methodentext ausführen kann. Damit kann man z.B. auch eine Methode aufrufen. Somit kann man die Methode, die die Werte aus der Tabelle ausliest, genau dann aufrufen, wenn es nötig ist. Die Methode muss sich dann nicht ständig selbst aufgerufen. Vielleicht bringt das eine Verbesserung. Ansonsten würde ich versuchen herauszufinden, wie lange die Methode läuft (oder wo die Zeit sonst bleibt). Um die Zeit zu messen, kann man z.B. mittels der print-Anweisung am Anfang und Ende einer Methode den Wert "processTime" oder "sysDate" auf die Console ausgeben. (processTime ist die CPU-Zeit, die der eM-Plant-Prozess verbraucht hat, sysDate ist die Systemzeit.) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Homer Simpson Mitglied
 
 Beiträge: 345 Registriert: 14.09.2005
|
erstellt am: 06. Dez. 2006 17:01 <-- editieren / zitieren --> Unities abgeben:          Nur für ManRo
Noch eine Anmerkung: Wenn man eine Methode mittels "ExecuteSimTalk" über die COM-Schnittstelle aufruft, braucht die Simulation nicht zu laufen. Wenn die Simulation nicht laufen würde, würde eM-Plant nicht ständig CPU-Zeit verbraten und den C#-Prozess ausbremsen. Alternativ kann man mittels der Anweisung sleep(0.001); eM-Plant für eine tausendstel Sekunde schlafen legen, wenn gerade nichts zu tun ist. Das bewirkt ebenfalls, dass der eM-Plant-Prozess nicht 100% CPU-Zeit verbrät. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |