begin process at 2012 02 13 05:43:06
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > SERVEUR MODBUS TCP

SERVEUR MODBUS TCP


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :19 259 / 2 111

Auteur : MCSilver

Ecrire un message privé
Commentaire sur cette source (22)
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

Les Membres Club peuvent 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 :
.

 Sources du même auteur

Source avec Zip Source avec une capture AFFICHE ET ENREGISTRE UNE IMAGE D'UNE WEBCAM (SNAPSHOT) À FR...

 Sources de la même categorie

Source avec Zip Source avec une capture GESTIONNAIRE DE TÉLÉCHARGEMENT, AVEC REPRISE ET MULTITHREADI... par Madx23
Source avec Zip Source avec une capture CONVERTIR DU TEXTE RTF EN CODE HTML ET VICE-VERSA par vicosta
Source avec Zip Source avec une capture DICTIONAIRE TEXT/AUDIO/VISUELLE ANGLAIS AVEC WEBBROWSER CONT... par majnounmajda
Source avec Zip Source .NET (Dotnet) NSLOOKUP EN VB.NET OU COMMENT FAIRE UNE REQÛETE DNS EN PRÉCI... par ShareVB
Source avec Zip Source avec une capture MINI SEVEUR HTTP AVEC INTERFACE GRAPHIQUE ET IMPLÉMENTATIONS... par lemout

 Sources en rapport avec celle ci

Source avec Zip COMMUNICATION MODBUS MASTER par sergelapointe
Source avec Zip Source .NET (Dotnet) OVERSOCK - CLASS SOCKET ASYNCHRONE MULTI-CLIENT AVEC INTER-T... par iLgend
Source .NET (Dotnet) ASYNC SOCKET par iLgend
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DE BAZSOCKET , DU COMPOSANT MYSQL , TOUT CECI DA... par wiifeet
Source avec Zip TEST MODBUS/TCP par Churchill

Commentaires et avis

Commentaire de etudiantge le 15/12/2007 15:23:39

Salut,

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

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.

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 ^_^

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.

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. @++

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.

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.

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 ?)

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.

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.

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é.

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 ... ;-)

Commentaire de swonder le 15/07/2009 17:18:46

Je viens de tomber sur ton programme car j'ai besoin de simuler un WAGO et un automate communiquant en Modbus. Il fonctionne niquel pour être reconnu comme un automate mais il ne répond hélas pas à la fonction 2 (par bits), la 3 fonctionne niquel.
Si je finis la 2 de façon propre, je t'envois le code.
Je vais surement rajouter aussi des textbox pour changer les valeurs des bits/registres.

Commentaire de Adn56 le 15/07/2009 19:02:27

@ tenix et superjc42, pouvez vous poster vos sources que ce topic avance ?
je n'ai plus le temps de programmer, mais comme vous l'avez lu, ce sujet m'intéresse.
En éspérant voir un jour vos contributions. Une source pour un wago sous codesys et une autre pour pcvue cela le ferait ;)
cordialement. @dn

Commentaire de Adn56 le 15/07/2009 19:03:51

oups pas tenix, mais swonder -_-" dsl pour le double post, mais un jour l'édition sera peut être possible ?

Commentaire de swonder le 16/07/2009 14:57:30 10/10

J'ai mis mes rajouts de code à cette adresse :
http://www.vbfrance.com/codes/EXTENSION-SERVEUR-MODBUS-TCP-MCSILVER_50317.aspx
C'est pas énorme, mais c'est ce qu'il me manquait.
Merci encore MCSilver.

Commentaire de Adn56 le 16/07/2009 17:40:49

Merci pour le partage !

Commentaire de swonder le 17/07/2009 10:10:33

C'est le but de ce site :-)

Commentaire de superjc42 le 24/07/2009 23:56:22

Bonjour,
Désolé pour le retard du post., mais mieux vaut tard que jamais (on se rattrape à ce que l'on peu :p).
Voici les sources du rajout de fonction que j'ai effectué :

--------------------------------------------------------------------------------
Case 4  'Lecture Multiples Registre avec la fonction 4
        ReDim RetTrame(9 + Trame(MB_Def.NbDataLSB) * 2 - 1)
        Array.ConstrainedCopy(Trame, 0, RetTrame, 0, 5)
        RetTrame(5) = 4 + Trame(MB_Def.NbDataLSB) * 2
        RetTrame(6) = Trame(MB_Def.Index)
        RetTrame(7) = Trame(MB_Def.Fonction)
        RetTrame(8) = Trame(MB_Def.NbDataLSB) * 2

        Adresse = Trame(MB_Def.AddrMSB) * &H100 + Trame(MB_Def.AddrLSB)

        For j = 0 To RetTrame(8) - 2 Step 2
             RetTrame(9 + j) = ServeurMB.Item(i + 1).RegTable(j / 2 + Adresse) \ &H100
             RetTrame(10 + j) = ServeurMB.Item(i + 1).RegTable(j / 2 + Adresse) And &HFF
        Next

        ServeurMB.Item(i + 1).NbLectures += 1
        ServeurMB.Item(i + 1).NbMots += (BytesReceived + RetTrame.Length + 56) / 1000  '56 représente le nombre de mot d'entête par trames IP (28*2)

        ClientMB.Item(ClientIndex).NbLectures += 1
        ClientMB.Item(ClientIndex).NbMots += (BytesReceived + RetTrame.Length + 56) / 1000  '56 représente le nombre de mot d'entête par trames IP (28*2)
--------------------------------------------------------------------------------

Voila pour les infos !
J'espère que cela vous apportera de l'aide.

Bonne réception
Cordialement
JC

Commentaire de jeremieviel le 18/11/2009 18:06:33

Bonjour,

Est ce normal que je ne puisse pas extraire ton archive ?

Merci d'avance pour ta réponse

Commentaire de MCSilver le 02/12/2009 03:03:29

Ça fonctionne pour moi, j'utilise 7zip pour décompresser au lieu du WinZip payant. (www.7zip.org pour download)

Commentaire de SteveFuchsIT le 07/12/2009 17:27:20

J'ai finalement cherché à comprendre plus en détail le protocole ModBus et j'ai développé mon propre serveur en C#.
J'ai déposé les sources à l'adresse : http://www.csharpfr.com/codes/SERVEUR-ESCLAVE-MODBUS-TCP-IP_50946.aspx
Peut-être que cela aidera quelqu'un d'autre.

 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é Protocole Modbus RTU RS232 - VB Express 2008 [ par vince42 ] Bonjour, Je suis actuellement entrain de développer en VB Express 2008 une application qui permettra de communiquer avec un appareil détectant des 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 le protocole snmp [ par nahlafrt ] bonsoir, je cherche une documentation sur de commende snmp ecritent en java pour trouver la liste des ports ouverts.j'utilise netbeans.si vous pouvez Problème Socket asynchrone [ par pictom41 ] Bonjour, J'ai un problème pour un TP de classe. Je dois pratiquer une connexion et une action spécifique sur un serveur a socket asynchrone. J'ai choi Protocole HTTP en Visual Basic [ par beorchia ] Bonjour à tous, Je développe en ce momment une petite applic client qui communique avec un serveur HTTP (Apache). Pour cela j'ai utilisé les objets


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,888 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales