|
Problème de communication avec MCF Eltrade via port série |
Iniciado por Lionel Gildas KANHON, 14,jun. 2020 11:43 - 20 respuestas |
| |
| | | |
|
| |
Miembro registrado 4 mensajes |
|
Publicado el 14,junio 2020 - 11:43 |
Bonjour,
J'ai un problème de communication via le port série avec un équipement de facturation Eltrade MCF. Le PC envoi une commande à l'équipement en respectant le format suivant :
où SOH=début de la commande; LEN=Nombre total d'octets de la position 2 "LEN" à6 "AMB" (inclus), plus décalage fixe de 20h; SEQ=N° de série de la commande; CMD=code de la commande; Data=Donnée selon la commande (0 s'il n'y a pas de données); AMB=Délimiteur; BCC=somme des octets de données de la position 2 à la position 6; ETX=Fin de commande
J'essaye de lancer la commande C1h pour afficher le status de la machine. Cette commande n'a pas de données.
Voici le code dans le bouton
sFerme(SAI_N_de_Port)
sChaîneAEcrire est une chaîne =Caract(0x01)+Caract(0x39)+Caract(0x35)+Caract(0xC1)+Caract(0x30)+Caract(0x2C)+Caract(0x39)+Caract(0x03)
SI sOuvre(SAI_N_de_Port, 12288, 12288, sTimeoutDéfaut, Vrai)=Vrai ALORS Trace(" Ouverture du port "+SAI_N_de_Port+" est Ok ") SI sFixeParamètre(SAI_N_de_Port, 115200, 0, 8, 0)=Vrai ALORS Trace(" Paramétrage du port "+SAI_N_de_Port+" est ok") nBcaract est un entier=0 nBcaract=sEcrit(SAI_N_de_Port,sChaîneAEcrire) SI nBcaract>0 ALORS Trace(" Des données ont été écris sur le port COM "+SAI_N_de_Port+" "+nBcaract+" caractères écrits") SINON Trace(" Une erreur est survenue lors de l'écriture sur le port "+SAI_N_de_Port) FIN Multitâche(-100) LectureCOM() SINON Trace(" Paramétrage du port "+SAI_N_de_Port+" a échoué") FIN SINON Trace(" Erreur lors de l'ouverture du port "+SAI_N_de_Port) FIN
Procedure LectureCOM()
sMessageLu est une chaîne nNbCar est un entier
nNbCar=sDansFileEntrée(SAI_N_de_Port)
Trace(nNbCar)
sMessageLu+=sLit(SAI_N_de_Port,sDansFileEntrée(SAI_N_de_Port))
Trace(sMessageLu)
Tout semble correct quand j'exécute le code mais j'ai pas le résultat (je reçois le signe ). Je ne sais pas si le problème se situe au niveau du code Hexa.
J'ai vraiment besoin de votre aide.
Merci pour le support, |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 946 mensajes Popularité : +102 (110 votes) |
|
Publicado el 14,junio 2020 - 14:34 |
bonjour Après les instructions :
SI sOuvre(SAI_N_de_Port, 12288, 12288, sTimeoutDéfaut, Vrai)=Vrai ALORS Trace(" Ouverture du port "+SAI_N_de_Port+" est Ok ") SI sFixeParamètre(SAI_N_de_Port, 115200, 0, 8, 0)=Vrai ALORS Trace(" Paramétrage du port "+SAI_N_de_Port+" est ok")
il manque l'instruction sEvenement() pour gerer la reception et votre timer ne sert plus à rien
-- « L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4 mensajes |
|
Publicado el 14,junio 2020 - 23:14 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 946 mensajes Popularité : +102 (110 votes) |
|
Publicado el 15,junio 2020 - 12:30 |
bonjour pouriez vous montrer votre code ?
-- « L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4 mensajes |
|
Publicado el 12,julio 2020 - 22:42 |
Bonjour Philipe, Excuse moi pour le retard de ma réponse. J'ai créé une procédure MakeTrame pour générer la trame à envoyer sur le port et une autre LectureCOM pour lire la réponse de l'équipement.
Procedure MakeTrame(cSEQ est un entier sans signe sur 1 octet, cCMD est un entier sans signe sur 1 octet, sData est une chaîne)
cSOH est un entier sans signe sur 1 octet = 0x01 cLEN est un entier sans signe sur 1 octet = 0x24 cAMB est un entier sans signe sur 1 octet = 0x05 iBCC est un entier sans signe sur 2 octets = 0x00 cETX est un entier sans signe sur 1 octet = 0x03 cBCC1, cBCC2, cBCC3, cBCC4 est un entier sans signe sur 1 octet SousTrame, sTrame est une chaîne
cLEN += Taille(sData) SousTrame = Caract(cLEN) + Caract(cSEQ) + Caract(cCMD) + sData + Caract(cAMB)
i est un entier FOR i=1 _TO_ Taille(SousTrame) iBCC += Asc(SousTrame[[i]]) END
cBCC1 = bitDécaleDroite(iBCC & 0xf000, 12) + 0x30 cBCC2 = bitDécaleDroite(iBCC & 0x0f00, 08) + 0x30 cBCC3 = bitDécaleDroite(iBCC & 0x00f0, 04) + 0x30 cBCC4 = (iBCC & 0x000f) + 0x30
sTrame = Caract(cSOH) + SousTrame + Caract(cBCC1) + Caract(cBCC2) + Caract(cBCC3) + Caract(cBCC4) + Caract(cETX) gsTra=sTrame
RENVOYER sTrame
sMessageLu est une chaîne nNbCar est un entier
nNbCar=sDansFileEntrée(1)
Trace(nNbCar)
sMessageLu+=sLit(1,sDansFileEntrée(1))
SAI_Retour+=" "+RC+sMessageLu
Le code du bouton de la commande C1h qui donne les information sur la machine :
MakeTrame(0x40,0xC1,0x30)
sFerme(SAI_NumPort) sChaîneAEcrire est une chaîne =gsTra
SI sOuvre(SAI_NumPort, SAI_TailleBuffEntree, SAI_TailleBufferSortie, sTimeoutDéfaut, bGesEve)=Vrai ALORS sEvénement(SAI_NumPort,sEveCaractèreReçu,LectureCOMC1) SI sFixeParamètre(SAI_NumPort, SAI_Vitesse_de_transmission, nParite, SAI_NombreBitData, SAI_NombreBitArret)=Vrai ALORS nBcaract est un entier=0 nBcaract=sEcrit(SAI_NumPort,sChaîneAEcrire) Multitâche(-100) SINON Trace(" Paramétrage du port "+SAI_NumPort+" a échoué") FIN SINON Trace(" Erreur lors de l'ouverture du port "+SAI_NumPort) FIN
sFerme(SAI_NumPort)
Le problème est que en cliquant sur le bouton la machine réagit bien mais pas toutes les fois. Aussi les autres commande sur la machine ne donnent pas les réponses attendues. Je ne sais pas si c'est à cause du numéro de séquence de la commande.
Merci du support, |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 946 mensajes Popularité : +102 (110 votes) |
|
Publicado el 13,julio 2020 - 14:46 |
bonjour avez-vous testé en incrémentant cSEQ car il ne faut pas envoyer deux fois de suite la même trame
-- « L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi |
| |
| |
| | | |
|
| | |
| |
Publicado el 13,julio 2020 - 16:32 |
La séquence est comprise entre 20h et FFh donc 32-255; je convertis en hexa le nombre trouvé avant de l'appliquer. Le retour n'est pas tout le temps concluant mais je cherche toujours. Une aide de votre part serait la bienvenue.
Merci du support, |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 962 mensajes Popularité : +183 (185 votes) |
|
Publicado el 13,julio 2020 - 17:40 |
hello, Lionel, il y a un truc louche dans ton code. Tu fermes la liaison série à la fin. Cela n'est pas bon pour les données qui peuvent arriver. Normalement dans une liaison série on programme et on ouvre le port série au début et on le laisse ouvert tout le temps que l'on peut avoir besoin de lui. On ne le ferme que quand on a finit toutes les opérations. Par exemple à la fermeture de l'application.
-- Ami calmant, J.P |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 946 mensajes Popularité : +102 (110 votes) |
|
Publicado el 13,julio 2020 - 21:45 |
1 bouton juste pour ouvrir et parametrer le port (je vous laisse rajouter les contrôles) mais "normalement" 3 lignes sufisent
sOuvre(SAI_NumPort, 2400, 2400, sTimeoutDéfaut, True) sFixeParamètre(SAI_NumPort, SAI_Vitesse_de_transmission, nParite, SAI_NombreBitData, SAI_NombreBitArret) sEvénement(SAI_NumPort, sEveCaractèreReçu, LectureCOMC1) Une fois que vous aurez cliqué sur ce bouton et si le port de com est bien paramètré alors si le port com reçois des octets et ça quelque soit l'endroit où se trouve le programme, ce dernier sera interompu pour exécuter la procédure LectureCOMC1 (c'est le principe des Interrutions) C'est donc dans la procédure LectureCOMC1 que le travail de lecture des données doit se faire...
1 bouton juste pour ennvoyer la trame
Ecrit(SAI_NumPort, MakeTrame(0x40, 0xC1, 0x30))
1 bouton juste pour fermer le port
-- « L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4 mensajes |
|
Publicado el 14,julio 2020 - 15:02 |
Bonjour Philippe,
Oui j'ai essayé de corriger comme expliqué en dessus. Mon problème actuellement se trouve au niveau des autres commandes. Normalement la machine est connecté pour envoyer les facture saisi par mon logiciel vers la direction des impôts; donc il y a une suite de commandes à exécuter pour récupérer le code de normalisation à afficher sur la facture.
La commande C1h pour voir le status marche correctement mais le problème se trouve au niveau des autres commande qui prennent des paramètres (donc plus de 0x30). Comment préfixer la donnée en paramètre à la procédure MakeTrame de "0x". Pour être plus explicite j'ai la commande C0 qui doit prendre comme données : "1,Bienvenu,9999900000154,0.00,18.00,0.00,18.00,FV"; apès conversion de cette donnée en hexa et envoyer à la procédure, on a pas le résultat attendu.
Si possible envoie moi ton email, j'enverrai mon programme avec la documentation pour que tu puisses mieux me corriger
Toujours merci pour le support |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 946 mensajes Popularité : +102 (110 votes) |
|
Publicado el 14,julio 2020 - 15:23 |
bonjour je viens de vous envoyer un mail
-- « L'erreur ne devient pas vérité parce qu'elle se propage et se multiplie ; la vérité ne devient pas erreur parce que nul ne la voit. » Gandhi |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 946 mensajes Popularité : +102 (110 votes) |
|
Publicado el 14,julio 2020 - 16:02 |
bonjour je comprend pas " apès conversion de cette donnée en hexa"
Il suffit juste de faire :
NumSeq++ IF NumSeq < 0x20 THEN NumSeq = 0x20 sEcrit(ComPort, MakeTrame (NumSeq, 0xC0, "1,Bienvenu,9999900000154,0.00,18.00,0.00,18.00,FV")) |
| |
| |
| | | |
|
| | |
| |
Publicado el 21,julio 2020 - 11:09 |
Bonjour,
Je reviens avec un autre soucis toujours dans le même cadre. Tout marche bien à présent et je récupère toute les réponses émises par la machine sans faute. Mon soucis actuellement est au niveau des factures avec plusieurs lignes. Quand j'émets une facture avec plusieurs lignes de produits, la machine ne prend en compte que la première ligne malgré que j'ai mis ce traitement dans une boucle. En dessous le code :
gsReponse="" Sequence()
i est un entier Pour i=1 a TABLE_SansNom2..occurence sDataAscii=TABLE_SansNom2.COL_Réf_Article[i]+TAB+TABLE_SansNom2.COL_TG[i]+TABLE_SansNom2.COL_Total_TTC[i] Trace(sDataAscii) MakeTrame(gnNumSeq,0x31,sDataAscii) sChaîneAEcrire=gsTra nBcaract=sEcrit(gnNumPort,sChaîneAEcrire) SI nBcaract=0 ALORS Trace(" Une erreur est survenue lors de l'écriture sur le port "+gnNumPort+" alloué à la machine MCF ") gnSaveFacture=0 SINON Temporisation(100) gnSaveFacture=1 FIN FIN
Ai-je fais une erreur dans ce code? Votre aide me sera utile.
Merci, |
| |
| |
| | | |
|
| | |
| |
Publicado el 01,agosto 2020 - 23:37 |
Il y a toujours une erreur dans ton code. Le numero de séquence doit varier d'une ligne de facture à une autre. Dans ton code c'est la même séquence que tu envoies l'Eltrade considère que c'est la même ligne de facture. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 1 mensaje |
|
Publicado el 28,septiembre 2020 - 18:13 |
bonjour mr lionel gildas Pourras tu partager avec moi la solution pour l'utilisation de la machine électronique de facturation.?? Merci |
| |
| |
| | | |
|
| | |
| |
Publicado el 15,febrero 2021 - 01:16 |
Bonjour, Messieurs. J'aimerais savoir concrètement, comment, par exemple, exécuter la commande de vérification d'état "C1h". |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 352 mensajes Popularité : +12 (18 votes) |
|
Publicado el 25,marzo 2021 - 15:46 |
Bonjour, En reprenant le code donné plus, j'arrive à obtenir une réponse du boitier. Code pour envoie commande C1h :
nNumeroPort est un entier=6 sChaineLue1 est une chaîne="" tabDataLue1 est un tableau de chaînes
sFerme(nNumeroPort)
sChaîneAEcrire est une chaîne =Caract(0x01)+Caract(0x24)+Caract(0x26)+Caract(0xC1)+Caract(0x05)+Caract(0x30)+Caract(0x31)+Caract(0x31)+Caract(0x30)+Caract(0x03)
SI sOuvre(nNumeroPort, 12288, 12288, sTimeoutDéfaut, Vrai)=Vrai ALORS SI sFixeParamètre(nNumeroPort, 115200, 0, 8, 0)=Vrai ALORS nBcaract est un entier=0 nBcaract=sEcrit(nNumeroPort,sChaîneAEcrire) SI nBcaract>0 ALORS SINON Erreur(" Une erreur est survenue lors de l'écriture sur le port "+nNumeroPort) sFerme(nNumeroPort) RETOUR FIN BOUCLE SI sDansFileSortie(nNumeroPort) = 0 ALORS SORTIR FIN sChaineLue1=LectureCOM() tabDataLue1=ChaîneDécoupe(sChaineLue1,",") SINON Erreur("Paramétrage du port "+nNumeroPort+" a échoué"+RC+ErreurInfo()) FIN sFerme(nNumeroPort) SINON Erreur("Erreur lors de l'ouverture du port "+nNumeroPort+RC+ErreurInfo()) FIN
PROCEDURE INTERNE LectureCOM() sMessageLu est une chaîne nNbCar est un entier sMessageRetour est une chaîne nNbCar=sDansFileEntrée(nNumeroPort) sMessageLu=sLit(nNumeroPort,sDansFileEntrée(nNumeroPort)) SI Contient(sMessageLu,EOT) ALORS sMessageRetour=ExtraitChaîne(sMessageLu,1,EOT) SINON sMessageRetour=sMessageLu FIN SI Contient(sMessageRetour,Caract(1)) ALORS sMessageRetour=ExtraitChaîne(sMessageRetour,2,Caract(1)) sMessageRetour=sMessageRetour[[4 À]] FIN RENVOYER sMessageRetour FIN
Réponse obtenue :
ED0XXXXXXXXX,28894,20210324114034,2,0,0,,,,0.00,19.00,10.00,5.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,2.00,5.00,0.00,0.00
Ce que je n'arrive pas à comprendre, des données n'ont pas pu être récupérées en position 7,8,9 A quoi correspondent ces données?
Maintenant que j'ai ça, je ne sais pas comment doit se faire l'envoie des autres commandes : C3, C0, 31, 33, 35, 38 Merci pour votre aide. |
| |
| |
| | | |
|
| | |
| |
Publicado el 06,mayo 2021 - 18:39 |
Salut Julien. Je suis sur un projet de soutenance et j'ai ce genre de soucis actuellement. Je te demande vraiment de me donner un coup de main a propos du protocole de communication entre le site et le mcf. Je suis nul en langage machine et tout mes efforts a essayer les codes trouvés sur le net sont vains. J'espère que tu répondras vivement a ma requête |
| |
| |
| | | |
|
| | |
| |
Publicado el 23,junio 2021 - 11:02 |
Bjr Lionel ! u va bien jesper . je voudrais de ton aide dans le sens d"envoi des factures à la DGI via mon appli windev. merci de me répondre via juckeboxe24@gmail.com |
| |
| |
| | | |
|
| | |
| |
Publicado el 04,octubre 2021 - 19:05 |
Bonjour tous ! @Philippe Pasquali et @tous Merci pour l'aide, grâce à vos échanges j'ai pu faire communiquer mon logiciel avec le MCF, en tout cas jusqu'au niveau de la commande c31 oû j'ai la reponse suivante :
0Ý1E: TR<EOT>á€È€ÀØ06<= (comme vous le voyez j'ai un souci d'encodage à l'affichage des réponses du MCF)
Données envoyées : ASSURANCE_PRO<TAB>EX0.00%1000<TAB>500*2
Merci ! |
| |
| |
| | | |
|
| | |
| |
Publicado el 19,octubre 2021 - 07:35 |
Bonjour mes chers amis.
Lionel, Eomulussoo1
J'ai besoin que vous m'aidiez avec la solution pour communiquer Avec la machine ELtrADE
Voici mon mail yawo907@gmail.com
Merci |
| |
| |
| | | |
|
| | | | |
| | |
|