jeudi 13 mai 2021

Décoder le réseau Seatalk ng

Ce post pour dépanner les utilisateurs d'un réseau en Seatalk ng.

Copie du buffer des émissions en Seatalk ng


Nous avons été confrontés à des soucis de compatibilité dans l'organisation de notre réseau de bord, notamment en connectant ensemble des appareils de marques différentes fonctionnant en NMEA, en Seatalk ou en Seatalk ng 

Pour comprendre ce qui se passait sur le réseau, nous avons du lire les trames d'informations qui circulaient. Le but était de vérifier que les instruments recevaient les bonnes trames et le cas échéant bloquer / débloquer les messages.

Il est assez facile de lire les trames NMEA 0183, car elles sont affichées en clair dans la plupart des ordinateurs de bord. Pour Raymarine, il suffit d'aller dans le menu "entretien" et de sélectionner l'interface à lire (généralement NMEA in, Out ou Seatalk) et de lancer le buffer.

NMEA 0183

Le format des trames NMEA 0183 est le suivant :

$--123,x1,x2,x3,....., xn,a*hh

Avec 123, l'identifiant de la trame
x1 à xn les données propres à une trame
a*hh un contrôle sur la somme des données transmises
Exemple ;
$--MVW,x.x,a,x.x,a*hh
5 informations séparées par des virgules :
MVW correspond à une trame de données "Angle et vitesse du vent"
Angle du vent, de 0 à 360 degrés
Référence, R = Relative, T = Vraie,
Vitesse du vent,
Unité de vitesse du vent, K/M/N,
Etat, A = Données valides

$--MVW335,R,11.0,N,A*08 se lit donc ;
Vent à 335°, donc bâbord 25° (par rapport à l'axe du bateau)
R indique un vent relatif, donc un vent apparent
11,1 la vitesse du vent
N, le vent est en nds
A = données valides


Trames 
Raymarine
Description

AAM Alarme d'arrivée à un point de route
APB Pilote automatique "B"
BWC Relèvement et distance au point de route
BWR Relèvement et distance au point de route sur la route loxodromique
DBT Profondeur sous sondeur
DPT Profondeur
DSC Données d'appel sélectif numérique
DSE Complément données de détresse
DTM Système géodésique de référence
GBS Données de détection de défaillance d'un satellite GPS 
GGA Données point GPS
GLC Position géographique Loran C
GLL Latitude longitude de la position géographique
GSA Précision GPS et satellites actifs
GSV Satellites GPS en vue
HDG Déclinaison du cap et variation de la déclinaison
HDT Cap vrai
HDM Cap magnétique
MDA Météo composite
MSK Interface récepteur MSK
MSS État du signal du récepteur MSK
MTW Température de l'eau
MWV Angle et vitesse du vent
RMB Données minimum recommandées de navigation
RMC Données minimum recommandées spécifiques de transit GPS 
RSD Données système Radar
TTM Message de cible poursuivie
VHW Cap et vitesse surface
VLW Distance parcourue sur l'eau
VTG Route et vitesse sur le fond
XTE Écart traversier calculé
ZDA Date et heure 


Seatalk ng

Pour le Seatalk ng, c'est un peu plus difficile.
Nous avons toujours affaire à des trames, mais elles apparaissent en hexadécimal.
En hexadécimal, on compte en base 16, donc les chiffres sont les suivants :
1 2 3 4 5 6 7 8 9 A B C D E F
A = 10 
F= 16
Pour écrire 17 en hexadécimal on écrit 11, 26 on écrira 1A, 27 donnera 1B...

Le format des trames Seatalk ng est le suivant :
11AAAA22    FF AA AA AA AA AA FF FF
Avec 11, la priorité de la trame
AAAA  l'identifiant du PGN, c'est le type d'information en fait
22 est l'adresse de la source d'information
FF est le SID
AA AA AA AA AA les informations à transmettre
FF FF non utilisé je crois
Attention, pour décoder l'hexadécimal il faut lire 4 caractères à la fois et inverser les 2 derniers avec les 2 premiers si ceux-ci sont plus petits.


Exemple 1 :
FF 18 03 9F EE FA FF FF
18 03 se lit 0318 et donne en décimal 792 
Utiliser la fonction =HEXDEC("0318") de votre tableur préféré :)

Exemple 2:
FF 3B 02 36 EB FA FF FF
36 EB se lit 36EB et donne en décimal 14059 

Exemple de trame complète;
09FD0204  FF 18 03 9F EE FA FF FF
09 => priorité 2
FD002 => PGN 130306
18 03 donne 15,84 nds 
9F EE donne 359°
FA pour vent apparent

Le PGN 130306 correspond à une trame de données "Angle et vitesse du vent"
avec une vitesse à l'échelle 10 mm/s donc formule =2*HEXDEC("0318")/100
car on divise par 100 pour avoir des m/s puis on multiplie par 2 pour avoir de nds

Angle du vent, de 0 à 360 degrés à l'échelle 0,0001 radian
donc formule =(HEXDEC("EE9F")/10000)*180/PI()

FA donne en binaire 11111010, prendre les 3 derniers digits, donc 010 et cela donne en décimal 2
0 serait pour le vent vrai / Nord géographique
1 serait pour le vent vrai / Nord magnétique
2 pour le vent apparent 
3 pour le vent vrai / axe du bateau
4 pour le vent vrai / cap de surface

Extrait des trames de notre ordinateur A125
Raymarine A125
    Emission
    Réception 
    PGN
 Extrait 
 N° PGN  Message NMEA  Commentaires
RX 09F10D73 1F10D 127245 RSA Rudder (Barre)
RX / TX 09F11273 1F112 127250 HDG, HDM, HDT Vessel Heading
RX / TX 09F50323 1F503 128259 VHW Speed, Water referenced
TX / RX 09F80104 1F801 129025 GLL Position, Rapid Update 
TX / RX 09F80204 1F802 129026 VTG COG & SOG, Rapid Update
TX / RX 09FD0204 1FD02 130306 VWR, VWT, MWD, MWV Wind Data 
TX / RX 0DF01004 1F010 126992 ZDA, GLL  System Time
RX / TX 0DF50B23 1F50B 128267 DBT, DBS, DPT  Water Depth 
TX / RX 0DF80504 1F805 129029 GGA, GLL, RMC, ZDA GNSS Position Data 
TX / RX 0DF80904 1F809 129033 Heure Local Time Offset 
TX / RX 0DF90304 1F903 129283 APB, BWC, BWR, RMB, XTE  Cross Track Error
TX / RX 0DF90B04 1F90B 129291 VDR Set & Drift, Rapid Update
TX / RX 0DFE1104 1FE11 130577 Heading Direction Data
TX 10F11A04 0F11A 61722 Tension ? DC/DC 2 High side Current 
RX / TX 19F51323 1F513 128275 VLW Distance Log
RX 15FD0723 1FD07 130311 XDR, MTW, MDA  Environmental Parameters
RX 15FD0C23 1FD0C 130316 XDR, MTW, MDA Temperature, Extended Range 
TX 19F11A04 1F11A 127258 HDG Magnetic Variation 
TX 19FA0404 1FA0A 129546 GNSS RAIM Settings Report the control parameters for a GNSS Receiver 
TX 19FA0604 1FA06 129542  GNSS Noise Statistiques de bruit de pseudodistance GNSS
RX 1CFF0873 0FF08 65288 Alarmes ? apparently a proprietary datagram
TX 1CFF1F04 0FF1F 65311 HDT, RMC, VDR,VHW,VTG Magnetic Variation (Raymarine)
RX 1CFF4F73 0FF4F 65359
HDT, HDM Pilot heading
TX 1CFF5204 0FF52 65362 Test status hardware ? apparently a proprietary datagram
TX 1CFF5404 0FF54 65364 XYZ angle ? apparently a proprietary datagram 
RX 1DEFFF73 1EFFF 126975 Multi messages  

Pour utiliser les PGN, il reste à trouver quels sont les champs transmis dans la trame et avec quelle échelle de lecture. Pour nous, c'était uniquement le vent qui nous intéressait, donc le message MWV en NMEA et le PGN 130306 en Seatalk ng.

Avec ce travail de fourmi, nous avons pu trouver que les messages MWV arrivaient bien au pilote sur le réseau Seatalk ng et donc que notre anémomètre Nasa Clipper était compatible avec notre pilote Raymarine. 

Au lieu d'incriminer l'anémomètre, nous avons vérifié les paramètres du pilote et bingo, il manquait la définition du bateau en "Sailling boat" pour fonctionner en mode vent ...

Note sur le décodage des identifiants en Seatalk ng

L'identifiant est codé sur 29 bits
  • Priorité 3 bits
  • PGN 18 bits, dont 2 bits libres (en noir ci-dessous) et 16 fixés par la norme
  • Adresse source 8 bits
Cela donne :

Msb : bits de poids fort, donc le plus grand 
Lsb : bits de poids faible, le plus à droite

Exemple pour le vent, message identifié 09FD0204 sur le Raymarine (en hexadécimal, ce que l'on lit à l'écran)
Sur 29 bits (en complétant donc les champs avec des 0 à gauche) on obtient le tableau suivant

28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0


Détail pour obtenir le tableau :

09 en hexadécimal donne 1001 en binaire donc sur 5 digits on complète à gauche par un 0
28 27 26 25 24
0 1 0 0 1

FD en hexadécimal donne 11111101 en binaire
23 22 21 20 19 18 17 16
1 1 1 1 1 1 0 1

02 en hexadécimal donne 10 en binaire donc sur 8 digits on complète à gauche par plusieurs 0
15 14 13 12 11 10 9 8
0 0 0 0 0 0 1 0

04 en hexadécimal donne 100 en binaire donc sur 8 digits on complète à gauche par plusieurs 0
7 6 5 4 3 2 1 0
0 0 0 0 0 1 0 0

Lecture des informations :

Les 3 premiers digits définissent la priorité des messages. 
ici on lit 010 donc priorité 2

Cela donne les tableaux suivants :

Binaire Hexa
Décimales

  Binaires
 sur 3 digits

010 01 09 Priorité 2 0            000
011 00 0C Priorité 3 1            001
011 01 0D Priorité 3 2            010
100 00 10 Priorité 4 3            011
101 01 15 Priorité 5 4           100
110 01 19 Priorité 6 5           101
111 01 1D Priorité 7 6           110
111 00 1C Priorité 7 7            111

Le PGN sur 18 digits :
25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8
0 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0

Cela donne en décimal 130306

Votre tableur préféré ne donne probablement pas de résultat si le nombre binaire dépasse 10 digits.
Pour contourner le souci, prendre les 10 premiers à gauche soit 01 11111101
Cela donne en décimal 509
Multiplier par 2 autant de fois que vous avez de digit non calculés à droite. Ici il manque 8 digits, donc on multiplie par 256 cela donne 130304
Reste à ajouter les bits qui ne sont pas à zéro en partant de la droite. Ici vous avez 10 en binaire à ajouter.
10 donne 2 en décimal, donc le nombre recherché est 130304 + 2 = 130306 (cqfd)

Lecture des alarmes :

PGN 65288 (0FF08) et format data

Byte 1 = FF Manufacture
Byte 2 = FC Manufacture & Industry Group
Byte 3 = Load Least significant byte
Byte 4 = Load Most significant byte
Byte 5 = FF Unused
Byte 6 = FF Unused
Byte 7 = FF Unused
Byte 8 = FF Unused
  • Manufacturer (1851 pour Raymarine)
  • Reserved 2 digits
  • Industry code (4 pour Marine)
  • SID 1 octet
  • Alarm id 1 octet
  • Alarm status 1 octet
  • Alarm group 1 octet
  • Alarm priority 2 octets

Alarm status
  • 0 = condition non remplie
  • 1 = condition remplie et non silencieuse
  • 2 = condition remplie et silencieuse
Alarm id
  • 0=No Alarm
  • 1=Shallow Depth
  • 2=Deep Depth
  • 3=Shallow Anchor
  • 4=Deep Anchor
  • 5=Off Course
  • 6=AWA High
  • 7=AWA Low
  • 8=AWS High
  • 9=AWS Low
  • 10=TWA High
  • 11=TWA Low
  • 12=TWS High
  • 13=TWS Low
  • 14=WP Arrival
  • 15=Boat Speed High
  • 16=Boat Speed Low
  • 17=Sea Temp High
  • 18=Sea Temp Low
  • 19=Pilot Watch
  • 20=Pilot Off Course
  • 21=Pilot Wind Shift
  • 22=Pilot Low Battery
  • 23=Pilot Last Minute Of Watch
  • 24=Pilot No NMEA Data
  • 25=Pilot Large XTE
  • 26=Pilot NMEA DataError
  • 27=Pilot CU Disconnected
  • 28=Pilot Auto Release
  • 29=Pilot Way Point Advance
  • 30=Pilot Drive Stopped
  • 31=Pilot Type Unspecified
  • 32=Pilot Calibration Required
  • 33=Pilot Last Heading
  • 34=Pilot No Pilot
  • 35=Pilot Route Complete
  • 36=Pilot Variable Text
  • 37=GPS Failure
  • 38=MOB
  • 39=Seatalk1 Anchor
  • 40=Pilot Swapped Motor Power
  • 41=Pilot Standby Too Fast To Fish
  • 42=Pilot No GPS Fix
  • 43=Pilot No GPS COG
  • 44=Pilot Start Up
  • 45=Pilot Too Slow
  • 46=Pilot No Compass
  • 47=Pilot Rate Gyro Fault
  • 48=Pilot Current Limit
  • 49=Pilot Way Point Advance Port
  • 50=Pilot Way Point Advance Stbd
  • 51=Pilot No Wind Data
  • 52=Pilot No Speed Data
  • 53=Pilot Seatalk Fail1
  • 54=Pilot Seatalk Fail2
  • 55=Pilot Warning Too Fast To Fish
  • 56=Pilot Auto Dockside Fail
  • 57=Pilot Turn Too Fast
  • 58=Pilot No Nav Data
  • 59=Pilot Lost Waypoint Data
  • 60=Pilot EEPROM Corrupt
  • 61=Pilot Rudder Feedback Fail
  • 62=Pilot Autolearn Fail1
  • 63=Pilot Autolearn Fail2
  • 64=Pilot Autolearn Fail3
  • 65=Pilot Autolearn Fail4
  • 66=Pilot Autolearn Fail5
  • 67=Pilot Autolearn Fail6
  • 68=Pilot Warning Cal Required
  • 69=Pilot Warning OffCourse
  • 70=Pilot Warning XTE
  • 71=Pilot Warning Wind Shift
  • 72=Pilot Warning Drive Short
  • 73=Pilot Warning Clutch Short
  • 74=Pilot Warning Solenoid Short
  • 75=Pilot Joystick Fault
  • 76=Pilot No Joystick Data
  • 77=not assigned
  • 78=not assigned
  • 79=not assigned
  • 80=Pilot Invalid Command
  • 81=AIS TX Malfunction
  • 82=AIS Antenna VSWR fault
  • 83=AIS Rx channel 1 malfunction
  • 84=AIS Rx channel 2 malfunction
  • 85=AIS No sensor position in use
  • 86=AIS No valid SOG information
  • 87=AIS No valid COG information
  • 88=AIS 12V alarm
  • 89=AIS 6V alarm
  • 90=AIS Noise threshold exceeded channel A
  • 91=AIS Noise threshold exceeded channel B
  • 92=AIS Transmitter PA fault
  • 93=AIS 3V3 alarm
  • 94=AIS Rx channel 70 malfunction
  • 95=AIS Heading lost/invalid
  • 96=AIS internal GPS lost
  • 97=AIS No sensor position
  • 98=AIS Lock failure
  • 99=AIS Internal GGA timeout
  • 100=AIS Protocol stack restart
  • 101=Pilot No IPS communications
  • 102=Pilot Power-On or Sleep-Switch Reset While Engaged 
  • 103=Pilot Unexpected Reset While Engaged
  • 104=AIS Dangerous Target
  • 105=AIS Lost Target
  • 106=AIS Safety Related Message (used to silence)
  • 107=AIS Connection Lost
  • 108=No Fix
Alarm group
  • 0=Instrument
  • 1=Autopilot
  • 2=Radar
  • 3=Chart Plotter
  • 4=AIS