BECKHOFF FC5101 User Manual
Page 57

Eiserstraße 5 / D-33415 Verl / Telefon 05246/963-0 / Telefax 05246/963-149
57
IF SDO_READ.ReadDataAvailable THEN 
 ReadStart := FALSE; 
 ReadError := SDO_READ.Error; 
 ReadData := SDO_READ.ReadData; 
END_IF 
The SDO_READ function block that has been called in turn calls the ADSREAD function a number of times. It 
looks like this (starting with the variable declaration): 
FUNCTION_BLOCK SDO_READ 
VAR_INPUT 
 ADSNetID:STRING(23); (* The AMSNetID addresses the FC5101 card. Can be empty if 
only one local single channel card is present*) 
 PortNr:WORD; (* This Port No. addresses the CANopen Node (see System 
Manager) *) 
 CO_Index:DWORD; (* This is the Index of the CANopen Object Dictionary En-
try*) 
 CO_SubIndex:DWORD; (* This is the Sub-Index of the CANopen Object Dictionary 
Entry*) 
 DataLength:DWORD; (* This is the Length of the CANopen Object Dictionary En-
try*) 
 StartReading:BOOL; (* only reset to FALSE after ReadDataAvailable=TRUE*) 
END_VAR 
VAR_OUTPUT 
 ReadData:ARRAY[0..255] OF BYTE; 
 ReadDataAvailable:BOOL; 
 Error:DWORD; 
END_VAR 
VAR 
 state:BYTE := 0; 
 ADSREAD:ADSREAD; 
END_VAR
CASE state OF 
 0: 
 IF StartReading THEN 
 ReadDataAvailable := FALSE; 
 Error := 0; 
 ADSRead( 
 NETID:= ADSNetID, 
 PORT:= PortNr, 
 IDXGRP:= CO_Index, 
 IDXOFFS:= CO_SubIndex, 
 LEN:= DataLength, 
 DESTADDR:= ADR(ReadData), 
 READ:= TRUE, 
 TMOUT := T#1s 
 ); 
 IF ADSRead.err THEN 
 state := 2; 
 ReadDataAvailable := TRUE; 
 Error := ADSRead.ErrId; 
 ELSE 
 state := 1; 
 END_IF 
 ELSE 
 ADSRead( 
 NETID:= ADSNetID, 
 PORT:= PortNr, 
 IDXGRP:= CO_Index, 
 IDXOFFS:= CO_SubIndex, 
 LEN:= DataLength, 
 DESTADDR:= ADR(ReadData), 
 READ:= FALSE, 
 TMOUT := T#1s 
 ); 
 END_IF 
