Aufruf eines Programmes (ST)

2009-12-02
2009-12-03
  • chris07011985 - 2009-12-02

    Hallo,

    ich habe neben meines Hauptprogrammes (PRG_PCL) noch ein weiteres Programm. Sowohl das Hauptprogramm als auch das zusätzliche Programm sind in ST geschrieben.

    Jetzt hänge ich an einer Stelle und komme nicht weiter: Wie kann ich das Programm in meinem Hauptprogramm aufrufen ? Wenn ich Versuche das Programm als eine Instanz im Hauptprogramm zu deklarieren bekomme ich eine Fehlermeldung.

    Hier der Code:

    PROGRAM PLC_PRG

    VAR

    inc: inkrementierung;
    
    k: int;
    

    END_VAR

    inc(j:=1); <---Hier kommt die Fehlermeldung


    PROGRAM inkrementierung

    VAR_INPUT

    j:INT;
    

    END_VAR

    VAR_OUTPUT

    k:INT;
    

    END_VAR

    k := j + 1;


     
  • Anonymous - 2009-12-02

    Originally created by: mg

    ne weitere Instanz öffnet man mit FUNCTIONBLOCK.

    Man kann zwar auch ein PROGRAM als Unterprogramm öffnen, aber das ist keine Instanz. Soweit ich weiß kann ich einem PROGRAM keine Variablen übergeben (ich erhalte nur uU welche zurück)

    Wenn ich schon ein Untergrogramm verwenden will (ohne Variablen zu übergeben) geht das am besten, indem ich dem PROGRAM eine AKTION hinzufüge. Dann erolgt der Zugriff allerding nur innerhalb des PROGRAM

     
  • Rolf-Geisler - 2009-12-02

    Hi,

    das Anhängen einer Aktion geht in ST nicht.

    Wenn schon zwei unabhängige Programme benötigt werden, ist die sauberste Lösung, beide Programme über die Taskkonfiguration aufzurufen (können auch in einer gemeinsamen Task laufen), und die Daten als globale Variablen auszutauschen.

    Wenn es nur um das Inkrementieren eines Wertes geht oder andere einfache Berechnungen, läßt sich das besser über eine FUNCTION realisieren, die dann im Hauptprogramm aufgerufen wird.

    Eine Funktion verwendet man wie eine deklarierte (parametrierbare) Variable, d.h. man braucht sie im verwendenden Baustein nicht zu instanziieren.

    Beispiel:

    FUNCTION inkrementierung: INT
    VAR_INPUT
    j:INT;
    END_VAR 
    inkrementierung := j + 1;
    

    Der Aufruf im Hauptprogramm sieht dann so aus:

    VAR
    k:INT;
    inc: inkrementierung;
    END_VAR
    k := inc(j:=1);
    

    Das von der Funktion zurückgegebene Ergebnis kann in komplexeren Anweisungen direkt verarbeitet werden, hier wird es halt nur auf eine lokale Variable des Programms geschrieben.

    Genaueres steht auch in der CoDeSys online Hilfe.

    Gruss

     
  • Uwe - 2009-12-03

    Hallo Chris ...

    also ..

    Programme kann man nicht instanziieren ...

    wenn du mehrere Instanzen benötigst, dann musst du einen

    Funktionsblock schreiben ..

    Aber man kann natürlich Programme in anderen Programmen aufrufen ...

    auch ohne Taskkonfiguration ...

    In deinem Fall musst du nur die Deklaration im VAR ... END_VAR Block löschen ...

    Der Aufruf sollte dann so aussehen

    inkrementierung( j := 1);
    

    Programme können sehr wohl INPUT, OUTPUT und sogar IN_OUT Variablen übergeben bekommen ...

    man kann sogar an Programme Aktionen dran hängen,

    wobei diese Aktionen

    nicht mit den Aktionen in AS zu verwechseln sind ...

    Man markiert dazu links im Baum das Programm und clickt dann mit der rechten Maustaste

    das Contextmenü auf. Dort kann man dann eine Aktion hinzufügen.

    Diese Aktionen müssen dann aber auch noch aufgerufen werden ...

     
  • chris07011985 - 2009-12-03

    Erst einmal vielen Dank an euch alle für die Antworten! Mitlerweile habe ich mein Problem gelöst bekommen. Habe eben auch im CoDeSys-Handbuch was dazu gefunden. Hatte dieses mir zwar schon mehrmals angeschaut aber trotzdessen die betreffende Stelle immer wieder übelesen oder übersehen.

    Also nochmal Vielen Dank und einen schönen Tag,

    Christian

     

Log in to post a comment.