cs_bakalasup
Messages postés10Date d'inscriptionlundi 10 décembre 2007StatutMembreDernière intervention16 septembre 2009
-
15 juil. 2009 à 12:11
jmf0
Messages postés1566Date d'inscriptionmardi 26 décembre 2000StatutMembreDernière intervention 5 avril 2013
-
18 juil. 2009 à 15:37
bjour
toute mes excuses pour la forme ,je suis nouveau ds le forum .
en effet je suis en stage de fin d'étude sur les magasin automatisé et je dois développer
un programme en VB qui pilote un lecteur de billet avec rendu monaie ..
je vous remercie d'avance
je vous le code sources( qui ma foi est un peu longue)
en effet il arrive à 10% que le lecteur se comporte comme il n voyait pas le billet et après lecture des traces
en "trame envoyé xxxxxxxxxxxxx " et alors que"trame reçu 0"
du coup le client se voit un peu " arnaqué " pas de produit commandé , pas de rendu de billet inséré .
le lecteur doit passer par 5 étapes ( d'après le doc du constructeur)
1- IDLING
2- ACCEPTING
3 -ESCROWED
4- STRACKING
5- STRACKED
vraiment je suis bloqué
bessoin d'aide
'************************************************************************************************
'*************************************** LECTEUR SC83 ******************************************
'************************************************************************************************
Private WithEvents MSCSC83 As MSComm
Private intPort As Integer
Private intVitesse As Integer
Private strParite As String
Private intTaille As Integer
Private intBitStop As Integer
Private lngScrutation As Long
Private statusLectBilletOk As Boolean
Private blnEnvoi As Boolean
Private strAEnvoyer() As String
Private n20 As Integer ' utilisé pour traiter l'ACK renvoyé par le lecteur de billet
Private nNbPassage2 As Integer
Private strBilletsAcceptes As String
Private intBilletAccepte As Integer
Private BILLET_ENCOURS As Integer
Private ETAT_LECTEUR_BILLET_ENCOURS As Integer
Private WithEvents tmrSC83 As clsTimer
'Remontée d'évéments
Public Event Billet(intBillet As Integer)
Public Event Etat(intEtat As Integer)
Public Event Divers(intEtat As Integer)
Public Event EtatLecteurBillet(intEtat As Integer)
'Trames
Public bLecteurFull As Boolean ' Si le lecteur est plein, permet de n'afficher aucun biller à l'acran
Public intACK As Integer ' ACK à envoyer au lecteur de billet
Public bLecteurOFF As Boolean
Public bFin As Boolean
'Accepter les billets
Private Const TRAME_ACCEPTE As String = "&H02;&H08;&H10;;&H18;&H00;&H03;"
'Stocker le billet dans le cashflow
Private Const TRAME_STOCKAGE As String = "&H02;&H08;&H10;;&H20;&H00;&H03;"
' Accepte le billet de 500€
Private Const TRAME_ACCEPTE_40 As String = "&H02;&H08;&H10;&H40;&H18;&H00;&H03;"
' Accepte les billets autorisés par l'appli et les empile
Private Const TRAME_ACCEPTESTOCKAGE As String = "&H02;&H08;&H10;;&H28;&H00;&H03;"
' Accepte le billet de 500€ et l'empile
Private Const TRAME_ACCEPTESTOCKAGE_40 As String = "&H02;&H08;&H10;&H40;&H28;&H00;&H03;"
'Rejeter le billet
Private Const TRAME_REJET As String = "&H02;&H08;&H10;&H7F;&H58;&H00;&H03;"
'Arrêter la demande de billets
Private Const TRAME_ARRET As String = "&H02;&H08;&H10;&H00;&H00;&H00;&H03;"
'Valeurs hexadécimales
Private Const HEXA As String = "&H"
Private Const STX As String = &H2
Private Const ETX As String = &H3
Private Const ENQ As String = &H5
Private Const CR As String = &HD
Private Const NO_BILLET As String = "0000"
' Initialisation de la classe
Private Sub Class_Initialize()
On Error GoTo lblErreur
'Initilisation du lecteur
n20 1 ' 21
nNbPassage2 = 0
bLecteurFull = False
bFin = False
intACK = (n20 + 1) Mod 2
Set MSCSC83 = New MSComm
Set tmrSC83 = New clsTimer
ETAT_LECTEUR_BILLET_ENCOURS = -1
BILLET_ENCOURS = -1
strBilletsAcceptes = NO_BILLET
Exit Sub
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:Class_Initialize)"
Err.Clear
Resume Next
End Sub
'Port ###################################################
Public Property Let Port(Valeur As Integer)
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:DemandeInsertion)"
Err.Clear
Resume Next
End Sub
'Indique que l'on doit finir le polling
Public Sub Arret()
On Error GoTo lblErreur
DemandeInsertion500 ' Uniquement les billets de 500e autorisés afin qu'aucun billet
' ne soit inséré pendant la séquence d'arrêt du lecteur
bFin = True
Exit Sub
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:Arret)"
Err.Clear
Resume Next
End Sub
'Arrêt du lecteur de billet
Public Sub StopLecteurBillet()
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:DemandeStockage)"
Err.Clear
Resume Next
End Sub
'Calcul du CheckSum
Private Function GetCheckSum(strMessage() As String) As String
Dim strRetourne As String
Dim strTempo As String
Dim Ind As Integer
On Error GoTo lblErreur
strRetourne = strMessage(1)
For Ind = 2 To CInt(strMessage(1)) - 3
strTempo = strRetourne Xor strMessage(Ind)
strRetourne = strTempo
Next Ind
GetCheckSum = HEXA & Hex(strRetourne)
Exit Function
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:GetCheckSum)"
Err.Clear
Resume Next
End Function
Public Function GetLecteur() As Boolean
On Error GoTo lblErreur
GetLecteur = bLecteurOFF
Exit Function
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:GetLecteur)"
Err.Clear
Resume Next
End Function
Public Sub SetLecteur(bLecteur As Boolean)
On Error GoTo lblErreur
bLecteurOFF = bLecteur
Exit Sub
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:SetLecteur)"
Err.Clear
Resume Next
End Sub
Private Sub tmrSC83_Action()
Dim Ind As Integer
Dim Jnd As Integer
Dim strTempo() As String
Dim intTempoEtat As Integer
Dim intTempoBillet As Integer
Dim intTempoDivers As Integer
Dim blnNouvelEtat As Boolean
Dim bTrameFormat As Boolean
Dim blnDef As Boolean
'Dim i As Integer
'Dim strTrame As String
On Error GoTo lblErreur
DoEvents
blnNouvelEtat = False
blnDef = False
'strTrame = ""
If (blnEnvoi) Then
If (UBound(strAEnvoyer) > 0) Then
' Si un message est prêt à être envoyé
' On positionne le bon ACK
strAEnvoyer(2) = HEXA & "1" & CStr(intACK)
' On calcule le checksum de fin!
strAEnvoyer(UBound(strAEnvoyer)) = GetCheckSum(strAEnvoyer)
'i = 0
' Affichage de la trame envoyée du lecteur
'Do While (i <= UBound(strAEnvoyer))
' strTrame = strTrame & " " & strAEnvoyer(i)
' i = i + 1
'Loop
'RecupTrace "Trame envoyée = " & strTrame
'strTrame = ""
' ENVOI ====> de la trame au lecteur de billet
' strEnvoyer contient la trame à envoyer au lecteur
' strTempo contient la trame émise en retour par le lecteur
strTempo = Emettre(strAEnvoyer)
' Affichage de la trame reçue du lecteur
'i = 0
'Do While (i <= UBound(strTempo))
' strTrame = strTrame & " " & strTempo(i)
' i = i + 1
'Loop
'RecupTrace "Trame reçue = " & strTrame
' On teste la valeur ACK renvoyée par le lecteur
' Appli Lecteur
' 10 =>
' <= 20
' 11 =>
' <= 21
' 10 =>
' ...
' Sinon il faut renvoyer la même trame
' Si trame reçue <> "0"
bTrameFormat = True
If (UBound(strTempo) >= 2) Then
' Si le ACK renvoyé par le lecteur = 0
If (Int(strTempo(2) And (2 ^ 0)) = 0) Then
n20 0 ' ACK 20
Else
n20 1 ' ACK 21
End If
intACK = (n20 + 1) Mod 2
Else
bTrameFormat = False
End If
' Test la trame reçue qu'elle soit au bon format
If (UBound(strTempo) > 0) Then
' Format trame retour
' 0x02 Length ACK "Data Field" 0x03 Checksum
' Test STX
If (Int(strTempo(0)) <> 2) Then
bTrameFormat = False
End If
' Test la longueur
'If CLng(strTempo(1)) <> (UBound(strTempo) + 1) Then
'bTrameFormat = False
'End If
' Test ACK
' si <> 0x20 et 0x21
If (Int(strTempo(2)) <> 32) And (Int(strTempo(2)) <> 33) Then
bTrameFormat = False
End If
' EXT
If (UBound(strTempo) > 8) Then
If (Int(strTempo(9)) <> 3) Then
bTrameFormat = False
End If
End If
End If
If Not bTrameFormat Then
' Le format de la trame émise par le lecteur est invalide, on ne traite pas cette trame!
Exit Sub
End If
' Certaines trames envoyées par le lecteur ne sont pas complètes cad différentes de:
' 0x02 Length ACK "Data Field" 0x03 Checksum
' Dans ce cas il faut quand même faire un traitement au cas où cette trame incomplète
' soit primordiale pour la suite d'une séquence
If (UBound(strTempo) >= 4) Then
intTempoEtat = ETAT_LECTEUR_BILLET_ENCOURS
'Test si le lecteur de billet est en défaut
' Test si le lecteur est encombré <=> Byte 1 / Bit 2 = 1
If (Int(CInt(strTempo(4)) And (2 ^ 2)) > 0) Then
bLecteurFull = True
blnDef = True
If (intTempoEtat <> 4) Then
ETAT_LECTEUR_BILLET_ENCOURS = 4
RaiseEvent Etat(4)
End If
Else
If Not blnDef Then
bLecteurFull = False
End If
End If
' Test si le lecteur est plein <=> Byte 1 / Bit 3 = 1
If (Int(CInt(strTempo(4)) And (2 ^ 3)) > 0) Then
bLecteurFull = True
blnDef = True
If (intTempoEtat <> 8) Then
ETAT_LECTEUR_BILLET_ENCOURS = 8
RaiseEvent Etat(8)
End If
Else
If Not blnDef Then
bLecteurFull = False
End If
End If
' Test si le LRC est en place (tiroir à billet) <=> Byte 1 / Bit 4 = 0
If (Int(CInt(strTempo(4)) And (2 ^ 4)) = 0) Then
bLecteurFull = True
blnDef = True
If (intTempoEtat <> 16) Then
ETAT_LECTEUR_BILLET_ENCOURS = 16
RaiseEvent Etat(16)
End If
Else
If Not blnDef Then
bLecteurFull = False
End If
End If
End If
If (UBound(strTempo) >= 3) Then
' Si il n'y a pas de défaut au niveau du lecteur alors on regarde le Byte 0
If Not (blnDef) Then
Ind = 6
Do While Ind >= 0
'For Ind = 0 To 6
' Etat de retour du lecteur
' Bit Description "1" indication
'--------------------------------------------------------
' 0 En attente d'un billet Pas de billet
' 1 Accepte un billet Vu un billet passé
' 2 Escrowed Billet maintenant escrow
' 3 Empilage En cours d'empilement
' 4 Empilé Le billet est empilé
' 5 Retour En cours de retour
' 6 Retourné Le billet est retourné
' 7 Non utilisé
If (Int(strTempo(3) And (2 ^ Ind)) > 0) Then
If (intTempoEtat <> Ind) Then
ETAT_LECTEUR_BILLET_ENCOURS = Ind
blnNouvelEtat = True
Select Case ETAT_LECTEUR_BILLET_ENCOURS
Case 0
RecupTrace "Etat du lecteur : IDLING"
Case 1
RecupTrace "Etat du lecteur : ACCEPTING"
Case 2
RecupTrace "Etat du lecteur : ESCROWED"
Case 3
RecupTrace "Etat du lecteur : STACKING"
Case 4
RecupTrace "Etat du lecteur : STACKED"
Case 5
RecupTrace "Etat du lecteur : RETURNING"
Case 6
RecupTrace "Etat du lecteur : RETURNED"
End Select
Exit Do
Else
If Ind 4 Then '> si Byte 0 = 0x11 alors ne pas continuer la boucle, si je veux!!!
Exit Do
End If
End If
End If
Ind = Ind - 1
Loop
'Next Ind
Else
Pause 100
StopLecteurBillet
SetLecteur (True)
bFin = False
End If
' Le lecteur a changé d'état
If ((blnNouvelEtat) Or (bFin And (ETAT_LECTEUR_BILLET_ENCOURS = 0))) Then
intTempoBillet = BILLET_ENCOURS
Select Case ETAT_LECTEUR_BILLET_ENCOURS
Case 0
' IDLING"
If bFin Then
RecupTrace "IDLING + FIN"
DemandeArretInsertion
Pause 100
StopLecteurBillet
SetLecteur (True)
End If
Case 1
' ACCEPTING"
Case 2
' ESCROWED"
DemandeStockage
Pause 300
If bFin Then
DemandeInsertion500
Else
DemandeInsertion
End If
Case 3
' STACKING"
Case 4
' STACKED"
If (UBound(strTempo) < 6) Then
intTempoEtat = 1
End If
' On teste le billet inséré et on avertit l'application
Select Case (CInt(strTempo(5)) And 56)
' Byte 2 - Bit 3-4-5
' Valeur Bit 5 Bit 4 Bit 3
' 5€ 0 0 1 = And 8
' 10€ 0 1 0 = And 16
' 20€ 0 1 1 = And 24
' 50€ 1 0 0 = And 32
' 100€ 1 0 1 = And 40
' 200€ 1 1 0 = And 48
' 500€ 1 1 1 = And 56
Case 8
'Type 1 <=> 5€
If (intTempoBillet <> 0) Then
BILLET_ENCOURS = 0
RaiseEvent Billet(0)
RecupTrace "Billet inséré = 5€"
End If
Case 16
'Type 2 <=> 10€
If (intTempoBillet <> 1) Then
BILLET_ENCOURS = 1
RaiseEvent Billet(1)
RecupTrace "Billet inséré = 10€"
End If
Case 24
'Type 3 <=> 20€
If (intTempoBillet <> 2) Then
BILLET_ENCOURS = 2
RaiseEvent Billet(2)
RecupTrace "Billet inséré = 20€"
End If
Case 32
'Type 4 <=> 50€
If (intTempoBillet <> 3) Then
BILLET_ENCOURS = 3
RaiseEvent Billet(3)
RecupTrace "Billet inséré = 50€"
End If
Case 40
'Type 5 <=> 100€
If (intTempoBillet <> 4) Then
BILLET_ENCOURS = 4
RaiseEvent Billet(4)
RecupTrace "Billet inséré = 100€"
End If
Case 48
'Type 6 <=> 200€
If (intTempoBillet <> 5) Then
BILLET_ENCOURS = 5
RaiseEvent Billet(5)
RecupTrace "Billet inséré = 200€"
End If
Case 56
'Type 7 <=> 500€
If (intTempoBillet <> 6) Then
BILLET_ENCOURS = 6
'RaiseEvent Billet(6)
RecupTrace "Billet inséré = 500€"
End If
End Select
Case 5
' RETURNING"
Case 6
' RETURNED"
End Select
End If
End If
End If
End If
Exit Sub
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:tmrSC83_Action)"
Err.Clear
Resume Next
End Sub
'Envoi d'une trame au Lecteur
Private Function Emettre(strMessage() As String) As String()
Dim strRetourne() As String
Dim strTempo As String
Dim strBuffer As String
Dim strAux As String
Dim Ind As Integer
Dim tmrEnveloppe
On Error GoTo lblErreur
For Ind = 0 To CInt(strMessage(1)) - 1
strTempo = strTempo & Chr(Int(strMessage(Ind)))
Next Ind
tmrEnveloppe = Timer
If (blnEnvoi) Then
MSCSC83.Output = strTempo
Do While (True)
strBuffer = MSCSC83.Input
' Trame reçue
' 0x02 Length ACK DataField 0x03 Checksum
If ((Timer - tmrEnveloppe) > (tmrSC83.Intervalle / 2)) Then
Exit Do
End If
If (strBuffer <> "") Then
If (Int(Asc(Mid(strBuffer, 1, 1))) = 2) Then
'ReDim strRetourne(0 To Int(Asc(Mid(strBuffer, 2, 1))))
ReDim strRetourne(0 To (Len(strBuffer) - 1))
For Ind = 1 To Len(strBuffer)
strAux = Hex(Asc(Mid(strBuffer, Ind, 1)))
strRetourne(Ind - 1) = HEXA & strAux & " "
Next Ind
Else
' La trame reçue est mal formatée
' STX (0x02) non trouvé
ReDim strRetourne(0 To 0)
strRetourne(0) = 0
End If
Exit Do
End If
DoEvents
Loop
End If
Emettre = strRetourne
Exit Function
lblErreur:
RecupErreur Err.Number, Err.Description & " (clsSC83:Emettre)"
Err.Clear
Resume Next
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 15 juil. 2009 à 13:44
Salut
Et tu crois qu'on va analyser 15 pages de code sur un projet qui traite d'un matériel qu'on n'a pas devant nous ?
Non, soit plus précis sur ce que tu cherches à faire.
Sors du contexte et dis nous quelle structure de programme tu bloques.
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_bakalasup
Messages postés10Date d'inscriptionlundi 10 décembre 2007StatutMembreDernière intervention16 septembre 2009 16 juil. 2009 à 15:18
Slt Jack
merci pour ta réponse et aussi pour la remarque que j juge raisonnable.
en effet , je souhaite avoir un algo simple et clair m permettant de dialoguer avec le lecteur de billet, sachant que le billet doit passer en 5 etapes ( d'après le doc du constructeur)
1- IDLING
2- ACCEPTING
3 -ESCROWED
4- STRACKING
5- STRACKED
et aussi afficher la valeur du billet ds chaque étape.
ensuite rembourser le client en cas de défaut ( commande non livré, billet coincé,...)
j n sais pas si j'ai été un peu précis
jmf0
Messages postés1566Date d'inscriptionmardi 26 décembre 2000StatutMembreDernière intervention 5 avril 20138 18 juil. 2009 à 15:37
Bonjour,
Les réponses à tes questions dépendent de ton matériel (ton lecteur de billet), normalement accompagné d'une documentation de la (des) librairies qu'il utilise !
Seule la partie "rendu de la monnaie" pourra éventuellement, une fois les premières étapes passées, relever de l'utilisation du code VB6 approprié.