AWL: Dynamischer Aufruf von Funktionen (Funktionszeiger in AWL)

tomi_wunder

Level-1
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi!
Gibt es in AWL eine Möglichkeit, Funktionen bzw. vll. auch Funktionsbausteine parametrisch aufzurufen, d.h. nicht durch die direkte Angabe des symbolischen Namens oder einer festen Bausteinnummer, sondern über eine irgendwo gespeicherte Nummer (oder Zeiger)?
Ungefähr sowas:
Code:
CALL       FC    [#fcnr]

bzw.

CALL       #funktionszeiger

Weil ich aus der C/C++-Welt komme kenne ich das ganze unter dem Namen Funktionszeiger. Nun macht man mit C und C++ aber leider Anwendungsprogrammierung was somit nicht allzuviel mit SPS-Programmierung zu tun hat. Dennoch habe ich für SCL schon gesehen, daß es möglich ist einem FC/FB Parameter vom Typ BLOCK_FC/BLOCK_FB mitzugeben, wobei ich annehme, daß man damit auch auf nix anderes hinaus will, als ich vorhabe.

Mir ist schon klar, daß man das auch über unzählige Fallunterscheidungen lösen kann, nur geht es mir darum mein Programm kürzer und effizienter zu machen. Ziel ist es sowas ähnliches zu bauen wie eine Befehlsqueue, also ein veränderliches Array von Funktionsnummern bzw. Funktionszeigern, daß sequentiell durchgearbeitet wird.
Mit Datenbausteinen gibt's ja auch was äquivalentes wie z.B.
Code:
AUF   DB   [LW 10]

Vorab schonmal herzlichen Dank
Gruß
Thomas
 
Hallo,

wie wäre es mit

cc fb [mw10]

oder

uc fb [mw10]


wobei vorher im MW10 die entsprechende Baustinnummer eingetragen wird

Grüße Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aufrufe

Hallo Thomas,

alles schön und gut. Aber haste schon mal dran gedacht dass die Bausteinaufrufe dann in keiner Referenzliste mehr zu finden sind? Auch wenn x Aufrufe mehr Arbeit machen, übersichtlicher ist es allemal. Das Instandhaltungspersonal (wenn vorhanden) wirds dir danken. Was haste denn unterschiedliches anzuspringen?

MfG
André Räppel
 
Hallo André,

mir ist schon klar, das die Aufrufe nicht in der Ref. auftauchen.
Ich gehöre aber auch zu dem erwähnten Instandhaltungspersonal (wenn vorhanden) und komme genauso zurecht wie mit Spagetticode wo ein Aufruf dem anderen folgt und bei bestimmten Bedingungen übersprungen wird.Wenn dann noch die Bausteinnummern pro entsprechendem Aufruf limitiert und vielleicht noch zu allem Überfluss dokumentiert sind, sollte es für niemanden Probleme geben.

Grüße Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur für sie ...

Hallo André,

der Einwand ist m.E. schon berechtigt.

Ich habe mir bei inzidierter Adressierung oder
anderen, nicht in der QVL auftauchenden Dingen
(Statusmerker von Siemens-S5-Hantierungsbausteinen,
die nur im DB1 als String auftauchen) angewöhnt,
ein Dummy-Netzwerk mit Kommentaren in der Nähe der
Sprungtabelle anzulegen, z.B.

BEA // hier ist Schluss
SPB FB 101 // ab hier nur für die QVL !
SPB FB 102
SPB FB 103
SPB FB 104
SPB FB 105

@TOMI aus der WUNDER_baren C/C++ Welt:
... und vergiss nicht die Limitierung
des Indexzeigers, das nimmt dir in der
SPS nämlich kein Compiler oder Linker ab!

Gruß U.
(der mit dem großen Herz für die
[oft gar nicht so armen]
Instandhalter)
 
Hi!
Erstmal nochmal ganz herzlichen Dank für die Hinweise, hat mir sehr geholfen!

Jetzt hab ich aber nochmal eine Frage, die, wie ich glaube, nicht so wirklich oft gefragt wird - wär auch nicht so schlimm, wenn da keiner eine Antwort drauf parat hätte:
Step7 kann's teilweise auch - Funktionen und Funktionsbausteine im Run-Zustand in die CPU zu übertragen. (Ich denke da an meine 313C, da wars sogar möglich, den OB1 im Laufenden Betrieb abzuändern)

Kennt jemand den Mechanismus, mit dem die S7 dazu gebracht wird, einen FC oder FB anzulegen und könnte man sowas auch Anwenderprogrammäßig verwenden? Vielleicht kennt ja hier jemand das Prinzip vom "dynamic loading" aus der Anwendungsprogrammierung, wo man Programmbibliotheken dynamisch an sein Programm anbinden kann (dlopen, dlsym...).
Der Vorteil und Nutzen bei so einer Geschichte läge dann darin, daß man dem Nutzer z.B. einer Fertigungsstraße, die öfters mal umgerüstet werden muß (Möbelteile, Fenster und Türen bzw. Verpackungen für saisonabhängige Lebensmittel...), die Möglichkeit gäbe, eine bestimmte Funktionalität gegen eine Andere auszutauschen, ohne ihm gleich ein PG dort lassen zu müssen. (Für alle die's kennen, man hätte dann sowas wie eine CORBA-Architektur, wo man dann die einzelnen Module nach Bedarf "reinsteckt")

Jaja, ich weiß schon was man sich da denkt, und wahrscheinlich geht's auch garnicht anders, als: "Leg doch alle FC's und FB's, die du jemals brauchst in der CPU ab und..."

Gruß
Thomas
 
Ist im Prinzip mit geringem Aufwand machbar. Voraussetzung: Alle ausgetauschten FBs/FCs habe die gleiche Schnittstelle (sonst ist die SPS beleidigt) und jeweils die gleiche Bausteinnummer (sonst müsste der Aufruf nachgepflegt werden). Und die verschiedenen Varianten sind in verschiedenen Projekten bzw. Programmen abgelegt (ein Baustein ist im Programm eindeutig).
Mit ACCON-S7-Backup/Restore http://www.deltalogic.de/software/s7-power-tools/s7-backuprestore.htm kann nun per Kommandozeile die gewünschte Variante in die SPS übertragen werden. Sinnvollerweise ist dazu die SPS vorher in Stop zu bringen (wenn es sich um mehr als einen Baustein handelt), damit die Bausteinkonsistenz gewahrt bleibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie wäre es mit

cc fb [mw10]

oder

uc fb [mw10]

wobei vorher im MW10 die entsprechende Baustinnummer eingetragen wird
Hmm, treiben wir das Speil jetzt noch weiter...............

Wie funktioniert das ganze, wenn ich einen FC mit Parametern indiziert aufrufen möchte, also z.B.

call fc [mw10]
Parameter 1:= ....
Parameter 2:= ....

Nach sowas such ich nämlich schon seit 2 Jahren!

mfg
Maxl
 
Hallo Maxl

definier doch einfach z.B. ab Mw200 10Worte als schmiermerkerbereich, welche du vor dem Aufruf mit den entsprechenden Parametern versorgst und aus welchen du nach Beendigung des Bausteins die Rückgabewerte entsprechend entsorgst(Anzahl de Worte nach bedarf auch anders).Oder habe ich dich falsch verstanden, mit dem was du meintest?

Thomas
 
der ansatz von thomass5 ist gar nicht schlecht.

wäre so wie man das bei s5 auch gehandhabt hat.

Code:
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1
BEGIN
NETWORK
TITLE =
//testzuweisung
      L     10; 
      T     MW    10; //DB
      L     20; 
      T     MW    12; //Anfangsadresse im DB
 
      L     MD    10; 
      CALL FC     2 ;
END_FUNCTION
 
FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1
 
VAR_TEMP
  uebergabe_db : INT ; //db in dem die übergabedaten stehen
  uebergabe_dw : INT ; //anfangsadresse im db
END_VAR
BEGIN
NETWORK
TITLE =
      T     LD     0; 
      AUF   DB [#uebergabe_db]; 
 
      L     #uebergabe_db; //test
      L     #uebergabe_dw; //test
END_FUNCTION
 
Vorschlag FC statt FB

Machbar ist folgendes, wenn vielleicht auch ohne Dokumentation nur bedingt nachvollziehbar.
Ich verwende manchmal statt einem FB eine FC und übergebe dieser FC als zusätzlichen Parameter die Nummer des aktuellen DB. In der FC kann dann mit AUF DI [DB_nr] der DB als Instanzdatenbaustein geöffnet werden und die Werte sind per DID, DIB, ... ansprechbar. Natürlich leider nicht mit symbolischen Adressen. Deshalb verwende ich das nur bei Sachen, die ausgetestet und gründlich dokumentiert sind und sehr oft wiederverwendet werden sollen, da vom Wald- und Wiesen-Prog kaum nachvollziehbar.
 
Ich muss jetzt mal einen alten Thread ausgraben:

Hat schon einer geschafft mit TIA und SCL einen FC dynamisch aufzurufen? Ich bin bisher kläglich gescheitert
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss jetzt mal einen alten Thread ausgraben:

Hat schon einer geschafft mit TIA und SCL einen FC dynamisch aufzurufen? Ich bin bisher kläglich gescheitert
Interessant wäre das ja nur, wenn man einen Funktionszeiger, so wie in C/C++ mitgeben kann, der dann einfach nur ein definiertes (oder dynamisches) Interface implementiert. Und das ganze auf sauberem (=symbolischem) Weg. Das ist zum einen Utopisch, da Siemens ja intern wieder auf so ein Nummernsystem setzt, womit die sauber-symbolische Variante wohl so nicht machbar wäre.
Nachdem ich sowas mit dynamischen Funktionspointern bisher nicht mal bei Rockwell und B&R in STL gesehen habe, bezweifle ich dass es sowas bei Siemens je geben wird.

Ein gangbarer Weg, sowas in der S7-Welt wirklich laufen zu lassen, ist der Einsatz des ODK. Aber ob man sich den finanziellen Aufwand antun will.......

lg
 
Interessant wäre das ja nur, wenn man einen Funktionszeiger, so wie in C/C++ mitgeben kann, der dann einfach nur ein definiertes (oder dynamisches) Interface implementiert.

Also das gehört zu den Funktionen über die sich ein normaler Instandhalter freuen würde :ROFLMAO:
Denkt doch mal dran, dass die Maschinen und Programme wartbar bleiben müssen.
 
Also das gehört zu den Funktionen über die sich ein normaler Instandhalter freuen würde :ROFLMAO:
Denkt doch mal dran, dass die Maschinen und Programme wartbar bleiben müssen.
Das ist richtig!
Drum gehören solche Dinge auch nicht in die Maschinensteuerung sondern in den abstrakten Teil. Das macht vielleicht im Prüfstandsbau und bei hochkomplexen Serienmaschinen Sinn, aber ob da soviel Simatic-Zeug drinnen ist?
 
Zurück
Oben