![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Automation Forum d'entraide sur l'automatisme, la robotique et l'informatique industrielle |
![]() |
|
|
Outils de la discussion |
|
|
#16 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
J'ai un collégue qui a testé mes equipement avec un programme, installé sur son ordinateur, et ca fonctionne
Donc c'est bien dans mon code qu'il y a un probleme ... Mon code actuel : Code :
Option Explicit
Private Sub Command1_Click()
Text1.Text = ""
MSComm1.Output = Text2.Text
Call MSComm1_OnComm
End Sub
Private Sub Form_Load()
Form1.Caption = "App2"
With MSComm1
.CommPort = 1 'on utilise le port COM1
.Handshaking = 2
.RThreshold = 1
.RTSEnable = True
.Settings = "9600,n,8,1"
.SThreshold = 1
.PortOpen = True
End With
Text1.Text = ""
Command1.Caption = "&Send"
Text2.Text = "0502072B0002B4F3"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False 'on ferme le port quand l'appli quitte
End Sub
Private Sub MSComm1_OnComm()
Dim Tampon As String
Select Case MSComm1.CommEvent
' On effectue la gestion des erreurs (cf. le modèle ci-dessus)
' Ici, on gère en fait pas grand-chose, mais c'est pour illustrer la démarche ;)
'liste des erreurs possibles
Case comEventBreak 'On a reçu un signal d’interruption (Break)
Case comEventCDTO ' Timeout de la porteuse
Case comEventCTSTO ' Timeout du signal CTS (Clear To Send)
Case comEventDSRTO ' Timeout du signal de réception
Case comEventFrame ' Erreur de trame
Case comEventOverrun ' Des données ont été perdues
Case comEventRxOver ' Tampon de réception saturé
Case comEventRxParity ' Erreur de parité
Case comEventTxFull ' Tampon d’envoi saturé
Case comEventDCB ' Erreur de réception DCB (jamais vu)
'liste des événements possibles qui sont, eux, normaux
Case comEvCD 'Changement dans la broche CD (porteuse)
Case comEvCTS 'Changement dans broche CTS
Case comEvDSR 'Changement dans broche DSR (réception)
Case comEvRing 'Changement dans broche RING (sonnerie)
'Chouette! on a reçu des données :)
Case comEvReceive
Tampon = MSComm1.Input
Call Traitement(Tampon) 'traitement données
Case comEvSend ' il y a des caractères à envoyer
Case comEvEOF 'on a reçu le caractère EOF
End Select
End Sub
Sub Traitement(Chaine As String)
'cette procédure sert à traiter l’information reçue dans le tampon
Text1.SelStart = Len(Text1.Text)
Text1.SelText = Chaine 'ici, on affiche le résultat dans un champ de texte
End Sub
__________________
![]()
Dernière modification par mat-tech ; 26/09/2008 à 20h08 |
|
|
|
|
|
#17 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
Pour le reste je suis certain que tout est configuré de la meme facon, dans mon programme et dans le compteur.
A mon avis, si tu n'as pas vu cette partie du code c'est qu'elle est mauvaise Code :
Private Sub Command1_Click() Text1.Text = "" MSComm1.Output = Text2.Text Call MSComm1_OnComm End Sub
__________________
![]()
|
|
|
|
|
|
#18 (permalink) | |
![]() |
Citation:
par exemple : Code vb :
Private Sub Command1_Click() Dim i as integer dim st as string Dim buffer as string Text1.Text = "" st =Text2.Text For i = 1 To Len(st) Step 2 buffer = buffer & Chr(Val("&h" & Mid(st, i, 2))) Next MSComm1.Output = buffer End Sub [Edit] pense aussi à vérifier ton CRC ... j'aurai plutôt dit 89 33
__________________
bbil : Impératif "A LIRE AVANT DE POSTER" |
|
|
|
|
|
|
#19 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
Bonjour,
voila j'ai testé ton code, et maintenant lorsque je clic sur "Send", (ca va tres vite mais on voit) la led TX et ensuite RX qui clignote, donc on fait bien maintenant de l'envoie et le compteur repond, mais il repond "‚À¡" donc je suppose que pour la reception, je dois aussi faire une resception octet apres octet ou pas utile ?
__________________
![]()
|
|
|
|
|
|
#20 (permalink) | |
![]() |
bjr,
si tu veux afficher la trame reçue sous la forme d'une chaine composé des valeurs contenue dans ta trame en hexadécimal (comme ta chaine d'émission) tu utilise la fonction inverse à Chr :Asc pour trouver le code ascii des caractères reçu, puis la fonction Hex pour avoir la valeur Hexadécimale. dans ton cas : Code :
Private Sub Command1_Click()
Dim stRecue As String
stRecue = "‚À¡" 'Ta chaine récupéré sur le forum
For i = 1 To Len(stRecue)
st = st & Right("0" & Hex(Asc(Mid(stRecue, i, 1))), 2)
Next
Debug.Print st
MsgBox st 'Au cas où tu ne connaitrai pas la fenêtre exécution
End Sub
Citation:
voir : http://www.modbus.org/docs/Modbus_Ap...ocol_V1_1b.pdf (peu-être te faudra-t'il d'abords passer par la : http://www.modbus.org/specs.php ) Essai de modifier le CRC de la trame émise en remplaçant B4F3 par 8933 Peu-tu me rappeler ce que désire lire dans le Diris, de mémoire je ne me souviens pas quels sont les "bits" disponibles en lecture. [EDIT] J'ai finalement jeté un oeil à la doc diris dans ton lien .. il n'y as rien d'accessible par une fonction modbus 02 !
__________________
bbil : Impératif "A LIRE AVANT DE POSTER" |
|
|
|
|
|
|
#21 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
Je ne sais pas mais j'ai des choses bizarres qui se passent, hier j'ai testé ton code et il me renvoyait quelque chose de bizarre, mais j'ai trouvé pourquoi en fait hier j'envoyai "0502072B0002B4F3" alors que je devais envoyer
"0503072B0002B4F3" et depuis plus rien ne se passe en réception ![]() Mon code : Code :
Option Explicit
Private Sub Command1_Click()
Dim i As Integer
Dim st As String
Dim buffer As String
Text1.Text = ""
st = Text2.Text
For i = 1 To Len(st) Step 2
buffer = buffer & Chr(Val("&h" & Mid(st, i, 2)))
Next
MSComm1.Output = buffer
End Sub
Private Sub Form_Load()
Form1.Caption = "App2"
With MSComm1
.CommPort = 1 'on utilise le port COM2: car on utilise 1 PC avec 2 ports COM:
'si vous avez 2 PC, changez en .CommPort=1 !!!
.Handshaking = 2
.RThreshold = 1
.RTSEnable = True
.Settings = "9600,n,8,1"
.SThreshold = 1
.PortOpen = True
End With
Text1.Text = ""
Command1.Caption = "&Send"
Text2.Text = "0503072B0002B4F3"
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False 'on ferme le port quand l'appli quitte
End Sub
Private Sub MSComm1_OnComm()
Dim Tampon As String
Select Case MSComm1.CommEvent
' On effectue la gestion des erreurs (cf. le modèle ci-dessus)
' Ici, on gère en fait pas grand-chose, mais c'est pour illustrer la démarche ;)
'liste des erreurs possibles
'on a reçu des données
Case comEvReceive
Tampon = MSComm1.Input
Call Traitement(Tampon) 'traitement données
End Select
End Sub
Sub Traitement(Chaine As String)
'cette procédure sert à traiter l’information reçue dans le tampon
Text1.SelStart = Len(Text1.Text)
Text1.SelText = Chaine 'ici, on affiche le résultat dans un champ de texte
End Sub
__________________
![]()
|
|
|
|
|
|
#22 (permalink) |
![]() |
ben la difficile de savoir ce tu as changé d'autre... si tu reviens en arrière cela fonctionne..?
tu est bien en com1..? sinon ta dernière trame semble mieux, du moins le CRC est correct!
__________________
bbil : Impératif "A LIRE AVANT DE POSTER" |
|
|
|
|
|
#23 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
En désespoir, j'ai déconnecté le convertisseur et je l'ai reconnecté et ça fonctionne de nouveau et maintenant lorsque j'envoie "0503072B0002B4F3" le dirais me répond " ¿ó"
Ensuite j'ai adapté ton morceau de code pour transformer la trame reçue et il m'affiche "050304BFF3" se qui me semble logique car la réponse a ma requête vaut 0 (car la somme des KWh est a 0). Je vais faire quelques test, et j'aurais sans doute encor besoin de vous Mais je vous remercie mille fois pour votre aide Quelques petites questions : Mais je remarque, que parfois le compteur me repond aussi "" (se qui donne "050304"), mais pourquoi il met pas le CRC ? Dans la notice, on dit qu'il faut absolument placer une resistance de 120 ohms à chaque extrémitée du câble, entre + et -, je me demande pour quoi.
__________________
![]()
|
|
|
|
|
|
#24 (permalink) | ||
![]() |
Citation:
ta trame reçue n'est pas complète...05 => numéro esclave 03 => lecture mot 04 => nombre d'octets lu BF et F3 => les 2 premiers octets lu il manque deux octets de données puis deux octets CRC suivant le temps "inter-caractères" il est possible que la réception de la trame soit effectué en plusieurs fois... Citation:
J'ai pas regardé la doc de ton convertisseur, mais parfois ceux-ci intègrent cette résistance il suffit de bouger un switch pour l'activer.
__________________
bbil : Impératif "A LIRE AVANT DE POSTER" |
||
|
|
|
|
|
#25 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
Oui on dirait vraiment que lorsqu'un octet vaut 00, le compteur ne l'affiche pas dans la trame ...
J'ai testé une autre trame, pour avoir la fréquence du réseau, j'ai envoyé "0503070A0001A4F8" je reçu " ‰… " Après transformation ça donne "05030213898512" la réponse qui m'intéresse est en fait "1389" qui donne en décimale "5001" soit 50,01 Hz Ma question actuelle comment je pourrai faire, pour que le programme récupère de la valeur "05030213898512" la partie "1389" et la transforme automatiquement en 50,01 par exemple. J'y travail mais si vous avez des conseils ou des exemples me donner je suis preneur.
__________________
![]()
|
|
|
|
|
|
#26 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
J'arrive a récupérer la valeur :
Code :
st2 = Mid(st, 7, 4) MsgBox st2 Code :
st2 = CDec(Hex(Mid(st, 7, 4)) MsgBox st2 Merci
__________________
![]()
|
|
|
|
|
|
#27 (permalink) | |
![]() |
Citation:
je pencherai plutôt pour un problème dans ton programme tu ne lis pas tous les caractères reçus sur le port série.Hex te permet de passer de décimal à hexadécimal , la c'est le contraire que tu veux faire.. Code :
msgbox val("&h" & "1389")
__________________
bbil : Impératif "A LIRE AVANT DE POSTER" Dernière modification par bbil ; 27/09/2008 à 12h54 |
|
|
|
|
|
|
#28 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
J'arrive a afficher ce nombre "4999" par exemple mais je dois afficher 49,99 Hz, j'ai essayé de diviser (par 100 ou par 64 en hexadeciamal)le nombre avant ou apres transformation, je n'arrive pas a trouver ...
![]() Pouvez-vous me donner une idée
__________________
![]()
|
|
|
|
|
|
#29 (permalink) |
|
Membre actif
![]() Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
|
Bon j'ai trouvé une solution
Code :
st2 = Mid(st, 7, 4)
st3 = Val("&h" & st2)
st2 = Mid(st3, 1, 2) & "," & Mid(st3, 3, 2) & " Hz"
MsgBox st2
__________________
![]()
|
|
|
|
|
|
#30 (permalink) | |
![]() |
Citation:
![]() Code :
msgbox val("&h" & "1389")/100
__________________
bbil : Impératif "A LIRE AVANT DE POSTER" |
|
|
|
|
|
![]() |
![]() |
||
Connection RS485 vers Modul Modbus
|
||
| Outils de la discussion | |
|
|