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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 29

Thema: Aufruf einer FUNCTION abhängig von einer Eingangsvariablen

  1. #11
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja RobiHerb hat Recht, in Hochsprache z.B. C# geht das. Nennt sich "Delegate". Nutzt man z.B. wenn man eine Funktion schreibt die immer das gleiche machen soll mit unterschiedlichen Datentypen. Entweder kann man da die Funktion überladen und mehrmals mit dem gleichen Namen implementieren jedoch mit unterschiedlichen Signaturen oder man nutzt delegates. Dann erübrigt es sich Funktionen mit dem selben Inhalt jedoch unterschiedlichen Datentypen zu implementieren.

    Beispiel:

    FunktionA(int a, int b)
    {
    return a*b;
    }

    FunktionA(real a, real b)
    {
    return a*b;
    }

    Beide Funktionen haben den selben Inhalt jedoch für unterschiedliche Datentypen. Hier müsste man diese Fkt. nun überladen oder halt eine Delegate anlegen dann funktioniert das für alle Datentypen die definiert sind. Ist natürlich ein Pippifaxbeispiel. Aber soweit ich mich erinnere trifft das den Gedanken ganz gut.

    Kurzum: In Codesys geht das so nicht. Das einzige was du tun kannst ist (Achtung: würde ich nicht empfehlen):
    Eine Funktion anlegen mit einer Signatur mit einem Pointer to Byte dann brauchst du noch einen Eingang der jeweils definiert auf welchen Datentyp gezeigt wird damit du das intern per Pointer to Byte in ein Real oder Dint oder was auch immer kopieren kannst. Du musst dann die Maxanzahl der möglichen Singaturparameter anlegen und in der Funktion jeweils den beschreibenden Parameter prüfen ob dieser > 0 ist was bedeutet, dass der Typ verwendet wird. Dann siehst du ob der Pointer auch valide Daten zugreift. Du musst natürlich trotzdem jeden Parameter immer beim Fktaufruf anlegen da das sonst syntaktisch nicht korrekt wäre.

    Beispiel:
    Funktion(
    pValue1 : Pointer to Byte,
    TypeValue1 : INT,
    pValue2 : Pointer to Byte,
    TypeValue2 : INT,
    pValue3 : Pointer to Byte,
    TypeValue3 : INT,
    )

    Wobei TypeValue jeweils intern z.b. so interpretiert wird:
    0 = Pointerwert nicht valide
    1 = DINT
    2 = REAL
    3 =...
    ==> Kannst natürlich auch als Enum anlegen dann wird es übersichtlicher

    Wie gesagt: Nicht zu empfehlende Lösung...

  2. #12
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi.
    Also ich habe das so verstanden, dass du in deinem FunctionBlock an einem bestimmten Punkt die Funktion ausführen möchtest, welche an dem Eingang liegt.
    Also was Du vorhast geht sehrwohl und dies auch noch relativ simple. Stichwort Interface.
    Du deklarierst dir ein Interface vom Typ "Irgendwas", welches eine Methode "genericFunction" enthält.
    als Eingang deklarierst Du:

    Code:
    VAR_INPUT
    Baustein : Irgendwas;
    END_VAR
    Jetzt kannst du einen FunktionsBlock erstellen, welcher das Interface "Irgendwas" implementiert.
    in diesem kannst du jetzt die Methode "genericFunction" erstellen und eine "Funktion" deiner Wahl hinterlegen, bzw. ausprogrammieren.

    als letzte Aktion übergibst du nun den Baustein an dein Eingang.

    Code:
    Instanz(Baustein:=DeinNeuerBaustein);
    Und in deinem Baustein kannst du die externe "Funktion" jetzt so aufrufen:

    Code:
    Baustein.genericFunction();

    Zugegeben, diese Version macht dann Sinn, wenn du der Methode werte übergeben möchtest,
    diese nicht als Ausgang Preis geben magst, oder einfach elegant programmieren willst .
    Andernfalls kannst au auch einfach eine INOUT Variable ungleich 0 setzen und dann darauf reagieren.
    bspw. in einer Case Struktur.

    Ich persönlich finde jedoch die Variante des Inteface eleganter.
    Man kann so in dem FB die externe Methode aufrufen und es kann natürlich auch so ein Wert von außen an den FB über den Methodenrückgabewert zurückgegeben werden.


    ich hoffe ich konnte dir helfen.
    Geändert von SY50 (27.01.2016 um 00:37 Uhr)

  3. #13
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Früher hieß es "Nobel geht die Welt zugrunde".
    Heutzutage ist niemand mehr nobel, heute geht die Welt durch "elegante" Programmierung zugrunde.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. #14
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Früher hieß es "Nobel geht die Welt zugrunde".
    Heutzutage ist niemand mehr nobel, heute geht die Welt durch "elegante" Programmierung zugrunde.

    Harald
    Ein Kunde von uns hat es mal so in einer Ausschreibung spezifiziert, das der Originallaut: "...... Es ist ausreichend Speicherplatz vorhanden. Auf trickreiche Programmierung wird kein Wert gelegt".

  5. #15
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Wir benutzen so etwas als "Callback" Funktion.
    Beispiel:
    In einem FB soll aufgrund äußerer Einflüsse eine Aktion ausgeführt werden.
    Bevor dies passiert, wird eine Callbackmethode aufgerufen (externe Methode).
    In dieser Methode, welche einige Werte übergeben bekommen hat, können nun Rückgabewerte manipuliert werden.
    Nachdem die Callbackmethode aufgerufen wurde, wird die Aktion im FB mit den manipulierten
    oder den ursprüglichen Werten ausgeführt.

  6. #16
    Registriert seit
    08.02.2007
    Ort
    A-2320
    Beiträge
    2.252
    Danke
    244
    Erhielt 332 Danke für 303 Beiträge

    Standard

    Zitat Zitat von SY50 Beitrag anzeigen
    Wir benutzen so etwas als "Callback" Funktion.
    Beispiel:
    In einem FB soll aufgrund äußerer Einflüsse eine Aktion ausgeführt werden.
    Bevor dies passiert, wird eine Callbackmethode aufgerufen (externe Methode).
    In dieser Methode, welche einige Werte übergeben bekommen hat, können nun Rückgabewerte manipuliert werden.
    Nachdem die Callbackmethode aufgerufen wurde, wird die Aktion im FB mit den manipulierten
    oder den ursprüglichen Werten ausgeführt.
    Interessant, kannst Du beschreiben welche Prozessfunktion sich da konkret dahinter verbirgt, also was macht das "Teil" genau?

  7. #17
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    @SY50
    Ja, aber ich habe den TE eher so verstanden, dass er einen String "My_Function" mit dem Inhalt "Funktion_1" übergeben will und im FB dann diese Funktion (Funktion_1) aufrufen und ausführen lassen will.
    Übergibt er den String "Funktion_2", dann eben diese Funktion aufrufen und ausführen.

    Wäre das mit deinem Konstrukt möglich?
    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

  8. #18
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @Ralle
    Indirekt. Er kann ja der Interfacemethode dann einfach den String als Input Variable übergeben und darin dann auf den String reagieren.

    @borromeus
    Ich könnte mir da so einiges vorstellen. Von einfacher Hardware angefangen... Bspw. wenn man auf mehrere externe einflüsse warten möchte oder so....
    Wir benutzen es knkret in folgenden Anwendungen:
    Wir haben in der Steuerung Verschiedene Parameter angelegt, die für diverse Schnittstellen nach außen "sichtbar" sind.
    Diese Parameter können bspw. beschrieben werden. => Wenn ein Schreibbefehl von außen in die Steuerung gelangt, wird eben ein solcher Callback aufgerufen.
    Wird dort nichts gemacht, so wird der Parameter einfach geschrieben.
    Andernfalls kann in dem Callback eine Kundenspezifische Auflösung / Normierung vorgenommen werden, oder schlicht und ergreifend aufgrund des Maschinenzustands das Schreiben des Parameters verweigert werden.

    Ich hoffe das war irgendwie verständlich...

    Also im Großen und Ganzen kann man sagen, wir setzen es da ein, wo man Entscheidungen / Veränderungen in einem Abstrakten FB treffen muss, die man innerhalb des FBs garnicht entscheiden kann... dann wird dies eben nach außen gelegt.

    "Vergleichbar" mit einem Event das in C# von einer Klasse geschmissen wird.
    Gruß

  9. #19
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von SY50 Beitrag anzeigen
    @Ralle
    Indirekt. Er kann ja der Interfacemethode dann einfach den String als Input Variable übergeben und darin dann auf den String reagieren.
    Da ist er aber mit der Case-Variante von PN/DP wesentlich effizienter, nachvollziehbarr und einfacher dran. Mehr wäre es ja bei deiner Methode zum Schluß auch nicht.
    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

  10. #20
    Registriert seit
    04.02.2013
    Beiträge
    271
    Danke
    12
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Ralle Beitrag anzeigen
    Da ist er aber mit der Case-Variante von PN/DP wesentlich effizienter, nachvollziehbarr und einfacher dran. Mehr wäre es ja bei deiner Methode zum Schluß auch nicht.
    Oh... Weit gefehlt. Würde er eine case in dem FB machen, dann müsste er ja beim erzeugen des FBs schon wissen was passieren soll und wenn der Parameter für die case Struktur ein ausgabeparameter des FB wäre, dann würde diese ja erst abgearbeitet werden, wenn der Code durchlaufen würde... Das wäre eben bei der interfacevariante nicht so, da direkt die Methode aufgerufen wird.
    und ja, das wird in manchen Anwendungen manchmal benötigt, auch wenn. Sich nicht jeder das vorstellen kann

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 16.12.2015, 15:57
  2. [codesys] variabler SMS Text abhängig von Zustand einer Variable
    Von linsenpago im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 27.02.2013, 13:35
  3. Antworten: 4
    Letzter Beitrag: 22.06.2012, 15:16
  4. OB1 mit Aufruf einer Funktion in SCL
    Von pinolino im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 29.04.2009, 17:18
  5. Antworten: 10
    Letzter Beitrag: 26.11.2007, 16:34

Lesezeichen

Berechtigungen

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