MCSilver
Messages postés13Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention 6 janvier 2011 2 déc. 2009 à 03:03
Ça fonctionne pour moi, j'utilise 7zip pour décompresser au lieu du WinZip payant. (www.7zip.org pour download)
jeremieviel
Messages postés1Date d'inscriptionmardi 14 mars 2006StatutMembreDernière intervention18 novembre 2009 18 nov. 2009 à 18:06
Bonjour,
Est ce normal que je ne puisse pas extraire ton archive ?
Merci d'avance pour ta réponse
superjc42
Messages postés3Date d'inscriptionmercredi 4 mars 2009StatutMembreDernière intervention16 septembre 2009 24 juil. 2009 à 23:56
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é :
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
cs_swonder
Messages postés6Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 mai 2009 17 juil. 2009 à 10:10
C'est le but de ce site :-)
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 16 juil. 2009 à 17:40
Merci pour le partage !
cs_swonder
Messages postés6Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 mai 2009 16 juil. 2009 à 14:57
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 15 juil. 2009 à 19:03
oups pas tenix, mais swonder -_-" dsl pour le double post, mais un jour l'édition sera peut être possible ?
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 15 juil. 2009 à 19:02
@ 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
cs_swonder
Messages postés6Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 4 mai 2009 15 juil. 2009 à 17:18
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.
superjc42
Messages postés3Date d'inscriptionmercredi 4 mars 2009StatutMembreDernière intervention16 septembre 2009 17 mars 2009 à 15:15
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 ... ;-)
MCSilver
Messages postés13Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention 6 janvier 2011 13 août 2008 à 14:37
Ce n'était effectivement pas normal. Une MAJ de la source corrige ce problème. Merci de l'avoir rapporté.
cs_TeniX
Messages postés118Date d'inscriptionmercredi 24 décembre 2003StatutMembreDernière intervention11 décembre 20112 7 août 2008 à 16:15
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.
MCSilver
Messages postés13Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention 6 janvier 2011 7 janv. 2008 à 21:50
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.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 7 janv. 2008 à 18:49
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 ?)
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 7 janv. 2008 à 18:17
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.
MCSilver
Messages postés13Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention 6 janvier 2011 7 janv. 2008 à 17:03
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.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 7 janv. 2008 à 11:13
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. @++
MCSilver
Messages postés13Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention 6 janvier 2011 7 janv. 2008 à 06:43
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.
Adn56
Messages postés1172Date d'inscriptionjeudi 24 mai 2007StatutMembreDernière intervention28 septembre 20131 4 janv. 2008 à 17:27
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 ^_^
MCSilver
Messages postés13Date d'inscriptionmercredi 25 octobre 2006StatutMembreDernière intervention 6 janvier 2011 17 déc. 2007 à 20:49
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.
etudiantge
Messages postés7Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention14 août 2009 15 déc. 2007 à 15:23
Salut,
Ton programme pourait-il simuler un automate programmable et envoyer des données?
7 déc. 2009 à 17:27
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.
2 déc. 2009 à 03:03
18 nov. 2009 à 18:06
Est ce normal que je ne puisse pas extraire ton archive ?
Merci d'avance pour ta réponse
24 juil. 2009 à 23:56
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
17 juil. 2009 à 10:10
16 juil. 2009 à 17:40
16 juil. 2009 à 14:57
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.
15 juil. 2009 à 19:03
15 juil. 2009 à 19:02
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
15 juil. 2009 à 17:18
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.
17 mars 2009 à 15:15
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 ... ;-)
13 août 2008 à 14:37
7 août 2008 à 16:15
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.
7 janv. 2008 à 21:50
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.
7 janv. 2008 à 18:49
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 ?)
7 janv. 2008 à 18:17
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.
7 janv. 2008 à 17:03
Piges-y ce dont tu as besoin.
7 janv. 2008 à 11:13
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. @++
7 janv. 2008 à 06:43
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.
4 janv. 2008 à 17:27
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 ^_^
17 déc. 2007 à 20:49
Tu peux modifier le code à ta guise pour déclencher des écritures vers un équipement distant.
15 déc. 2007 à 15:23
Ton programme pourait-il simuler un automate programmable et envoyer des données?