Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: per Pointer eine FC aufrufen?

  1. #1
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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?
    Zitieren Zitieren per Pointer eine FC aufrufen?  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Registriert seit
    19.07.2010
    Beiträge
    1.289
    Danke
    213
    Erhielt 267 Danke für 233 Beiträge

    Standard

    Wäre dir evtl mit einer Sprungleiste geholfen?
    mfG Aventinus

  4. #4
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Zitat Zitat von FrankTheTank Beitrag anzeigen
    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?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    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.

  7. #7
    Registriert seit
    13.09.2010
    Beiträge
    2.292
    Danke
    178
    Erhielt 375 Danke für 355 Beiträge

    Standard

    Hallo zusammen !

    Zitat Zitat von vierlagig Beitrag anzeigen
    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...
    kind regards
    SoftMachine

  8. Folgender Benutzer sagt Danke zu SoftMachine für den nützlichen Beitrag:

    FrankTheTank (08.08.2011)

  9. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.712
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  10. #9
    Registriert seit
    27.07.2011
    Beiträge
    41
    Danke
    17
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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.

Ähnliche Themen

  1. Antworten: 24
    Letzter Beitrag: 31.01.2010, 21:32
  2. Antworten: 10
    Letzter Beitrag: 27.07.2009, 14:27
  3. Zeiger/Pointer auf eine Struktur
    Von logo78 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 29.03.2009, 17:09
  4. Antworten: 4
    Letzter Beitrag: 29.06.2006, 13:37
  5. Eine POINTER Frage
    Von Danielegger im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 30.07.2004, 16:19

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •