Solution Pont-Bascule
Architecture
Le Pont-Bascule
Le Pont-Bascule est une Sonde qui retourne 2 valeurs
- Un Poids mesuré
- Un Dispositif de Stockage des Données (DSD)
API entrante
◇ : RS-232 / Port "Série" / Port "COM"
La plupart du temps, le Pont-Bascule permettra le requêtage direct en envoyant une trame d'octets sur le Port COM du PC hôte et en récupérant sur ce même Port une trame réponse contenant les informations. Le paramétrage devra alors comporter toutes les caractéristiques de la connexion Série (vitesse, parité, …)
○ : TCP/IP / LeadUp
Dans une architecture réseau, la connexion Série peut être remplacée par une connection TCP/IP directe. L'envoi et la réception de trames est alors identique à la connexion RS-232, mais le paramétrage se limite alors à un Socket (IP et Port).
▷ : Autres interfaces
D'autres modes de connexions peuvent parfois être proposés. Quelques exemples :
- L'interrogation d'un FTP local à l'appareil ;
- un Web Service ;
- etc.
La couche intermédiaire (Middlewares)
La couche intermédiaire a plusieurs rôles
- Normaliser les APIs des différents Ponts ;
- les rendre accessibles sur le réseau de l'entreprise ;
- absorber la complexité de l'infrastructure réseau ;
- proposer une API au format Web Service REST.
API prises en charge
- ◇ : RS-232 / Port "Série" / Port "COM"
- ○ : TCP/IP / LeadUp
Les autres interfaces (▷) peuvent être ajoutées dans la solution au cas par cas.
API entrante
⬡ : Droid/Probe/WeighStation
Il s'agit d'un Web Service REST fournissant la liste des Pont-Bascules connectés au Middleware au format JSON.
⬡ : Droid/Probe/WeighStation/<WeighBridge>
Il s'agit d'un Web Service REST fournissant la réponse du Pont-Bascule <WeighBridge> à une requête de pesée au format JSON.
Le Client
N'importe quelle Application capable de faire une requête HTTP GET au Web Service du Middleware pourra servir de Client à la Solution.
Les Logiciels de la couche intermédiaire
Le cœur de la solution est le logiciel Fleet/Droid qui peut s'interfacer avec les différents Pont-Bascules en utilisant les API supportées. C'est également le Fleet/Droid qui met à disposition le Web Service Droid/Probe/WeighStation.
Il s'agit d'une application .NET 6.0 qui se lance en espace Utilisateur et écoute sur un port paramétrable les requêtes Web Services entrantes. Il n'y a pas de limite au nombre de Pont-Bascules qu'un Fleet/Droid peut adresser, tant qu'ils sont tous visibles depuis la Session de l'Utilisateur.
Si l'infrastructure réseau empêche un accès direct par le Client au Fleet/Droid, il est possible d'ajouter un Fleet/GroundControl qui mettra à disposition du Client le même Web Service Droid/Probe/WeighStation mais permet l'utilisation en mode Proxy, la gestion des IP Dynamiques et la possibilité pour le client d'utiliser une URL unique pour toutes ses requêtes peu importe le nombre de Fleet/Droids ou de Pont-Bascules dans l'infrastructure.
La particularité de ce type de déploiement est que le Fleet/GroundControl, se faisant passer pour un Fleet/Droid il permet d'avoir plusieurs niveaux de profondeur.
L'image ci-dessus combine tous les scénarios possibles d'infrastructure dans une Solution Pont-Bascule avec les contraintes vues précédemment
- Le Client peut appeler indifféremment un Fleet/Droid ou un Fleet/GroundControl via la même requête ;
- le Fleet/GroundControl ne peut dialoguer qu'avec des Fleet/Droids, il ne peut pas s'interfacer directement avec un Pont-Bascule ;
- Le Fleet/Droid ne peut pas communiquer avec un autre Fleet/Droid ;
- Un même Fleet/Droid pour gérer plusieurs Pont-Bascules, peu importe leur API.
Installation
.NET
Le Fleet/Droid nécessite le .NET en version 6 Le Fleet/GroundControl nécessite le .NET en version 7.
- À installer :
- .NET Windows Runtime
- ASP.NET Core Runtime
Fleet/Droid
Le Droid.exe
est à copier sur la machine hôte à l'emplacement souhaité.
L'emplacement recommandé est le suivant :
C:\Program Files\Fleet\Droid\Droid.exe
Démarrage silencieux
S'agissant d'une Application Windows qui se lance en espace Utilisateur, il est préférable de masquer la fenêtre d'exécution pour éviter qu'elle soit accidentellement fermée.
$path = 'C:\Program Files\Fleet\Droid\Droid.exe'
$instance = 'Ligonnes'
Start-Process -FilePath $path -WindowStyle Hidden -ArgumentList 'instance',$instance
Fleet/GroundControl
Le GroundControl.exe
est à copier sur le serveur à l'emplacement souhaité.
L'emplacement recommandé est le suivant :
C:\Program Files\Fleet\GroundControl\GroundControl.exe
Service Windows
Pour installer le Service Windows, exécuter la commande suivante en Administrateur : Cette étape est à répéter pour chaque instance
GroundControl.exe -install -instance <nom de l'instance>
Paramétrage général
Fleet/Droid
Modules
Les Modules sous forme de DLL sont à déposer à l'emplacement suivant :
C:\ProgramData\Fleet\Droid\Modules\
Droid.fleet
Le paramétrage du Fleet/Droid est obtenu en assemblant les 4 fichiers suivants :
<chemin de l'exe>\Droid.fleet
C:\ProgramData\Fleet\Droid\Droid.fleet
<chemin de l'exe>\Droid.<instance>.fleet
C:\ProgramData\Fleet\Droid\<instance>\Droid.fleet
Les fichiers sont lus dans l'ordre (si existants) et toute valeur présente dans l'un d'entre eux écrasera la valeur précédemment lue. Le format du fichier est le suivant :
{
"Quantum": { "Server": "<adresse quantum>", "Port": 11337 }, // Facultatif
"Port": 8888, // Facultatif. Défaut 11337
"<Module>" : {
...
}
...
}
Paramètre | Défaut | Note |
---|---|---|
Quantum | ∅ | Adresse du Fleet/GroundControl Proxy dans une infrastructure complexe |
Port | 11337 | SI aucun port n'est spécifié, le Fleet/Droid prendra le premier port libre suivant |
<Module> | { } | Objet de configuration spécifique à chaque module chargé |
Fleet/GroundControl
Modules
Les Modules sous forme de DLL sont à déposer à l'emplacement suivant :
C:\ProgramData\Fleet\GroundControl\<instance>\Modules\
GroundControl.fleet
Le paramétrage du Fleet/Droid est obtenu en assemblant les 4 fichiers suivants :
<chemin de l'exe>\GroundControl.fleet
C:\ProgramData\Fleet\GroundControl\GroundControl.fleet
<chemin de l'exe>\GroundControl.<instance>.fleet
C:\ProgramData\Fleet\GroundControl\<instance>\GroundControl.fleet
Les fichiers sont lus dans l'ordre (si existants) et toute valeur présente dans l'un d'entre eux écrasera la valeur précédemment lue. Le format du fichier est le suivant :
{
"Quantum": { "Server": "<adresse quantum>", "Port": 11337 }, // Facultatif
"Port": 11337, // Facultatif. Défaut 11337
"<Module>" : {
...
}
...
}
Paramètre | Défaut | Note |
---|---|---|
Quantum | ∅ | Adresse du Fleet/GroundControl Proxy dans une infrastructure complexe |
Port | 11337 | SI aucun port n'est spécifié, le Fleet/Droid prendra le premier port libre suivant |
<Module> | { } | Objet de configuration spécifique à chaque module chargé |
Paramétrage d'un Pont-Bascule
Fleet/Droid/WeighStation
Le module Fleet/Droid chargé de s'interfacer avec les Pont-Bacules est le module WeighStation. Le format est le suivant :
"WeighStation": {
"WeighBridges" : [
...
]
}
Paramètre | Défaut | Note |
---|---|---|
WeighBridges | [ ] | Liste d'Objets WeighBridge de paramétrage de Pont-Bascules |
Fleet/Droid/WeighStation/WeighBridge
Chaque WeighBridge comporte un Nom et un Modèle. Les paramètres supplémentaires dépendent du Modèle d'API paramétré.
DemoWeighBridge
Un WeighBridge de démo permettant de tester l'API Web Service sans avoir besoin d'un véritable Pont-Bascule. Le DemoWeighBridge retournera alternativement un Poids élevé suivi d'un Poids faible. Le DSD s'incrémentera à chaque appel.
{
"Name": "Ligonnes",
"Model": "DemoWeighBridge"
}
Paramètre | Défaut | Note |
---|---|---|
Name | ∅ | Nom du Pont-Bascule dans l'API |
Model | DemoWeighBridge |
SerialWeighBridge
Un WeighBridge utilisant l'API RS-232 / Port "Série" / Port "COM". Le paramétrage se fait en 2 temps :
- Configuration du Port COM ;
- configuration des trames.
{
"Name": "Dupond",
"Model": "SerialWeighBridge",
"PortName": "COM1",
"BaudRate": 1200,
"Parity": "None",
"DataBits": 8,
"StopBits": "One",
"Timeout": 3000,
"Delay": 1000,
"Ask": [ "#01#0901#1099M54#0D#0A" ],
"Data": [ "#01#0901#0204*#0201*#0203<weight,6>*#0299<dsd,5>*" ]
}
Paramètre | Défaut | Note |
---|---|---|
Name | ∅ | Nom du Pont-Bascule dans l'API |
Model | SerialWeighBridge | |
PortName | "" | Port COM sur lequel le Pont-Bascule est branché |
BaudRate | 0 | Configuration de la connexion Série |
Parity | ∅ | Configuration de la connexion Série |
DataBits | 0 | Configuration de la connexion Série |
StopBits | None | Configuration de la connexion Série |
NewLine | "" | Configuration de la connexion Série |
Timeout | 0 | Configuration de la connexion Série (Read + Write) |
Delay | 0 | Délai d'attente entre l'envoi (Write) et la réception (Read) sur le Port Série |
Ask | [] | Ensemble des trames à envoyer pour faire une requête au Pont-Bascule (voir [[#Trames Ask / Data]] ci-après) |
Data | [] | Réponse attendue pour chacune des requêtes du paramètre Ask (voir [[#Trames Ask / Data]] ci-après) |
TCPWeighBridge
Un WeighBridge utilisant l'API TCP/IP. Le paramétrage se fait en 2 temps :
- Configuration du Socket ;
- configuration des trames.
{
"Name": "Dupont",
"Model": "TCPWeighBridge",
"Address": "192.168.13.37",
"Port": 4567,
"Ask": [ "#01#0901#1099M54#0D#0A" ],
"Data": [ "#01#0901#0204*#0201*#0203<weight,6>*#0299<dsd,5>*" ]
}
Paramètre | Défaut | Note |
---|---|---|
Name | ∅ | Nom du Pont-Bascule dans l'API |
Model | TCPWeighBridge | |
Address | 127.0.0.1 | Configuration de la connexion TCP/IP |
Port | 0 | Configuration de la connexion TCP/IP |
Ask | [] | Ensemble des trames à envoyer pour faire une requête au Pont-Bascule (voir [[#Trames Ask / Data]] ci-après) |
Data | [] | Réponse attendue pour chacune des requêtes du paramètre Ask (voir [[#Trames Ask / Data]] ci-après) |
LeadUpWeighBridge
Un WeighBridge utilisant l'API TCP/IP compatible avec l'application LP Indicator de la société LeadUp.
{
"Name": "Pidou",
"Model": "LeadUpWeighBridge",
"Address": "192.168.13.37",
"Port": 4567,
}
Paramètre | Défaut | Note |
---|---|---|
Name | ∅ | Nom du Pont-Bascule dans l'API |
Model | TCPWeighBridge | |
Address | 127.0.0.1 | Configuration de la connexion TCP/IP |
Port | 0 | Configuration de la connexion TCP/IP |
Ask | [ "<POIDS_DSD>" ] |
Requête LeadUp (valeur fixe) |
Data | [ "#3C/POIDS_DSD~<weight>~<dsd>#3E*" ] |
Réponse LeadUp (valeur fixe) |
Trames Ask / Data
Une Requête à un Pont-Bascule en utilisant les Trames (Port Série ou TCP/IP) se paramètre comme un échange séquentiel. Le Fleet/Droid envoie la première Trame du tableau Ask, attends la réponse et en extrait des valeurs le cas échéant, puis recommence jusqu'â épuisement des Trames du tableau Ask.
Les Réponses à chaque Requête Ask sont décodées en utilisant le paramétrage du tableau Data.
Trame Ask
La Trame Ask ne peut contenir que des caractères ASCII (CodePoint < 128).
Les caractères non graphiques peuvent être écrits en utilisant la syntaxe #xx
avec xx
représentant un nombre à 2 chiffres hexadécimal.
Élément | Note |
---|---|
a-z , A-Z , 0-9 |
Lettres, chiffres |
`, !, ", $, %, &, ', (, ), *, +, ,,<br> -, ., /, :, ;, <, =, >, ?, @, [, `,] , ^ , _ , ` , { , \| , } , ~ |
Caractères graphiques (sauf # ) |
#xx (xx = nombre hexadécimal) |
Caractère ASCII xx |
#23 |
Caractère # |
Par exemple, CRLF
(Carriage Return + Line Feed) s'écrit #0D#0A
La Trame "#01#0901#1099M54#0D#0A"
se décode de la manière suivante :
Valeur | Caractères |
---|---|
#01 |
Start of Heading (SOH) |
#09 |
Horizontal Tab (HT) |
0 |
Le chiffre 0 |
1 |
Le chiffre 1 |
#10 |
Data Link Escape (DLE) |
9 |
Le chiffre 9 |
9 |
Le chiffre 9 |
M |
La lettre M |
5 |
Le chiffre 5 |
4 |
Le chiffre 4 |
#0D |
Carriage Return (CR) |
#0A |
Line Feed (LF) |
American Standard Code for Information Interchange — Wikipédia
Trame Data
La reconnaissance des données dans une Trame Data se fait de gauche à droite, à la manière d'une Expression Régulière simplifiée. Les différents éléments qui la composent sont les suivants :
Élément | Note |
---|---|
<weight> |
Poids retourné par le Pont-Bascule |
<weight,x> (x = nombre) |
Poids retourné sur x caractères (Peut inclure un séparateur décimal) |
<dsd> |
DSD retourné par le Pont-Bascule (Chaîne ASCII) |
<dsd,x> (x = nombre) |
DSD retourné par le Pont-Bascule (Chaîne ASCII) sur x caractères |
_ |
N'importe quel caractère (un seul) |
* |
N'importe quels caractères (jusqu'à l'Élément suivant ou la fin. Peut être de longueur 0) |
`, !, ", $, %, &, ', (, ), +, ,, -<br> ., /, :, ;, =, ?, @, [, `, ] ^ , ` ,{ , \| , } , ~ |
Caractères graphiques (sauf # , _ , * , < , > ) |
#xx (xx = nombre hexadécimal) |
Caractère ASCII xx |
#23 |
Caractère # |
#5F |
Caractère _ |
#2A |
Caractère * |
#3C |
Caractère < |
#3E |
Caractère > |
Exemples :
Trame Data "#01#0901#0204*#0201*#0203<weight,6>*#0299<dsd,5>*"
Valeur | Caractères |
---|---|
#01 |
Start of Heading (SOH) |
#09 |
Horizontal Tab (HT) |
0 |
Le chiffre 0 |
1 |
Le chiffre 1 |
#02 |
Start of Text (STX) |
0 |
Le chiffre 0 |
4 |
Le chiffre 4 |
* |
N'importe quels caractères (Jusqu'à #02 ) |
#02 |
Start of Text (STX) |
0 |
Le chiffre 0 |
1 |
Le chiffre 1 |
* |
N'importe quels caractères (Jusqu'à #02 ) |
#02 |
Start of Text (STX) |
0 |
Le chiffre 0 |
3 |
Le chiffre 3 |
<weight,6> |
Le Poids sur 6 caractères |
#02 |
Start of Text (STX) |
9 |
Le chiffre 9 |
9 |
Le chiffre 9 |
<dsd,5> |
Le DSD sur 5 caractères |
* |
N'importe quels caractères (Jusqu'à la fin) |
Trame Data "#3C/POIDS_DSD~<weight>~<dsd>#3E*"
Valeur | Caractères |
---|---|
#3C |
Caractère < |
/ |
Caractère / |
POIDS_DSD |
Chaîne POIDS_DSD |
~ |
Caractère ~ |
<weight> |
Le Poids (jusqu'à ~ ) |
~ |
Caractère ~ |
<dsd> |
Le DSD (jusqu'à #3E ) |
#3E |
Caractère > |