2017-10-17 4 views
0

Je travaille actuellement sur une application qui communique avec les périphériques utilisant série Modbus. L'application est écrite en C#.Conversion d'application Modbus série vers Modbus TCP/IP C#

Nos appareils ont été modifiés pour utiliser Ethernet et moi avons maintenant été chargés de convertir cette application pour utiliser Modbus TCP/IP.

J'ai d'abord pensé que ce serait très simple, et ne nécessiterait changer la connexion série à une connexion TCP Client et Listener.

J'ai lu la documentation sur Modbus TCP/IP

https://www.prosoft-technology.com/kb/assets/intro_modbustcp.pdf https://www.honeywellprocess.com/library/support/Public/Documents/51-52-25-121.pdf

Bien que je sens que je peux encore être absent quelques différences essentielles.

D'après ce que je comprends, c'est ce qui doit être fait.

  1. Introduisez un nouvel en-tête MBAP à la place de la section Adresse supplémentaire au début d'un paquet.
  2. Supprime la somme de contrôle du paquet Modbus car elle est gérée par TCP/IP.
  3. Ouvrir la connexion avec chaque périphérique à l'aide de la classe Socket. Pour ouvrir ces connexions, j'ai maintenant besoin de stocker chaque IP de périphérique dans ma configuration client/maître. Ils seront à l'écoute sur le port par défaut 502 et la connexion doit être ouverte à partir d'un port disponible aléatoire> 1024. La connexion doit également rester ouverte, donc je vais maintenir un Array de TcpClient objets. Ou devrais-je simplement fermer la connexion après avoir reçu une réponse? Aurai-je besoin d'avoir un thread pour chaque serveur/esclave?

Répondre

1

Vous êtes dans la bonne direction. Mais s'il vous plaît ne fermez pas les connexions TCP après avoir reçu la réponse. J'ai développé des esclaves Modbus TCP auparavant, sur des plates-formes très limitées en ressources, et ce n'était pas amusant de gérer la création/destruction de connexions TCP toutes les 1-2 secondes. Gardez la connexion ouverte, ce sera plus facile pour vous et les esclaves.

Vous n'avez pas besoin d'un fil pour chaque esclave. Vous pouvez utiliser une forme de "select" disponible en C#.

+0

Donc, pour être sûr de bien comprendre, est-ce que j'initialiserais une connexion socket pour chaque esclave, puis bouclerais chaque socket sur une minuterie et vérifierais que les données soient lues? –

+1

Oui, vous ouvrez une connexion TCP à chaque esclave. Vous n'avez pas besoin d'une minuterie, vous pouvez créer une liste de sockets à attendre et utiliser la méthode Socket.Select. (https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.select?view=netframework-4.7.1). Je ne suis en aucun cas un expert. NET, donc s'il vous plaît vérifier s'il y a une meilleure/plus facile d'attendre. – Ronaldo