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