RS232 ModBus

cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024 - 20 mai 2008 à 19:48
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024 - 22 mai 2008 à 22:55
Bonjour,

J'essai de convertir une application VB6 en VB.net 2005 qui consiste à lire en modbus sur le port com RS232
une serie de mot dans un automate de type télémécanique.

je commence à comprendre la difference entre VB6 et VB.net pour le port com.

mais bien que mon code à l'air de fonctionner l'automate ne repond pas en VB.net.
Suite à divers recherche dans mon programme je me suis apercu quand VB.net la fonction Chr(0) me rend la valeur "nothing" alors quand VB6 y a bien un caractére. evidement si je n'envois pas la bonne trame l'automate ne risque pas d'y repondre

Qqu'un aurait eu le même probleme ou une piste ?

Par avance merci,

Jérôme.

8 réponses

cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
20 mai 2008 à 19:53
Re,

Complement d'information.

J'ai besoin de la fonction chr(0) dans le code si dessous.
je re précise quand VB6 mon programme fonctionne très bien.
Le pb que j'ai en VB.net vient de cette fonctionne qui ne rend pas les mêmes valeur en utilisant chr(0) seulement.

(------------------------------------)
Mot = 1
' Demande de lecture de mot
' Emet la demande au sous programme de dialogue ModBus
R_Float_Modbus = ModBus(Chr(Esclave) + Chr(3) + Chr(Mot \ 256) + Chr(Mot Mod 256) + _
              Chr(0) + Chr(2), 5 + 2 * 2)

Jérôme.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
21 mai 2008 à 09:02
Bonjour

Voir ce message aussi :
http://www.vbfrance.com/infomsg_SUPERVISION-AUTOMATES-AVEC-MODBUS-TCP-IP_1122096.aspx

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
0
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
21 mai 2008 à 21:15
Bonjour,

NHenry je viens de parcourir ton code et je n'ai pas trouvé de reponse.

J'espere que qqu'un à eu le même soucis et pourra m'éclairer parce que depuis plusieurs jours je fais du surplace.

Chr(3) + Chr(3) + Chr(1 \ 256) + Chr(1

Mod 256) + Chr(1 \ 256) + Chr(1
Mod 256)

c'est exactement la trame que j'envois sur le port com...

En VB6 cette trame me donné 6 caracteres...
en vb.net cette trame me donne que les deux premiers caracteres parce que chr(1\256) = nothing et tous le reste n'est pas interpreter
est ce que qqu'un aurait une solution pour que le chr(1\256) = chr(0) me donne le même resultat quand VB6 ou
qu'il est une explication de pourquoi deux fonctions identiques ne donne pas les mêmes resultats d'ou viendrait le Pb ?
 

Merci,

Jérôme

Jérôme.
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
22 mai 2008 à 08:28
Bonjour

A la place d'utiliser une chaine de caractère, utilise un tableau d'octet plutot, et tu n'auras plus ce pb.

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
22 mai 2008 à 18:23
Merci pour ton aide,

tu pourrais me donner un exemple de comment remplacerma trame de 6 caracteres de la table ascii en un tableau d'octets

Jérôme.
0
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
22 mai 2008 à 19:44
Chr
utilise la classe <?XML:NAMESPACE PREFIX MSHelp NS "http://msdn.microsoft.com/mshelp" /??><mshelp:link tabindex="0" keywords="T:System.Text.Encoding">Encoding</mshelp:link> dans l'espace de noms <mshelp:link tabindex="0" keywords="N:System.Text">System.Text</mshelp:link> pour déterminer si le thread en cours utilise un jeu de caractères codé sur un octet (SBCS, Single-Byte Character Set) ou sur deux octets (DBCS, Double-Byte Character Set). Il accepte ensuite CharCode comme un point de code dans le jeu approprié. La plage peut s'étendre de 0 à 255 pour les caractères SBCS et de -32 768 à 65 535 pour les caractères DBCS. Pour les tableaux des caractères ASCII codés sur un octet, consultez <mshelp:link tabindex="0" keywords="55a5ff74-169c-49d9-9d5d-5e6cba634ac5">Codes de caractères ASCII</mshelp:link>.



La valeur retournée dépend de la page de codes du thread en cours, contenue dans la propriété <mshelp:link tabindex="0" keywords="P:System.Globalization.TextInfo.ANSICodePage">ANSICodePage</mshelp:link> de la classe <mshelp:link tabindex="0" keywords="T:System.Globalization.TextInfo">TextInfo</mshelp:link> de l'espace de noms <mshelp:link tabindex="0" keywords="N:System.Globalization">System.Globalization</mshelp:link>. Vous pouvez obtenir ANSICodePage en spécifiant
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage
.

Mon Pb viendrait peut etre de ca ? pck a part ca je vois strictement aucune raison qu'une fonction en VB6 ( chr(0) ) ne retourne pas exactement la même chose en VB.net


Jérôme.
0
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
22 mai 2008 à 20:11
Aprés réfléxion je me demande si mon soucis ne viendrais pas plutot de ma config du port rs232

Variable de mon fichier config.ini
[Com]
port=5
bitsparseconde=19200
bitsdedonnees=8
parite=0 ( zéro numérique = none )
bitsdarret=1

Function Init_Comm(
ByVal RScom
As
Object)
As
Boolean
On
Error
GoTo Erreur

' Configuration du port RS232
RScom.Port = Com_config.Port
' Num‚ro de port
RScom.BaudRate = Com_config.Bitsparseconde
' Bit par seconde
RScom.Parity = Com_config.Parite
' Parit‚e IO.Ports.Parity.None
RScom.StopBit = Com_config.Bitsdarret
' Bit d'arrˆt IO.Ports.StopBits.One
RScom.DataBit = Com_config.Bitsdedonnes
' Bit de donn‚es
RScom.Open()
Init_Comm =
True
Exit
Function

' Gestion des erreurs
'*******************
Erreur:

'Call Arc_Erreur("Erreur lors de l'initialisation du port com (Divers/G‚n‚ral/Init_Comm) " & Error)
End
FunctionSi qqu'un  deja communiquer en Modbus sur port rs232 en vb.net peut-il me dire si y a d'autre élément à configurer pour le port ? en sachant que les valeurs de config sont bonne puisqu'elle sont identique a celle de mon Programme VB6 qui fonctionne.

Jérôme.
0
cs_Alien Messages postés 70 Date d'inscription mardi 4 juin 2002 Statut Membre Dernière intervention 23 mars 2024
22 mai 2008 à 22:55
Re,

Après 3 Jours de galère je viens enfin de comprendre pourquoi l'appareil ne repondait pas...

Pour gerer mon port com j'utilise le fichier fournit par microsoft rs232.vb
et j'ai du modifier la fonction write
J'ai remplacer ceci ...

Dim oEncoder As New System.Text.ASCIIEncoding()
Dim aByte() As Byte = oEncoder.GetBytes(Buffer)

par cela...

Dim aByte()
As
Byte
Dim a
As
Integer
ReDim aByte(Len(Buffer) - 1)

For a = 0
To Len(Buffer) - 1
    aByte(a) = Asc(Mid(Buffer, a + 1, 1))

Next a

Me.Write(aByte)

Merci NHenry ( je pige mieux le tableau de octet ( byte ) )et merci aussi à portmon, j'ai pus avec ce logiciel analysé la trame envoyé en VB6 et VB.net et ca ma permit de localiser le soucis

( Mon logiciel ne fonctionne trjs pas lol , mais l'appareil repond... c'est un très bon début , maintenant il me reste a récupere les infos dans le buffer ce qui n'est pas le plus dure)

Jérôme.

 

Ps: si qqu'un rencontre le même soucis que moi qu'il n'hesite pas à me ML
0
Rejoignez-nous