Step 7 Any Pointer - Zykluszeit

Pico1184

Level-2
Beiträge
347
Reaktionspunkte
13
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Abend,

wir entwickeln im Moment einen Standard für unsere Rundläuferanlagen. Diese bestehen immer aus dem Rundläufer selbst und einer differierenden Zahl an Zuführungen. Der Rundläufer ist physikalisch Abhängig vom Zustand der Zuführungen.

Die Zuführungen selbst bestehen aus Förderbändern etc.

unser Standard ist aufgedröselt bis zur kleinsten Komponente z.b ein 2 spuliges Ventil mit 2 Endlagen ist ein FB. In diesem FB werden dann die Ansteuerungen der Spulen, Laufzeitüberwachung, Status, etc bearbeitet.

In einem global DB gibt es für jede Komponente 3 Strukturen welche über udts definiert sind, "Status, Meldungen, Störungen" z.b für die Visu.

Desweiteren gibt es einen Betriebsarten DB welcher auch über eine Udt definiert ist.

Für die Zuführung gibt es ebenfalls einen Global dB, auch über eine udt definiert.

Für eine Zuführung habe ich dann einen FB geschrieben welcher die einzelnen Komponenten aufruft z.b. Förderband1, Zylinder, Förderband2 etc.

Diesem Zuführungs FB übergebe ich dann 4 Any Pointer als in-Out. Einen auf den Komponenten DB für Förderband1, einen für Zylinder, einen für die Betriebsarten und einen für den Zuführungsstatus. Im Zuführungs FB kopiere ich die Any Pointer auf Lokaldaten ( temporäre any Pointer) und übergebe diese dann an den jeweiligen Komponenten fb (z.b. Förderband1) welcher als Instanz im Zuführungs fb angelegt ist. Dasselbe dann für alle Komponenten und Betriebsarten sowie den Zuführungsstatus!

Ich hoffe das ist für euch einigermaßen verständlich ;) gar nicht so einfach zu erklären.

Meine Frage ist nun ob das Zerlegen der any Pointer auf Lokaldaten und Übergabe an die Instanz fbs und das weitere Zerlegen in diesen, meine Zykluszeit belastet? Mit PLCSIM hatte ich bei nur einem Zuführungs FB schon ca 15ms Zykluszeit....aber kann man das auf reale CPUs übertragen?

Und würdet ihr an der Gesamtstruktur etwas ändern oder findet ihr das gelungen gelöst?

Eure Meinung ist sehr interessant für mich! :cool:

Grüße Pico
 
Zuletzt bearbeitet:
ich zeig euch mal hier ein beispiel:

FB für eine Komponente (Zylinder Förderband etc)
Code:
IN_OUT:
IO_ANY_Komponente : ANY
IO_ANY_Betriebsarten : ANY

      TAR2  
      T     #T_DW_AR2_Backup         // Sichern des Adressregister 2
      L     DW#16#FFFFF                 // nicht relevante Bits ausblenden
      UD    
      T     #T_DW_Instanzanfang         // Instanzanfang

      L     P##IO_ANY_Komponente
      +D    
      LAR2                              // Zeiger AR2 auf DB setzen
      L     W [AR2,P#4.0]               // und auslesen
      T     #T_IN_DB_Komponente         // Komponenten DB aufschlagen
      AUF   DB [#T_IN_DB_Komponente]

      L     D [AR2,P#6.0]               // Zeiger AR2 auf DW setzen
      T     #T_DW_Dat_Komponente
      LAR2  

      L     P##Status_Komponente        // Zeiger AR1 auf temporäre UDT setzen
      LAR1  

      L     W [AR2,P#0.0]               //Kopiere Status
      T     W [AR1,P#0.0]
      L     W [AR2,P#2.0]               //Kopiere Messages
      T     W [AR1,P#2.0]
      L     W [AR2,P#4.0]               //Kopiere Errors
      T     W [AR1,P#4.0]
      L     W [AR2,P#6.0]               //Kopiere Merker
      T     W [AR1,P#6.0]
      L     W [AR2,P#8.0]               //Kopiere Status VISU
      T     W [AR1,P#8.0]


//Aufsplitten in Unterstrukturen
      L     #T_DW_Instanzanfang
      L     P##Messages                 //Lade Messages
      +D    
      LAR1  

      L     #T_DW_Instanzanfang
      L     P##Status_Komponente        //Lade lokale Struktur
      +D    
      LAR2  

      L     W [AR2,P#2.0]               //Kopieren in Struktur
      T     W [AR1,P#0.0]

      L     #T_DW_Instanzanfang
      L     P##Errors                   //Lade Errors
      +D    
      LAR1  

      L     W [AR2,P#4.0]               //Kopieren in Struktur
      T     W [AR1,P#0.0]

      L     #T_DW_Instanzanfang
      L     P##Merker                   //Lade Merker
      +D    
      LAR1  

      L     W [AR2,P#6.0]               //Kopieren in Struktur
      T     W [AR1,P#0.0]

      L     #T_DW_Instanzanfang
      L     P##Status_Visu              //Lade Status VISU
      +D    
      LAR1  

      L     W [AR2,P#8.0]               //Kopieren in Struktur
      T     W [AR1,P#0.0]

//Betriebsarten
      L     #T_DW_Instanzanfang
      L     P##IO_ANY_Betriebsarten
      +D    
      LAR2                              // Zeiger AR2 auf DB setzen
      L     W [AR2,P#4.0]               // und auslesen
      T     #T_IN_DB_Betriebsarten      // DB für Betriebsarten aufschlagen
      AUF   DB [#T_IN_DB_Betriebsarten]

      L     D [AR2,P#6.0]               // Zeiger AR2 auf DW setzen
      T     #T_DW_Dat_Betriebsarten
      LAR2  

      L     P##Betriebsarten            // Zeiger AR1 auf T_UDT setzen
      LAR1  

      L     D [AR2,P#0.0]
      T     D [AR1,P#0.0]
      L     W [AR2,P#4.0]
      T     W [AR1,P#4.0]
      L     W [AR2,P#6.0]
      T     W [AR1,P#6.0]
      L     W [AR2,P#8.0]
      T     W [AR1,P#8.0]
      L     W [AR2,P#10.0]
      T     W [AR1,P#10.0]
      L     W [AR2,P#12.0]
      T     W [AR1,P#12.0]
      L     W [AR2,P#14.0]
      T     W [AR1,P#14.0]
      L     D [AR2,P#16.0]
      T     D [AR1,P#16.0]

      LAR2  #T_DW_AR2_Backup         // Rücksichern Adressregister 2

........

Komponenten DB:
Code:
Foerderband_1 : "UDT_Komponente"
Zylinder_1 : "UDT_Komponente"
Foerderband_2 : "UDT_Komponente"

Betriebsarten DB:
Code:
Rundlauferanlage : "UDT_Betriebsarten"

Zuführungs DB:
Code:
Zuführung_1 : "UDT_Zuführung"

Zuführungs FB:
Code:
IN_OUT:
IO_ANY_Foerderband_1: ANY
IO_ANY_Zylinder: ANY
IO_ANY_Foerderband_2: ANY
IO_ANY_Betriebsarten : ANY
IO_ANY_Zufuehrung : ANY

.....
kopieren aller in_out auf temp any oder temporäre UDT (Zuführung + Betriebsarten)
.....

call Foerderband_1
      IO_ANY_Komponente:=T_ANY_Foerderband_1
      IO_ANY_Betriebsarten:=T_ANY_Betriebsarten

call Foerderband_2
      IO_ANY_Komponente:=T_ANY_Foerderband_2
      IO_ANY_Betriebsarten:=T_ANY_Betriebsarten

call Zylinder
      IO_ANY_Komponente:=T_ANY_Zylinder
      IO_ANY_Betriebsarten:=T_ANY_Betriebsarten

.....

Hoffe es ist so etwas verständlicher!

Grüße Pico
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit PLCSIM hatte ich bei nur einem Zuführungs FB schon ca 15ms Zykluszeit....aber kann man das auf reale CPUs übertragen?

Nee, das kannst Du nicht übertragen. Welche CPU willst Du denn einsetzen?

Allgemein: Es ist in aller Regel wichtiger, dass das Programm gut lesbar ist, anstatt es auf Zykluszeit zu optimieren. Bei Notwendigkeit lieber ne größere CPU nehmen.

Erst wenn die Zykluszeit für Deine Anwendung/Aufgabe zu lang wird, entsteht Handlungsbedarf.

Gruß
 
Welche CPU willst Du denn einsetzen?

Wir setzen meistens eine 315F-2 PN/DP ein. Mit 512kbyte MMC und aktiviertem Webserver bzw aktiviertem Sicherheitsbetrieb.

Mir ging es auch generell darum mal eine Bewertung von euch zu bekommen, ob so ein Strukturaufbau sinnvoll ist und ob ihr das auch so ähnlich realisiert.

Ich finde das so eigentlich ziemlich gelungen, da wir hier Standardbausteine für jegliche Komponenten einer Anlage abgebildet haben (Ventile, Antriebe etc) und aus diesen einzelnen Komponenten dann komplette Anlagenbereiche abgebildet werden können.

Gerade bei uns im Sondermaschinenbau können die Anlagenfunktionen immer ziemlich unterschiedlich sein, aber die Software sollte doch so ausgelegt sein, um wirklich mit minimalem Aufwand ein gutes übersichtlich strukturiertes Programm vorzufinden und um auch auf die verschiedenen Anforderungen leicht reagieren zu können!

Grüße Pico
 
Zuletzt bearbeitet:
Wir nutzen in Teilen ein ähnliches System.
Zyklus ist bei uns meist kein Thema. Zum Kopieren der Daten verwenden wir SFC20 Blockmove.
Damit kannst du - wenn du deine Strukturen bzw. UDTs sauber aufbaust - viel Zeit sparen und zudem ist es weniger fehlerträchtig.

Ein ganz wichtiger Punkt:
Bevor du überhaupt mit dem System anfängst, ist ein DURCHGÄNGIGES Bezeichnungssystem notwendig.
Ein Instandhalter kann bei so einem System nicht mehr einfach im Programm nach der Verwendung von von Ein- oder Ausgängen suchen und so den Fehler finden. Deshalb müssen deine Bewegungen eindeutig identifizierbar sein. Vom Schaltplan bis ins letzte Datenbit im SPS-Programm.

Gruß
Dieter
 
Zurück
Oben