|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Bonjour,
Je doit modifier un projet existant pour le porté sur une nouvelle plateforme. Notamment un Module DIGI Connect ME 9210. C'est un petit module Ethernet, permettant de dialoguer sur le réseaux et d’interroger notre supervision par RS232. Il dispose d'un linux embarqué. Dessus nous avons un logiciel qui tourne pour faire du Telnet, SNMP, Http etc. C'est ce dernier qui m'occupe. Actuellement nous lisons une page qui contient des codes sous la form ##MODULE1 // DATA/BATTERIE/3## Lorsque l'on lit ce genre de code, ont remplace ce code par la valeur correspondant que l'on interroge à la supervision à travers le RS232, et l'on renvoie la page HTML au client avec les données Lorsque l'on interroge par exemple l'information "BATTERIE" la supervision nous renvoie une ligne contenant plusieurs information, la tension, le courant, la température etc.. Sur la page Html on utilise plusieurs de ces informations donc plusieurs fois le même type de code ##MODULE1 // DATA/BATTERIE/3##, ##MODULE1 // DATA/BATTERIE/4##, ##MODULE1 // DATA/BATTERIE/5##. Vu que l'on a récupéré la première fois toutes les informations il est inutile de rappeler la supervision, cela fait perdre du temps. Pour cela je doit crée un tableau servant de cache pour 16 paramètres, ce cache doit avoir une durée de 5 secondes, au delà on met à jour le cache donc ont appel de nouveau la supervision si besoin. Voila pour la situation. Je pensais donc faire un tableau de 16 lignes contenant une structure: Code :
Si vous avez une idée se serait sympa, je bosse tout la journée dessus voir plus si besoin. Merci |
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
Salut Megamario,
Pour résumer, tu as 16 valeurs à mettre à jour toutes les 5 secondes. C'est la seule condition pour mettre à jour les données ? C'est automatiquement et obligatoirement toutes les 4 secondes ? Quelles sont les types de ces 16 variables ? Je ne comprends pas trop l'intérêt de la structure que tu as déjà fait. Pourquoi des char* ? Souhaites-tu aussi faire des méthodes pour la mise à jour de la structure, à la façon d'une classe ?
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#3 | |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Citation:
Alors je met à jour les valeurs uniquement lorsque j'en ai besoin et que celle déposé dans le tableau ont plus de 5 secondes. Lorsque je n'utilise pas le service http je ne met pas à jour ces données. Chronologie: Le client demande la page html. - Je lit ma page html et recherche les codes entre les ## .....## - Lorsque je rencontre un code je regarde dans le cache si le code existe et qu'il a moins de 5 secondes (typiquement lors de l'appel de la page html soit il n'y a rien soit il est plus vieux) - Dans le cas ou il n'y a rien ou plus vieux je demande les données à la supervision. J'entre ces données dans le cache et je rempli à la place des ## ...# la valeur recherché. - Le continu à lire le html jusqu'au nouveau code. - je regarde dans le cache s'il est présent et moins de 5 secondes. - S'il est présent je récupère la donnée associée et remplie le html avec. - etc... - Une fois le html lu et rempli je transmet au client le code hmtl modifié Voila j’espère que c'est plus clair; En ce qui concerne ma structure pour le moment elle contient donc: (J'ai fixé les tableau de char et la date est une variable déjà existante dans le projet) Char Commande[20]; -> c'est le code de commande recherché, typiquement se sera "/DATA/BATT_1/" pour interroger l'objet batterie 1 Char Reponse[200]; -> C'est la ligne complète de réponse de la supervision, typiquement se sera /DATA/BATT_1/5448/20/21522/80/" etc... Dans cette ligne il est contenu toute les donner de la batterie, la tension, le courant, température, % de charge et plein d'autre truc. time_t Date; -> la date de l’acquisition le code dans la page html est de ce type ##MODULE1 // DATA/BATTERIE/5## pour MODULE1 ->pour indiquer la supervision utilisé (on a plusieurs modèle) DATA/BATTERIE/ -> le code à appeler en RS232 5 -> La position de la donnée dans la réponse ici dans l'exemple "/DATA/BATT_1/5448/20/21522/80/ " le 5 correspond a 21522. |
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
Pour simplifier le problème, on va faire abstraction de l'histoire du HTML car elle n'apporte rien à la résolution du problème en lui-même, elle est juste utile à comprendre le contexte
Donc : - le client demande des données - si tu as des données suffisamment jeunes, tu lui envoies - sinon, tu fais une acquisition, tu analyses la réponse de la supervision, tu envoies au client. De ce que je comprend, la périodicité n'est pas de 5 secondes obligatoirement et ce ne sera pas forcément les 16 données à chaque fois ? La demande des données ce fait par une commande (ex : MODULE1 // DATA/BATT_1/x ) et tu vérifies que cette commande (en enlevant le x) est présente dans ton tableau de structures correspondant à MODULE1. Il faut que tu sois très prudent sur la taille du buffer pour stocker la réponse, pour ne pas risquer de buffer overflow. Si tu dois interroger la supervision, quel est le surcout en temps ?
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
00
|
|
|
#5 | ||||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
C'est exactement cela.
Le temps de réponse de la supervision est de quelques milliseconde, on est limité par la RS232 et bien sur, les 2 traitements des microprocesseurs. Je n'est pas mesuré mais lorsque j’appelle à chaque code trouvé, la page html met quelques secondes à s'afficher car il y a plusieurs fois les même demande. On pourrais réduire par 4 à 5 fois le nombre de transferts RS232 à chaque rafraîchissement. Voila ce que j'ai fait pour le moment: (avec 20 données au lieu de 16) Fichier h: Code :
Code :
|
||||
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 694 ![]() |
Plusieurs remarques :
1) Pour la définition du type booléen : http://c.developpez.com/faq/index.ph...ral#TYPES_bool 2) Les variables globales sont à éviter autant que possible. Si maintenant tu veux 2 tableaux de structures (pour par exemple adresser 2 supervisions), alors tes fonctions sont à refaire. Pourquoi ne pas passer un pointeur vers le premier élément et la taille du tableau en paramètre de la fonction ? 3) SSCT_removeAll() : pourquoi ne pas faire une fonction renvoyant une structure vide et ainsi réellement écraser chaque case du tableau ? 4) SSCT_add() : initialise tes index à -1 et si à la fin de ta boucle ils sont à une valeur différentes, c'est qu'un index (V ou T) a été trouvé. 5) Toujours dans la même fonction : elle est censé renvoyer un BOOL, alors retourne TRUE ou FALSE (sinon, pourquoi s'embêter à les définir ?! 6) Code :
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
||
|
00
|
|
|
#7 | ||||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Merci pour ces infos, j'en avais déjà modifié quelque une.
Réponse au 1) Pour cela j'ai gardé ce qui existait dans le code actuel, mais cela m'a surpris aussi. Réponse au 2) En ce qui concerne le type de supervision. Sa c'est pas un souci car en faite dans celle partie je ne le gère pas. D'ailleurs je n'aurais qu'un seul type à gérer a la fois. La module externe étant connecter a une seul supervision à la fois. C'est la partie RS232 qui s'occupe de la transmission qui gère tel ou tel type de supervision.Donc sa on peut l'oublier dans mon cas présent. Réponse au 3) Bonne idée je vais chercher comment faut faire mais j'ai une vague idée. Réponse au 4) Effectivement, j'ai déjà fait sa en plus pour d'autre projet. Réponse au 5) Sa j'ai corrigé Réponse au 6) Merci pour l'info. ------------------------------------- J'ai commencé mes test mais c'est chaud de reprendre un projet en cours ou le code par dans tout les sens. Voici ou j'en suis (j'ai pas encore modifier suivant les indications données) Code C :
le H: Code C :
pour le moment il me fait un Add qu'a la fin du tableau je cherche pourquoi.. [Edit]A si trouvé, c'est normal. |
||||
|
|
00
|
|
|
#8 | ||
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Il m’énerve il plante, je ne sais pas pourquoi.
Code :
Je suppose qu'il ne doit pas y avoir le \0. je regarde sa demain. |
||
|
|
00
|
|
|
#9 |
|
Membre actif
![]() VB6/VB.net/C/C++/C# Inscription : septembre 2008 Messages : 551 ![]() |
Bonjour,
Bon j'avance et cela fonctionne, mais j'avais un souci avec le printf ou fprintf pour débugger. Lorsqu'il rencontrait le caractère 13 (CR) il retournait à la ligne en effaçant ce qu'il venait d'afficher donc rien d'afficher dans la console ou le fichier. Un peu rageant de voir que forcement mon cache fonctionnait puisqu'il ne fessait qu'une requête de la même commande, mais que rien ne s'affichait dans la console. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com