When an Extended IO card is present in ATV71 and when IMC card (v4.0ie13 and below) is supplied separately by its +24V connector, implicit exchanges (DRIVE_PIx/POx) do not start when the following sequence is applied:
- Switch off ATV71 AC power
- Wait for the communication between the drive and the card to be lost
- Switch on ATV71 AC power -> implicit exchanges between ATV and IMC do not start (DRIVE_PIx = 0)
A workaround is to copy-paste in Drive_Start POU the following code to configure implicit exchanges:
In declaration part :
wRetry: WORD:=0 ;
In code part :
CASE wStateInitialization OF
1:
(* Initializing Cyclic data exchange Read*)
DriveParameterCyclicReadSet(
addrDRIVE_PI1:= 3207, (* for example to read line voltage (ULN) *)
addrDRIVE_PI2:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI2*)
addrDRIVE_PI3:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI3*)
addrDRIVE_PI4:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI4*)
addrDRIVE_PI5:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI5*)
addrDRIVE_PI6:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI6*)
addrDRIVE_PI7:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI7*)
addrDRIVE_PI8:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI8*)
bExecute:= TRUE);
(* on some configuration, the request is taken into account by the drive after more than 1 second,
for example with an IoExtended board. So we need to manage 500 retry *)
IF DriveParameterCyclicReadSet.bError AND wRetry < 500 THEN
wRetry := wRetry + 1;
ELSIF DriveParameterCyclicReadSet.bDone THEN
wStateInitialization:=2;
wRetry := 0;
END_IF
2:
(* Initializing Cyclic data exchange Write*)
DriveParameterCyclicWriteSet(
addrDRIVE_PO1:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO1*)
addrDRIVE_PO2:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO2*)
addrDRIVE_PO3:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO3*)
addrDRIVE_PO4:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO4*)
(*addrDRIVE_PO5:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO5*)
(*addrDRIVE_PO6:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO6*)
(*addrDRIVE_PO7:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO7*)
(*addrDRIVE_PO8:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO8*)
bExecute:=TRUE );
IF DriveParameterCyclicWriteSet.bError AND wRetry < 500 THEN
wRetry := wRetry + 1;
ELSIF DriveParameterCyclicWriteSet.bDone THEN
wStateInitialization:=3;
wRetry := 0;
END_IF
3: Display_RestoreSavedParameters();
- Switch off ATV71 AC power
- Wait for the communication between the drive and the card to be lost
- Switch on ATV71 AC power -> implicit exchanges between ATV and IMC do not start (DRIVE_PIx = 0)
A workaround is to copy-paste in Drive_Start POU the following code to configure implicit exchanges:
In declaration part :
wRetry: WORD:=0 ;
In code part :
CASE wStateInitialization OF
1:
(* Initializing Cyclic data exchange Read*)
DriveParameterCyclicReadSet(
addrDRIVE_PI1:= 3207, (* for example to read line voltage (ULN) *)
addrDRIVE_PI2:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI2*)
addrDRIVE_PI3:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI3*)
addrDRIVE_PI4:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI4*)
addrDRIVE_PI5:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI5*)
addrDRIVE_PI6:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI6*)
addrDRIVE_PI7:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI7*)
addrDRIVE_PI8:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PI8*)
bExecute:= TRUE);
(* on some configuration, the request is taken into account by the drive after more than 1 second,
for example with an IoExtended board. So we need to manage 500 retry *)
IF DriveParameterCyclicReadSet.bError AND wRetry < 500 THEN
wRetry := wRetry + 1;
ELSIF DriveParameterCyclicReadSet.bDone THEN
wStateInitialization:=2;
wRetry := 0;
END_IF
2:
(* Initializing Cyclic data exchange Write*)
DriveParameterCyclicWriteSet(
addrDRIVE_PO1:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO1*)
addrDRIVE_PO2:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO2*)
addrDRIVE_PO3:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO3*)
addrDRIVE_PO4:= xxx, (*Uncomment the line to map a Drive parameter to DRIVE_PO4*)
(*addrDRIVE_PO5:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO5*)
(*addrDRIVE_PO6:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO6*)
(*addrDRIVE_PO7:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO7*)
(*addrDRIVE_PO8:= ,*) (*Uncomment the line to map a Drive parameter to DRIVE_PO8*)
bExecute:=TRUE );
IF DriveParameterCyclicWriteSet.bError AND wRetry < 500 THEN
wRetry := wRetry + 1;
ELSIF DriveParameterCyclicWriteSet.bDone THEN
wStateInitialization:=3;
wRetry := 0;
END_IF
3: Display_RestoreSavedParameters();