IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

[WD10] Gestion port serie


Sujet :

WinDev

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [WD10] Gestion port serie
    bonjour
    mon probleme que je poste ici concerne un peu les automaticiens
    je realise une interface d essai qui me permetera de lire un mot memoire stocker dans l automate (twido)
    le protocole utilise est le modbus
    j envoie une trame modbus de lecture (01 03 00 01 00 01 xx xx) je lit le %mw1 les xx xx c est le crc de la trame 01 c est l adress automate 03 c le code fonction lecture des mots
    voici ci joit mon code et une fenetre de sniffer de port serie
    mon programe ne marche pas j aimerai avoir une reponse de l automate
    corriger moi svp merci d avance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Résultat est un booléen
    Résultat = sOuvre(1, 2000, 2000) // Ouverture de COM1
    SI Résultat = Vrai ALORS // SI LE PORT EST OUVERT ALORS .....
     
    sFixeParamètre(1, 9600, 0, 8, 1) //JE REGLE LES PARAMETRES DE MON COM1
    sEcrit(1,Caract(0x01)+Caract(0x03)+Caract(0x00)+Caract(0x01)+Caract(0x00)+Caract(0x01)+Caract(0xD5)+Caract(0xCA)) 
    //J'ECRIT LA TRAMES MODBUS DE LECTURE DE %MW1(01 03 00 01 00 01 D5 CA) DE MON TWIDO 
     
    R est un Buffer //JE DECLARE UNE VARIABLE POUR METTRE LA REPONSE DE MON TWIDO
    R=sLit(1,sDansFileEntrée(1)) //JE LIT CE QUI EST DANS LE BUFFER
    RS=R //J'AFFICHE SE QUE JE RECOIT DANS UNE ZONNE DE SAISIE SUR MA FENETRE INTERFACE
     
     
    sFerme(1) //JE FERME COM1 
     
    SINON
    Erreur("Erreur d'ouverture de COM1") //J AFFICHE UN MESSAGE SI ECHEC D OUVERTURE DE COM 1
     
    FIN 
    -----------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------
     
    le sniffer de port serie 
     
    15:52:22 - ---------------------------------------
    15:52:22 - Serial Port COM1 opened
    15:52:22 - ---------------------------------------
    15:52:22 - Application: C:\WinDev 10\Programmes\WDTST.EXE
    15:52:22 - Timeouts changed to RIT: -1 RTTM: 0 RTTC: 0 WTTM: 0 WTTC: 0
    15:52:22 - BaudRate changed to 9600
    15:52:22 - DTR changed to ON
    15:52:22 - Line control changed to StpBts: 0 Prty: 0 WrdLen: 8
    15:52:22 - Flow control changed to CHSh: 1 FR: -2147483456 XOnL: 2048 XOff: 512
    15:52:22 - BaudRate changed to 9600
    15:52:22 - DTR changed to ON
    15:52:22 - BaudRate changed to 9600
    15:52:22 - DTR changed to ON
    15:52:22 - Line control changed to StpBts: 0 Prty: 0 WrdLen: 8
    15:52:22 - Flow control changed to CHSh: 1 FR: -2147483456 XOnL: 2048 XOff: 512
    15:52:22 - Written 8 bytes: 15:52:22 - Read 0 bytes: 
    15:52:22 - ---------------------------------------
    15:52:22 - Serial Port COM1 closed
    15:52:22 - ---------------------------------------

  2. #2
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Je ne peux pas corriger ta trame mais si l'automate n'a pas eu le temps de répondre? Essai un sleep avant ta lecture ou une boucle qui attend que sDansFileEntrée > 0.
    «Un problème bien défini est un problème à moitié résolu.»

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j ai modifier mon programme comme suivant:apparemment c est les paramètres d ouverture qui sont pas bon
    aussi j ai inséré un multitache de la mémé valeur que le délai de réponse du twido qui est de 1*100ms
    mon problème maintenant c est que je recoi une trame que je n arrive pas a déchiffrer (¶;آ) dans ma zone de texte
    y a t il une fonction windev qui me permettra de lire ma trame qui sera de cette forme 01 03 00 6f xx le 6f est 111 en hexa
    c est la valeur que j ai stocke dans %mw1 le xx est le crc de la trame repense twido
    je demande votre aide encore et merci d avance



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Résultat est un booléen
    Résultat = sOuvre(1, 2000, 2000) 				// Ouverture de COM1
    SI Résultat = Vrai ALORS						// SI LE PORT EST OUVERT ALORS .....
     
    	sFixeParamètre(1, 19200, 0, 8, 0)			//JE REGLE LES PARAMETRES DE MON COM1
    	sEcrit(1,Caract(0x01)+Caract(0x03)+Caract(0x00)+Caract(0x01)+Caract(0x00)+Caract(0x01)+Caract(0xD5)+Caract(0xCA)) 
    												//J'ECRIT LA TRAMES MODBUS DE LECTURE DE %MW1(01 03 00 01 00 01 D5 CA) DE MON TWIDO 
     
     
    	Multitâche(100) //attente
     
     
    	R est un Buffer								//JE DÉCLARE UNE VARIABLE POUR METTRE LA RÉPONSE DE MON TWIDO
    	R=sLit(1,sDansFileEntrée(1))				//JE LIT CE QUI EST DANS LE BUFFER
    	RS=R										//J'AFFICHE SE QUE JE REÇOIT DANS UNE ZONE DE SAISIE SUR MA FENÊTRE INTERFACE
     
     
    	sFerme(1) 									//JE FERME COM1 
     
    SINON
    	Erreur("Erreur d'ouverture de COM1")				//J AFFICHE UN MESSAGE SI ECHEC D OUVERTURE DE COM 1
     
    FIN

  4. #4
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Le deuxième paramètre de Val permet de donner la base à utiliser.
    «Un problème bien défini est un problème à moitié résolu.»

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    dans une nouvelle zone text j affiche la valeur du bit que j extrait de la variable B qui est le buffer
    cette valeur est de "0" quelque soit la position de l extraction
    y a t il des fonctions windev pour traiter ma trame recu pour verifier si la reponse de l automate est bien correcte


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    buffer=""
    Résultat est un booléen
    Résultat = sOuvre(1, 2000, 2000) 				
    SI Résultat = Vrai ALORS						
    	//parametrage de com1 + emmission de la trame modbus"01 03 00 01 00 01 D5 CA"
    	sFixeParamètre(1, 19200, 0, 8, 0)			
    	sEcrit(1,Caract(0x01)+Caract(0x03)+Caract(0x00)+Caract(0x01)+Caract(0x00)+Caract(0x01)+Caract(0xD5)+Caract(0xCA)) 
     
     
    	//attente de 10 ms
    	Multitâche(10)
    	//lecture du buffer port com1
    	B est un Buffer								
    	B=sLit(1,sDansFileEntrée(1))		
    	sai_buffer=B         <------------------------affchage de la trame recu ( ,)
     
     
    	//concatenation des chaines tirees des bytes recus
    	SAI_Representation=B[[1]]+B[[2]]+B[[3]]+B[[4]]+B[[5]]+B[[6]]+B[[7]]  <---------------affichage   (¶;Â)
     
    	SAI_Valeur=Val(SAI_Representation,"x")             <------------la valeur de la chaine sai_representation en hexa	
    									affichage "0"
     
     
    	//verification de la longueur de la trame
     
    	SAI_Taille=Taille(B)      <------------------------affichage "7"
     
     
    	sFerme(1) 									
     
    SINON
    	Erreur("Erreur d'ouverture de COM1")				
     
    FIN

  6. #6
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    En fait tes données semblent concaténées en binaire dans une chaine de caractère.

    Si tu prend la valeur ascii de chacun des caractères du devrais obtenir ce que tu veux.
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    bonjour tous le monde
    voila maintenant je suis arrive a lire correctement la trame de réponse de twido
    bon voila la méthode :
    -j envoie la requête modbus 001 003 000 001 000 001 crc crc
    -je récupère la réponse après un bref délai d attente
    -la réponse est de cette forme 001 003 002 000 111 crc crc
    -la valeur du4iem bit et du 5ieme bit étant la valeur stocker a %MW1 111decimale

    jusque ici tous va bien mais quand je stock une autre valeur plus grande que 222decimal
    par exemple 444 je recoi une trame de réponse de cette ordre 001 003 002 001 188 crc crc
    si j retire seulement la 5ieme bit et je l affiche j aurai %MW1=188 alors que c faux
    je doit prendre le 5ieme bit que je converti en hexa qui me donnera "BC" que je concaténé
    avec la 4ieme bit qui est 001 ca va me donner 001BC que je convertirai hexa ver décimale
    qui me donnera exactement le fameux 444 que j ai bien stocke dans le %MW1
    je vous demande maintenant si il existe une fonction windev qui convertie
    le decimale en hexa et vice versa ou je devrai la construire?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    B=""
    	sEcrit(1,Caract(0x01)+Caract(0x03)+Caract(0x00)+Caract(0x01)+Caract(0x00)+Caract(0x01)+Caract(0x74)+Caract(0x0A))
    	Multitâche(11)
    	B=sLit(1,sDansFileEntrée(1))
    	SAI_Mw1=Asc(B[[5]])             <--------------affiche 188 decimal la valeur reel stocker c 444 decimal
     
     
    	SAI_Saisie1=Asc(B[[1]])	<--------------affiche 1  (001) adress esclave modbus
    	SAI_Saisie2=Asc(B[[2]])	<--------------affiche 3  (003) code fonction modbus
    	SAI_Saisie3=Asc(B[[3]])	<--------------affiche 2  (002) reponse sur 2 octets
    	SAI_Saisie4=Asc(B[[4]])	<--------------affiche 1  (001) valeur 1octet
    	SAI_Saisie5=Asc(B[[5]]) <--------------affiche 188(188) valeur 2 octet BC en hexa
    	SAI_Saisie6=Asc(B[[6]])	<--------------affiche crc   1ier octet crc 
    	SAI_Saisie7=Asc(B[[7]])	<--------------affiche crc   2iem octet crc 
               //forme finale de la trame 001 003 002 001 188 crc crc 
     
    	SAI_V=Val(Asc(B[[5]]),"x") <-------------affiche le 73 valeur fausse
    si je fait la conversion manuel avec mon stylo j aurai
    001 003 002 001 188 crc crc trame
    ------------- 001 BC hex
    -------------- 444 decimal------------>%Mw1=444

  8. #8
    Membre expérimenté Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Points : 1 322
    Points
    1 322
    Par défaut
    Tu ne veux pas vraiment faire une conversion mais les fonctions NumeriqueVersChaine et Val permettre d'enregistrer et de lire des numériques et de les afficher en chaînes sous diverses bases. Et en passant ce ne sont pas des bits mais des octets (bytes en anglais) que tu lis et écris.
    «Un problème bien défini est un problème à moitié résolu.»

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    oui pardon ce sont des bytes et pas des bits
    merci pour la correction

Discussions similaires

  1. Gestion Ports Serie
    Par gaston11 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/12/2012, 22h32
  2. gestion d'une carte via un port serie
    Par leo_OrNg dans le forum Composants
    Réponses: 1
    Dernier message: 04/12/2008, 16h41
  3. Gestion de port serie sous Xp - Visual
    Par unluckymannn dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 30/11/2006, 09h40
  4. Gestion de port serie sous Xp avec Visual C++
    Par unluckymannn dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 30/11/2006, 09h40
  5. Gestion des ports serie
    Par wass dans le forum Windows
    Réponses: 1
    Dernier message: 19/04/2006, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo