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

Eigener Datentyp - Übersetzung scheitert 2.Frage - gl.Bezug

2007-02-06
2007-02-12
  • KentJohnson - 2007-02-06

    Hallo !

    Wo muss ich die Zustandsdefinition meines eigens erstellten Datentyps (* TYPE STATE_TYPE : (FUELLEN_T1,FUELLEN_T2,LEEREN_T1,LEEREN_T2);

    END_TYPE;*) hinpacken, dass die Beschreibung übersetzt werden kann ?

    Vielen Dank ! Kent

    QUELLTEXT:

    TYPE STATE_TYPE : (FUELLEN_T1,FUELLEN_T2,LEEREN_T1,LEEREN_T2);

    END_TYPE;

    PROGRAM MAIN

    VAR

    STATE : STATE_TYPE;

    END_VAR

    VAR_INPUT

    T1LEER : BOOL ;

    T1VOLL : BOOL ;

    T2LEER : BOOL ;

    T2VOLL : BOOL ;

    END_VAR

    VAR_OUTPUT

    VEIN1 : BOOL := 0 ;

    VAUS1 : BOOL := 1 ;

    VEIN2 : BOOL := 0 ;

    VAUS2 : BOOL := 1 ;

    STOER : BOOL := 0 ;

    END_VAR

    CASE STATE OF

    FUELLEN_T1 : IF T1VOLL = FALSE THEN

              VEIN1 := 1 ;
    
              STATE := FUELLEN_T1 ;
    
                ELSE  IF T1LEER THEN
    
                            STOER := 1 ;
    
                    STATE := FUELLEN_T1 ;
    
                      ELSE STATE := FUELLEN_T2 ;
    
                      END_IF ;
    
                END_IF ;
    

    FUELLEN_T2 : IF T2VOLL = FALSE THEN

              VEIN2 := 1 ;
    
              STATE := FUELLEN_T2 ;
    
                ELSE  IF T2LEER THEN
    
                   STOER := 1 ;
    
                   STATE := FUELLEN_T2 ;
    
                     ELSE STATE := LEEREN_T2 ;
    
                     END_IF ;
    
               END_IF ;
    

    LEEREN_T2 : IF T2LEER = FALSE THEN

              VAUS2 := 0 ;
    
              STATE := LEEREN_T2 ;
    
                ELSE  IF T2VOLL THEN
    
                   STOER := 1 ;
    
                   STATE := LEEREN_T2 ;
    
                     ELSE STATE := LEEREN_T1 ;
    
                     END_IF ;
    
                END_IF ;
    

    LEEREN_T1 : IF T1LEER = FALSE THEN

                 VAUS1 := 0 ;
    
             STATE := LEEREN_T1 ;
    
               ELSE IF T1VOLL THEN
    
                     STOER := 1 ;
    
                 STATE := LEEREN_T1 ;
    
                   ELSE STATE := FUELLEN_T1 ;
    
                       END_IF ;
    
               END_IF ;
    

    END_CASE ;

    END_PROGRAM

     
  • Anonymous - 2007-02-06

    Originally created by: Bernhard Werner

    Hallo Kent,

    Sie müssen einen Datentyp definieren. Also auf der linken Seite im Object Organizer das Register Datentyp wählen. Objekt einfügen wählen, als Name STATE_TYPE angeben. Dann den Code einfügen, so wie sie ihn geschrieben haben. Dann können sie den Datentyp überall verwenden, so wie sie es gemacht haben.

    Bernhard Werner

     
  • KentJohnson - 2007-02-06

    Vielen Dank Herr Werner !

    Gruß Kent Johnson

     
  • KentJohnson - 2007-02-08

    Hallo !

    Bitte noch eine kurze Nachfrage zu oben gegebener Ablaufsteuerung:

    Ist es syntaktisch korrekt innerhalb der Anweisung 'case of' nur die sich ändernden Ausgangsvariablen auszugeben, oder sollten für jeden Zustandsübergang auch sämtliche Ausgangsvariablen gelistet sein?

    Minimal:

    VAR_OUTPUT

    VEIN1 : BOOL := 0 ;

    VAUS1 : BOOL := 1 ;

    VEIN2 : BOOL := 0 ;

    VAUS2 : BOOL := 1 ;

    STOER : BOOL := 0 ;

    END_VAR

    CASE STATE OF

    FUELLEN_T1 : IF T1VOLL = FALSE THEN

                        VEIN1 := 1 ;
    
                        STATE := FUELLEN_T1 ;
    
                     ELSE    IF T1LEER THEN
    
                                   STOER := 1 ;
    
                                   STATE := FUELLEN_T1 ;
    
                                ELSE STATE := FUELLEN_T2 ;
    
                                END_IF ;
    
                     END_IF ;
    

    ==============================================

    Zum Vergleich:

    VAR_OUTPUT

    VEIN1 : BOOL := 0 ;

    VAUS1 : BOOL := 1 ;

    VEIN2 : BOOL := 0 ;

    VAUS2 : BOOL := 1 ;

    STOER : BOOL := 0 ;

    END_VAR

    CASE STATE OF

    FUELLEN_T1 : IF T1VOLL = FALSE THEN

                         VEIN1 := 1 ;
    

    VAUS1 := 1 ;
    VEIN2 := 0 ;
    VAUS2:= 1 ;
    STOER := 0 ;

                         STATE := FUELLEN_T1 ;
    
                     ELSE    IF T1LEER THEN
    

    VEIN1 := 0 ;
    VAUS1 := 1 ;
    VEIN2 := 0 ;
    VAUS2:= 1 ;

                                   STOER := 1 ;
    
                                   STATE := FUELLEN_T1 ;
    
                                ELSE <span style="color: orange">VEIN1 := 0 ;
                                        VAUS1 := 1 ;
                                        VEIN2 := 0 ;
                                        VAUS2:= 1 ;
                                        STOER := 0 ;</span>
    
                                        STATE := FUELLEN_T2 ;
    
                                END_IF ;
    
                     END_IF ;
    
     
  • Anonymous - 2007-02-09

    Originally created by: Bernhard Werner

    Hallo Kent,

    Syntaktisch korrekt ist es auf jeden Fall. Es ist nur so: in einem Funktionsblock werden die Outputs nur beim Programmstart initialisiert. Die Variablen werden nicht bei jedem Aufruf initialisiert. Das heisst, vermutlich macht es schon Sinn die Variablen immer auf die zu erwartenden Werte zu setzen.

    Bernhard Werner

     
  • KentJohnson - 2007-02-09

    Hallo Bernhard,

    Man kann also sagen, sobald der Code das "Top Module" (PRG) beschreibt ist es korrekt, da die Variablen ständig initialisiert werden, doch kann es zu Problemen kommen sobald der Einsatz als Funktionsblock (FB) gewünscht ist.

    Vielen Dank und schönes Wochenende, Gruß

    Kent

     
  • KentJohnson - 2007-02-12

    Habe mich gerade nochmals informiert: Demnach wird die Variablendeklaration einmalig und nur bei Programmstart (Kaltstart) durchlaufen. Ausgangsvariablen die in 'case' wirksam sein sollen sind nach der Deklaration im Programmteil nochmals auszugeben. Diese werden dann mit jedem Takt NEU initialisiert.

    Bsp:

    ...

    VAR_OUTPUT

    A : BOOL ;

    B : BOOL ;

    END_VAR

    A:=0;

    B:=0;

    CASE STATE OF

    Z1 : IF Q1 = 1 THEN

        (* A:=0;
    
            B:=0; *)
    
            STATE:=Z1;
    
         ELSE
    
            A:=1;
    
            B:=1;
    
            STATE:=Z2;
    
         END_IF;
    

    ...

     

Log in to post a comment.