TwinCAT
udInvokeId := fbAdsWriteInd.INVOKEID; //for the Response
udGroup := UDINT_TO_DWORD(fbAdsWriteInd.IDXGRP);
udOffset := fbAdsWriteInd.IDXOFFS; //Prm or Cfg Data or DPV1 Services
udLenght := fbAdsWriteInd.LENGTH; //Len of the data
ptrByte := fbAdsWriteInd.DATAADDR; //Pointer from the data
//Result without Error, if you want so send an Error use "1"
IF F_CreateAmsNetId(nIds:=gvl.CX7031_NetID )=sNetId THEN //Check the AMSNet ID from CX7031
-> IF sNetId='5.23.4.5.4.1' THEN ....
IF nPort=1000 + 22 THEN //Slave with Adress 22
CASE udOffset OF //Offset which kind of data is comming
20: //For DP-V1 Services (20 is here the PB Index)
MEMCPY(ADR(DPV1_Write),ptrByte,udLenght);
fbAdsWriteRes.RESULT := 0;
ELSE
fbAdsWriteRes.RESULT := 16#0700_00B0 ; //Access, Invalid Index;
END_CASE
END_IF
IF iCase = 0 THEN
iCase := 10; //Send response
END_IF
END_IF
END_IF
CASE iCase OF
0: (* WAIT *);
10: (* send ADS-Response *)
fbAdsWriteRes(
NETID := sNetId,
PORT := nPort,
INVOKEID := udInvokeId,
RESULT := ,
RESPOND := TRUE);
fbAdsWriteInd(CLEAR:=TRUE); (* confirm ADS-Indication *)
iCase := 20;
20: fbAdsWriteRes(RESPOND:=FALSE);
fbAdsWriteInd(CLEAR:=FALSE);
iCase := 0;
END_CASE
//READ Indication for DPV1 Read Data
ADSREADINDEX(
CLEAR:= ,
MINIDXGRP:= ,
VALID=> ,
NETID=> ,
PORT=> ,
INVOKEID=> ,
IDXGRP=> ,
IDXOFFS=> ,
LENGTH=> );
IF ADSREADINDEX.VALID THEN
sNetId_READ :=ADSREADINDEX.NETID; //AMD Net ID from device (CX7031)
nPort_READ :=ADSREADINDEX.PORT; //PB Adresse + 1000 dec
udInvokeId_READ :=ADSREADINDEX.INVOKEID; //for the Response
udGroup_READ :=UDINT_TO_DWORD(ADSREADINDEX.IDXGRP);
udOffset_READ :=ADSREADINDEX.IDXOFFS; //Prm or Cfg Data
udLenght_READ :=ADSREADINDEX.LENGTH; //Len of the data
iRead:=10;
IF F_CreateAmsNetId(nIds:=gvl.CX7031_NetID )=sNetId_READ THEN //Check the AMSNet ID from
CX7031 -> IF sNetId='5.23.4.5.4.1' THEN ....
IF nPort_READ =1022 THEN //Check Slave Addr 22
IF (16#FF AND udGroup_READ) = 2 THEN //Check Slot Number
IF udOffset_READ=16#15 THEN //Check Index Number, here is the Index 21=0x15
DataRead[0]:=DPV1_Write[0]+1;
ADSREADRES.RESULT:=0; //no Error
ELSE
ADSREADRES.RESULT :=16#0700_00B0 ; //Access, Invalid Index
END_IF
ELSE
ADSREADRES.RESULT :=16#0700_00B2 ; //Access, Invalid Slot
END_IF
END_IF
END_IF
END_IF
CASE iRead OF
0: //Wait
10:
CX7031
Version: 1.0
87