TIA Graph Parrallelschrittnummern lesen

meikelneit

Level-2
Beiträge
172
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich stehe aktuell vor dem Problem, im TIA Portal (S7-1500, GRAPH) alle aktiven Schrittnummern einer Schrittkette in einem SPS-Zyklus auszulesen. In meinem Anwendungsfall kann es durch parallele oder alternative Abläufe vorkommen, dass mehrere Schritte gleichzeitig aktiv sind, und ich benötige alle aktiven Schrittnummern, nicht nur den "aktuell aktiven Schritt" (DB_Step_Active o. Ä.).

Meine Frage an die Runde:Wie löst ihr das in der Praxis? Gibt es eine saubere Möglichkeit, z. B. über die Instanzdaten des GRAPH-Bausteins, gezielt die Schrittnummern der gesetzten Schritte (z. B. in EXEC_BITS) zu ermitteln?

Ich habe gesehen, dass das Bitfeld EXEC_BITS im Instanz-DB die aktiven Schritte abbildet, allerdings habe ich bisher keine direkte Zuordnung gefunden, mit der ich sagen kann: Bit 3 entspricht Schrittnummer X.

Daher zwei Fragen:

  1. Wie liest ihr im SPS-Zyklus alle gleichzeitig aktiven Schritte (Schrittnummern) einer GRAPH-Schrittkette aus?
  2. Gibt es eine dokumentierte oder praktikable Zuordnung von Bitpositionen in EXEC_BITS zu den tatsächlichen Schrittnummern?

Bin gespannt, wie ihr das angeht – vielleicht kennt jemand sogar eine Möglichkeit, das Mapping programmatisch aufzubauen oder über symbolische Informationen heranzukommen.


Vielen Dank vorab!
Viele Grüße
 
  1. Wie liest ihr im SPS-Zyklus alle gleichzeitig aktiven Schritte (Schrittnummern) einer GRAPH-Schrittkette aus?
  2. Gibt es eine dokumentierte oder praktikable Zuordnung von Bitpositionen in EXEC_BITS zu den tatsächlichen Schrittnummern?
1. noch nie gemacht.. mir ist in meinem Umfeld keine Praxis bekannt wo es notwendig wäre das zu tun
2.


Deswegen noch mal die allgemeine Frage:

Was soll durch das auslesen der aktiven Schritte erreicht werden? Wieso ist das notwendig? Vielleicht gibts ja andere Lösungen..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir haben das mal machen und visualisieren müssen für einen Automobilisten. Der hat dann einen Ausdruck der Kette bekommen und konnte so seinen Fehler suchen, wenn was hing.

Wir haben dazu in jedem Schritt eine Variable beschrieben mit der zum Schritt gehörigen S_NO (siehe Struktur). Gibt es Parallelverschaltungen, dann gibt es entsprechend mehr Variablen. In parallelen Schritten werden verschiedene Schrittnummern angezeigt, ansonsten immer die gleichen. Gleiches gilt für weitere Ketten im gleichen Baustein. Wenn du Schritte kopierst und wieder einfügst brauchst du nicht mal etwas tippen, weil die Umbenennung in den Aktionen automatisch erfolgt.
 
@EliteGurke: Vielleicht kannst du noch etwas genauer darauf eingehen.?!

Ich kenne es eigentlich auch so dass man in den Aktionen der Schritte eine Variable vom Typ Bool oder Integer nicht speichernd beschreibt und somit außerhalb der Schrittkette weiß welcher Schritt aktiv ist falls die Schrittkette läuft.

Nun ein paar Jahre später möchte ich das eigentlich eleganter implementieren und brauche die Schrittnummer oder besser noch den Schritt Namen. Zudem soll ein weiteres Zutun beim Erweitern der Schrittkette vermieden werden, da dies öfters vergessen wird.

- Ein durchrollen des Ausgangsparameters S_NO mittels Flanke von S_NEXT (inkl. Grenzerkennung) kann die Schrittnummer liefern, macht aber Probleme oder hohen Aufwand bei der Implementierung wenn es Simultanverzweigugnen gibt und die Schritte nur für eine Zykluszeit aktiv sind.

- Die Schnittstelle von "Standard Schnittstellenparameter" auf "Maximale Schnittstellenparameter" zu stellen, bringt leider nicht die notwendigen Informationen in den Instanzdatenbaustein der Schrittkette.

- Die Verwendung eines Erweiterungsbausteins liefert lediglich die Information wie viele Schritte aktiv sind, aber nicht welche.

Es muss doch eine Lösung für so etwas geben...

Benötigt wird die Information um sie dann in eine Log Datei zu schreiben, zukünftig aber auch um sie im HMI anzuzeigen. Das ganze soll natürlich komfortabel und erweiterungsfreundlich umgesetzt werden.


Über konkrete Hinweise oder besser noch Hilfestellungen, wäre ich sehr dankbar.


Edit: Innerhalb des Erweiterungsbausteins kann man das über die IO Schnittstelle übergebenes Array[*] of G7_StepPlus_V6 erledigen:

// Init
#Steps := #Steps_init;

// Boundaries
#iLowerBound := DINT_TO_INT(LOWER_BOUND(ARR := #io_G7S, DIM := 1));
#iUpperBound := DINT_TO_INT(UPPER_BOUND(ARR := #io_G7S, DIM := 1));

// Data acquisition
FOR #i := #iLowerBound TO #iUpperBound DO
IF #io_G7S[#i].X THEN
#Steps.usiNumber[#siNumberOfActiveSteps] := INT_TO_USINT(#io_G7S[#i].SNO);
END_IF;
END_FOR;

Nur die Schritt Namen bekomme ich noch nicht...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
- Die Verwendung eines Erweiterungsbausteins liefert lediglich die Information wie viele Schritte aktiv sind, aber nicht welche.
Das stimmt nicht.
Du bekommst ein Array aller Schritte auf einmal.
Mit einer Schleife diese Variable abfragen:

#io_G7S[ #HierDeineINDEXvariable ].X
Die ist TRUE wenn der Schritt aktiv ist.

#io_G7S[ #HierDeineINDEXvariable ].SNO
Da Steht die Graph Schritt Nr drin.

Du musst nur die Array Größe dynamisch ermitteln. Sonst bekommst Du bei Änderungen Probleme
z.B.:
#si_MinSchritteGraph := DINT_TO_INT(LOWER_BOUND(ARR := #io_G7S, DIM := 1));
#si_MaxSchritteGraph := DINT_TO_INT(UPPER_BOUND(ARR := #io_G7S, DIM:= 1));
Also die für deine For-Schleife nutzen
 
Danke. Mir hat das geholfen und den Inhalt des Erweiterungsbausteins folgend befüllt:

// Init
#Steps := #Steps_init;

// Boundaries
#iLowerBound := DINT_TO_INT(LOWER_BOUND(ARR := #io_G7S, DIM := 1));
#iUpperBound := DINT_TO_INT(UPPER_BOUND(ARR := #io_G7S, DIM := 1));

// Data acquisition
FOR #i := #iLowerBound TO #iUpperBound DO
IF #io_G7S[#i].X THEN
#Steps.usiNumber[#siNumberOfActiveSteps] := INT_TO_USINT(#io_G7S[#i].SNO);
END_IF;
END_FOR;

Nur die Schritt Namen bekomme ich noch nicht...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe schon die SFC "GetSymbolName" gefunden. Allerdings gibt die dann auf mein Beispiel bezogen z.B. "io_G7S[1]" zurück und löst den Namen damit nicht korrekt auf. Korrekt wäre "BeispielNameFürSchrittkette.Step1". Vermutlich müsste man dann an dieser Stelle mit Zeigern arbeiten...
 
Nur die Schritt Namen bekomme ich noch nicht...
Wenn Du eine Lösung gefunden hast, wäre ich auch daran interessiert.

Das ist genauso ein Thema, wie die Identifikation von Bausteinen bei Fehlern.
Das TIA ist ja sooooo symbolisch. Aber, wenn ein Baustein mit Fehler vom TIA gemeldet wird, wird dieser absolut (FC34, FB56, DB101, ...) angegeben.
Wenn man sein Programm mit Ordnern und Unterordnern strukturiert hat und man viele Bausteine hat, ist das echt blöd.
 
Wenn Du eine Lösung gefunden hast, wäre ich auch daran interessiert.

Das ist genauso ein Thema, wie die Identifikation von Bausteinen bei Fehlern.
Das TIA ist ja sooooo symbolisch. Aber, wenn ein Baustein mit Fehler vom TIA gemeldet wird, wird dieser absolut (FC34, FB56, DB101, ...) angegeben.
Wenn man sein Programm mit Ordnern und Unterordnern strukturiert hat und man viele Bausteine hat, ist das echt blöd.
Vielleicht hilft dir dann GetBlockName?!
 
Ja, ich wollte die Variable siNumberOfActiveSteps einsparen, da ja mit "#io_G7Arrays[#io_RT_Data.OFFSETS.SAX_OFFSET] - 1" schon ermittelt werden kann wie viele Schritte aktiv sind. Merkte aber dass ich die besagte Variabel aber als Laufindex für das Array verwendet habe in das die Informationen dann reinkopiert werden. Bereinigter Code sieht dann so aus:
Allerdings funktioniert die Ausgabe vom Schritt Namen noch nicht. Da braucht es vlt Zeiger für.

1753357465610.png
 
Zurück
Oben