Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1 2
Bonjour,
Pour piloter l'ouverture et la fermeture d'un tiroir caisse, je cherche à envoyer une info sur le port 4b8 de la machine ... C'est un peu du chinois pour moi.
Je sais ouvrir un port com et communiquer avec, mais là, je ne crois pas pouvoir procéder de même ...
Quelqu'un s'y connait en communication avec les ports (type 80, 4900 et autres ??? et surtout 4b8 ???)
Il existe une astuce pour piloter le tiroir caisse depuis l'imprimante point de vente associée, mais à chaque fois que je veux ouvrir le tiroir, l'imprimante sort du papier pour rien ... et ça ne me convient pas.
Alors j'utilise le port dédié sur le terminal point de vente, et là, c'est le grand vide intersidéral au niveau de mes connaissances.
Merci d'avance aux bonnes âmes de ce forum !
Dernière modification par Ryo (29-08-2007 14:17:17)
Hors ligne
salut, tu es sûr de ton port 4b8 ?
N'y a-t-il pas confusion entre les ports physiques (com1,...) et les ports TCP/IP (80, 4900...) ?
Par ailleurs, pourrais-tu donner des précisions sur l'envt. technique ? (applications existantes communiquant avec le tiroir caisse... )
Hors ligne
En ce qui concerne le n° de port, c'est : 4b8h.
Pour le type de port, et bien en fait, je ne sais pas trop. Je pencherais plus pour un port TCP/IP.
Mais même si techniquement ça a une importance capitale, ça ne change rien pour mon problème : je ne sais pas non plus comment envoyer une valeur sur un port TCP / IP avec PB.
Je bosse aussi avec Windev, et il me semble que c'est un peu plus facile : on utilise des sockets, on connecte et on balance les données. Mais je refuse de migrer cette grosse appli sous Windev : trop gros et je perdrais tous les avantages des DW : ça n'existe pas encore en Windev, même s'ils font des efforts et des essais.
Pour l'instant, la machine est un TPV équipé d'une multitude de ports de communication (6 ports COM, un port dédié tiroir caisse, une alim imprimante TPV intégrée), d'USB, d'un afficheur client, d'un lecteur de carte CF et d'un écran tactile. Tout tourne sous XP Pro et ça roule plutôt correctement.
Le pilotage du tiroir caisse est possible par l'imprimante (il faut alors brancher le tiroir sur le port dédié de l'imprimante) et balancer un code dans un PrintJob. ça je sais faire, mais ça sort un bout de rouleau papier à chaque fois ... Donc je cherche à utiliser le port dédié sur le TPV directement.
Pour l'instant, le fournisseur livre une appli qui sait ouvrir le tiroir et le fermer (en fait, le loquet d'ouverture reste ouvert, pour le ramener en position d'origine, il faut utiliser une autre valeur). Cette appli doit utiliser une DLL ou je ne sais quoi, mais je n'arrive pas à connaitre la fonction appelée ... Peut-être devrais-je utiliser un outil pour explorer les DLL (ça existe ?).
Le fournisseur explique aussi qu'il suffit d'utiliser le port 4b8h (et non 4b8) ...
"Le cash draw peut être connecté sur l'imprimante ou bien sur l'Odyssé.
Le cash draw est géré par le pilote (commande d'ouverture incluse)
ou bien par une commande en ESC/POS exemple: esc p 0 100 100 ou 27 112 0 100 100 (interface serie ou parallele)
ou bien directement sur l'Odyssé, adresse 4B8h "
Bon, en fait je suis un peu perdu.
Vous savez tout ...
Hors ligne
utilises cela pour voir les fonctions exsitantes de ta dll...
http://pbadonf.fr/forum/viewtopic.php?id=106
Hors ligne
Sinon, j'ai trouvé un bout de script VB ... j'essaie de transcrire tout ça et je vous tiens au courant !
Pour info, les scripts VB ressemblent à ça :
La déclaration Vb (pour les fonctions de la DLL WinIO.dll) est du type :
Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte)
Ensuite, on doit utiliser des subroutines du style :
Private Sub Command1_Click() Dim Result As Boolean Result = SetPortVal(&H4B8, &H1, 1) If (Result = False) Then MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "B82 CashDrawer" Unload Me End If Call CheckCDStatus End Sub Private Sub Command2_Click() Dim Result As Boolean Result = SetPortVal(&H4B8, &H0, 1) If (Result = False) Then MsgBox "Whoops ! There is a problem with SetPortByte.", vbOKOnly + vbCritical, "B82 CashDrawer" Unload Me End If Call CheckCDStatus End Sub Private Sub Command3_Click() Call CheckCDStatus End Sub Private Sub Form_Load() If InitializeWinIo = False Then MsgBox "Whoops ! There is a problem with InitializeWinIo.", vbOKOnly + vbCritical, "VBDumpPort32" Unload Me Else Call CheckCDStatus End If End Sub Private Sub CheckCDStatus() Dim Result As Boolean Dim PortVal As Long Result = GetPortVal(&H4B8, PortVal, 1) If (Result = False) Then MsgBox "Whoops ! There is a problem with GetPortByte.", vbOKOnly + vbCritical, "VBDumpPort32" Unload Me Else If PortVal And &H10 Then Text1.Text = "Cash Drawer is closed" Else Text1.Text = "Cash Drawer is opened or not exist" End If 'TxtPortByte = Hex$(PortVal And &HFF) End If End Sub
Hors ligne
Ryo a écrit:
En ce qui concerne le n° de port, c'est : 4b8h.
Pour le type de port, et bien en fait, je ne sais pas trop. Je pencherais plus pour un port TCP/IP.
Mais même si techniquement ça a une importance capitale, ça ne change rien pour mon problème : je ne sais pas non plus comment envoyer une valeur sur un port TCP / IP avec PB.
Je bosse aussi avec Windev, et il me semble que c'est un peu plus facile : on utilise des sockets, on connecte et on balance les données. Mais je refuse de migrer cette grosse appli sous Windev : trop gros et je perdrais tous les avantages des DW : ça n'existe pas encore en Windev, même s'ils font des efforts et des essais.
Pour l'instant, la machine est un TPV équipé d'une multitude de ports de communication (6 ports COM, un port dédié tiroir caisse, une alim imprimante TPV intégrée), d'USB, d'un afficheur client, d'un lecteur de carte CF et d'un écran tactile. Tout tourne sous XP Pro et ça roule plutôt correctement.
Le pilotage du tiroir caisse est possible par l'imprimante (il faut alors brancher le tiroir sur le port dédié de l'imprimante) et balancer un code dans un PrintJob. ça je sais faire, mais ça sort un bout de rouleau papier à chaque fois ... Donc je cherche à utiliser le port dédié sur le TPV directement.
Pour l'instant, le fournisseur livre une appli qui sait ouvrir le tiroir et le fermer (en fait, le loquet d'ouverture reste ouvert, pour le ramener en position d'origine, il faut utiliser une autre valeur). Cette appli doit utiliser une DLL ou je ne sais quoi, mais je n'arrive pas à connaitre la fonction appelée ... Peut-être devrais-je utiliser un outil pour explorer les DLL (ça existe ?).
Le fournisseur explique aussi qu'il suffit d'utiliser le port 4b8h (et non 4b8) ...
"Le cash draw peut être connecté sur l'imprimante ou bien sur l'Odyssé.
Le cash draw est géré par le pilote (commande d'ouverture incluse)
ou bien par une commande en ESC/POS exemple: esc p 0 100 100 ou 27 112 0 100 100 (interface serie ou parallele)
ou bien directement sur l'Odyssé, adresse 4B8h "
Bon, en fait je suis un peu perdu.
Vous savez tout ...
Pour moi ton port 4b8h étant en hexa, il serait peut-être interessant d'essayer de communiquer sur le port socket 1208 et donc de bien vérifier qu'il n'est pas bloqué par un firewall quelconque...
Hors ligne
Merci pour toutes ces informations.
La communication avec un port socket, c'est dans la doc de PB ? Je jette un oeil !
Hors ligne
Ryo a écrit:
Merci pour toutes ces informations.
La communication avec un port socket, c'est dans la doc de PB ? Je jette un oeil !
Malheureusement non, tu ne pourras pas communiquer sur ce socket avec autre chose que les méthodes ORB servant à parler avec un serveur applicatif type EAS pour ne pas le nommer. Il faut donc passer par les API de Window pour y arriver...
Hors ligne
Ok, je vais donc faire un essai avec ce script vb. Avec un peu de bol, ça va coller tout seul, et cette nuit, le tiroir caisse fonctionnera comme il faut.
Merci !!
Hors ligne
Petit question hors sujet : je suis tout neuf sur ce forum et je me vois attribuer des pépites ... c'est quoi les pépites et ça sert à quoi ? J'ai beau fouiller sur le forum je ne trouve pas d'explication ... Une lumière cher Pick Ouic ?
Hors ligne
http://msdn2.microsoft.com/fr-fr/library/034sezwy(VS.80).aspx
Si ça peut t'aider...
Hors ligne
Merci. J'essaierai les socket si les appels aux DLL ne donnent rien.
Plus de news demain.
Encore merci Chrnico de N2I
Hors ligne
Rien a faire, quand j'appelle la fonction SetPortval, j'ai une "Bad Runtime Reference"
Pourtoant, je déclare la fonction normalement, et je l'appelle par :
lb_result = SetPortVal(1208, 1, 1)
Peut-être est-ce la déclaration du "BYTE" que j'ai mal converti ... ?
Hors ligne
Non, même pas, les types conviennent ...
Hors ligne
Trouvé !
J'utilise une autre DLL et hop, ça marche.
Reste à insérer un délai entre l'ouverture et la fermeture, histoire de laisser le temps au tiroir de s'ouvrir physiquement.
Merci !
Hors ligne
Ryo a écrit:
Petit question hors sujet : je suis tout neuf sur ce forum et je me vois attribuer des pépites ... c'est quoi les pépites et ça sert à quoi ? J'ai beau fouiller sur le forum je ne trouve pas d'explication ... Une lumière cher Pick Ouic ?
A chaque post de message tu reçois 3 pépites.
Généralment il est également de bon ton de donner quelques pépites à ceux qui t'aident (menu donation).
Ainsi, le nombre de pépites permet de savoir si un membre est actif ou non sur le forum.
De plus il sert à jouer à la loterie (menu loterie), histoire d'avoir plein de pépites. Bon là j'avoue qu'il n'y a pas grand intérêt. Tu peux également placer tes pépites en banques pour obtenir des intérêts (menu loterie)... Voilà, en gros c'est plus pour le fun
Hors ligne
C'est du capitalisme de pépites
Encore un truc de chef d'entreprise !!! (n'est-ce pas Chrnico ?)
En tout cas merci de votre aide.
Hors ligne
Bon, en gros, la solution est toute simple, il y a une DLL qui contient une oaire de fonctions pour communiquer directement sur le port concerné. Il suffit d'envoyer la commande d'ouverture, puis après quelques dixièmes de secondes, la commande de fermeture, pour laisser le temps au ressort du tiroir d'éjecter ce dernier. Sinon, le tiroir n'a même pas le temps de sortir.
C'est un peu la galère de régler ce genre de délai ... sous d'autres langages, on a tout un armada de solutions pour faire patienter le programme un certain temps, mais PB, c'est un peu l aplaie pour ça.
Il y a du mieux de ce côté dans PB 10.5 ou 11 ? J'ai le 10.5 mais je n'ai pas encore migré cette grosse appli.
Hors ligne
merci de tes nouvelles, ryo saeba
Hors ligne
Ryo a écrit:
... sous d'autres langages, on a tout un armada de solutions pour faire patienter le programme un certain temps, mais PB, c'est un peu l aplaie pour ça.
Il y a du mieux de ce côté dans PB 10.5 ou 11 ? J'ai le 10.5 mais je n'ai pas encore migré cette grosse appli.
Il y a la commande SLEEP(nbre de seconde)
Hors ligne
ça marche moyen quand on veut juste des centièmes ou dixièmes de secondes, mais c'est vrai qu'il y a ça.
Hors ligne
"merci de tes nouvelles, ryo saeba "
J'ai tous les mangas de la série en poches à la maison ... Manque juste le marteau de 100 T et un gros flingue ...
On s'égare, c'est hors sujet, désolé !
Hors ligne
Bon, mauvaise nouvelle :
La migration de mon application en PB 10.5 fait planter mon application au niveau de l'afficheur client ... je suppose que la gestion des ports COm a subi une petite transformation dans les DLL de PB ...
Quelqu'un aurit-il une info pour m'éviter de me creuser la cervelle une seconde fois ?
Merci.
Hors ligne
salut, tu peux nous montrer des exemples de declarations d'appels ?
est ce que cela utilise aussi des blobs ?
Hors ligne
Ryo a écrit:
ça marche moyen quand on veut juste des centièmes ou dixièmes de secondes, mais c'est vrai qu'il y a ça.
pour ça tu peux utiliser une API (en millisecondes) :
SUBROUTINE Sleep(ulong milli) LIBRARY "Kernel32.dll"
à renommer pour ne pas entrer en conflit avec la fonction sleep de PB
Hors ligne
Pages: 1 2