Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 85 additions & 46 deletions POUs/Monitoring/FB_ESSMonitoringBase.TcPOU
Original file line number Diff line number Diff line change
Expand Up @@ -397,41 +397,82 @@ VAR
END_VAR

VAR_INST
fbUpdateEcSlaveStateTON: TON;
fbGetEcSlaveStates: FB_EcGetAllSlaveStates;
stSlaveState: ARRAY[0..nMAX_EC_SLAVES] OF ST_EcSlaveState;
nActualEcSlaves: UINT := 0;
TON_UpdateGetEcConfSlaves: TON;
fbGetEcConfSlaves: FB_EcGetConfSlaves;
_aSlaveConfig: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; // Temporary container
aSlaveConfig: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData;

//Frame statistics
fbUpdateEcMasterFrame: TON;
aSlaveConfigBuffer1: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 1 for EtherCAT Slave Config Data
aSlaveConfigBuffer2: ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Buffer 2 for EtherCAT Slave Config Data
pWriteSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Pointer to the buffer with write access
pReadSlaveConfigBuffer: POINTER TO ARRAY[1..EC_MAX_SLAVES] OF ST_EcSlaveConfigData; //Pointer to the buffer with read access
fbGetEcMasterFrames: FB_EcMasterFrameStatistic;

fbEtherCATAlarmDelayTON: TON;
bStartEtherCATdelayTON: BOOL := FALSE;
bEtherCATInitialized: BOOL := FALSE;
tonAutoResetError: TON;
bFirstReadSlaveConfigDone: BOOL := FALSE;
bErrorZeroEcSlavesFound: BOOL := FALSE;
bInit: BOOL := TRUE;
END_VAR
VAR CONSTANT
tAUTO_RESET: TIME := T#3S;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[//Read frames
fbUpdateEcMasterFrame(IN:=NOT fbUpdateEcMasterFrame.q, PT:=T#1000MS);
fbGetEcMasterFrames(sNetId:= nEcMasterNetId, bExecute:= fbUpdateEcMasterFrame.q);
TON_UpdateGetEcConfSlaves(IN:=NOT TON_UpdateGetEcConfSlaves.Q, PT:=T#100MS);
fbGetEcConfSlaves(
sNetId:=nEcMasterNetId,
pArrEcConfSlaveInfo := ADR(_aSlaveConfig),
cbBufLen := SIZEOF(_aSlaveConfig),
bExecute := TON_UpdateGetEcConfSlaves.Q);
IF NOT fbGetEcConfSlaves.bBusy AND NOT fbGetEcConfSlaves.bError THEN
aSlaveConfig := _aSlaveConfig;
<ST><![CDATA[IF bInit THEN
bInit := FALSE;
pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer1);
pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer2);
END_IF


tonAutoResetError(
PT := tAUTO_RESET,
IN := NOT tonAutoResetError.Q
AND (fbGetEcMasterFrames.bError
OR fbGetEcConfSlaves.bError
OR fbGetEcSlaveStates.bError));

//Read the frame statistics of the EtherCAT master.
fbGetEcMasterFrames(
sNetId := nEcMasterNetId,
bExecute := NOT (fbGetEcMasterFrames.bBusy
OR fbGetEcMasterFrames.bError)
OR tonAutoResetError.Q);
nEcMasterFramesLost := fbGetEcMasterFrames.nLostFrames;

//Read a list of configured slaves from the EtherCAT master object directory.
fbGetEcConfSlaves(
sNetId := nEcMasterNetId,
pArrEcConfSlaveInfo := pWriteSlaveConfigBuffer,
cbBufLen := SIZEOF(pWriteSlaveConfigBuffer^),
bExecute := NOT (fbGetEcConfSlaves.bBusy
OR fbGetEcConfSlaves.bError)
OR tonAutoResetError.Q);

//Swap buffer if read out is sucessfully finishes
IF NOT (fbGetEcConfSlaves.bBusy
OR fbGetEcConfSlaves.bError
OR fbGetEcConfSlaves.nSlaves = 0)
THEN
bFirstReadSlaveConfigDone := TRUE;
IF pWriteSlaveConfigBuffer = ADR(aSlaveConfigBuffer1) THEN
pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer2);
pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer1);
ELSE
pWriteSlaveConfigBuffer := ADR(aSlaveConfigBuffer1);
pReadSlaveConfigBuffer := ADR(aSlaveConfigBuffer2);
END_IF
END_IF

//Get EtherCAT status and the Link status of all the slaves connected to the master.
fbGetEcSlaveStates(
sNetId := nEcMasterNetId,
pStateBuf := ADR(stSlaveState),
cbBufLen := SIZEOF(stSlaveState),
//fbGetEcSlaveStates never goes bBusy (finishes same cycle as bExecute)
//Starts on bExecute of fbGetEcConfSlaves instead
bExecute := (fbGetEcConfSlaves.bExecute
AND NOT fbGetEcSlaveStates.bError)
OR tonAutoResetError.Q);
nActualEcSlaves := fbGetEcSlaveStates.nSlaves;

//Check ethercat master device state
bEcLinkError := _nEcMasterDevState.0;
bEcIOlocked := _nEcMasterDevState.1;
Expand All @@ -447,41 +488,39 @@ bEcSlaveSafeOP := _nEcMasterDevState.10;
bEcSlaveError := _nEcMasterDevState.11;
bEcDCnotInSync := _nEcMasterDevState.12;

//Check ethercat slave device state
fbUpdateEcSlaveStateTON(IN:=NOT fbUpdateEcSlaveStateTON.q, PT:=T#100MS);
fbGetEcSlaveStates(
sNetId:=nEcMasterNetId,
pStateBuf:=ADR(stSlaveState),
cbBufLen:=SIZEOF(stSlaveState),
bExecute:=fbUpdateEcSlaveStateTON.q);
nActualEcSlaves:=fbGetEcSlaveStates.nSlaves;

fbEtherCATAlarmDelayTON(IN:=bStartEtherCATdelayTON, PT:=T#3S);
IF fbEtherCATAlarmDelayTON.Q THEN
bStartEtherCATdelayTON := FALSE;
bEtherCATInitialized := TRUE;
END_IF

IF NOT bEtherCATInitialized THEN
bStartEtherCATdelayTON := TRUE;
RETURN;
END_IF

bEcMasterError := _nEcMasterDevState > 0;

// After startup timeout, reset variables before loop
//After startup reset variables before loop
bSlaveStateNotOP := FALSE;
bSlaveLinkError := FALSE;
aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] := ', Slave Id #: ';
aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', Slave Id #: ';

IF nActualEcSlaves = 0 THEN
IF NOT bErrorZeroEcSlavesFound THEN
bErrorZeroEcSlavesFound := TRUE;
ADSLOGSTR(
msgCtrlMask := ADSLOG_MSGTYPE_ERROR,
msgFmtStr := 'FB_ESSMonitoringBase Error: %s',
strArg := '0 EtherCAT Slaves found, check correct AmsNetId in CabinetMonitoring');
END_IF
bSlaveLinkError := TRUE;
aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] := ', 0 EtherCAT Slaves found';
RETURN;
Comment thread
szilard-ess marked this conversation as resolved.
END_IF
bErrorZeroEcSlavesFound := FALSE;

IF NOT bFirstReadSlaveConfigDone THEN
RETURN;
END_IF

FOR i:=0 TO nActualEcSlaves-1 DO
IF stSlaveState[i].linkState <> EC_LINK_STATE_OK THEN
aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] :=
CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=UINT_TO_STRING(i+1));
IF NOT bSlaveLinkError THEN
aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] :=
CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=CONCAT('-', LEFT(aSlaveConfig[i+1].sName, FIND(aSlaveConfig[i+1].sName,' (')-1)));
CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=CONCAT('-', LEFT(pReadSlaveConfigBuffer^[i+1].sName, FIND(pReadSlaveConfigBuffer^[i+1].sName,' (')-1)));
END_IF
aExtraMessage[nSLAVE_LINK_ERROR_ENTRY] :=
CONCAT(STR1:=aExtraMessage[nSLAVE_LINK_ERROR_ENTRY], STR2:=', ');
Expand All @@ -495,7 +534,7 @@ FOR i:=0 TO nActualEcSlaves-1 DO
CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:= UINT_TO_STRING(i+1));
IF NOT bSlaveStateNotOP THEN
aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] :=
CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:=CONCAT('-', LEFT(aSlaveConfig[i+1].sName, FIND(aSlaveConfig[i+1].sName,' (')-1)));
CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:=CONCAT('-', LEFT(pReadSlaveConfigBuffer^[i+1].sName, FIND(pReadSlaveConfigBuffer^[i+1].sName,' (')-1)));
END_IF
aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY] :=
CONCAT(STR1:=aExtraMessage[nSLAVE_NOT_OP_STATE_ENTRY], STR2:=', ');
Expand Down
Loading