'
' Exemple de programme pour simuler la fermeture du portail en
BASIC11 (basic compilé)
' démo HB du 26/02/1999
' LES ENTREES SORTIES SUR LA CARTE CONTROLBOY
' Les entrées :
' PORT A bit 0 : fdfer
' PORT A bit 1 : fdouv
'
' Les sorties :
' PORT B bit 0 : commande RE1 (sens Ouverture = 0 / fermeture =1)
' PORT B bit 1 : commande RE3 (alimentation moteur)
' Fichier de config E/S
#include "start.bas"
' Déclaration des variables
int tp(4), tp_ok(4), tmax(4), nb_tempos, nb
BYTE X(5) ' Déclaration du tableau des étapes 0 à 4
BYTE fdfer ' Déclaration variable associée au capteur fin de
fermeture
BYTE commande ' Déclaration variable associée à la télécommande
(simulé par bouton poussoir)
BYTE arreter_moteur, fermer_portail ' variables associées aux
sorties (actions)
BYTE v, s1,s2,s3,s4,s5,bs1
BYTE T0_D, T1_D, bebe
' Initialisation
PACTL.1 = 0 ' selectionner la vitesse
PACTL.0 = 0
TMSK2.6 = 1 ' declencher le timer
cli ' autoriser les interruptions
tmax(0) = 500 ' valeur tempo 0
nb_tempos = 1 ' (+1)
v = 1
X(0) = 1
X(1) = 0
X(2) = 0
X(3) = 0
X(4) = 0
PORTB = 0 ' Arrêt moteur
DDRD = 0 ' PD5=PD4=PD3=PD2=input
SCONF = 0x4C ' B,C = sorties
lcdinit()
print " GRAFCET FERMER "
' PROGRAMME PRINCIPAL
DO ' début de la boucle
' Lecture des entrées
LDAA PORTD ' Lecture interrupteur sur carte Controlboy
ANDA #32 ' MASQUAGE
EORA #32 ' inversion du bit car
STAA commande ' Interrupteur carte actif niveau 0
LDAA PORTA ' Lecture capteur fdouv (fin ouverture)
ANDA #1 ' bit0 = 1 si non actif
EORA #1 ' Inversion bit
STAA fdfer
' MISE A JOUR DES RECEPTIVITES
T0_D = testtempo(0)
' Mise à jour des étapes
IF commande > 0 AND X(0) = 1 then
s1 = 1
ELSE
s1 = 0
END IF
IF T0_D = 1 AND X(1) = 1 THEN
s2 = 1
ELSE
s2 = 0
END IF
IF fdfer > 0 AND X(2) = 1 THEN
s3 = 1
ELSE
s3 = 0
END IF
IF T0_D = 1 AND X(3) = 1 THEN
s4 = 1
ELSE
s4 = 0
END IF
IF v = 1 and X(4) = 1 THEN
s5 = 1
ELSE
s5 = 0
END IF
' DESACTIVATION DES ETAPES
IF s1 = 1 THEN
X(0) = 0
END IF
IF s2 = 1 THEN
X(1) = 0
END IF
IF s3 = 1 THEN
X(2) = 0
END IF
IF s4 = 1 THEN
X(3) = 0
END IF
IF s5 = 1 THEN
X(4) = 0
END IF
' ACTIVATION DES ETAPES
X(0) = s5 OR X(0)
X(1) = s1 OR X(1)
X(2) = s2 OR X(2)
X(3) = s3 OR X(3)
X(4) = s4 OR X(4)
' Equation des sorties
tp_ok(0) = X(1) OR X(3) ' Validation tempo T0
' Affectation des sorties
IF X(0) = 1 THEN
PORTB = 0
END IF
IF X(1) = 1 THEN
PORTB = 1 ' Activation RE1 : SENS fermeture
END IF
IF X(2) = 1 THEN
PORTB = 3 ' RE3 = 1 (ALIM ) + RE1 =1 (sens fermeture)
END IF
IF X(3) = 1 THEN
PORTB = 1 ' RE3 désactivé, RE1 reste actif
END IF
IF X(4) = 1 THEN
PORTB = 0
END IF
LOOP ' Reboucler vers DO
function tempo(cnt)
int t
for cnt=cnt to 0 step -1
for t=0 to 200
next
next
end function
' Fonction test d'une tempo n
function testtempo(n)
if tp(n) >= tmax(n) then
return 1
else
return 0
end if
end function
' Fonction d'interruption pour Tempo non bloquante
interrupt function temporiser3 at $FFF0
for nb = 0 to nb_tempos
if tp_ok(nb) = 1 then
if tp(nb)>20000 then ' Limit max si erreur programme
tp(nb) = 20000
end if
tp(nb) = tp(nb) + 1
else
tp(nb) = 0
end if
next
TFLG2.6 = 1 ' autoriser l'interruption à nouveau
end function
' Fichier routines pour afficheur LCD
#include "lcd.bas"
' FIN DU PROGRAMME BASIC11