FUNCTION_BLOCK "FB_SupervisionRasterSensor"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      stInSenRaster : "UDT_Sensor";   // Das Signal das überwacht wird
      xInMotorRun : Bool;   // Motor dreht sich
      stInSettings : Struct   // Einstellungen
         xInEnableSupervision : Bool := false;   // Überwachung aktiviert
         tInDelayMotorRun : Time := T#200ms;   // Motor Delay
         tInRasterHigh : Time := T#100ms;   // High Signal
         tInRasterLow : Time := T#100ms;   // Low Signal
         sInConveyorName : String;
         wInTextListFunctionId : Word;
         wInTextListMessageId : Word;
      END_STRUCT;
      xInErrorQuit : Bool;   // Quittieren z.B. Button Reset
   END_VAR

   VAR_OUTPUT 
      xOutErrorRasterSensor : Bool;   // Fehler ausgeben
   END_VAR

   VAR 
      tOn_RasterHigh {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;   // Überwachungszeit High-Signal
      tOn_RasterLow {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;   // Überwachungszeit Low-Signal
      tOnMotorRunningDelay {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;   // Motor Delay Timer
      xErrorRasterSensor : Bool;   // Fehler 
   END_VAR


BEGIN
	REGION Überwachung Raster Sensor
	    
	    #tOnMotorRunningDelay(IN := #xInMotorRun,       // CarouselRun muss delayed benutzt werden, wegen Anfahrzeit vom ETF
	                          PT := #stInSettings.tInDelayMotorRun);
	    
	    #tOn_RasterHigh(IN := #xInMotorRun AND #tOnMotorRunningDelay.Q AND #stInSenRaster.xDirectSensor,
	                    PT := #stInSettings.tInRasterHigh);
	    
	    #tOn_RasterLow(IN := #xInMotorRun AND #tOnMotorRunningDelay.Q AND NOT #stInSenRaster.xDirectSensor,
	                   PT := #stInSettings.tInRasterLow);
	    
	    IF #tOn_RasterHigh.Q OR #tOn_RasterLow.Q THEN // Wenn einer der beiden Timer abläuft, dann Fehler!
	        #xErrorRasterSensor := TRUE;
	    END_IF;
	END_REGION
	
	REGION Quittieren
	    IF #xErrorRasterSensor AND #stInSettings.xInEnableSupervision AND #xInErrorQuit THEN
	        #xErrorRasterSensor := FALSE;
	    END_IF;
	END_REGION
	
	REGION Ausgänge    
	    #xOutErrorRasterSensor := #xErrorRasterSensor AND #stInSettings.xInEnableSupervision; // Fehler ausgeben, wenn Überwachung aktiviert
	END_REGION
	
	(* REGION Monitoring
	    #fbMonitoring.stSettings.nErrorType := 1;
	    #fbMonitoring.stSettings.xErrLedIfMachineIsOff := TRUE;
	    #fbMonitoring.stSettings.xSelfQuit := TRUE;
	    #fbMonitoring.stSettings.tDelay := T#1s;
	    #fbMonitoring(sInFctnName := 'Rastersensorueberwachung',
	                  sInPrefix := #stInSettings.sInConveyorName,
	                  wInTextListId_Function := #stInSettings.wInTextListFunctionId,
	                  wInTextListId_Message := #stInSettings.wInTextListMessageId,
	                  sInSuffix := #stInSenRaster.sName,
	                  InOutMachineState := "DB_MachineGlobal".stStateMain,
	                  xInQuitError := "DB_MachineGlobal".stStateMain.xQuitError,
	                  xInSignal := NOT #xErrorRasterSensor,
	                  sInAlarmMessage := 'Rastersensorueberwachung ausgeloest');
	END_REGION *)
END_FUNCTION_BLOCK

