Programmation d'un terminal intelligent (moteur)
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:
- courant maximum permanent (reg34) 230 [mA]
- courant nominal (reg35) 60[mA]
- tension nominal du moteur (reg36) 24[v]
- courant pour réduction du couple sens positif (reg41) 200 [mA]
- courant pour réduction du couple sens negatif (reg49) 200 [mA]
- sélectionne courant et tension pour les valeurs lue en permanence (reg1)
- résistance interne du moteur (reg44) 75[Ohm]
- 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);