Ne handvoll Einsteigerfragen

derbenny

Level-1
Beiträge
40
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
So, wieder mal nen Tag an S7 rumgeklickt, dabei kamen so einige Frage auf auf SCL bezogen):

1) Angenommen in einem FB1 wurde in den statischen Variablen eine Struktur definiert. Wie kann ich diese z.B. an FB2 übergeben, so dass ich von FB2 zumindest lesend darauf zugreifen kann?
DB1.meineStruktur.meineVariable funktioniert nicht --> „Strukturierte Daten aus dem IO-Bereich des Instanz-DBs ‚Name’ sind nicht als Operanden im globalen DB-Zugriff erlaubt“

2) Warum kann ich in einer Stuktur keine Multiinstanzen anlegen?
Also z.B. sowas:
VAR
meineStruktur :STRUCT
Variable1:BOOL;
Zylinder1:FB_Zylinder;
Zylinder2:FB_Zylinder;
Zylinder3:FB_Zylinder;
END_STRUCT

Ausserhalb der Stuktur funktioniert es einwandfrei.

3) Wie kann ich eine Instanz eines FB (also sowas wie gerade gezeigt, nur ausserhalb der Struktur) an einen anderen FB übergeben? VAR_IN_OUT bzw VAR_IN lässt diese Datentypen nicht zu. ANY hat nicht funktioniert. Können Pointer weiterhelfen?



Es geht darum, aus einem FB heraus auf die Daten des aufrufenden FB zugreifen zu können. Möglichkeit 1 wäre gewesen, alle Variablen die ich brauche per VAR_IN oder VAR_IN_OUT rein zu holen. Fällt allerdings weg, das es über 40 Stück sind. Die nächste unschöne Möglichkeit wäre, direkt auf die Daten im Instanz-DB zuzugreifen. Da darin aber Strukturen sind, geht das nicht (s.o.).

Das letzte was mir einfällt ist alle Variablen global anzulegen. Auch sehr unangenehm.

Hat jemand bessere Ideen?


Dann noch was zum GRAPH-Editor:
Ich wollte auf ein globales Array einer Stuktur zugreifen, also so:
[FONT=&quot]"X".Modul[10].Variable1
Hat im FUP/KOP-Editor einwandfrei funktioniert. Im Graph-Editor kann ich zwar in der Dropdown-Liste alles richtig auswählen, aber dabei werden die "" verschluckt. Auch wenn ich es von Hand eingebe. Wenn ich es allerdings rein kopiere, funktioniert es. Falsche Einstellung oder Fehler im Graph-Editor?

So, ich hoffe es kommen ein paar Antworten. Danke...!
[/FONT]
 
1) Das kommt darauf an wie der FB2 aufgerufen wird. Wenn der FB1 den FB2 Aufruft dann die statische Variable als Ausgang von FB1 an einen Eingang von FB2 übergeben. Falls der FB2 von sonst wo aufgerufen wird ist der Saubere Weg über Ausgang von FB1 an globale Variable an Eingang von FB2. Der quer Zugriff auf Instanz DBs ist Unsauber.

2) Das kann Step7 nicht Du kannst auch keine Arrays von FBs Bauen. Da sollte sich mal was ändern!

3) Das geht auch nicht. Wir sind ja hier nicht beim OOP ;o)


Graph7) Das muss ich auch erst mal testen.


Sorry das ich Dir da nicht wirklich angenehmes schreiben konnte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort :) Hatte schon befürchtet dass die S7 das nicht packt was ich vor hatte. Der Einstieg ist wirklich etwas deprimierend, da hatte ich mir von Siemens mehr erhofft. Demzufolge wird es wohl eine größere Aktion werden. Wenn ich GRAPH vernünftig einbinden will muss ich wohl die komplette bisherige Datenstruktur umschmeissen :(
 
...
Hatte schon befürchtet dass die S7 das nicht packt was ich vor hatte. Der Einstieg ist wirklich etwas deprimierend, da hatte ich mir von Siemens mehr erhofft.
...

Ich hatte nun drei Jahre lang nichts mit der Step7 am Hut und in der Erinnerung war es auch besser als es wirklich ist. Aber manche denken es wäre da nichts mehr zu verbessern ;o)
 
Ich hatte nun drei Jahre lang nichts mit der Step7 am Hut und in der Erinnerung war es auch besser als es wirklich ist. Aber manche denken es wäre da nichts mehr zu verbessern ;o)
Jop, ich verfolge den Thread :cool: Wer mit dem Teil arbeitet, vielleicht nichts anderes kennt und mit seinem Alltagskram damit klar kommt und umständliche Klickereien halt in Kauf nimmt weils schon seit Jahren so ist...dem werden Verbesserungen ein rotes Tuch sein...wäre ja Aufwand, sich an die Neuerungen zu gewöhnen. Der Mensch ist faul und ein Gewohnheitstier ;)

Aber für die Diskussion gibts ja schon nen Thread ;)

Ich finde es jedenfalls armselig wenn man in einer aktuellen Softwaregeneration einer Programmierumgebung ein externes Programm bemühen muss um zu suchen an welcher Stelle im Quelltext eine Variable verwendet wird (Projektweite Volltextsuche, vor allem für Strukturen..).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum ist es eigentlich so unschön, in einem DB (z.Bsp. DB100) die benötigte Struktur zu definieren und diese dann in den FB entsprechend zu benutzen. Ich kann daran nichts schlechtes finden, das ist dann schlicht und einfach eine globale Variable/Struktur. Sie "verbirgt" sich zwar in einem DB, was zotos ja haßt, aber trotz allem ist es eine global angelegte Variable, die global im gesamten Programm gültig ist und verwendet werden kann.
 
Ja das mit dem Globalen DB wäre eine Möglichkeit. Kommt darauf an wie oft der FB Aufgerufen wird. Wenn man diesen FB mehrfach braucht mir autonomen statischen variablen was ja im Normalfall die lokalen statischen Variablen darstellen dann geht der Trink nicht so einfach.

Aber um da nun wirklich einen guten Kompromiss zu finden müsste man mehr über die Randbedingungen wissen.
 
Warum ist es eigentlich so unschön, in einem DB (z.Bsp. DB100) die benötigte Struktur zu definieren und diese dann in den FB entsprechend zu benutzen. Ich kann daran nichts schlechtes finden, das ist dann schlicht und einfach eine globale Variable/Struktur. Sie "verbirgt" sich zwar in einem DB, was zotos ja haßt, aber trotz allem ist es eine global angelegte Variable, die global im gesamten Programm gültig ist und verwendet werden kann.
Wäre für einen FB ok. Es geht aber darum, dass es so an die 20 Module gibt, in denen ich jeweils die Schrittkette in einen GRAPH FB auslagern wollte. D.h. ich müsste für jedes dieser 20 Module den eigentlichen Modul-FB + Instanz-DB + global-DB + GRAPH-FB anlegen. Das wird unübersichtlich, frisst Speicher und tut der Performance bestimmt auch nicht gut :rolleyes:
 
Wäre für einen FB ok. Es geht aber darum, dass es so an die 20 Module gibt, in denen ich jeweils die Schrittkette in einen GRAPH FB auslagern wollte. D.h. ich müsste für jedes dieser 20 Module den eigentlichen Modul-FB + Instanz-DB + global-DB + GRAPH-FB anlegen. Das wird unübersichtlich, frisst Speicher und tut der Performance bestimmt auch nicht gut :rolleyes:

Ok, das kann ich verstehen, aber der Übersichtlichkeit tut das, was du vorhast noch viel weniger gut, da kaum jemand anders da noch rauskommen würde. Ich bin auch immer sehr am überlegen, wie ich die FB/FB/DB aufteile, inzwischen hab ich eine Art eigenen Standard, so daß ich mich in allen meinen Programmen zurechtfinde. Wenn du für jedes der Module(Stationen?) je 10 FC/FB/DB reservierst, die Nummern entsprechend aufteilst und die Symbolik gut überlegt einsetzt ginge das schon. Inzwischen können ja die meißten Siemens-CPU auch mit etwas größeren Bausteinummern als 128/256 umgehen.

Bei der Performance wär ich mit nicht unbedingt so sicher, müßte man mal probieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, das kann ich verstehen, aber der Übersichtlichkeit tut das, was du vorhast noch viel weniger gut, da kaum jemand anders da noch rauskommen würde.
Naja, wenn ich mit dem Graph-FB ganz einfach auf die Variablen des aufrufenden Modul-FBs zugreifen könnte wäre das für mich perfekt. Denn die Modulstruktur kennen alle MA, die ist seit Jahren in allen Anlagen gleich, wenn ich jetzt noch ohne große Umbauaktionen die Schrittketten grafisch darstellen könnte wäre das optimal. So könnte ich einfach das was in den Schrittketten bisher passiert in den Graph machen und dort wo bisher die SK stand den Graph-FB aufrufen. Das sind meistens nur BOOL-Status-Abfragen oder der Index für ein Positionsarray mit anschliessendem BOOL-Fahrbefehl. Aber das scheint so nicht zu gehen. Wäre auch zu einfach gewesen...

..OOP ist einfach zu schön ;) Wäre praktisch wenn der Child-Graph-FB die Variablen des Parent-FB erben könnte :D :D :D
 
Naja, wenn ich mit dem Graph-FB ganz einfach auf die Variablen des aufrufenden Modul-FBs zugreifen könnte wäre das für mich perfekt. Denn die Modulstruktur kennen alle MA, die ist seit Jahren in allen Anlagen gleich, wenn ich jetzt noch ohne große Umbauaktionen die Schrittketten grafisch darstellen könnte wäre das optimal. So könnte ich einfach das was in den Schrittketten bisher passiert in den Graph machen und dort wo bisher die SK stand den Graph-FB aufrufen. Das sind meistens nur BOOL-Status-Abfragen oder der Index für ein Positionsarray mit anschliessendem BOOL-Fahrbefehl. Aber das scheint so nicht zu gehen. Wäre auch zu einfach gewesen...

..OOP ist einfach zu schön ;) Wäre praktisch wenn der Child-Graph-FB die Variablen des Parent-FB erben könnte :D :D

Wo wir dann wieder bei der Frage eines anderen Thread hier im Forum landen, braucht es eine S9 :ROFLMAO:. Für solche Fälle wohl ja, aber die Instandhalter in den Firmen werden uns bei solchen Konstruktionen wohl kreuzigen (jedenfalls die, die ich so kenne).
 
Für mich klingt das ganze auch zu komplex.

Wenn ich das richtig verstanden habe hattet ihr ursprünglich Programmteile in ST (oder was ähnlichem) in dem die Module und Stationen abliefen. Auch Schrittketten (als Case?) und nun wollt ihr den Schrtittekttenteil ausgliedern in Graph7. Was nun aber sehr viele Schnittstellenprobleme bereitet.

Der Einwand von Ralle mit den Instandhaltern ist zwar hier im Forum das Argument gegen alles neue. Aber ich denke ab ein gewissen Komplexität der Aufgabe kommt man eben ohne höhere Programmiersprache nicht klar. Verallgemeinert geschrieben: Was ein Programmierer nicht in AWL versteht versteht der Instandhalter auch nicht in AWL (auch zahlreiche Ausnahmen bestätigen die Regel).

Wenn ihr Graph7 wegen der Übersichtlichkeit verwendet habt dann sollte die Kette nicht durch Zahllose Schnittstellen selbst in Ketten gelegt werden.

In CoDeSys z.B. kann man mit AS die Kette malen und in jedem Schritt je nach Vorliebe und bedarf in den anderern Programmiersprachen den Inhalt dieses Schritts programmieren. Wir verwenden eine Schrittkette immer vom Typt PRG (Programm) also nur eine Instanz und alle komplexeren Vorgänge sind dann der Kette untergeordnet. Um das in Step7 zu realisieren müsste man sich wirklich was zurecht konstruieren. Sowas wie einen SCL FB der von einem "unabhängigen" Schrittketten FB die Schrittnummer bekommt und dann eben die Schrittkette doppelt Programmieren. Das wäre IMHO ein super GAU.

Wenn man SCL wenigsten halbwegs gescheit im Onlinemodus betrachten könnte. Wie man das von anderen Programmierumgebungen gewöhnt ist. würde ich eurem Fall da zu tendieren die Module weiter rein in SCL zu programmieren mit eingebetteter Case-Schrittkette. Und lieber Energie darauf verwenden die Diagnoseinformationen nach außen (auch in die Visu) zu führen. Also Schrittnummer ist ja einfach aber die Weiterschaltbedingungen. Da würde mir zwar auch was einfallen aber dazu müsste man eine Liste von Handpflegen oder über de SCL Quelle extern generieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ne Idee

So, wieder mal nen Tag an S7 rumgeklickt, dabei kamen so einige Frage auf auf SCL bezogen):

1) Angenommen in einem FB1 wurde in den statischen Variablen eine Struktur definiert. Wie kann ich diese z.B. an FB2 übergeben, so dass ich von FB2 zumindest lesend darauf zugreifen kann?
DB1.meineStruktur.meineVariable funktioniert nicht --> „Strukturierte Daten aus dem IO-Bereich des Instanz-DBs ‚Name’ sind nicht als Operanden im globalen DB-Zugriff erlaubt“

2) Warum kann ich in einer Stuktur keine Multiinstanzen anlegen?
Also z.B. sowas:
VAR
meineStruktur :STRUCT
Variable1:BOOL;
Zylinder1:FB_Zylinder;
Zylinder2:FB_Zylinder;
Zylinder3:FB_Zylinder;
END_STRUCT

Ausserhalb der Stuktur funktioniert es einwandfrei.

3) Wie kann ich eine Instanz eines FB (also sowas wie gerade gezeigt, nur ausserhalb der Struktur) an einen anderen FB übergeben? VAR_IN_OUT bzw VAR_IN lässt diese Datentypen nicht zu. ANY hat nicht funktioniert. Können Pointer weiterhelfen?



Es geht darum, aus einem FB heraus auf die Daten des aufrufenden FB zugreifen zu können. Möglichkeit 1 wäre gewesen, alle Variablen die ich brauche per VAR_IN oder VAR_IN_OUT rein zu holen. Fällt allerdings weg, das es über 40 Stück sind. Die nächste unschöne Möglichkeit wäre, direkt auf die Daten im Instanz-DB zuzugreifen. Da darin aber Strukturen sind, geht das nicht (s.o.).

Das letzte was mir einfällt ist alle Variablen global anzulegen. Auch sehr unangenehm.

Hat jemand bessere Ideen?

Vielleicht funzt das:

Lege einen UDT bzw. zwei UDT's an (global) in denen de Struktur der IN-OUT-Variablen gesammelt ist und verwende die in den beiden FB's (anstatt üre die Instanz zu gehen). dann definierstdu einmal die Variable im aufrufenden FBals statisch und im aufGErufenen FB als IN-OUT.

hth
 
Zuletzt bearbeitet:
Vielleicht funzt das:

Lege einen UDT bzw. zwei UDT's an (global) in denen de Struktur der IN-OUT-Variablen gesammelt ist und verwende die in den beiden FB's (anstatt üre die Instanz zu gehen). dann definierstdu einmal die Variable im aufrufenden FBals statisch und im aufGErufenen FB als IN-OUT.

hth
Würde bestimmt funktionieren, aber wie gesagt, die Anzahl der Module wird dann wieder das Problem.
 
Für mich klingt das ganze auch zu komplex.

Wenn ich das richtig verstanden habe hattet ihr ursprünglich Programmteile in ST (oder was ähnlichem) in dem die Module und Stationen abliefen. Auch Schrittketten (als Case?) und nun wollt ihr den Schrtittekttenteil ausgliedern in Graph7. Was nun aber sehr viele Schnittstellenprobleme bereitet.
Exakt, bisher alles in SCL Modulen, inkl Case-Schrittketten (die widerlich zu debuggen sind)

Aber ich denke ab ein gewissen Komplexität der Aufgabe kommt man eben ohne höhere Programmiersprache nicht klar.
Nein, das ist auch nicht das Ziel. SCL sollte die Basis sein, und einfache Teile die mit FUP übersichtlicher und schneller zu machen sind eben mit FUP. Und Schrittketten in Graph. Das wäre das Optimun. Leicht gesagt...aber schwer umzusetzen.

Sowas wie einen SCL FB der von einem "unabhängigen" Schrittketten FB die Schrittnummer bekommt und dann eben die Schrittkette doppelt Programmieren. Das wäre IMHO ein super GAU.
Richtig, das wär ein Schuss nach hinten.

Wenn man SCL wenigsten halbwegs gescheit im Onlinemodus betrachten könnte. Wie man das von anderen Programmierumgebungen gewöhnt ist.
icon_knie.gif
Schön wärs..


Werde das ganze mal ausdiskutieren. Aber Urlaubszeit --> dauert :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Exakt, bisher alles in SCL Modulen, inkl Case-Schrittketten (die widerlich zu debuggen sind)
...

Echt? Also ich nutze Case auch manchmal um Sequenzen darzustellen. Und finde das sehr Übersichtlich und vom Debugging her auch angenehm. Klar ist eine Visuelle Darstellung zugänglicher.
 
Zurück
Oben