Bonjour,
Depuis quelques jours j'ai un problème que je n'avais pas avant et que je ne comprends pas. Dans l'optique d'un projet j'utilise un BUS Ethernet via un shield Ethernet pour Arduino avec le protocole modbus TCP . Je connecte une ou plusieurs carte en Serveur au bus et j'utilise mon PC comme client via une interface python avec bibliotheque.
Les soucis sont les suivant :
Quand je me connecte en client depuis mon PC et que j'essaie d'avoir accès à des registres (quelque soit leur type) une fois sur 2 ça ne marche pas et et quand ça marche les valeurs sont complètement incohérentes. Des registres auquels je ne touche pas encore qui sont initialisés à 0 par défaut affichent des valeurs au hasard entre 0 et 47 000 et quelques et il en va de même pour les registres auquels j'ai affecté des valeurs précises. Des fois j'ai même des timeout error alors que j'arrive à ping n'importe quel élément du réseau Ethernet.
J'utilise le code suivant comme exemple pour vous montrer les soucis mais ce n'est pas le code de mon projet celui serait trop long et trop complexe pour mettre en évidence le problème.
Mon code Arduino pour une carte que j'utilise comme serveur est donc :
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoModbus.h>
// Adresse MAC du shield Ethernet
byte mac[] = {0xA8, 0x61, 0x0A, 0xAE, 0xA8, 0x3F};
//Adress IP de la connection Ethernet
IPAddress ip(192, 168, 0, 102);
// Utilisation du port TCP défaut pour la com modbus
EthernetServer ethServer(502);
ModbusTCPServer modbusTCPServer;
const int ledPin = 7;
int counter = 0;
void setup() {
Serial.begin(115200);
Serial.setTimeout(10);
Serial.println("Ethernet Modbus TCP Example");
// start the Ethernet connection
Ethernet.begin(mac, ip);
// start the Ethernet server
ethServer.begin();
// start the Modbus TCP server
if (!modbusTCPServer.begin()) {
Serial.println("Failed to start Modbus TCP Server!");
while (true) {
delay(1); // do nothing, no point running without Modbus server
}
}
// configure the LED as output
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
// configure 50 holding starting at starting address 0x00
modbusTCPServer.configureHoldingRegisters(0x00, 50);
//initialise 3 random of them at 3 values : 0, 100, 200
modbusTCPServer.holdingRegisterWrite(0x20, 0);
Serial.print("valeur initial du holding register 0x20 : ");
Serial.println(modbusTCPServer.holdingRegisterRead(0x20));
modbusTCPServer.holdingRegisterWrite(0x21, 100);
Serial.print("valeur initial du holding register 0x21 : ");
Serial.println(modbusTCPServer.holdingRegisterRead(0x21));
modbusTCPServer.holdingRegisterWrite(0x22, 200);
Serial.print("valeur initial du holding register 0x22 : ");
Serial.println(modbusTCPServer.holdingRegisterRead(0x22));
}
void loop() {
// listen for incoming clients
EthernetClient client = ethServer.available();
if (client) {
// a new client connected
Serial.println("client ok ");
// let the Modbus TCP accept the connection
modbusTCPServer.accept(client);
// loop while the client is connected
while (client.connected()) {
// Increment internal counter, while client is connected
counter++;
modbusTCPServer.holdingRegisterWrite(0x23, counter);
// poll for Modbus TCP requests, while client connected
modbusTCPServer.poll();
delay(500);
}
}
}
Le code python pour mon client est bien plus simple :
from pyModbusTCP.client import ModbusClient
import matplotlib.pyplot as plt
from time import sleep
import random as rd
c = ModbusClient(host = "192.168.0.102", port = 502 , auto_close = False, debug = True )
c.open()
c.is_open
puis j'envoie la commande
c.read_holding_registers(0x00, 50)
qui me permet de lire les 50 registres initialisés dans mon IDE Arduino.
Voilà ce que j'obtiens comme valeurs :
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8448, 1867, 1942, 1944, 148, 16388, 2, 1, 1, 36615, 18952, 513,
63753, 513, 45827, 42759, 1024, 3072, 60167, 0, 19210, 1792, 2560, 44892, 50451, 3072, 50183,
1024, 13831, 256, 768, 56064, 3092, 256, 1280, 244]
Je n'arrive pas à voir de cohérence la dedans. Sachant que par défaut si on ne fait rien un registre est initialisé à 0 . Mais même quand j'initialise manuellement ça ne change rien les valeurs ne sont pas bonnes (aux adresses 30 31 et 32 (0x20 0x21 et 0x22 en hexa) les valeurs ne correspondent pas à l'initialisation alors qu'à aucun moment je n'écrit dans ces registres.
Pour situer mon incompréhension j'ajoute que j'ai essayé pas mal de chose. Déjà le fait de supprimer en partie ou toute comme Serial aide un petit peu mais ne résout pas le problème global, c'est comme si la comme avec le port série perturbait la comme modbus tcp ce qui me paraît peu cohérent.
Je précise que je n'avais pas ce problème il y a quelque semaines mais que celui ci ne se règle pas en changeant de version ce qui me paraît tout aussi bizarre.
Cordialement
Dans l'attente de n'importe quelle piste.