WebSampling 1.2.X

De wiki
Aller à : navigation, rechercher

Le but de cet article est de décrire la conception du logiciel WebSampling 1.2.X utilisé pour la Carte d'Acquisition Web.

Prérequis

Avant de commencer il est indispensable de lire la documentation disponible de la carte SB68EC sur le site de Modtronix.

Après avoir lu la documentation, il est aussi conseillé de s'entrainer à utiliser le serveur web intégré et à recharger le logiciel fourni par modtronix à l'aide de l'application netloader.

Téléchargement

L'archive V1.2 contenant les sources, les fichiers projets pour l'environnement MPLAB, les binaires compilés est disponible ici.

Description rapide de l'implémentation

Les différences par rapport à la version 1.1 sont l'intégration d'un module permettant la remontée vers le site BDPV (www.bdpv.fr) des informations de production d'un générateur photovoltaïque connecté au réseau. Ce faisant le client http a été amélioré et permet maintenant la sauvegarde (puis l'affichage) de l'upload, aussi bien pour la fonction "Websampling" que la fonction "BDPV"

La version 1.2 est toujours conçue à partir du logiciel Modtronix SBC68EC Webserver V3.06. Pour remplir les fonction de la Carte d'Acquisition Web, il est nécessaire de lui ajouter les fonctionnalités suivantes :

  • Réception des trames de téléinformation EdF de 2 compteurs différents
  • Ajout d'un client SNTP permettant d'aquérir l'heure GMT, mais aussi d'ajuster le diviseur de la base de temps interne afin d'annuler la dérive de celle-ci
  • Mise en place d'un client HTTP emettant des requêtes contenant ces trames de téléinformation ainsi que les valeurs de ports analogiques
  • Ajout d'un module BDPV qui permet d'uplmoader vers le site www.bdpv.fr les chiffres de production d'une installation photovoltaique
  • Ajout d'un automate cadençant l'émission de ces requêtes toutes les minutes

Réception des trames de Téléinformation EdF

Pour réaliser cette fonction, il est nécessaire de modifier les fichiers suivants :

  • projdefs.h :
    • passage des tailles de buffer UART Rx/Tx à 32 et 8 octets.
  • appcfg.c :
    • passage du Baudrate par défaut 1200 Bauds.
    • modification du diviseur de l'UART pour 1200 bauds : on diminue la valeur de 1%. Cela revient à paramétrer un baudrate de 1212 bauds. En effet l'UART du PIC s'attend à avoir un bit de stop entier à la fin de chaque octet. Or la sortie téléfinformation EdF n'envoie qu'un seul bit de stop. Ce qui fait que l'UART du PIC rate parfois le front start de l'octet suivant et donc l'octet en entier. Pour remédier à ce problème on augmente la cadence de l'UART du PIC de 1%, cela permet d'être sur que l'échantillonnage du bit de stop est terminée lorsque le front start de l'octet suivant arrive. Cela n'a pas d'influence sur le décodage.
  • serint.c :
    • on ne tient plus compte du Frame Error. En effet la réception était arrêtée puis redémarrée dans ce cas, ce qui n'est pas la méthode préconisée dans la datasheet du PIC. Cette modification est optionnelle.
  • teleinfo.h et teleinfo.c :
    • ajout de ces deux fichiers qui contionnent les définitions et le code nécessaire pour la réception des trames de téléinformation.

Fonction WebSampling

Cette fonction gère chaque minute l'ordonnancement des différentes actions pour obtenir le résultat désiré :

  • résolution dns du domaine.
  • acquisition de la trame téléinformation courante.
  • émission de la requête http.

L'état de la fonction est signalé à l'utilisateur à l'aide des deux rangées de leds de la plaque de prototypage.

Cette fonction est définie et implémentée à l'aide des deux fichiers suivants :

  • proto_board/websampling.h
  • proto_board/websampling.c

Fonction Leds

Cette fonction gère l'allumage et l'extinction des leds de la carte de prototype. Elle est définie et implémentée dans les fichiers suivants :

  • proto_board/led.h
  • proto_board/leds.c

Elle a été modifié depuis la version 1.1 pour permettre de commander chaque led séparément.

Client HTTP

Pour réaliser cette fonction il est nécessaire de modifier les fichiers suivants :

  • projdefs.h :
    • définition de la macro suivante :
      • define HTTP_SERVICE_PORT : valeur définie en EEPROM du port TCP service web distant utilisé par la carte pour uploader les données.
    • définition des constantes suivantes :
      • DEFAULT_HTTP_SERVICE_PORT : valeur par défaut de HTTP_SERVICE_PORT.
      • STACK_CLIENT_MODE : directive de compilation qui permet d'inclure la partie client de la stack IP.
      • STACK_USE_DNS : directive de compilation qui permet d'inclure le client DNS.
  • appcfg.h : Mise à jour du mapping EEPROM pour sauvegarder le host name, son IP et le port utilisé.
  • appcfg.c : ajout des valeurs par défaut pour les paramètres EEPROM ci-dessus.
  • net/http.c : modification de la fonction sendfile afin que cette dernière puisse être appelée avec pour paramètre un handle de liaison TCP et à la place de l'index de tableau de handle interne au serveur http.
  • net/tcp.c : correction des fonctions TCPGetArrayChr et TCPGetArray dans lesquelles le compteur d'octets restant à lire n'est pas mis à jour.
  • net/httpclient.c : copie modifiée de net/tcputils.c afin de pouvoir envoyer des fichiers parsés à l'aide de la fonction sendfile de http.c. Ajout des fonctions initHttpClient et initHttpClientIpEeprom pour initialiser la connection, getHttpResponseLine pour récupérer une ligne de la réponse, skipHttpHeaders pour sauter les en têtes de la réponse et le corps de cette dernière.

Client DNS

  • net/dns.c:
    • correction de deux bugs :
      • une variable d'état qui doit être statique
      • le port source udp était nul, c'est contraire au protocole IP. La valeur 1234 est maintenant utilisée.

Client SNTP

Pour implémenter le client SNTP, les fichiers suivants ont été modifiés :

  • appcfg.h : Mise à jour du mapping EEPROM pour sauvegarder le host name du serveur sntp.
  • appcfg.c : ajout des valeurs par défaut pour les paramêtres EEPROM ci-dessus.
  • net/tick.h et net/tick.c : ces deux fichiers sont modifiés pour :
    • ajouter un compteur tickSec32 qui compte le nombre de secondes depuis le lancement du logiciel sur 32 bits.
    • offrir la possibilité d'ajuster la valeur rechargée tous les 10 ms dans le timer0 afin d'augmenter la précision de ces 10 ms.
    • corriger un bug potentiel lié à la modification des variables tickCounter et tickSec32 dans une interruption : si cela intervient pendant l'utilisation de ces variables dans l'application, cela peut donner des résultats incohérents.
  • sntp/sntp.h et sntp/sntp.c : ces deux fichiers contiennent :
    • une fonction, activée toutes les heures qui permet d'obtenir l'heure GMT d'un serveur sntp
    • une fonction qui permet de calculer la dérive de l'horloge interne entre deux acquisitions sntp et de modifier la valeur utilisée pour recharger le timer0 (voir net/tick.c)

Module Hashes

Ce module défini par les fichiers net/hashes.c et net/hashes.h permet de calculer des sommes de contrôles MD5 et SHA

Module BDPV

Ce module est décrit dans les fichiers :

  • proto_board/bdpv.h
  • proto_board/bdpv.c

Il permet d'envoyer quotidiennement (chaque nuit, entre 0h et 2h GMT) vers le site BDPV

Module Pulse Counter

Ce module est décrit dans les fichiers :

  • proto_board/pulseCounter.h
  • proto_board/pulseCounter.c

Il permet de compter des impulsions présentes sur l'entrée A5

Automate

  • mxwebsrvr.c : ce fichier contient l'automate qui gère le cadencement de toutes les fonctions implémentées dans le logiciel. Les modifications suivantes ont donc été apportées :
    • désactivation de la de configuration par interface série
    • ajout des appels d'initialisation et de traitement des fonctions sntp, websampling et BDPV

Commandes Utilisateur

  • cmd.h : definion des commande de modification du host name et du path de l'URL d'upload.
  • cmd.c : code de traitement pour la modification des paramêtres du :
    • serveur http cible : host name (commande lh), path de l'URL (commande lr).
    • serveur sntp source : host name (commande ls)
  • httpexec.h : définition des tags de lecture de des paramêtres du :
    • serveur http cible :host name (l22) ,path de l'URL (l23).
    • serveur sntp source : host name (l24)
  • ainsi que des variables contenant :
    • le nombre de secondes écoulées depuis le dernier reset (R00)
    • la dernière trame téléinfo reçue sur l'entrée 1 (R01)
    • la dernière trame téléinfo reçue sur l'entrée 2 (R02)
    • l'heure (timestamp UNIX) (R03)
  • httpexec.c :implémentation des fonctions de lecture des paramêtres et variables définies ci-dessus.

Compilation

L'application est compilée à l'aide de l'environnement de développement MPLAB de Microchip. Elle est chargée dans la carte à l'aide de l'application Modtronix netloader.

Pages Web

Interface Homme Machine

Les pages webs de la carte SBC68EC sont définies dans le répertoire webpages/default/ de l'archive. Elles ont été modifiées pour les besoins de l'application Websampling. En particulier :

  • les fichiers xncfg.cgi, netcfg01.js pour l'affichage de l'IP du serveur DNS utilisé (IP récupérée à l'aide du protocole DHCP).
  • les fichiers webs.cgi et webs.htm pour définir les IHM de saisie des paramètres WebSampling.
  • les fichiers sntp.cgi et sntp.htm pour définir l'IHM liée au client sntp.
  • les fichiers bdpv.cgi et bdpv.htm pour définir l'IHM liée au client sntp.
  • le fichier tiframe.cgi permet d'afficher le contenu de la dernière trame téléinformation reçue.
  • le fichier dispreq.htm permet d'afficher un exemple de requête http envoyée au service web.
  • les fichiers contact.htm, index.htm, intro.htm, syscfg65.htm, xcfg.htm ont reçus des mise à jour diverses (liens,etc..)

Note : les pages webs.htm, bdpv.htm et sntp.htm utilisent la technologie AJAX.

Définition des requêtse HTTP d'upload des données

  • le fichier httpreq.cgi a été ajouté. Il contient la trame de la requête http émise périodiquement vers le service web. Elle est parsée comme les pages cgi standard, les tags étant remplacés par leurs valeurs adéquates. Une astuce concerne la longueur définie dans l'entête Content-Length. L'entête est requise par les serveurs Apache (et peut être les autres). Comme cette longueur est difficile à calculer sur le PIC (il faudrait mettre le corps de la requête en mémoire), on la remplace par sa valeur max (si la trame de télé information fait 255 caractères). Pour les cas ou le corps de la requête est plus petit que la taille max définie, on le complète par autant de lignes de 32 "espaces" que nécessaire (vous pouvez les remarquer dans le fichier httpreq.cgi).
  • le fichier bdpvreq.cgi a été ajouté. Il contient la trame de la requête http émise chaque jour vers le service bdpv. Elle est parsée comme les pages cgi standard, les tags étant remplacés par leurs valeurs adéquates.

Compilation

L'ensemble de ces "pages web" est "compilé" à l'aide de l'application Modtronix netloader en un fichier default.img. Ce fichier est chargé dans l'EEPROM de la carte SBC68EC toujours à l'aide de l'application netloader.