FUNCTION_BLOCK EtherCAT_Checker VAR_INPUT END_VAR VAR_OUTPUT wSlaveStateRequest: WORD; END_VAR VAR ETC_Master : DUT_EtherCAT_Master; ETC_Slaves : DUT_EtherCAT_Slaves; DED_Bus : DUT_EtherCAT_Bus; DED_Device : DUT_EtherCAT_Device; _itfNode : DED.INode; _itfDevice : DED.IDevice; _itfBus : DED.IBus; _iStep : INT := 0; i : INT := 0; pSlave : POINTER TO ETCSlave; _SlaveState : ARRAY [0..10] OF ETC_SLAVE_STATE; Device_Info : ARRAY[0..10] OF DUT_EtherCAT_Device; _GetBusScan : DED.GetBusScan; _GetDeviceError : ARRAY[0..10] OF DED.GetDeviceError; _OptionalsReady : BOOL; i_optional :INT:= 0; END_VAR EtherCAT_Master(); EtherCAT_Master.GetBusInfo(DED_Bus.BusInfo); EtherCAT_Master.GetStatistics( udiSendFrameCount => ETC_Master.SendFrameCount, udiFramesPerSecond => ETC_Master.FramesPerSecond, udiLostFrameCount => ETC_Master.LostFrameCount, udiTxErrorCount => ETC_Master.TxErrorCount, udiRxErrorCount => ETC_Master.RxErrorCount); DED_Bus.BusLoad := EtherCAT_Master.BusLoad; ETC_Master.MasterState := EtherCAT_Master.MasterState; ETC_Master.xConfigFinished := EtherCAT_Master.xConfigFinished ; ETC_Master.xError := EtherCAT_Master.xError ; ETC_Master.LastError := EtherCAT_Master.LastError; ETC_Master.LastMessage := EtherCAT_Master.LastMessage; ETC_Master.xSyncInWindow := EtherCAT_Master.xSyncInWindow ; ETC_Master.NumberActiveSlaves := EtherCAT_Master.NumberActiveSlaves; ETC_Master.NbrSlavesFirstPort := EtherCAT_Master.NbrSlavesFirstPort; ETC_Master.NbrSlavesSecondPort := EtherCAT_Master.NbrSlavesSecondPort; ETC_Master.ChildNodeCount := EtherCAT_Master.ChildNodeCount; DED_Device.uiUnknown := 0; DED_Device.uiStopped := 0; DED_Device.uiRunning := 0; DED_Device.uiError := 0; DED_Device.uiNotConfigured := 0; DED_Device.uiNotFound := 0; DED_Device.uiDisabled := 0; DED_Bus.Disabled := 0; DED_Bus.Error := 0; DED_Bus.Running := 0; DED_Bus.Stopped := 0; DED_Bus.Unknown := 0; _itfNode := DED.GetRoot(); i :=0; REPEAT i:= i +1; _itfDevice := DED.INode_TO_IDevice(_itfNode); _itfBus := DED.INode_TO_IBus(_itfNode); Device_Info[i].Dispositivo := _itfDevice; Device_Info[i].Estado :=_itfDevice.GetDeviceState(); _GetBusScan (itfNode := _itfNode, eError => DED_Bus.eError, itfFirstDevice => DED_Bus.itfFirstDevice); _GetDeviceError[i] (itfNode := _itfNode, xError => Device_Info[i].Error, einDeviceError => Device_Info[i].Error_Info); IF _itfDevice <> 0 THEN CASE _itfDevice.GetDeviceState() OF DED.DEVICE_STATE.UNKNOWN: DED_Device.uiUnknown := DED_Device.uiUnknown + 1; DED.DEVICE_STATE.STOPPED: DED_Device.uiStopped := DED_Device.uiStopped + 1; DED.DEVICE_STATE.RUNNING: DED_Device.uiRunning := DED_Device.uiRunning + 1; DED.DEVICE_STATE.ERROR: DED_Device.uiError := DED_Device.uiError + 1; DED.DEVICE_STATE.NOT_CONFIGURED: DED_Device.uiNotConfigured := DED_Device.uiNotConfigured + 1; DED.DEVICE_STATE.NOT_FOUND: DED_Device.uiNotFound := DED_Device.uiNotFound + 1; DED.DEVICE_STATE.DISABLED: DED_Device.uiDisabled := DED_Device.uiDisabled + 1; END_CASE ELSIF _itfBus <> 0 THEN CASE _itfBus.GetBusState() OF DED.BUS_STATE.DISABLED: DED_Bus.Disabled := DED_Bus.Disabled + 1; DED.BUS_STATE.ERROR: DED_Bus.Error := DED_Bus.Error + 1; DED.BUS_STATE.RUNNING: DED_Bus.Running := DED_Bus.Running + 1; DED.BUS_STATE.STOPPED: DED_Bus.Stopped := DED_Bus.Stopped + 1; DED.BUS_STATE.UNKNOWN: DED_Bus.Unknown := DED_Bus.Unknown + 1; END_CASE END_IF _itfNode := DED.GetNextNode(_itfNode); UNTIL _itfNode = 0 END_REPEAT IF ETC_Master.MasterState <> ETC_MASTER_STATE.ETC_MASTER_OPERATIONAL THEN CASE _iStep OF 0: EtherCAT_Master.xRestart := FALSE; _iStep := 1; 1: EtherCAT_Master.xRestart := TRUE; _iStep := 2; 2: IF EtherCAT_Master.xConfigFinished THEN _iStep := 3; END_IF; 3: IF NOT EtherCAT_Master.Start THEN EtherCAT_Master.Start:= TRUE; END_IF; ETC_Master.xError:= EtherCAT_Master.xError; _iStep := 0; END_CASE END_IF; ETC_Slaves.uiBoot := 0; ETC_Slaves.uiInit := 0; ETC_Slaves.uiPreoperational := 0; ETC_Slaves.uiSaveOperational := 0; ETC_Slaves.uiOperational := 0; IF ETC_Master.MasterState = ETC_MASTER_STATE.ETC_MASTER_OPERATIONAL THEN pSlave := EtherCAT_Master.FirstSlave; i:= 0; WHILE pSlave <> 0 DO i:= i + 1; pSlave^(); _SlaveState[i]:= pSlave^.wState; CASE pSlave^.wState OF ETC_SLAVE_STATE.ETC_SLAVE_BOOT: ETC_Slaves.uiBoot := ETC_Slaves.uiBoot + 1; ETC_SLAVE_STATE.ETC_SLAVE_INIT: ETC_Slaves.uiInit := ETC_Slaves.uiInit + 1; ETC_SLAVE_STATE.ETC_SLAVE_PREOPERATIONAL: ETC_Slaves.uiPreoperational := ETC_Slaves.uiPreoperational + 1; ETC_SLAVE_STATE.ETC_SLAVE_SAVEOPERATIONAL: ETC_Slaves.uiSaveOperational := ETC_Slaves.uiSaveOperational + 1; ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL: ETC_Slaves.uiOperational := ETC_Slaves.uiOperational + 1; END_CASE IF pSlave^.wState = 0 THEN pSlave^.SlaveEnable := TRUE; ELSIF pSlave^.wState <> ETC_SLAVE_STATE.ETC_SLAVE_OPERATIONAL THEN pSlave^.xSetOperational := TRUE; END_IF pSlave := pSlave^.NextInstance; END_WHILE END_IF;