#!/bin/sh
#NC imcp.ba@free.fr IMCP Blandy Alain
#principe de fonctionnement de la station
#un defaut batterie onduleur => demande d'arret tous les pc de la station
#arret effectif de tous les pc > coupure onduleur
#retour tension batterie charge => temporisation => redemarrage onduleur, modem ,pc ....
#media commun RS232 et Handshake en girlande reliant les pc et la carte electronique qui gere onduleur
#partie gestion des arrets (demon a ecoute liaison RS232) ou demande arret
# sous programme de surveillance/arret par rs232 de l'onduleur et autres micros
#
# deux modes de fonctionement (en fonction du parmetre d'appel $1) :
#
# si parametre alors
# demon en boucle surveillance RS232 batterie onduleur ou pc
# (sortie de la boucle si defaut ou appuis bp rouge ou rs232)
# fin si
# envois message RS232 arret general dans tous les cas
file="/dev/ttyS1"; # la liaison serielle a utiliser en reception et emission !!PRW
# a adapter a la liaison serie (ou usb?) de votre pc
# si le periferique ne peut pas etre ouvert ou n'existe pas !!!!
# le programme demon boucle sans interruption et ne genere aucun arret !!!!
fstrace="/var/log/arretestbat.txt"; # compilation des demande ou arrets seriel
#stty raw
# same as -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
# -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -opost -isig -icanon -xcase min 1 time 0
# Le signal qui viend de la carte electronique sur les entres RX
# est normalement a etat bas 0V (ou legerement inferieur)
# en cas de defaut baterrie il pase a une tension superieure a >4V
# Ensuite il apparait des impulsion breves inverses vers l'etat bas,
# amplitude de ces impulsions augment avec le defaut baterrie,
# jusqu'a provoquer un start bit au niveau des recepteurs rs232.(lsb first)
# la frequence change le recepteur recois donc des 0 1 3 7 F
# programmer les uart en surveillance pour qui ils ne cassent pas trop les pieds
stty raw -echo cs7 cread ignbrk -parenb -istrip -opost -cstopb min 1 time 0 9600 <$file;
stopcause="$1"; # en parametre appel un du script
if test "$stopcause" == ""; then # si on est en mode surveillance liaison
stopcause="onduleur ou autre micro";
#ici on est dans le cas general de la surveillance batterie ou rs232
#
# Principes
#
# Cette partie du programme boucle sur la lecture de la RS232
# et de se fait valide le DTR de la rs232 (par l'open du device).
# Le DTR Arme et hinibe le Watch Dog electronique,
# de la carte electronique de surveillance.
#
# Cette derniere surveille la batterie de l'onduleur
# et en cas de probleme (baisse de tension) (ou appuis sur le bouton rouge d'arret)
# envois une alerte RS232 a tous les micros a l'ecoute ...
#
# Cette partie du programme, qui est a l'ecoute de la RS232 commune (sur chaque micro),
# apres reception d'un message d'alerte validee, cesse l'ecoute (le close du device : hinibe son DTR)
# et s'arrete !
# Le Programme batch qui la lance (/usr/local/Ambiance/0b_login sur toutou linux)
# constate sa fin(exit 5), et lance alors l'arret du micro (les autre micros font pareil) ...
#
# Apres avoir constate la suppression de tous les DTR,
# pendant un temps suffisant ... le WAtch Dog electronique de la carte de veille,
# arrete onduleur (si le defaut DTR persiste) ...
#
# Si la clef de commande et alors sur arret, electronique et onduleur son hinibes,
# le voyant cristal de veille s'eteind.
# Si la clef de commande est sur marche (ou y reviend , par une horloge programmable par exemple)
# et si le niveau de charge batterie est suffisante,
# l'onduleur est remis en route apres temporisation d'au moins 15 s
#
# Pendant la phase ou electronique est valide, le voyant cristal veille est allume,
# la clef de commande est ignore, et electronique peut eteindre ou allumer
# onduleur a sa guisse.
#
# ATTENTION CHOCS ELECTRIQUES !!!
#
# Attention l'electronique a deux masses electriques distinctes
# une masse RS232
# une masse batterie onduleur
# entre les deux "masses" il peut y avoir,
# celon les cas de fonctionnent de l'onduleur:
# marche, arret, test, defaut secteur ...
# du 220V alternatif ou autres regimes transitoires (HAZARDOUZ VOLTAGE)
# ( d'ou l'usage :
# optocoupleurs infrarouge pour isolement galvanique
# des differente partie de electronique
# et de vieux et solide modeles de transitors
# peut sensible a electrictee "statique"(contrairement aux amplis OP))
#
# Ne pas y intervenir (avec onduleur en service) !!!!!
# vous risquer une decharge electrique
# et la mort premature,
# des micros qui n'aime pas le 220V sur les entres RS232
# du hub ethernet, du scoppe ....
# typiquement le batch qui a lance ce programme, en redirige la sortie stdout, dans le logger
# ce qui permet de suivre dans historique etat de onduleur
# Dans toutou linux ce batch est lance par /usr/loc/Ambiance/Ob_login ....
echo "PROGRAMME SURVEILLANCE BATTERIE ONDULEUR & MICROS $0 $1"; # message dans log
# date -u; #pas utile avec logger
timeout="5"; #en seconde (au dela du quel on considere la transmission invalide avortee erratique spourious)
confirme="30"; #nombre de messages consecutifs pour confirmer l'arret
# ( le temps morts entre deux messages consecutif ne doit pas depasser le timeout precedant)
oldate="0"; #date du message precedant : initialise a tres tres vieux
cpt="0"; #compteur de confirmation
while test "1" == "1"; do # boucle principale de scrutation de la RS232
#lecture de la RS232 par od (octal dump)
A="";
A="`od -A n -c -t x1 -v -N 60 $file `"; # -N taille message a lire pour info Log
# (pas trop grand) sensibilitee (taille * confirme )
# a metre au point sur votre machine !!!!!!
# le fait de lire la tty open, active le DTR (qui hinibe le Watch DOG electronique)
# le DTR ne retombera qu'apres l'arret electrique complet Pc/uart
#on ne sort de intruction precedante que en cas de reception ou en cas erreur !!!
if test "$A" == ""; then #si erreur de lecture de la RS232
#probablement, si par hazard, on a lancer plusieur fois ce programme sur la meme machine !
echo "$0 pas d'acces a $file !!! Multiple execution ???"; #message pour le loger
sleep 15; # ralentir ce programme : il doit y en avoir un autre (lancer tempo >> $timeout)
continue; # ignorer tous et reboucler en lecture d'un paquet
fi;
#reception de caracteres !
newdate="`date -u +%s`"; #recuperer TU courant en seconde, (epoque 1970 apres JC here chretienne)
delais="$[$newdate - $oldate]"; #calculer le delais relatif, ecoule depuis le dernier message
oldate="$newdate"; #relancer base de temps du timeout, pour le message suivant ....
if test "$[$delais > $timeout]" == "1"; then #nouveau ou pas asse rapide
cpt="0"; #annuler message precedant (trasmission erratique, appuis trop bref sur bp rouge ... )
sync; #mettre a jour par precaution les disques( ram ecrite sur dique ), cela sera deja fait !!!
fi;
#recpetion en cours sans timeeout
if test "$[$cpt >= $confirme]" == "1"; then # si les demandes arret sont suuffisante on confirme
# ici on a recus un nombre de messages suffisant (confirme)
# entre chaque message il y a une attente inferieure a (timeout)
echo -e "$0 : $newdate MESSAGE CONFIRME $cpt : ALARME \n$A"; #sortie redirige dans loger
sleep 15; break; # attendre la fin de la transmission eventuelle du message d'arret
# du else suivant (dans une autre tache)
# pour permettre au autres micros de percevoir le message arret
# et sortir de la boucle
fi;
#recpetion en cours sans timeeout mais pas encore confirmee
paket="10"; # ecrire de temps en temps : modulo : dans les log
modu="$[$cpt / $paket * $paket]";
if test "$modu" == "$cpt"; then #informe de temps en temps les log
echo -e "$0 : $newdate MESSAGES RECUS $cpt ..."; #pas suffisament de confirmation #sortie redirige dans loger
fi; #on peut voir comme cela les micro coupure qui n'on pas provoque arret de la station
#vers message suivant ...
cpt="$[$cpt + 1]"; #incremmenter le compteur de message consecutifs
done; #rebouclage principale
fi; # fin du cas surveuillance
# else # parametre appel non vide : cause de arret
#dans tous les cas on passe ici
echo "`date -u` $0 ARRET ou DEMANDE !!! Demande par $stopcause">>$fstrace; #compilatio
# demande d'arret collectif retransmisse a la rs232
#
# cette partie du programme genere sur la RS232
# fstrace="/var/log/arretestbat.txt"; # compilation des demande ou arrets seriel un message qui genere un defaut
# pour demander arret general de tous les micros a ecoute
(
cpt="0";
while test "$[$cpt > 80]" == "0"; do
echo "ARRET $cpt !!! Demande par $stopcause">>$file; #envois dans RS232
sleep 0.2; #eviter overrun reception KKKK 1 sec
cpt="$[$cpt + 1]";
done;
) & #la demande d'arret RS232 est transmisse en batch &
# typiquement cette partie programme peut etre appele seule par un script cgi pour eteindre la station
#
# c'est ce que fait notament le programme Restiptables, du demon qui surveille la laison internet externe
# en cas de defaut persitant, il utilise ce programme pour dempander arret(redemarrage) de la station
#
# mais on doit etre sur que l'arret se fera apres une tempo suffisante
# pour laisser le temps au programme batch RS232 pecedant, de transmettre le messages aux autres ...
# fi;
echo "FIN DE $0 $1";
exit 5; # Normal return code
# apres avoir constate la mort de ce programme, son demon de pere, lance le shutdown
# immediatement si le return code est "Normal"
# ( sinon apres une tempo ; pour permetter un leger debug avant coupure electrique)
# Dans toutou linux le batch surveillance est lance par /usr/local/Ambiance/Ob_login
# sous suze 6.4 par le fichier DemonBatterie un script shell
# appele par un script ( link dans /etc/rc.d/rc3.d/S30Batterie )
# Retour a la page d'appel du web source
#
|