Forum des développeurs  

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é.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Automation

Automation Forum d'entraide sur l'automatisme, la robotique et l'informatique industrielle

Réponse
 
Outils de la discussion
Vieux 26/09/2008, 19h15   #16 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

J'ai un collégue qui a testé mes equipement avec un programme, installé sur son ordinateur, et ca fonctionne (mais je n'ai pas la source, programme payant).
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
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/09/2008, 19h17   #17 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/09/2008, 21h45   #18 (permalink)
Responsable Visual Basic
 
Avatar de bbil
 
Date d'inscription: juin 2003
Localisation: Toulouse-Mirepoix
Âge: 42
Messages: 7 733
Envoyer un message via Skype™ à bbil
Par défaut

Citation:
Envoyé par mat-tech Voir le message
....
A mon avis, si tu n'as pas vu cette partie du code c'est qu'elle est mauvaise
....
oui déjà supprime ton "call MSComm1_OnComm" , ensuite tu ne dois pas envoyer directement ta chaine de caractére mais une suite d'octet.


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"
bbil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 08h42   #19 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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 ?
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 09h16   #20 (permalink)
Responsable Visual Basic
 
Avatar de bbil
 
Date d'inscription: juin 2003
Localisation: Toulouse-Mirepoix
Âge: 42
Messages: 7 733
Envoyer un message via Skype™ à bbil
Par défaut

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
ta trame reçue est donc:
Citation:
058201C0A1
et tu reçoit 82 : "Error code"
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"
bbil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 09h29   #21 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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
Encor merci de ton aide
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 09h41   #22 (permalink)
Responsable Visual Basic
 
Avatar de bbil
 
Date d'inscription: juin 2003
Localisation: Toulouse-Mirepoix
Âge: 42
Messages: 7 733
Envoyer un message via Skype™ à bbil
Par défaut

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"
bbil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 10h04   #23 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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.
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 10h16   #24 (permalink)
Responsable Visual Basic
 
Avatar de bbil
 
Date d'inscription: juin 2003
Localisation: Toulouse-Mirepoix
Âge: 42
Messages: 7 733
Envoyer un message via Skype™ à bbil
Par défaut

Citation:
Envoyé par mat-tech Voir le message
...t 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).
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:
Envoyé par mat-tech Voir le message
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.
c'est les résistances de terminaisons, elles sont nécessaire mais bon si ton réseau et court cela marche sans habituellement..
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"
bbil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 12h06   #25 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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.
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 12h33   #26 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

J'arrive a récupérer la valeur :
Code :
st2 = Mid(st, 7, 4)
MsgBox st2
Mais je ne trouve pas comment la convertir, fin j'ai essayé de faire
Code :
st2 = CDec(Hex(Mid(st, 7, 4))
 MsgBox st2
Mais j'ai une erreur, avez-vous une idée ...

Merci
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 12h36   #27 (permalink)
Responsable Visual Basic
 
Avatar de bbil
 
Date d'inscription: juin 2003
Localisation: Toulouse-Mirepoix
Âge: 42
Messages: 7 733
Envoyer un message via Skype™ à bbil
Par défaut

Citation:
oui on dirait vraiment que lorsqu'un octet vaut 00, le compteur ne l'affiche pas dans la trame ...
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")
pense aussi à vérifier le CRC de la trame reçue... au cas ou..
__________________
bbil : Impératif "A LIRE AVANT DE POSTER"

Dernière modification par bbil ; 27/09/2008 à 12h54
bbil est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 13h48   #28 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 14h14   #29 (permalink)
Membre actif
 
Avatar de mat-tech
 
Date d'inscription: avril 2006
Localisation: Bruxelles
Messages: 173
Par défaut

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
S'il existe d'autres solutions, je les veux bien car j'ai l'impression que c'est du chipo.
__________________
mat-tech est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/09/2008, 14h28   #30 (permalink)
Responsable Visual Basic
 
Avatar de bbil
 
Date d'inscription: juin 2003
Localisation: Toulouse-Mirepoix
Âge: 42
Messages: 7 733
Envoyer un message via Skype™ à bbil
Par défaut

Citation:
Envoyé par mat-tech Voir le message
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


Code :
msgbox val("&h" & "1389")/100
__________________
bbil : Impératif "A LIRE AVANT DE POSTER"
bbil est déconnecté   Envoyer un message privé Réponse avec citation
NEWS AUTRESAdaAlgoAssembleurBasicCobolFortranLaTeXMATLABPascalPerlPrologPurebasicRéseauRubySystèmesXMLRAD

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Automation



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide