Copy //Read Aoe vendor ID
//Read function
fbIOLinkRead_Vendor(
Execute:= bRead_Vendor, //Execute bit
MasterName:= ADR(strMasterName), //Instance name
SlaveAddress:= uiEthercatAddr, //EtherCAT address of IO-Link master
TargetNetId:= strTargetNetId , //Refer from ctrlX I/O
TargetPort:= 16#1000 + uiIoLinkPortNbr_Vendor, //ADS communication port = 16#1000 + IO-Link port number
IndexGroup:= 16#F302, //Fixed for IFM IO-Link
//IDXOFFS Index Offset
//Bits 0-7: IO-Link subindex
//Bits 8-15: 00000000
//Bits 16-31: IO-Link index
IndexOffset:= (16#FFFF0000 AND SHL(ANY_TO_UDINT(wIoLinkIndex_Vendor),16))
OR (16#000000FF AND ANY_TO_UDINT(byIoLinkSubIndex_Vendor)),
SizeOfValue:= SIZEOF(strVendor), //Byte requirement
ValueAdr:= ADR(strVendor)); //Value
IF TRUE = fbIOLinkRead_Vendor.Done THEN
bVendor_Error := FALSE; // Reset error
bVendor_Done := TRUE;
END_IF;
IF TRUE = fbIOLinkRead_Vendor.Error THEN
bVendor_Error := TRUE; // Error handling
bVendor_Done := FALSE;
END_IF;
//Read Aoe Product ID
fbIOLinkRead_ProductID(
Execute:= bRead_ProductID,
MasterName:= ADR(strMasterName),
SlaveAddress:= uiEthercatAddr,
TargetNetId:= strTargetNetId ,
TargetPort:= 16#1000 + uiIoLinkPortNbr_ProductID,
IndexGroup:= 16#F302,
IndexOffset:= (16#FFFF0000 AND SHL(ANY_TO_UDINT(wIoLinkIndex_ProductID),16))
OR (16#000000FF AND ANY_TO_UDINT(byIoLinkSubIndex_ProductID)),
SizeOfValue:= SIZEOF(strProductID),
ValueAdr:= ADR(strProductID),
);
//Read Aoe Product ID Set Point
fbIOLinkRead_ProductID_SetPoint(
Execute:= bRead_SetPoint,
MasterName:= ADR(strMasterName),
SlaveAddress:= uiEthercatAddr,
TargetNetId:= strTargetNetId ,
TargetPort:= 16#1000 + uiIoLinkPortNbr_ProductID_SetPoint,
IndexGroup:= 16#F302,
IndexOffset:= (16#FFFF0000 AND SHL(ANY_TO_UDINT(wIoLinkIndex_ProductID_SetPoint),16))
OR (16#000000FF AND ANY_TO_UDINT(byIoLinkSubIndex_ProductID_SetPoint)),
SizeOfValue:= SIZEOF(uiSetPointRead),
ValueAdr:= ADR(uiSetPointRead),
);
//Byte swap of Set Point read
uiSetPointRead_swap := WORD_TO_UINT(IL_SwapWord(uiSetPointRead));
IF TRUE = fbIOLinkRead_ProductID_SetPoint.Done THEN
bProductID_SetPoint_Error := FALSE; // Reset error
bProductID_SetPoint_Done := TRUE;
END_IF;
IF TRUE = fbIOLinkRead_ProductID_SetPoint.Error THEN
bProductID_SetPoint_Error := TRUE; // Error handling
bProductID_SetPoint_Done := FALSE;
END_IF;
//Write Aoe Product ID Set Point
//uiSetPointWrite_conv := ROR(SetPointWrite,8);
uiSetPointWrite_swap := WORD_TO_UINT(IL_SwapWord(uiSetPointWrite));
fbIOLinkWrite_ProductID_SetPoint_write(
Execute:= bWrite_SetPoint,
MasterName:= ADR(strMasterName),
SlaveAddress:= uiEthercatAddr,
TargetNetId:= strTargetNetId,
TargetPort:= 16#1000 + uiIoLinkPortNbr_ProductID_SetPoint,
IndexGroup:= 16#F302,
IndexOffset:= (16#FFFF0000 AND SHL(ANY_TO_UDINT(wIoLinkIndex_ProductID_SetPoint),16))
OR (16#000000FF AND ANY_TO_UDINT(byIoLinkSubIndex_ProductID_SetPoint)),
ValueAdr:= ADR(uiSetPointWrite_swap),
SizeOfValue:= SIZEOF(uiSetPointWrite_swap),
//SizeOfValue:= 2,
);
IF TRUE = fbIOLinkWrite_ProductID_SetPoint_write.Done THEN
bProductID_SetPoint_Write_Error := FALSE;// FB Finished -> Product name was read,
bProductID_SetPoint_Write_Done := TRUE;
END_IF;
IF TRUE = fbIOLinkWrite_ProductID_SetPoint_write.Error THEN
bProductID_SetPoint_Write_Error := TRUE;// Error handling
bProductID_SetPoint_Write_Done := FALSE;
END_IF;
// -------------------- Reading Distance sensor process output --------------------
//Concatinate the byte 0 and byte 1
wData := IL_ConcatByte(GVL.rawbyte0,GVL.rawbyte1);
//Right shift the word by 4 bit
iDistance := WORD_TO_INT(SHR(wData,4));
//Defining limits
IF iDistance > 200 THEN
iDistance := 200;
END_IF
IF iDistance < 5 THEN
iDistance := 5;
END_IF
//Set point output
bOutput := GVL.rawbyte1.0;
//SignalLamp condition
IF bOutput = TRUE THEN
GVL.segment1 := 2;
GVL.segment2 := 2;
GVL.segment3 := 2;
GVL.segment4 := 2;
GVL.segment5 := 2;
ELSE
GVL.segment1 := 4;
GVL.segment2 := 4;
GVL.segment3 := 4;
GVL.segment4 := 4;
GVL.segment5 := 4;
END_IF