L esprit Modem Application Note GenIP 20i Opérateurs Mathématiques Référence : EG_GenIP20i_1010_AN108_000_FR.doc Révision : 000 Date : 21/02/12 S.A. ERCO & GENER ZI de St. Lambert-des-Levées BP 30163 F-49412 SAUMUR Cedex Tél. : +33 (0)2 41 83 13 00 Fax : +33 (0)2 41 67 19 20 www.ercogener.com infos@ercogener.com SA CAPITAL 200873 R.C. SAUMUR B 332 174 820 SIRET 332 174 820 00032 NAF 2630Z TVA Intra : FR 16 332 174 820
EG_GenIP20i_1010_AN108_000_FR.doc Page 2 / 11 Evolution de ce document Revision Modifications Auteur Date 000 CREATION Loic Godineau 21/02/12 Les principales évolutions de cette documentation par rapport à la version précédente sont facilement identifiables lors de la lecture sur un écran par la couleur bleu du texte
EG_GenIP20i_1010_AN108_000_FR.doc Page 3 / 11 Sommaire 1 PRESENTATION... 4 2 LISTE DES OPERATEURS ACTUELS... 5 2.1 EXEMPLE ENVOI SMS SI EGALITE VALEUR LUE EN MODBUS... 6 2.2 EXEMPLE SURVEILLANCE OUVERTURE TUNNEL SSL ET ENVOI SUR TCP SI OUVERT... 6 2.3 EXEMPLE SURVEILLANCE OUVERTURE TUNNEL SSL ET ENVOI SUR TCP SERVEUR SI OUVERT OU FERME 6 2.4 EXEMPLE D'APPLICATION AU FACTEUR DE CONVERSION... 7 2.5 EXEMPLE EQUATION PREMIER DEGRE... 8 2.6 EXEMPLE DE RESOLUTION D'UNE EQUATION DU SECOND DEGRE SANS ECHO ET COMPTE RENDU SUR LES COMMANDES (NO ALL).... 9 2.7 EXEMPLE DECLENCHEMENT ENVOI MESSAGE PAR RAPPORT A DIFFERENTS SEUIL ENTREE ANALOGIQUE TENSION.... 10 2.8 EXEMPLE REMONTEE TEXTUELLE VALEUR ENTREE ANALOGIQUE EN COURANT... 11 3 REMARQUES... 11
EG_GenIP20i_1010_AN108_000_FR.doc Page 4 / 11 1 Présentation Le but est de présenter de manière plus approfondie les opérateurs logiques. Attention à la mise en œuvre de bien respecter la syntaxe. Avertissement Si vous avez une configuration fonctionnelle dans votre GenIP 20i, faites une sauvegarde avant toute manipulation. Pour démarrer sur une configuration usine, faire un reset du GenIP 20i via le bouton prévu à cet effet. Ceci est un exemple et doit être testé et validé par l utilisateur avant installation. Concernant les copies d écran, il peut y avoir un écart en fonction de la version logicielle dont vous disposez.
EG_GenIP20i_1010_AN108_000_FR.doc Page 5 / 11 2 Liste des opérateurs actuels Opérateur et Syntaxe Résultat Remarques $ADD_#xx#yy#$ $SUB_#xx#yy#$ $MUL_#xx#yy#$ $DIV_#xx#yy#$ $NOT_#xx#$ $AND_#xx#yy#$ $NAND_#xx#yy#$ $OR_#xx#yy#$ $NOR_#xx#yy#$ $XOR_#xx#yy#$ $CMP_#xx#operateur#yy#$ $IF_#xx#yy#zz#$ $LF$ $CR$ $0Xxx$ Retourne le résultat de l'addition de xx et yy. xx et yy peuvent être des message dynamiques ou des constantes Retourne la soustraction de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes. Retourne le produit de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes. Retourne la division de xx par yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes. Retourne l'inversion logique de xx. xx peut être un message dynamique ou une valeur constante. Retourne le et logique de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes Retourne le non et logique de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes Retourne le ou logique de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes. Retourne le ou exclusif logique de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes. Retourne le non ou logique de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes Retourne la comparaison de xx et yy, xx et yy peuvent être des messages dynamiques ou des valeurs constantes. Retourne 1 si vrai, sinon 0. L'opérateur peut être == pour l'égalité,!= pour la non égalité, < pour inférieur, <= pour inférieur ou égal, > pour supérieur, >= pour supérieur ou égal. Retourne zz si xx est égal à 0 ou vide, sinon, Retourne yy Insère un saut de ligne Insère un saut retour chariot Insère caractère ASCII, xx est la valeur hexadécimale du caractère souhaité xx et yy valeur décimale Utilisée seule doit être précédée de echo xx et yy valeur décimale Utilisée seule doit être précédée de echo xx et yy valeur décimale Utilisée seule doit être précédée de echo xx et yy valeur décimale Utilisée seule doit être précédée de echo Le séparateur # peut être remplacé par un autre caractère dans le cas ou celui-ci est utilisé dans yy ou zz Le séparateur # peut être remplacé par un autre caractère dans le cas ou celui-ci est utilisé dans yy ou zz Exemple : $0X41$ sera remplacé par A. $LEFT_#xx#yy#$ Retourne xx caractères les plus à gauche de la chaine yy. $RIGHT_#xx#yy#$ Retourne xx caractères les plus à droite de la chaine yy $SUBSTRING_#xx#yy#zz#$ Retourne yy caractères en partant de xx (0 est le début) de la chaine zz. $HEX_TO_BIN_#xx#$ Convertie la réprésentation hexadécimale xx en binaire $BIN_TO_HEX_#xx#$ Convertie la réprésentation binaire xx en hexadécimale (A à F sont des majuscules). $BIN_TO_hex_#xx#$ Convertie la représentation binaire xx en hexadécimale (A à F sont des minuscules). $TEST_MASK_#xx#yy#$ Teste si la chaine yy correspond au masque xx, retourne 1 si vrai, sinon retourne 0. Dans le masque,? est le joker pour 1 caractère, * est le joker pour 0 à n caractères. Astuce :??* est un joker pour 2 à n caractères ex : echo $TEST_MASK_#??1?#0110#$ retourne 1. echo $TEST_MASK_#*abc*#1234abc5678#$ retourne 1.
EG_GenIP20i_1010_AN108_000_FR.doc Page 6 / 11 Le signe $ encadre des variables ou résultat de variable. Les séparateurs dans les commandes telles que $CMP_#xx#operateur#yy#$ doivent être remplacés par un caractère qui n'est jamais dans xx ou yy ou zz. Par exemple # peut être remplacé par! Par exemple si on chaine ADD MUL et SUB, alors les séparateurs seront par exemple:? pour ADD! pour MUL # pour SUB 2.1 Exemple envoi SMS si égalité valeur lue en ModBus $IF_!$CMP_#$MODBUS_01_03_00_01_UINT$#==#3#$!send sms 0606491225 entree 1 fermee!!$;end; Lorsqu'il y aura égalité entre la valeur lue dans l'esclave ModBus 1 et la valeur 3, alors on enverra un sms. Si pas égalité aucune action ne sera exécutée. Dans ce cas pour CMP nous avons utilisé # en séparateur et pour IF nous avons utilisé! 2.2 Exemple surveillance ouverture tunnel SSL et envoi sur TCP si ouvert $IF_!$CMP_#$VPN_PPPOSSL_STATUS$#==#0#$!send tcp 192.168.100.37:100 tunnel ouvert!!$;end; Lorsque le tunnel sera ouvert la valeur de $VPN_PPPOSSL_STATUS$ passera à 1 donc la comparaison sera vrai. Dans ce cas le GenIP postera sur le serveur TCP le message tunnel ouvert. Dans le cas contraire aucune action ne sera exécutée. 2.3 Exemple surveillance ouverture tunnel SSL et envoi sur TCP serveur si ouvert ou fermé $IF_!$CMP_#$VPN_PPPOSSL_STATUS$#==#0#$!send tcp 192.168.100.37:100 tunnel ouvert!send tcp 192.168.100.37:100 tunnel fermé!$;end; Par rapport à l'exemple ci-avant le GenIP exécute une action lorsque la comparaison est vraie et aussi lorsqu'elle est fausse. Si on fait exécuter cette opération de manière périodique, nous sommes informés de l'état du tunnel (ouvert ou Fermé).
EG_GenIP20i_1010_AN108_000_FR.doc Page 7 / 11 2.4 Exemple d'application au facteur de conversion Considérons que nous avons une sonde de température affichant entre 0 et 100 degrés et fonctionnant en 4-20mA. Donc pour 4 ma nous aurons 0 degré et 20 ma nous aurons 100 degrés La plage de lecture du GenIP est de 0-20 ma. Donc pour avoir une même plage et un même nombre de pas il faudra enlever 4 à la valeur lue par le GenIP Ensuite la sonde varie de 4 à 20 ma donc le nombre de pas est 20-4 soit 16 pas ce qui donne 100/16 soit 6,25 degré par pas. Donc : Pour 4 ma nous aurons une valeur en degré de (4-4)*6,25=0 degré Pour 5 ma nous aurons une valeur en degré de (5-4)* 6,25=6,25 degré Pour 5,6 ma nous aurons une valeur en degré de (5,6-4)* 6,25=10 degrés Pour 20 ma nous aurons une valeur en degré de (20-4)* 6,25=100 degrés Au niveau du GenIP pour récupérer la valeur ceci se traduit par la macro commande et l'opération suivante : echo $MUL_!$SUB_#$ANALOG_VALUE_MA_ANALOG_INPUT_1$#4#$!6.25!$;end; Si nous avions voulu obtenir le résultat en Kelvin il aurait fallu retrancher -273 donc la macro commande aurait été : echo $SUB_?$MUL_!$SUB_#$ANALOG_VALUE_MA_ANALOG_INPUT_1$#4#$!6.25!$?273?$;end;
EG_GenIP20i_1010_AN108_000_FR.doc Page 8 / 11 2.5 Exemple équation premier degré Considérons le relevé suivant: Au niveau du GenIP pour récupérer la valeur ceci se traduit par la macro commande et l'opération suivante : echo $ADD_!$MUL_#$ANALOG_VALUE_MA_ANALOG_INPUT_1$#-0.4982#$!10.228!$;end; Cet exemple peut s'appliquer à une sonde dont on ne connait pas les caractéristiques courant/ Hauteur. Il suffit de faire plusieurs relevés puis à l'aide d'excel, on trace et on détermine l'équation. Sous Excel 2007, saisir le tableau de relevé puis insertion courbe nuage de points, puis clic de droit sur la courbe puis ajouter une courbe de tendance puis:
EG_GenIP20i_1010_AN108_000_FR.doc Page 9 / 11 2.6 Exemple de résolution d'une équation du second degré sans echo et compte rendu sur les commandes (no all). Considérons l'équation suivante: Au niveau du GenIP pour récupérer la valeur ceci se traduit par la macro commande et l'opération suivante : no all;echo $ADD_?$ADD_!$MUL_%$MUL_#$CUSTOM_MESSAGE_0$#$CUSTOM_MESSAGE_0$#$%2%$!$MUL_# $CUSTOM_MESSAGE_0$#3#$!$?1?$;end; Avec echo compte rendu des commandes nous aurions: echo 91 91 OK Sans echo compte rendu nous avons: 91
EG_GenIP20i_1010_AN108_000_FR.doc Page 10 / 11 2.7 Exemple déclenchement envoi message par rapport à différents seuil entrée analogique tension. Principe du script wait 1; attente une seconde pour stabilisation de la mesure set custom 0 $ANALOG_VALUE_MV_ANALOG_INPUT_1$; Charge la valeur lue dans le Custom 0 set custom 1 $CMP_!$CUSTOM_MESSAGE_0$!<!5000!$; Compare le contenu du Custom 0 et si inférieur ou égal à 500 et si vrai positionne le Custom 1 à 1 set custom 2 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!500!$#$CMP_!$CUSTOM_MESSAGE_0$!<!10000!$#$; Compare le contenu du Custom 0 et si supérieur à 500 et inférieur à 10000 si vrai positionne le Custom 2 à 1 set custom 3 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!1000!$#$CMP_!$CUSTOM_MESSAGE_0$!<!15000!$#$; Compare le contenu du Custom 0 et si supérieur ou égal à 10000 et inférieur à 15000 si vrai positionne le Custom 3 à 1 set custom 4 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!1500!$#$CMP_!$CUSTOM_MESSAGE_0$!<!20000!$#$; Compare le contenu du Custom 0 et si supérieur ou égal à 15000 si vrai positionne le Custom 4 à 1 $IF_#$CUSTOM_MESSAGE_1$#send sms +3311111111 inférieur à 5 volts##$; envoie le message si Custom message 1 à 1 $IF_#$CUSTOM_MESSAGE_2$# send sms +3311111111 entre 5 et 10 volts ##$; envoie le message si Custom message 2 à 1 $IF_#$CUSTOM_MESSAGE_3$# send sms +3311111111 entre 10 et 15 volts ##$; envoie le message si Custom message 3 à 1 $IF_#$CUSTOM_MESSAGE_4$# send sms +3311111111 supérieur à 15 volts ##$; envoie le message si Custom message 4 à 1 end; Script (Attention au rajout de caractères si vous faites un copier coller de cet exemple): wait 1; set custom 0 $ANALOG_VALUE_MV_ANALOG_INPUT_1$; set custom 1 $CMP_!$CUSTOM_MESSAGE_0$!<!5000!$; set custom 2 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!500!$#$CMP_!$CUSTOM_MESSAGE_0$!<!10000!$#$; set custom 3 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!1000!$#$CMP_!$CUSTOM_MESSAGE_0$!<!15000!$#$; set custom 4 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!1500!$#$CMP_!$CUSTOM_MESSAGE_0$!<!20000!$#$; $IF_#$CUSTOM_MESSAGE_1$#send sms +3311111111 inferieur à 5 volts 1##$; $IF_#$CUSTOM_MESSAGE_2$# send sms +3311111111 entre 5 et 10 volts ##$; $IF_#$CUSTOM_MESSAGE_3$# send sms +3311111111 entre 10 et 15 volts ##$; $IF_#$CUSTOM_MESSAGE_4$# send sms +3311111111 superieur à 15 volts ##$; end;
EG_GenIP20i_1010_AN108_000_FR.doc Page 11 / 11 2.8 Exemple remontée textuelle valeur entrée analogique en courant Le script sera le suivant(attention au rajout de caractères si vous faites un copier coller de cet exemple): set custom 62 192.168.100.37:100; set custom 63 +33111111111; wait 1; set custom 0 $ANALOG_VALUE_MA_ANALOG_INPUT_1$; set custom 1 $CMP_!$CUSTOM_MESSAGE_0$!<!8!$; set custom 2 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!8!$#$CMP_!$CUSTOM_MESSAGE_0$!<!10!$#$; set custom 3 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!10!$#$CMP_!$CUSTOM_MESSAGE_0$!<!15!$#$; set custom 4 $AND_#$CMP_!$CUSTOM_MESSAGE_0$!>=!15!$#$CMP_!$CUSTOM_MESSAGE_0$!<!20!$#$; $IF_#$CUSTOM_MESSAGE_1$#send sms $CUSTOM_MESSAGE_63$ vous etes a plus 1.3 metres ##$; $IF_#$CUSTOM_MESSAGE_2$#send sms $CUSTOM_MESSAGE_63$ vous etes entre 1.10 et 1.30 metres##$; $IF_#$CUSTOM_MESSAGE_3$#send sms $CUSTOM_MESSAGE_63$ vous etes entre 0.5 et 1.10 metres##$; $IF_#$CUSTOM_MESSAGE_4$#send sms $CUSTOM_MESSAGE_63$ vous etes a moins 0.5 metres##$; $IF_#$CUSTOM_MESSAGE_1$#send tcp $CUSTOM_MESSAGE_62$ vous etes a plus 1.3 metres$lf$$cr$##$; $IF_#$CUSTOM_MESSAGE_2$#send tcp $CUSTOM_MESSAGE_62$ vous etes entre 1.10 et 1.30 metres$lf$$cr$##$; $IF_#$CUSTOM_MESSAGE_3$#send tcp $CUSTOM_MESSAGE_62$ vous etes entre 0.5 et 1.10 metres$lf$$cr$##$; $IF_#$CUSTOM_MESSAGE_4$#send tcp $CUSTOM_MESSAGE_62$ vous etes a moins 0.5 metres$lf$$cr$##$; end; 3 Remarques La syntaxe est très importante. Le nombre de $ doit être paire