Table of Contents
Le protocole RocNet
Sommaire → Les centrales numériques → RocNet
RocNet ⇒ Réseau Rocrail®
C'est un protocole binaire Open Source prévu pour la communication entre deux et plusieurs, dans un réseau d'égal à égal, unités matériels.
Réseau sans maître
L'idée est de construire un réseau de deux ou plus d'unités en fonctionnement.
Il y a différents types d'unités:
- E/S, pour les aiguillages, signaux, détecteurs, …
- Générateurs DCC
- Décodeurs mobile et stationnaire activés par WLAN
- Ordinateurs
- …
Tous doivent avoir leurs propre identifient unique qui sont utilisés comme paramètre expéditeur/destinataire dans l'en-tête.
L'unité qui traite tous les messages et en envoie beaucoup entre eux et peut être autorisé à être l'hôte du réseau, mais en fait il est seulement un joueur dans le jeu.
Alors dans le cas de Rocrail l'ordinateur qui exécute ce logiciel peut être vu comme un hôte.
Identifiants réservés
ID | Description | Note |
---|---|---|
0 | Diffusion | Tous les nœuds l'évalueront. |
1 | Serveur Rocrail. | C'est l'identifiant recommandé par défaut. Un deuxième serveur doit utiliser 65001+. |
65535 | L'identifiant du nœud initial; Un nouvel identifiant sera assigné par le serveur Rocrail. |
Configuration
Plus d'informations à propos de la mise en place de la connexion RocNet: Configuration
UDP 8 bit
UDP est la méthode de communication par défaut recommandée qui est également utilisée en combinaison avec les RocNetNodes.
Toutes les autres méthodes sont limitées à la communication "un-à-un" communication.
Réglages par défaut:
- adresse: 224.0.0.1 (http://en.wikipedia.org/wiki/Multicast_address#IPv4_multicast_addresses)
- port: 4321 → Assurez-vous qu'aucun autre service ne tourne sur le même port!
ASCII HEXA 16 bit
Cela peut être utilisé pour une communication série utilisant seulement les caractères ASCII.
Le début du paquet démarre avec un @ et le reste est en HEXA1). (La valeur de 255 est représenté en HEXA par "FF", 100 par "64" etc…)
Les caractères ASCII utilisés:
@ 0 1 2 3 4 5 6 7 8 9 A B C D E F
Après la détection du début du paquet les 16 premiers caractères (8 octects), l'en-tête, peut être lu.
La longueur des données est dans deux derniers caractères de l'en-tête. Dans ce cas la longueur doit être multipliée par deux pour lire la partie donnée.
Exemple:
Une commande de mise sous tension de la voie envoyée à partir du serveur:
@000000000101020101
7 bit série
L'octet netid doit avoir le bit 7, 0x80, à l'état haut pour signaler le début du paquet. Tous les autres octets doivent utiliser 7 bit, 0x7F, chargement de la donnée. |
Réglages par défaut:
- dispositif: com1
Exemple
<digint iid="rn-1" lib="rocnet" sublib="serial" device="com1" bps="19200"> <rocnet id="1" crc="true"/> </digint>
Format du paquet
8 Byte Header | |||||||||
réseau | destinataire | expéditeur | action | donnée | crc | ||||
netid | idH | idL | idH | idL | groupe | code | longueur | n octets de données | optionnel pour 7-bit |
---|
Contenu du paquet
Identifiant réseau
Pour grouper les unités dans un large système. Laisser à zéro si il n'y a qu'un seul réseau actif.
Le bit 7 doit être réglé en cas de 7 bit série.
Alternativement il peut être utilisé comme identifiant d'emplacement pour grouper les nœuds logiquement dans une boite de dialogue de vue d'ensemble.
Destinataire
Chaque unité sur le réseau à son propre identifiant.
Si laissé à zéro toutes les unités doivent évaluer le paquet. Cela peut être utile pour les requêtes pour voir quels dispositifs sont disponibles.
Expéditeur
L'identifiant de l'unité expéditrice. L'identifiant par défaut du serveur Rocrail est 1.
Une valeur à "0" est pour la diffusion.
Action
Si l'action a besoin d'une adresse elle sera fourni par les premiers deux octets de la partie donnée. (format étendu)
Longueur
Nombre net d'octets des données suivantes.
Donnée
La partie variable du paquet qui dépend de l'action.
La longueur peut être réglée à zéro si aucune information futur n'est nécessaire pour l'action donnée.
Identifiant Réseau
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
8 bits | ID (0-255) | |||||||
7 bits | 1 | ID (0-127) |
L'identifiant zéro est pour tous les réseaux.
Identifiant de nœud Haut/Bas
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
8 bits | ID (0-255) | ||||||||
7 bits | 0 | ID (0-127) |
Calcul de l'adresse/identifiant
8 bit ID = idL + idH * 256
7 bit ID = idL + idH * 128
Groupe
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
8 bit | code groupe (0-255) | |||||||
7 bit | 0 | code groupe (0-127) |
Code
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
---|---|---|---|---|---|---|---|---|---|---|
fonction | 0 | 2 bit type (0-3) | 5 bit code (0-31) |
Type
- 0 requête
- 1 évènement
- 2 réponse
Si le type est un évènement ou une réponse, aucune action d'E/S réelle ne doit être effectuée sur l'adresse spécifiée; la plupart du temps l'E/S avec cette adresse signale un changement d'état.
Longueur
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
8 bit | nombre d'octets donnée (0-255) | ||||||||
7 bit | 0 | nombre d'octets donnée (0-127) |
Donnée
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
8 bits | 8 bits de donnée (0-255) | ||||||||
7 bits | 0 | 7 bits de donnée (0-127) |
CRC
Optionnel pour les connexions série 7-bit:
Le complément à 1 du OU exclusif au niveau du bit de tous les octets dans le message.
Exemple de code
unsigned char rnChecksum(const unsigned char *b, int len) { unsigned char chksum = 0xff; int i; for (i = 0; i < len; i++) { chksum ^= b[i]; } return chksum; }
Groupes
Code | Description | Remarque | sujet MQTT |
---|---|---|---|
0 | Hôte | Rocrail | rocnet/ht |
1 | Centrale numérique | Centrale numérique | rocnet/cs |
2 | Décodeurs mobiles | Locomotives et fonctions | rocnet/lc |
3 | Décodeurs stationnaires | Ports multiples pour entrées et sorties | rocnet/dc |
4 | Programmation mobile | DCC CVs | rocnet/pm |
5 | Programmation stationnaire | Incluant les centrales numériques | rocnet/ps |
6 | Transfert de données GP | Transfert de données à usage général entre les modules | rocnet/gp |
7 | Horloge | Horloge accélérée | rocnet/ck |
8 | Détecteur | Détermination de la position | rocnet/sr |
9 | Sortie | rocnet/ot |
|
10 | Entrée | rocnet/in |
|
11 | Son | rocnet/sn |
|
12 | Afficheur | rocnet/dp |
Hôte
Actions
act | description | data 1 | data 2 | data 3 | data 4 | data 5 | data 6 | data 7 | données de réponse 1 | données de réponse 2 |
---|---|---|---|---|---|---|---|---|---|---|
1 | Arrêt |
Centrale numérique
Actions
act | description | data 1 | data 2 | data 3 | data 4 | data 5 | data 6 | data 7 | data 8 | données de réponse 1 | données de réponse 2 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | NOP | 0 | |||||||||
1 | requête | statut | |||||||||
2 | alimentation de la voie | 0 = off, 1 = on | statut | ||||||||
3 | arrêt | statut | |||||||||
4 | version | versionH | versionL | ||||||||
5 | PT on/off | on/off | on/off | ||||||||
6 | vélocité | addrH | addrL | 0…127 | direction | lumières | protocole | crans de vitesse | |||
7 | fonction | addrH | addrL | F1-F8 | F9-F16 | F17-F24 | protocole | fonction changée + lumières 0x80 | F25-F32 | ||
8 | POM | addrH | addrL | cvH | cvL | value | opération: 0=obtenir, 1=régler | ||||
9 | Aiguillage | commande | type | adresse | |||||||
10 | Sortie | commande | type | value | adresse |
Statut
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
0 | Occupation PT | idle | alimentation |
Mobile
Actions
requête | réponse | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 5 | donnée 6 | donnée 7 | donnée 1 | donnée 2 | donnée 3 | donnée 4 | |
0 | NOP | 0 | |||||||||||
1 | réglage | protocole | nombre de fonctions | ||||||||||
2 | vélocité | 0…127 | direction | lumières | masse | pas | |||||||
3 | fonction | F1-F8 | F9-F16 | F17-F24 | fonction modifiée | F25-F32 | |||||||
4 | requête | code | sous-code | code | sous-code | réponse dépendant du code | |||||||
5 | fieldcmd | adresse de base | V_raw | dirf | fg 0+1 | fg 2+3 | fg 4+5 | fg 6+7 |
Type de protocole
Code | Type | Description |
---|---|---|
0 | 256 | 256 pas interprété (8 bit seulement) |
1 | DCC 28 | NMRA DCC avec 28 crans de vitesse |
2 | DCC 128 | NMRA DCC avec 128 crans de vitesse |
3 | DCC 14 | NMRA DCC avec 14 crans de vitesse |
3 | MM 1 | Märklin/Motorola |
4 | MM 2 | Märklin/Motorola |
5 | MM 3 | Märklin/Motorola |
6 | MM 4 | Märklin/Motorola |
7 | MM 5 | Märklin/Motorola |
Exemples
Arrête toutes les locomotives envoyé par le serveur Rocrail:
netid | rcptH | rcptL | sndrH | sndrL | groupe | code | longueur | velocité | direction | lumières |
---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 2 | 2 | 3 | 0 | 0 | 0 |
tout | tout | tout | srvr | srvr | mobile | velocité |
Représentation binaire:
00 00 00 00 01 02 02 03 00 00 00
Représentation ASCII HEXA:
@0000000001020203000000
La direction et les lumières restent inchangées parce que le bit 6 des deux octets ne sont pas définis.
Réglage de la vélocité par le serveur Rocrail:
- Adresse Locomotive = 291
- Velocité = 48
- Direction = avant
- Lumières = off
netid | rcptH | rcptL | sndrH | sndrL | groupe | code | longueur | velocité | direction | lumières |
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 35 | 0 | 1 | 2 | 2 | 3 | 48 | 65 | 64 |
Représentation binaire:
00 01 23 00 01 02 02 03 30 41 40
Représentation ASCII HEXA:
@0001230001020203304140
Stationnaire
Actions
Réponse | ||||||||||||
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 5 | donnée 6 | donnée 7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NOP | 0 | ||||||||||
1 | single port | 0,1 (off,on) | protocole/type | délai | port | statut | ||||||
2 | port paire | 0,1 (fermé,lancé) | protocole/type | délai | port | statut | ||||||
3 | port multiple | masque du port | 0…255 ou l'adresse est décalée | protocole/type | port | statut n | ||||||
4 | requête port simple | port | addrH | addrL | statut | |||||||
5 | requête port paire | port | addrH | addrL | statut | |||||||
6 | requête port multiple | port | addrH | addrL | statut n | |||||||
7 | report¹ | addrH | addrL | statut1 | statut2 | |||||||
8 | identifier | classe | manuID | versionH | versionL | nr E/S | subipH | subipL | ||||
9 | arrêt | 1=les nœuds doivent également s'éteindre | rc | |||||||||
10 | accuser réception | code action | portnr optionnel | |||||||||
11 | afficher² | |||||||||||
12 | début de journée | |||||||||||
13 | rapport d'erreur | classe d'erreur | raison | addrH | addrL |
¹) Tous les décodeurs stationnaires doivent rapporter leur statuts si le destinataire est réglé à zéro.
²) Le bouton poussoir sur le nœud déclenchera la boite de dialogue RocNetNode qui apparaîtra avec le nœud sélectionné. Une requête affichée à partir de l'hôte fera clignoter la LED sur le nœud.
Programmation
Pour la programmation des décodeurs stationnaires l'adresse représente l'adresse du module.
Actions
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 5 | donnée de réponse 1 | donnée de réponse 2 | donnée de réponse 3 | donnée de réponse 4 | donnée de réponse 5 | donnée de réponse 6 | donnée de réponse 7 | donnée de réponse 8 | donnée de réponse 9 | donnée de réponse 10 | donnée de réponse 11 | donnée de réponse 12 | donnée de réponse 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | écriture | registerH | registerL | valeurH | valeurL | registreH | registreL | valeurH | valeurL | ||||||||||
2 | lecture | registreH | registreL | registreH | registreL | valeurH | valeurL | ||||||||||||
3 | copie | destH | destL | donnée n | ack | ||||||||||||||
4 | lecture de la configuration du port | du port | au port | port# | valeur | type | délai | ||||||||||||
5 | écriture de la configuration du port | port# | valeur | type | délai | ||||||||||||||
6 | régler l'identifiant RocNet | idH | idL | subipH | subipL | ||||||||||||||
7 | lecture des options | iotype | flags | cstype | csdevice | I2C scan 0x20 H | I2C scan 0x20 L | I2C scan 0x30 H | I2C scan 0x30 | I2C scan 0x40 H | I2C scan 0x40 L | adc threshold | I2C scan 0x50 H | I2C scan 0x50 L | |||||
8 | écriture des options | iotype: 0=GPIO, 1=I2c-0, 2=I2C-1 | flags: bit0=ack | cstype: 0=none, 1=dcc232, 2=sprog | csdevice: 0=/dev/ttyUSB0, 1=/dev/ttyUSB1 | ||||||||||||||
9 | lecture des macros | nombre | nombre | port | délai | type | valeur | ||||||||||||
10 | écriture des macros | nombre | port | délai | type | valeur | |||||||||||||
11 | mise à jour | revH | revL | ||||||||||||||||
12 | lecture d'un évènement du port | du port | au port | port# | idH | idL | port | ||||||||||||
13 | écriture d'un évènement du port | port# | idH | idL | port | ||||||||||||||
14 | effacement de la configuration du port | port# |
Canaux
code | description | d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 | d1 | d2 | d3 | d4 | d5 | d6 | d7 | d8 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
15 | lecture de la configuration du canal | du canal | au canal | canal# | offposH | offposL | onposH | onposL | offsteps | onsteps | options | ||||||
16 | écriture de la configuration du canal | canal# | offposH | offposL | onposH | onposL | offsteps | onsteps | options | ||||||||
17 | efficacement de la configuration du canal | canal# | |||||||||||||||
18 | régler le canal | canal# | valeurH | valeurL |
La lecture, l'écriture et l'effacement du port/canal peut contenir jusqu'à 8 configurations de port.
La lecture et l'écriture de macro peut contenir jusqu'à 8 commandes.
Sortie
Type
Type | Valeur |
---|---|
aiguillage | 0 |
lumière | 1 |
servo | 2 |
son | 3 |
moteur | 4 |
analogique | 5 |
macro | 6 |
rétro-éclairage | 7 |
Actions
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 5 | donnée 6 | donnée 7 | donnée 8 |
---|---|---|---|---|---|---|---|---|---|
0 | off | type | valeur | adresse | |||||
1 | on | type | valeur | adresse | |||||
1 (macro) | on | 6 | 0 | aspect | macro offset |
Entrée
Le groupe entrée n'est pas utilisé ni défini; Utiliser le groupe détecteur.
Actions
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 5 | donnée 6 | donnée 7 | donnée 8 |
---|
Horloge
Actions
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée 5 | donnée 6 | donnée 7 | donnée 8 | donnée 9 |
---|---|---|---|---|---|---|---|---|---|---|
1 | réglage | annéeH | annéeL | mois | jour | heure | minutes | secondes | diviseur | luminosité |
2 | sync | annéeH | annéeL | mois | jour | heure | minutes | secondes | diviseur | luminosité |
Son
Actions
code | description | donnée 1-n |
---|---|---|
1 | play | nom du fichier audio |
2 | setpath | chemin du fichier audio |
3 | setplayer | nom du programme du lecteur audio |
Afficheur
Actions
code | description | donnée 1 | donnée 2 | donnée 3-n |
---|---|---|---|---|
1 | text | addr | displaynr | texte à montrer sur l'afficheur |
Détecteur
Actions
code | description | donnée 1 | donnée 2 | donnée 3 | donnée 4 | donnée n |
---|---|---|---|---|---|---|
1 | report | addrH¹ | addrL¹ | status | port | identifier (RFID) |
¹) Adresse de la locomotive déclarée.
L'identifiant du détecteur est réglé dans l'entête; Expéditeur.
Une sécurité du détecteur est faite avec le message d'accusé de réception stationnaire:
- Code = 1
- Port = port
Fichiers
- rocnet-const.h.zip Fichier entête pour langage C.