per Pointer eine FC aufrufen?

FrankTheTank

Level-1
Beiträge
41
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits!

Ich möchte, dass z.B. mein FB71 die FC81 über einen Pointer aufruft. Diese FC81 soll dann den Pointer auf FC82 setzen. Wenn ich beim nächsten Zyklus im FB71 bin, dann ruft diese den Pointer auf, der nun auf FC82 zeigt, usw.

Ist das prinzipiell möglich oder kann ich mit Pointern nur auf Daten zugreifen?
 
pointer geht nicht.
aber freier call mit angabe einer variablen nummer geht... UC und CC lassen das zu. allerdings kannst du dann keine parameter übergeben...

wie wäre es mit einer schrittkette oder einer sprungleiste?
 
Hallo!

Parameterübergabe spielt keine Rolle.

Da ich ein Neuling bin, weiss ich leider nicht was eine Sprungleiste ist.

Es geht darum, dass ich eine riesige CASE Verschachtelung vermeiden möchte.

Könnte man nicht einen String aus einer Variable (z.B. currentState) basteln und diesen String dann in SCL als ausführbaren Befehl interpretieren?

So in der Art (nur vom Grundgedanken):
Code:
currentState := 42;
meinString := "FC" + "currentState" + "()";

(* rufe Funktion namens "meinString" auf *)
???
Dann könnte ich in FCxx einfach "currentState" ändern und hätte im Endeffekt sowas wie einen dynamischen FC-Pointer.

Das ganze würde nämlich den Platzverbrauch meines Codes um geschätzte 90% reduzieren.
 
Hallo!

Parameterübergabe spielt keine Rolle.

Da ich ein Neuling bin, weiss ich leider nicht was eine Sprungleiste ist.

Es geht darum, dass ich eine riesige CASE Verschachtelung vermeiden möchte.

Könnte man nicht einen String aus einer Variable (z.B. currentState) basteln und diesen String dann in SCL als ausführbaren Befehl interpretieren?

So in der Art (nur vom Grundgedanken):
Code:
currentState := 42;
meinString := "FC" + "currentState" + "()";

(* rufe Funktion namens "meinString" auf *)
???
Dann könnte ich in FCxx einfach "currentState" ändern und hätte im Endeffekt sowas wie einen dynamischen FC-Pointer.

Das ganze würde nämlich den Platzverbrauch meines Codes um geschätzte 90% reduzieren.

Das geht nicht, wenn, dann ist der Vorschlag von 4L möglich.
Wieso verringert es den Platzbedarf deines Programmes, wenn du den Code in Unterprogramme auslagerst und dort bearbeitest?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei einem PID-Baustein der Standard-PID Bibliothek kann man über einen Parameter vom Typ BLOCK_FC eigene Funktionen angeben, die dann im Soll- oder Istwertzweig im Baustein selber aufgerufen werden.
Parameterversorgung funktioniert aber wie erwähnt nicht direkt. Laut Handbuch zu dieser Bibliothek soll man in den erstellten FCs auf die Instanzdaten des Regler FBs zugreifen.

Beispiel aus dem Handbuch:
Code:
FUNCTION ”Anwender-FC”
VAR_TEMP
  INV : REAL;
  OUTV : REAL;
END_VAR
BEGIN
  L ”Regler_DB”.SPFC_IN
  T #INV
  //Anwenderfunktion OUTV=f(INV)
  L #OUTV
  T ”Regler_DB”.SPFC_OUT
END_FUNCTION
Wenn man mehrere Regler hätte, müsste man also entsprechend die FCs ebenfalls pro Reglerinstanz duplizieren. Richtig schön ist das alles nicht.

Vor allem ist da in SCL garnichts zu holen, weil man BLOCK_FC zwar als Parameter angeben kann, damit im Baustein aber nichts anfangen kann außer an andere Bausteine durchzureichen.

Die Standard-PID Bausteine wurden wohl mit einem extra angepassten SCL-Compiler erstellt (Kommentar sagt "generiert vom SCL Übersetzer Version: P 0.95") oder es wurde der UC Befehl später per Hand im AWL Code eingebaut.
 
Hallo zusammen !

pointer geht nicht.
aber freier call mit angabe einer variablen nummer geht... UC und CC lassen das zu. allerdings kannst du dann keine parameter übergeben...

Sehe ich auch so...

wenn ich nicht irre (kann im Moment nicht nachsehen..) ging es in AWL so:

L 4 //FC-Nummer
T MW 10 //speichern

//FC 4 muss aber auch vorhanden sein !

UC FC[MW10] //FC 4 (4 = MW10) aufrufen

Das MW 10 musst du dann selbst verwalten, um den richtigen Aufruf durchzuführen...:)
 
Hallo,
unahängig von der Machbarkeit und der ggf. möglichen Code-Reduzierung ...
Wer soll hinterher noch durch so ein Programm durchsteigen ?
Bis du dir sicher, dass du selber es noch nach einiger Zeit (also >= 1 Woche nach Erstellung) verstehen wirst ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Verständlichkeit des Codes ist eher zweitrangig, da es erstmal nur um das Ergebnis geht. Ich werd es erstmal trotzdem mit CASE Konstrukten machen.

L 4 //FC-Nummer
T MW 10 //speichern

//FC 4 muss aber auch vorhanden sein !

UC FC[MW10] //FC 4 (4 = MW10) aufrufe
Das sieht interessant aus. Wird wohl aber in die Kategorie "wenn alles andere fertig ist" fallen, da ich im Moment leider null AWL Kenntnisse habe und mein Betreuer mir aufgetragen hat, das ganze mit CASE zu machen, weil es für kleinere Programme einfach schon funktioniert.
Danke trotzdem, ich werd den Vorschlag bestimmt später weiter verfolgen.
 
Zurück
Oben