Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

Problem mit RAMP_INT

guerillero
2007-06-14
2007-06-21
  • guerillero - 2007-06-14

    Hallo,

    ich habe da folgendes Problem.

    Ich will mit RAMP_INT aus der Bibliothek Util.lib arbeiten. Wenn ich nun RI in als PRG-FUP aufrufe, funktioniert der Baustein einwandfrei.

    Als PRG-ST tut sich leider nichts. Die Sache sieht folgendermaßen aus:

    Deklarationsteil:

    PROGRAM Rampe_ST

    VAR

    Links: RAMP_INT;
    
    raus: INT;
    

    END_VAR

    Implementationsteil:

    links.IN:=5000;

    links.ASCEND:=10;

    links.DESCEND:=10;

    links.TIMEBASE:=t#10ms;

    links.RESET:=FALSE;

    raus:=links.OUT;

    Wenn ich dann RI als FUN-FUP aufrufen will tut sich wieder nichts.

    Hat jemand eine Idee was da schief läuft?

    Gruß

    Michael Pajonk

     
  • Martin Wunsch - 2007-06-14

    Ich hab das Ding mal in FUP erstellt und dann nach AWL (ST) übersetzt. Das schaut dann so aus:

    CAL   Links(IN := 5000, ASCEND := 10, DESCEND := 10, TIMEBASE := T#10ms, RESET := FALSE)
    LD   Links.OUT
    ST   raus
    

    Mir scheint, als ob Du zwar die Werte in die Eingänge schreibst und den Ausgang liest, aber die eigentliche Funktion nicht aufrufst (CAL).

    Gruß

    Martin

     
  • guerillero - 2007-06-14

    Hallo,

    die Funktion wird in einem anderen Baustein aufgerufen. Ich habe zum Testen eine kleine Additionsfunktion geschrieben und aufgerufen. Funktioniert prima. Wenn ich jedoch die RAMP_INT als FUN-FUP aufrufe wird zwar der Wert übergeben aber RAMP_INT arbeitet nicht.

    Das oben aufgeführte Programm Rampe_ST wird im PLC_PRG aufgerufen und arbeitet ebenfalls nicht.

    Funktioniert es denn bei dir?

    Edit: AWL und ST sind zwei Paar Schuhe. Warum geht RI wenn es direkt als Programm Baustein aufgerufen wird jedoch nicht, wenn es von einem anderen Baustein als Funktion aufgerufen wird?

    Gruß

    Michael Pajonk

     
  • hugo - 2007-06-14

    ich kann zu den obigen modulen leider nichts sagen, kenne sie nicht.

    aber eine alternative findest du in der freien lib von oscat

    unter w www.oscat.de w

     
  • J Schohaus - 2007-06-15

    Hallo guerillero

    Zitat:
    die Funktion wird in einem anderen Baustein aufgerufen

    ???

    Deine Funktion "Links" muss aufgerufen werden !

    z.B.

    links.IN:=5000; 
    links.ASCEND:=10; 
    links.DESCEND:=10; 
    links.TIMEBASE:=t#10ms; 
    links.RESET:=FALSE; 
    links;
    raus:=links.OUT; 
    

    oder was übersichtlicher wäre

    links(
       IN:= 5000,
       ASCEND:= 10,
       DESCEND:= 10,
       TIMEBASE:= t#10ms,
       RESET:= FALSE,
       OUT=> raus );
    

    eventuel dein beispiel projekt beifügen

    mfG Jochen

     
  • Martin Wunsch - 2007-06-15

    Die CoDeSys-Hilfe sagt unter dem Punkt "Aufruf von Funktionsblöcken in ST" Folgendes:

    Zitat:
    Ein Funktionsblock in ST wird aufgerufen, und anschließend in Klammer die gewünschten Werte den Parametern zuweist.
    (entspricht Jochen's 2. Codeschnipsel).

    Wie meinen, "Die Funktion wird in einem anderen Baustein aufgerufen"? Das wäre wie als ob Du jemandem sagst "Stell mir hier etwas her", aber das Material dafür an einem anderen Ort bereitstellst.

    Du mußt die Parameter für einen Funktionsblock dort bereitstellen bzw. das Ergebnis abfragen, wo Du den Funktionsblock aufrufst.

    Gruß

    Martin

     
  • guerillero - 2007-06-15

    Hallo,

    also ich habe den Baustein FUN_Aufruf. Dieser ruft die Funktionen addition, steigung und Rampe_FUN_ST auf.

    FUN_Aufruf wird von PLC_PRG aufgerufen. Rampe_PRG_ST wird ebenfalls von PLC_PRG aufgerufen und dient zur kontrolle ob RAMP_INT prinzipiell funktioniet. Jetzt wo links aufgerufen wird funktioniert es. Danke für den Hinweis.

    Alles funktioniert erwartungsgemäß bis auf den Funktionsaufruf von Rampe_FUN_ST.

    Ich habe das Ganze Angehängt.

    Gruß

    Michael Pajonk

    funktionsaufruf.pro [31.97 KiB]

     
  • guerillero - 2007-06-15

    Hallo,

    hier habe ich es mal mit der Oscat lib versucht. Leider auch ohne Erfolg.

    Der Rechteckgenerator gen_sqr liefert mir am Ausgang Out nur die hälfte der Singnal Amplitude(O_RMP_FUP).Dafür funktioniert die Rampe FT_rmp.

    Edit: Das hat sich erledigt. Habe ein große Periodendauer eingestellt und das "-" nicht gesehen.

    In ST funktioniert FT_rmp auch wenn es sich um ein Programm-Baustein handelt (O_RMP). Wird jedoch ein Funktionsbaustein genutzt, der von FUN_Aufruf aufgerufen wird, springt Oscat_RMP sfort auf den Endwert.

    Die Variable Taster wir durch ein Visu Objekt getoggelt und beeinflusst die Variable Schmu.

    Weiß jemand Rat?

    Gruß

    Michael Pajonk

    funktionsaufruf2.pro [126.14 KiB]

     
  • Erik Böhm - 2007-06-15

    Hallo

    Deklariere deine Instanzen von rechts / links als Globale Variablen, dann gehts.

    Da sich die Funktionsblöcke die Variablenzustände merken müssen, kann das nicht als lokale Variable einer Funktion erstellt werden. Funktionen belegen den Speicher nur zur Laufzeit, sind also sehr vergesslich.

    Gruss Erik

     
  • guerillero - 2007-06-15

    Hallo,

    daran hat es gelegen. Jetzt geht der Funktionsaufruf einwandfrei.

    Vielen Dank an alle Beteiligten für die rege Anteilnahme und die schnelle Hilfe.

    Gruß

    Michael Pajonk

     
  • guerillero - 2007-06-15

    Hm, zu früh gefreut. Durch die Globale Deklaration lässt sich die Funktion nur einmal nutzen. D.h. ich kann mir das Ganze auch sparen. Es ist also für aufwendigere Funktionen nicht so wie bei C, dass wenn man eine Funktion schreibt diese dann beliebig oft einsetzen kann. Oder sehe ich da mal wieder was fasch?

    Gruß

    Michael Pajonk

     
  • Erik Böhm - 2007-06-18

    Hallo

    Das geht natürlich auch in CoDeSys. Du musst aus der FUNCTION einen FUNCTION_BLOCK machen. Dieser ist dann instanzierbar.

    Gruss

    Erik

     
  • Ralph Holz - 2007-06-18

    Hallo miteinander,

    das ist IEC Grundprinzip (haben wir von 3S uns nicht ausgedacht) alle Variablen von Funktionen werden beim Aufruf initialisiert und verlieren nach der Rückkehr zum Aufrufer ihre Gültigkeit. CoDeSys legt die Variablen von Funktionen auf dem Stack ab.

    Für alle "Funktionen" die irgendwie ein Gedächtniss brauchen gibt es die Funktionsblöcke die durch Deklaration beliebig oft verwendet werden können. Aufgerufen werden dann die deklarierten Instanzen.

    Grüße

    Ralph

     
  • guerillero - 2007-06-21

    Hallo,

    mit FUNCTION_BLOCK geht das reibungslos.

    Vielen Dank für die Hilfe.

    Gruß

    Michael

     

Log in to post a comment.