Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SERVEUR MODBUS TCP


Information sur la source

Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous : ModBus, protocole, socket Niveau : Initié Date de création : 06/12/2007 Date de mise à jour : 13/08/2008 14:35:24 Vu / téléchargé: 12 136 / 1 132

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Le serveur ModBus simule un équipement (device) avec port(s) ModBus TCP intégré.  L'utilisateur doit configurer au moins 1 device en lui donnant un nom et une adresse ModBus (index).  Chaque device configuré possède 8000 registres du type 4x (usage général). Ensuite, le soft liste les ports ethernet dispo sur le PC et y ouvre (en mode Asynchrone) le port 502 en écoute.  Lorsqu'une requête ModBus est envoyée vers le PC qui roule le soft (requête = lecture ou écriture), le soft exécute la requête et répond à la device qui a initié la requête (comme dans un échange ModBus standard).

Il est possible de visualiser la table (valeurs) des 8000 registres dans les différents formats populaires (Hexa, U16, S16, U32, S32 et float (IEEE)).
 

Conclusion

Mes connaissances étaient bonnes en VB5 mais ce programme est mon tout premier en .NET et le passage de WINSOCK à .NET (socket) est assez chiant.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

09 août 2008 05:57:34 :
Correction de petits bogues de navigation.
12 août 2008 05:07:38 :
Ajout d'un textbox pour voir les trames entrantes et sortantes.
13 août 2008 14:27:10 :
Correction d'un bogue avec l'utilisation de la fonction 6 (write single register). La valeur reçue était assumée être aux bytes 13 et 14 au lieu de 10 et 11
13 août 2008 14:35:25 :
.

Commentaires et avis

signaler à un administrateur
Commentaire de etudiantge le 15/12/2007 15:23:39

Salut,

Ton programme pourait-il simuler un automate programmable et envoyer des données?

signaler à un administrateur
Commentaire de MCSilver le 17/12/2007 20:49:42

Non car c'est un "SERVEUR" (un esclave dans le monde des PLC).  Tu peux y écrire et y lire des données.  Il ne déclenche pas d'écriture, car ça c'est le rôle d'un "CLIENT" (un maître dans le monde des PLC).

Tu peux modifier le code à ta guise pour déclencher des écritures vers un équipement distant.

signaler à un administrateur
Commentaire de Adn56 le 04/01/2008 17:27:09

je vais regarder cela avec grand intéret car j'essaye de communiquer avec un TWIDO en modbus mais j'ai des soucis de conversion HEX/DEC/ASCII -_-'
Pour l'instant j'y arrive via un protocol écrit 'maison' mais le modbus me parait plus 'standard'
Merci pour le partage. @+ pour les questions LOL ^_^

signaler à un administrateur
Commentaire de MCSilver le 07/01/2008 06:43:08

Effectivement, il y a là matière à s'y perdre.  Si ça peut donner un coup de main:

VB n'envoie que des string sur ses ports (série ou e-net), il faut donc s'organiser pour mettre en chaîne (string) des caractères ASCII donc le numéro (HEX ou DEC) correspond à la valeur réelle que l'on veut envoyer sur le port, et ce, même si le caractère ASCII n'est pas un caractère dit "affichable".  La fonction Chr() est toute désignée pour transformer la valeur à envoyer en code ASCII pour ensuite mettre ce code ASCII dans la chaîne à envoyer sur le port.

Exemple: une chaîne ModBus valide serait: 1 3 0 2 0 10  + les CRChi/CRClo
Pour que ces valeurs se retrouvent dans une chaîne de type string, il faut:
Dim strModBus as string = chr(1) & chr(3) & chr(0) & chr(2) & chr(0) & chr(10) & chr(CRChi) & chr(CRClo)

On retrouvera sstrModBus.lenght = 8 mais il te sera difficile d'afficher la string complète puisqu'elle présente des caractères non-affichables.  En VB5 il y avait un caractère genre "|" pour chaque caractères non-affichables dans la string.  En .net ce n'est pas le cas.  Je n'ai pas testé l'envoie d'une telle string sur un port série mais sur un port e-net c'est OK (sinon le Serveur ModBus ne fonctionnerais pas).

Voilà, c'est un début.  Si je peux t'aider d'avantage.... il me fera plaisir.

signaler à un administrateur
Commentaire de Adn56 le 07/01/2008 11:13:04

salut, en fait cela n'est pas avec l'scii ou la trame que j'ai des soucis, mais dans son interprétation ! je m'explique :
Je lis deux mots 00 et 01 dans l'esclave N°2 le mot 1=12345 et le secon=22222 (pour exemple)
J'envoie donc la trame suivante : 02 03 00 00 00 02 196 56 en DEC
et il me répond normalement : 02 03 04 48 57 86 206 168 10 en DEC
Et c'est là qu'il y a une merde ! car la réponse des valeurs est codé en DEC et représente la valeur du mot en HEXA O_o !
En effet 48et57(dec) donne 30et39(&H) et 3039 (ensemble) donne bien 12345 !
Je pourrais essayer de convertir 048057 directement en 12345 mais là je séche ! Je pensais avoir directement la valeur du mot en clair -_-'
La où cela devient chaud c'est si le mot = -1 alors la réponse sera 255 255 soit FF FF mais FFFF donne 65635 (16bit non signé)
Enfin bref c'est la mouise TWIDO je en sais pas comment font les autres. @++

signaler à un administrateur
Commentaire de MCSilver le 07/01/2008 17:03:14

Dans la source il y a une form FrmTableRegistre.vb, dans cette form il y a la fonction "Convertit" qui convertit deux mots en HEX16, en DEC16 signé, en DEC32 signé, en DEC32 non-signé et en FLOAT.

Piges-y ce dont tu as besoin.

signaler à un administrateur
Commentaire de Adn56 le 07/01/2008 18:17:26 10/10

c'est ce que je viens de voir :p
Du coup un 10/10 ! surtout pour la forme du code, cela me dépasse un peu car tu as une bien meilleur façon de coder que moi ^^ j'essaye encore de tout piger....
Tu fais une sorte de class pour la trame où tu lui balances toutes ses propriétés ? octet par octet. j'ai bon ? lol
en tout cas, merci de tout coeur cela devrait me servir (quant j'aurais tout décrypté ^^)
Je me demande même si cela ne vaudrait pas le coup de poster ce code dans un forum d'automaticien ;)
pour finir je vais essayer de faire une DLL de ton code pour utiliser cette fonction 'converti', 'crc16' et d'autre de façon plus souple. Si le coeur t'en dis ...tu iras plus vite que moi lol.
amicalement @dn.

signaler à un administrateur
Commentaire de Adn56 le 07/01/2008 18:49:16

Tiens pendant les tests une coquille ^^
Si tu demande une modif et qu'il n'y a pas de selection il y a un bug ^^
InvalidArgument=La valeur '0' n'est pas valide pour 'index'.
dans la zone :
  Private Sub CmdModifier_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdModifier.Click
        ServeurMB.SelIndex = ListView1.SelectedItems(0).Tag
        FrmEditServeurMB.Show()
    End Sub

je propose un if index > 0 avec msgbox "selectionner une ligne avant" ou un try catch au pire ;)

je continu à tester, tiens comment fais-tu pour modifier la table d'un serveur ? j'ai pas trouvé le fichier qui reprends les 8000 mots -_-' (suis vraiment noob moi ou bien ?)

signaler à un administrateur
Commentaire de MCSilver le 07/01/2008 21:50:43

Merci pour ces bons commtaires.  Il y a tout-de-même pas mal de chemin à faire encore pour intégrer tous les changements inhérents au .NET.   Le prog n'est pas complètement débuggé comme tu as pu le constaté.  Il est fonctionel dans le cadre où je l'utilise.

Pour la Table des registres, elle se modifie par une requête ModBus.  Faut pas oublier que c'est un Serveur, il attend donc d'être sollicité par un client (une lecture ou une écriture).  Tu peux donc rouler un autre prog.  qui déclenche des écriture vers le ServeurModBus qui roule aussi sur ton PC.  Il pourrait être pratique de pouvoir y entrer des valeurs manuellement ou par fichier .csv   Améliore-la source.

signaler à un administrateur
Commentaire de TeniX le 07/08/2008 16:15:55 10/10

Salut,

Tout d'abord bravo pour cette source, même si je ne code pas en VB, j'ai juste utilisé ton programme pour Simuler une communication entre une Supervision et un automate virtuel  par MODBUS TCP/IP

Cela fonctionne, j'ai une question simple pourquoi n'est t'il pas possible d'écrire des valeurs, j'ai bien les requêtes d'écritures sur le serveurs mais n'aboutisse pas.

Es ce normal ? Merci d'avance.

signaler à un administrateur
Commentaire de MCSilver le 13/08/2008 14:37:08

Ce n'était effectivement pas normal.  Une MAJ de la source corrige ce problème.  Merci de l'avoir rapporté.

signaler à un administrateur
Commentaire de superjc42 le 17/03/2009 15:15:07 10/10

Salut MCSilver !

Super code ! Je met un 10/10 !

Je vais pouvoir transformer ton code en service Windows pour une application avec PCVue.
J'ai juste due rajouter la fonction 4 dans le ModBus.

Cordialement
JC ... ;-)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Bessoins de testeur pour protocole modbus [ par patte ] Bonjour Je viens de crée un programme qui normalement devrai lire un nombre de mots defini sur un automate grace au protocole modbus Pour le crc j'ai protocole modbus [ par fbillard ] Salut je vois que nous sommes pas les seuls dans la galere avec ce protocole !!NOus avons un indicateur utilisant le protocole modbus, nous avons recu MODBUS [ par ricoux ] Voila le probleme: Nous possédons un Médiator de VisioProcess communiquant par la voie rs232 avec le protocole MODBUS RTU. Nous avons trouvé communication avec protocole Modbus [ par Maninga ] je fais mon pfe et j'ai des difficultés pour créer un réseau qui puisse permettre la communication entre un automate (tsx37) et des modules controller Programmation en Raw Socket sous windows, besoin d'aide. [ par Rootard ] J'aimerai programmé en raw socket sous windows, et je voulais savoir si quelqu'un si connait ! Alors si vous vous y connaisait, mailez moi: coolviper@ Protocole de communication d'une sourie série !! [ par Moses ] J'essaye de récuperer ce qu'envoie une sourie série sur un port COM!!Sous windows CE (iPAQ 3630)mais le contrôle mscomm me permet de lire du texte, ou comment trouver des protocoles de serveur? [ par ddur ] Savoire gere des paKet tout sa c bien beau mais comment savoire le protocole que le serveur que l'on veut utiliser utilise : port, se qui est recu , s Info CRC 16 sur MODBUS JBUS [ par Cyril ] Je cherche avoir la méthode de gérer sous VB6 pour implanterle calcul du CRC 16 pour les trame JbisMerci d'avance Winsock client qui ne marche qu'une fois! [ par Olivier ] Mon application client serveur fonctionne parfaitement une seule fois.La seconde fois, le client plante sur .connect en annonçant "adresse en cours d' Winsock client avec socket serveur Unix [ par Veloce ] J'ai un formulaire sous VB où il y a une zone de texte "txtMessage" et un bouton "command1"je veux envoyer le contenu de la zone de texte à un socket


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,546 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.