FUNCTION_BLOCK "FB_Längenmessung"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      xInStartMessung : Bool;   // Startsignal vom TRO (z.B. Separator Flanke)
      xInEndeMessung : Bool;   // Ende Sensor -> Sensor verschalten UDT_Sensor
      xInTeilVorhanden : Bool;   // UDT_Sensor
      xInTeilLang : Bool;   // UDT_Sensor
      xInTeilzuLang : Bool;   // UDT_Sensor
      tInWaitingTime : Time := T#20000ms;   // Timeout
      tInWaitForEnd : Time := T#1500ms;
   END_VAR

   VAR_OUTPUT 
      xOutTeilLang : Bool;
      xOutErrorzuLang : Bool;
      xOutErrorHängt : Bool;
      xOutLeer : Bool;
      xOutEndMessung : Bool;
      sOutLänge : String;
      xOutFinished : Bool;
      xOutTeilKurz : Bool;
   END_VAR

   VAR 
      xFlagTeilVorhanden : Bool;
      xFlagTeilLang : Bool;
      xFlagTeilzuLang : Bool;
      xFlagStartMessung : Bool;
      XFlagEndMessung : Bool;
      xLastSensorLang : Bool;
      xLastSensorVorhanden : Bool;
      xLastSensorzuLang : Bool;
      xLastSensorEndMessung : Bool;
      xTeilLang : Bool;
      xTeilZuLang : Bool;
      xTeilVorhanden : Bool;
      xEndMessung : Bool;
      nState : Int := 10;
      tOnTimeOut {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME;
      xOnWaiting { S7_SetPoint := 'True'} : Bool;
      tOnWaitForEnd {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
   END_VAR


BEGIN
	REGION Längenmessung
	    
	    CASE #nState OF
	            
	        10:  //waiting To start 
	            #xOnWaiting := 0;
	            #xTeilLang := FALSE;
	            #xTeilZuLang := FALSE;
	            #xTeilVorhanden := FALSE;
	            #xEndMessung := FALSE;
	            IF #xInStartMessung AND NOT #xFlagStartMessung THEN
	                #xOutFinished := FALSE;
	                #xOnWaiting := 1;
	                #xTeilLang := FALSE;
	                #xTeilZuLang := FALSE;
	                #xTeilVorhanden := FALSE;
	                #xOutErrorHängt := FALSE;
	                #xOutLeer := FALSE;
	                #xOutTeilKurz := FALSE;
	                #xOutTeilLang := FALSE;
	                #xOutErrorzuLang := FALSE;
	                #sOutLänge := '';
	                #xOutEndMessung := FALSE;
	                #nState := 20;
	            END_IF;
	        20: // überprüfen ob Teil vorhanden  
	            
	            IF #xInTeilVorhanden THEN
	                // #xOnwaiting := 1;
	                #xOutLeer := FALSE;
	                #nState := 30;
	            ELSIF #xInEndeMessung AND NOT #xInTeilVorhanden THEN
	                #nState := 10;
	                #xOutLeer := TRUE;
	                #xOutFinished := TRUE;
	                #sOutLänge := 'Leer';
	            ELSIF NOT #xInEndeMessung AND (#tOnTimeOut.Q) THEN
	                #xOutErrorHängt := TRUE;
	                #nState := 10;
	            END_IF;
	            
	            
	        30: // Messung 
	            
	            IF NOT #xInEndeMessung THEN
	                IF NOT #xTeilLang THEN
	                    #xOutTeilKurz := TRUE;
	                    #sOutLänge := 'Teil Kurz';
	                ELSIF
	                    #xTeilLang AND NOT #xTeilZuLang THEN
	                    #xOutTeilKurz := FALSE;
	                    #xOutTeilLang := TRUE;
	                    #xOutErrorzuLang := FALSE;
	                    #xOutLeer := FALSE;
	                    #sOutLänge := 'Teil Lang';
	                ELSIF #xTeilLang AND #xTeilZuLang THEN
	                    #xOutTeilKurz := FALSE;
	                    #xOutErrorzuLang := TRUE;
	                    #xOutTeilLang := FALSE;
	                    #xOutLeer := FALSE;
	                    #sOutLänge := 'Teil zu Lang';
	                ELSIF (#tOnTimeOut.Q) THEN
	                    #xOutErrorHängt := TRUE;
	                END_IF;
	            ELSE
	                //#xOutEndMessung := TRUE;
	                #nState := 35;
	            END_IF;
	        35: //noch kurz warten
	            IF #tOnWaitForEnd.ET < #tInWaitForEnd THEN
	                IF NOT #xTeilLang THEN
	                    #xOutTeilKurz := TRUE;
	                    #sOutLänge := 'Teil Kurz';
	                ELSIF
	                    #xTeilLang AND NOT #xTeilZuLang THEN
	                    #xOutTeilKurz := FALSE;
	                    #xOutTeilLang := TRUE;
	                    #xOutErrorzuLang := FALSE;
	                    #xOutLeer := FALSE;
	                    #sOutLänge := 'Teil Lang';
	                ELSIF #xTeilLang AND #xTeilZuLang THEN
	                    #xOutTeilKurz := FALSE;
	                    #xOutErrorzuLang := TRUE;
	                    #xOutTeilLang := FALSE;
	                    #xOutLeer := FALSE;
	                    #sOutLänge := 'Teil zu Lang';
	                ELSIF (#tOnTimeOut.Q) THEN
	                    #xOutErrorHängt := TRUE;
	                END_IF;
	            ELSE
	                #nState := 40;
	            END_IF;
	        40: // Messung finished 
	            #xOutFinished := TRUE;
	            #nState := 10;
	            
	            
	            
	    END_CASE;
	    
	END_REGION
	
	REGION State Manager
	    // Bei Bedarf
	END_REGION
	
	REGION sensor Flags
	    IF #xInTeilLang THEN
	        #xTeilLang := TRUE;
	    END_IF;
	    IF #xInTeilzuLang THEN
	        #xTeilZuLang := TRUE;
	    END_IF;
	    
	    // IF #xFlagTeilLang THEN
	    //     #xTeilLang := TRUE;
	    // END_IF;
	    // IF #xFlagTeilzuLang THEN
	    //     #xTeilZuLang := TRUE;
	    // END_IF;
	    // IF #xFlagTeilVorhanden THEN
	    //     #xTeilVorhanden := TRUE;
	    // END_IF;
	    // IF #XFlagEndMessung THEN
	    //     #xEndMessung := TRUE;
	    // END_IF;
	    
	    
	    
	    
	    // #xFlagTeilLang := #xInTeilLang AND NOT #xLastSensorLang ;
	    // #xFlagTeilzuLang := #xInTeilzuLang AND NOT #xLastSensorzuLang;
	    // #xFlagTeilVorhanden := #xInTeilVorhanden AND NOT #xLastSensorVorhanden;
	    // #xFlagStartMessung := #xInStartMessung;
	    // #XFlagEndMessung := #xInEndeMessung AND NOT #xLastSensorEndMessung;
	    // #xLastSensorLang := #xInTeilLang;
	    // #xLastSensorzuLang := #xInTeilzuLang;
	    // #xLastSensorVorhanden := #xInTeilVorhanden;
	    // #xLastSensorEndMessung := #xInEndeMessung;
	    
	    
	END_REGION
	REGION Timer
	    //so lange warten 
	    #tOnTimeOut(IN := #xOnWaiting,
	                PT := #tInWaitingTime);
	    
	    #tOnWaitForEnd(IN := #xOnWaiting,
	                   PT := #tInWaitingTime);
	    
	    (* IF #xInStartMessung THEN
	         #xInStartMessung := FALSE;
	     END_IF; *)
	    
	END_REGION
	
	REGION Monitoring 
	    //Fehler hinzufügen
	    
	END_REGION
	
	
	
END_FUNCTION_BLOCK

