Vous êtes ici : Accueil / TECHNICAL PAGES / Documentation / Euler Telescope Control System (ETCS) sous Beckhoff / PLC Type CX8090 / Beckhoff pour les Nuls / Programmation d'un terminal intelligent (moteur)

Programmation d'un terminal intelligent (moteur)

Technique pour programmer les registres d'une terminal

 

Le terminal est programmé au boot pour la raison suivante:

Alors qu'il est tout à fait possible d'éviter cette programmation et de procéder à la programmation directe, soit par TC SystemManager ou avec le KS2000, le terminal est programmé à chaque boot, permettant le cas échéant un remplacement simplifié d'un terminal défectueux.

 

Cet exemple suit le principe de "Programmation d'une fonction à effectuer une seule fois au démarrage" voir variable bInitDone.

FUNCTION_BLOCK FB_InitMotorEntrysh
VAR_INPUT
END_VAR
VAR_IN_OUT
    byState   : BYTE;
    byControl : BYTE;
    wDataIn   : WORD;
    wDataOut  : WORD;
END_VAR
VAR_OUTPUT
END_VAR
VAR
    bInitDone     : BOOL := FALSE; (* True when all cards are set *)
    fbRWTermReg   : ReadWriteTerminalReg;
    bWrite        : BOOL := FALSE; (*Ecrit wDataWrite au flanc montant bWrite*)
    wDataWrite    : WORD := 0; (*Valeur à écrire*)
    bRead         : BOOL := FALSE; (*Lit la valeur du registre ciblé et la met dans wDataRead au flanc montant bRead*)
    wDataRead     : WORD; (*Valeur lue / actuelle*)
    iRegNo        : BYTE;
    iCase         : INT;
END_VAR

 

Concernant le code ci-dessous:

On passe d'un case au suivant lorsque le case courant est terminé. La programmation d'un registre peut prendre plusieurs cycles machine.

La gestion des flans montants est fabriqué par les booleans bRead et bWrite

A noter que l'on traverse le FB fbRWTermReg à chaque cycle machine

 

Ce FB programme les registre suivants pour une carte KL2532 (2-channel DC motor output stage 24 V DC, 1A) voir doc:

  1. courant maximum permanent  (reg34) 230 [mA]
  2. courant nominal (reg35) 60[mA]
  3. tension nominal du moteur (reg36) 24[v]
  4. courant pour réduction du couple sens positif (reg41) 200 [mA]
  5. courant pour réduction du couple sens negatif (reg49) 200 [mA]
  6. sélectionne courant et tension pour les valeurs lue en permanence (reg1)
  7. résistance interne du moteur (reg44) 75[Ohm]
  8. active le moteur, reset des flats et autorise la réduction de couple

 

CASE iCase OF
0:
	bRead:=FALSE;
	bWrite:=FALSE;
	iRegNo:=0;
	wDataWrite:=16#0000;
	iCase := iCase+1;

1:
	iRegNo:=34;	(* 34: Maximum permanent coil motor *)
	wDataWrite:=230; (* [mA] *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF

2:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF

3:
	iRegNo:=35;	(* 35: Rated (nominal) current of the motor *)
	wDataWrite:=60; (* [mA] *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF
	
4:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF

5:
	iRegNo:=36;	(* 36: Rated (nominal) voltage (supply voltage) of the motor *)
	wDataWrite:=24000; (* [mv] *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF

6:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF

7:
	iRegNo:=41; (* 41: Reduced torque (coil current in positive direction) *)
	wDataWrite:=200; (* [mA] *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF

8:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF

9:
	iRegNo:=49;	(* 49: Reduced torque (coil current in negative direction) *)
	wDataWrite:=200; (* [mA] *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF
	
10:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF

11:	(* read Current of motor coil channel 1 and Voltage of motor coil channel 1 *)
	iRegNo:=1;	(* 1: Selection for measured value 1 and value 2 *)
	wDataWrite:= 16#0602; (* 6=current 2=voltage *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF

12:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF
13:
	iRegNo:=44;	(* Internal Resistance of the motor *)
	wDataWrite:= 7500; (* 75 [Ohm] ; unit:= 0.01[Ohm] *)
	bRead:=FALSE;
	bWrite:=TRUE;
	IF  fbRWTermReg.BUSY THEN
		iCase:=iCase+1;
	END_IF

14:
	IF NOT fbRWTermReg.BUSY AND NOT fbRWTermReg.ERR AND fbRWTermReg.CURREGVALUE=wDataWrite THEN
		bRead:=FALSE;
		bWrite:=FALSE;
		iRegNo:=0;
		wDataWrite:=16#0000;
		iCase:=iCase+1;
	END_IF


15:
	byControl := 2#01100001; (* CB6:= Reset; CB5:= Enable channel, CB0:= Reduced Torque *);
	bInitDone := TRUE;
	RETURN;	(* Without the use of fbRWTermReg *)


END_CASE

fbRWTermReg(
	STATE		:= byState,
	DATAIN		:= wDataIn,
	REGNO		:= iRegNo,
	READ		:= bRead,
	WRITE		:= bWrite,
	TMOUT		:= T#500ms,
	NEWREGVALUE	:= wDataWrite,
	CTRL		=> byControl,
	DATAOUT		=> wDataOut,
	CURREGVALUE	=> wDataRead);