Aller au contenu

Intégration Modbus

Manuel de la fonction d’intégration Modbus de FX Viewer

1. Présentation de la fonction

Il s’agit d’une fonction de serveur Modbus TCP permettant d’intégrer les données de caméra acoustique en temps réel de FX Viewer (puissance de faisceau, état d’alarme, etc.) à des systèmes externes (PLC, SCADA, HMI, etc.).

Cette fonction permet, depuis un dispositif de contrôle externe tel qu’un PLC, de surveiller les données de caméra de FX Viewer et de contrôler directement certains réglages.

2. Réglages de base et informations de connexion

Démarrage automatique

Lorsque le programme FX Viewer démarre, le serveur Modbus s’exécute automatiquement. Aucun réglage particulier n’est nécessaire.

Informations de connexion

  • Adresse IP : adresse IP du PC sur lequel FX Viewer est en cours d’exécution

  • Port : 5020 (par défaut) ou 502

    • Afin de tenir compte des environnements ne disposant pas des droits nécessaires pour utiliser les ports inférieurs ou égaux à 1024, le serveur se lie en priorité au port 5020. Si la liaison au port 5020 échoue, le serveur tente d’écouter sur le port 502.

    • Côté client, essayez d’abord de vous connecter au port 5020 ; si la connexion n’aboutit pas, tentez la connexion sur le port 502.

  • Protocole : Modbus TCP

3. Configuration de la caméra

Pour que la fonction Modbus fonctionne correctement, le surnom de la caméra doit être défini selon le format convenu.

⚠️ Important : les caméras dont le surnom diffère des règles ci-dessous sont exclues de l’intégration Modbus. Comme il s’agit de la cause la plus fréquente lorsque les données ne sont pas récupérées, vérifiez ce point en tout premier lieu avant l’intégration.

Unit IDSurnom requisAutres formats acceptésDevice ID
1FX_01FX01, FX-010x4601
2FX_02FX02, FX-020x4602
3FX_03FX03, FX-030x4603
  • La casse n’est pas prise en compte. (fx_01 est accepté)

  • La même règle s’applique telle quelle à partir de la quatrième caméra. Les Unit ID sont attribués dans l’ordre, à hauteur du nombre de caméras enregistrées et utilisées dans FX Viewer.

4. Mappage des registres

  • Mode d’adressage : côté client (PLC, etc.), il est recommandé d’utiliser les adresses filaires (Offset) commençant à 0. (Exemple : adresse 40009 → requête à l’adresse 8)
Adresse ModbusAdresse filaireNom du registreType de donnéesR/WDescription
400010DEVICE_IDU16RID unique de l’appareil (exemple : 0x4601)
400021DEVICE_CONNECTEDU16RÉtat de connexion de la caméra (1 : connectée, 0 : déconnectée)
400032YEARU16RHeure actuelle (année)
400043MONTHU16RHeure actuelle (mois)
400054DAYU16RHeure actuelle (jour)
400065HOURU16RHeure actuelle (heures)
400076MINUTEU16RHeure actuelle (minutes)
400087SECONDU16RHeure actuelle (secondes)
400098MAX_DBx10S16RPression acoustique maximale (valeur en dB x 10), exemple : 45.2dB → 452
400109ALARM_FLAGU16RÉtat d’alarme (1 : alarme déclenchée, 0 : normal)
4001110THRESH_DBx10S16R/WSeuil (valeur en dB x 10), exemple : 42.5dB → 425
4001211THRESH_HOLDx10S16R/WTemps de maintien (valeur en secondes x 10), exemple : 3.5 s → 35
40013-1412-13FREQ_LOW_HZU32R/WLimite inférieure de fréquence (Hz)
40015-1614-15FREQ_HIGH_HZU32R/WLimite supérieure de fréquence (Hz)

Configuration du type de données côté client

Exemple d'écran de configuration permettant de sélectionner le type de données (INT, WORD, DWORD, etc.) pour chaque adresse de registre dans un client Modbus PLC

Exemple d’écran de configuration permettant de sélectionner le type de données pour chaque adresse de registre dans un client Modbus PLC. Les éléments utilisant un seul registre se lisent conformément aux types du tableau ci-dessus : les entiers signés (S16) en INT et les entiers non signés (U16) en WORD ; FREQ_LOW_HZ et FREQ_HIGH_HZ, qui utilisent deux registres (32 bits), se lisent avec un type de la famille DWORD.

5. Fonctions principales et exemples d’utilisation (Python)

Activation du mode de déclenchement automatique

  • Lorsqu’une valeur est écrite depuis le PLC dans le registre de seuil (40011) ou de temps de maintien (40012), le mode d’enregistrement de la caméra concernée passe automatiquement en mode « enregistrement déclenché ».

⚠️ Attention : l’écriture dans les registres de seuil et de temps de maintien a pour effet secondaire de modifier le mode d’enregistrement de la caméra. Si vous n’avez besoin que de surveiller les données, utilisez uniquement des requêtes de lecture et n’envoyez des requêtes d’écriture que si le passage à l’enregistrement déclenché est intentionnel.

Exemple de code Python

L’exemple ci-dessous utilise la bibliothèque Python pymodbus (sur la base de la version 3.x). Installez d’abord la bibliothèque.

Fenêtre de terminal
pip install pymodbus

💡 Remarque : selon la version, pymodbus utilise un mot-clé différent pour spécifier l’Unit ID. Le slave= de l’exemple ci-dessous correspond à la version 3.x, tandis que les versions antérieures (2.x) utilisent unit=. Utilisez le mot-clé correspondant à la version installée.

from pymodbus.client import ModbusTcpClient
# Renseigner l'adresse IP et le port du PC sur lequel FX Viewer est en cours d'exécution
FX_VIEWER_IP = '127.0.0.1'
FX_VIEWER_PORT = 5020
client = ModbusTcpClient(FX_VIEWER_IP, port=FX_VIEWER_PORT)
client.connect()
# -- Exemple de lecture de données ---
# Lecture des données de la caméra FX_01 (Unit ID = 1)
# Lit 2 registres (pression acoustique, alarme) à partir de l'adresse filaire 8 (MAX_DBx10)
result = client.read_holding_registers(8, count=2, slave=1)
if not result.isError():
max_db_x10 = result.registers[0]
alarm_flag = result.registers[1]
# Conversion en entier signé 16 bits puis division par 10
import struct
signed_max_db_x10 = struct.unpack('>h', struct.pack('>H', max_db_x10))[0]
print(f"FX_01 pression acoustique max : {signed_max_db_x10 / 10.0} dB")
print(f"FX_01 état d'alarme : {'Déclenchée' if alarm_flag == 1 else 'Normal'}")
# -- Exemple d'écriture de données ---
# Définit le seuil de la caméra FX_02 (Unit ID = 2) à 45.5 dB
# Écrit la valeur à l'adresse filaire 10 (THRESH_DBx10)
new_threshold = 45.5
threshold_to_write = int(new_threshold * 10)
client.write_register(10, threshold_to_write, slave=2)
print(f"FX_02 : demande de réglage du seuil à {new_threshold} dB terminée")
client.close()

Exemple de résultat d’exécution

Exemple de sortie lorsque la pression acoustique maximale de la caméra FX_01 est de 45.2 dB (valeur de registre 452) et que l’alarme est à l’état normal.

FX_01 pression acoustique max : 45.2 dB
FX_01 état d'alarme : Normal
FX_02 : demande de réglage du seuil à 45.5 dB terminée

6. Résolution des problèmes (Troubleshooting)

  • Si la connexion n’aboutit pas :

    • Vérifiez que l’adresse IP et le port (5020) du PC FX Viewer sont corrects.

    • Vérifiez que le port 5020 ou 502 est autorisé par une règle de trafic entrant dans le pare-feu Windows.

  • Si les données n’affichent que la valeur 0 :

    • Vérifiez que la caméra est activée dans FX Viewer et que des données en temps réel sont bien reçues.

    • Vérifiez une nouvelle fois que le surnom de la caméra est correctement défini sur FX_01, FX_02, etc. (cause la plus fréquente)

  • Si certaines valeurs (fréquence, etc.) sont lues de manière anormale :

    • Vérifiez que la configuration du type de données du client correspond aux types du mappage des registres (S16/U16/U32). En particulier, FREQ_LOW_HZ et FREQ_HIGH_HZ, qui utilisent deux registres, doivent être lus avec un type de la famille DWORD. (Voir l’écran de configuration du type de données de la section 4)

7. Documents associés