Page 1 of 1
Ayuda para leer peso de una bascula
Posted: Fri Jul 05, 2013 12:20 am
by EBM
Compañeros, necesito poder leer el puerto COM3 de una báscula Marca Torrey y no logro hacerlo funcionar, el codigo que estoy usando es el siguiente:
FUNCTION TestBascula()
LOCAL nComm, nError, i, cDato, nContador := 0, cPaso := "", cDcb := ""
nComm := OpenComm("COM3:9600,N,8,1",2048,512)
cDato := Space(80)
If !BuildCommDcb( "COM3:9600,e,8,1", @cDcb )
nError := GetCommError( nComm )
MsgInfo( "Error de bascula: " + Str( nError ) )
else
Do While nContador < 10
For i := 1 to 3000
Next i
ReadComm( nComm,@cDato )
cPaso += cDato
nContador ++
If Len( AllTrim( cPaso ) ) > 0
MsgInfo( cPaso,"Bascula" )
EndIf
EndDo
EndIf
CloseComm( nComm )
MsgInfo( cPaso, "Bytes = " + Str( Len( cPaso ) ) )
Return .F.
No me marca ningun error en la linea de nError := GetCommError( nComm ) pero tampoco me lee nada del puerto, alguna ayudita o ejemplo funcionando, me urge un poquito hacerlo funcionar, ya probe con los ejemplos de FW y nada, tambien busque aqui en el foro y tampoco me funcionan los ejemplos. El puerto COM es un puerto a través de un USB, desde otra aplicacion que ya tiene el cliente si lee la bascula, asi que tengo descartado que sea algun problema con la bascula o con el puerto.
Gracias
FWH 1209 Harbour 3.2.0 rev 17516
LCP Eduardo Borondón Muñiz
Re: Ayuda para leer peso de una bascula
Posted: Fri Jul 05, 2013 4:00 am
by cmsoft
Hola Eduardo:
No se que protocolo de comunicación tendrá la báscula, pero yo comunicaba con una registradora fiscal por medio del puerto serie, y la misma tenía un protocolo, donde tenías que ponerla en aviso que la ibas a leer, mediante códigos de estado.
Yo lo hacía de la siguiente manera:
Code: Select all
Function Comunica()
Local mport := 1 // Puerto COM
Local PortId, cBloque
PortId := abrirport(mport)
cbloque = leer_bloque(PortId,31)
CloseComm(PortId)
RETURN cBloque
STATIC FUNCTION abrirport(n)
LOCAL IdPort, cDcb, nError
IdPort := OpenComm("COM"+STR(n,1),1024,256)
IF IdPort <= 0
nError = GetCommError( IdPort)
MsgInfo( "Error al abrir: " + Str( nError ) )
ELSE
MsgRun("Puerto abierto como " + STR(IdPort))
ENDIF
IF ! BuildCommDcb("COM"+STR(n,1)+":9600,n,8,1" , @cDcb)
nError = GetCommError( IdPort)
MsgInfo( "Error al Configurar: " + Str( nError ) )
RETURN 0
ELSE
MsgRun("Puerto Configurado")
ENDIF
IF ! SetCommState( IdPort, cDcb )
nError = GetCommError( IdPort)
MsgInfo( "Error al setear: " + Str( nError ) )
RETURN 0
ELSE
MsgRun("Puerto Seteado")
ENDIF
RETURN IdPort
STATIC FUNCTION leer_bloque(port,n)
LOCAL bloque:= SPACE(n),bcc1,nBytes,i:=1
DO WHILE .t.
nBytes := ReadComm( port,@bloque)
i++
IF EMPTY(bloque)
MsgWait("Esperando ENQ","Espere",3)
mandar_enq(port)
LOOP
ENDIF
IF i > 20 .or. bloque <> SPACE(n)
EXIT
ENDIF
ENDDO
RETURN bloque
STATIC FUNCTION mandar_enq(port)
LOCAL mcont,retorno,nBytes
retorno = .t.
FOR mcont := 1 TO 10
IF ( nBytes := WriteComm( port, CHR(5))) <= 0
MsgAlert("Mando mal ENQ")
retorno := .f.
ELSE
retorno := .t.
EXIT
ENDIF
MsgWait("Enviando datos...","Aguarde",1)
NEXT
RETURN retorno
Enq es un código (CHR(5)), que le indica a la registrador que la PC está a la espera. Como ese hay más códigos (EoT, Ack, etc) que son de ida y vuelta para decir o que se está a la espera o que va a enviarse información al port, pero eso depende del protocolo del equipo al que se quiera comunicar.
Espero que al menos esto te tire una pista por donde empezar
Re: Ayuda para leer peso de una bascula
Posted: Fri Jul 05, 2013 3:09 pm
by EBM
Gracias por responder, voy a probar con lo que me dices y a buscar si la bascula tiene algun codigo de estado como me comentas.
Saludos !!!
LCP Eduardo Borondón Muñiz
Re: Ayuda para leer peso de una bascula
Posted: Mon Jul 08, 2013 5:40 pm
by EBM
Muchas gracias por tu ayuda, efectivamente la bascula torrey requiere de un codigo chr(80) "P" para funcionar y enviar el peso, gracias a tu ejemplo pude ponerla a funcionar y ahora todo esta funcionando al 100%.
Mil gracias
LCP Eduardo Borondón Muñiz
Re: Ayuda para leer peso de una bascula
Posted: Mon Jul 08, 2013 5:59 pm
by cmsoft
Eduardo:
Me alegro mucho haberte sido de ayuda!! Y más que tu proyecto ya funcione al 100%!
Felicitaciones!
Re: Ayuda para leer peso de una bascula
Posted: Fri Jul 12, 2013 4:45 pm
by devtuxtla
Hola Eduardo.
Tengo el mismo problema pero con una bascula MAGELLAN 8100
Podrias darme un norte como resolviste el problema con tu bascula ?
Gracias
Saludos
Re: Ayuda para leer peso de una bascula
Posted: Sat Jul 13, 2013 7:45 pm
by gabo
Hola
Este es el codigo completo para leer una bascula Torrey, Todo el codigo fue obtenido del foro.. Espero y les sea de utilidad.
Saludos
Code: Select all
/*-----------------------------------------------------------------------------------------------*/
METHOD LeerBascula() CLASS TTpvPasadores
/*-----------------------------------------------------------------------------------------------*/
LOCAL oKilos, cKilos, oFontBtns, oBrush
LOCAL oDlg, oFontKilos, lTermina, oBtnOk, oBtnCancel, lGrabar, nElemento, nComm
lTermina:= .F.
lGrabar:= .F.
cKILOS:= "0.00"
DEFINE BRUSH oBrush FILENAME "bitmaps\BRUSH4.BMP"
DEFINE FONT oFontKilos NAME "Arial" SIZE 0, 96
DEFINE FONT oFontBtns NAME "Arial" SIZE 0, -18
DEFINE DIALOG oDlg FROM 140, 360 TO 500, 800 TITLE "LECTURA DE BASCULA" PIXEL BRUSH oBrush
@ 40,20 GET oKILOS VAR cKILOS Right OF oDlg SIZE 180, 60 PIXEL FONT oFontKilos;
COLOR CLR_WHITE, CLR_BLACK
@ 120, 30 BUTTONBMP oBtnOk PROMPT "&Registrar" SIZE 70, 30 ;
DEFAULT OF oDlg PIXEL
@ 120, 110 BUTTON oBtnCancel PROMPT "&Cancelar" SIZE 70, 30 ;
ACTION (lTermina:= .T., lGrabar:= .F., oDlg:End() ) ;
CANCEL OF oDlg PIXEL
oBtnOk:bAction:= { || ::GrabarPeso( cKILOS ), lTermina:= .T., lGrabar:= .T., oDlg:End() }
oBtnOk:oFont:= oFontBtns
oBtnCancel:oFont:= oFontBtns
oKilos:bKeyDown = { | nKey | SendStr( nComm, "P" ) }
oDlg:bCommNotify = { | nComm, nStatus | ReceiveStr( nComm, nStatus ) }
ACTIVATE DIALOG oDlg ;
ON INIT ( nComm := CheckPortSerial( oDlg, oKilos ),IF( nComm < 0, oDlg:End(), ) );
VALID ( oFontKilos:End(), oFontBtns:END(), oBrush:END(), lTermina )
IF lGrabar
CloseComm( nComm )
RETURN .T.
ENDIF
RETURN .F.
/*-----------------------------------------------------------------------------------------------*/
STATIC FUNCTION CheckPortSerial( oDlg, oGet)
/*-----------------------------------------------------------------------------------------------*/
LOCAL nCom, cDcb
BEGIN SEQUENCE
nCom = OPENCOMM( "COM1", 16384, 16384 )
IF nCom < 0
MSGSTOP( "ERROR! DE APERTURA DEL PUERTO SERIAL COM1" )
BREAK
ENDIF
BUILDCOMMDCB( "COM1:9600,N,8,1", @cDcb )
IF !SETCOMMSTATE( nCom, cDcb )
MSGSTOP( "ERROR! DE CONFIGURACION DEL PUERTO SERIAL COM1" )
BREAK
ENDIF
oDlg:bCommNotify = { | nCom | Connect( nCom, oGet ) }
IF !ENABLECOMMNOTIFICATION( nCom, oDlg:hWnd, 1, -1 )
MSGSTOP( "ERROR! DE NOTIFICACIONES DEL PUERTO SERIAL COM1" )
BREAK
ENDIF
RECOVER
nCom = -1
END SEQUENCE
RETURN nCom
/*-----------------------------------------------------------------------------------------------*/
STATIC FUNCTION CONNECT( nCom, oGet )
/*-----------------------------------------------------------------------------------------------*/
LOCAL cStr, nLen, n, nAsc
STATIC cNumeros
ENABLECOMMNOTIFICATION( nCom, 0, 1, -1 )
cStr = RECEIVESTR( nCom )
cStr = STRTRAN( cStr, CHR( 13 ), "" )
cStr = STRTRAN( cStr, CHR( 10 ), CRLF )
oGet:cText( Transform( cStr, "999.999" ) )
oGet:Refresh()
RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
STATIC FUNCTION SENDSTR( nCom, cString )
/*-----------------------------------------------------------------------------------------------*/
LOCAL nBytes:= 0, nError, ix
nBytes := WriteComm( nCom, cString )
for ix = 1 to 1000000 // El valor de LaEspera seria de acuerdo al dispositivo
next ix // Puse 1,000,000 Asi pudo Funcionar
if nBytes < 0
MsgStop( "Error de Envio!!: " + Str( GetCommError( nCom ) ) )
endif
if FlushComm( nCom, 0 ) != 0
nError = GetCommError( nCom )
MsgInfo( "FlushComm Error: " + Str( nError ) )
endif
RETURN NIL //nBytes = LEN( cString )
/*-----------------------------------------------------------------------------------------------*/
STATIC FUNCTION RECEIVESTR( nCom )
/*-----------------------------------------------------------------------------------------------*/
LOCAL cBuf := SPACE( 1000 )
RETURN LEFT( cBuf, READCOMM( nCom, @cBuf ) )
/* --------------------------------------------------------------------------------------------- */
METHOD GrabarPeso( cKilos ) CLASS TTpvPasadores
/*-----------------------------------------------------------------------------------------------*/
LOCAL nKilos:= Val( cKilos ), lAppend
DBSelectArea( "BUFFET" ); OrdSetFocus("CLAVE")
IF DBSeek( DToS( ::dFechaVenta ) + ::cPASADOR + ::cPRODU )
IF buffet->PESO_ENTRA > 0 .AND. buffet->PESO_SALE = 0
IF RecordLock( "BUFFET" )
buffet->PESO_SALE := nKilos
buffet->PESO_FINAL:= buffet->PESO_ENTRA - nKilos
buffet->( DBUnlock() )
ENDIF
ELSE
lAppend:= .F.
DO WHILE DToS(buffet->FECHA) + buffet->PASADOR + buffet->INSUMO == DToS( ::dFechaVenta ) + ::cPASADOR + ::cPRODU
IF buffet->PESO_ENTRA > 0 .AND. buffet->PESO_SALE > 0
lAppend:= .T.
ELSE
IF buffet->PESO_ENTRA > 0 .AND. buffet->PESO_SALE = 0
IF RecordLock( "BUFFET" )
buffet->PESO_SALE := nKilos
buffet->PESO_FINAL:= buffet->PESO_ENTRA - nKilos
buffet->( DBUnlock() )
lAppend:= .F.
ENDIF
ENDIF
ENDIF
DBSkip()
ENDDO
IF lAppend
IF AddRecord( "BUFFET" )
buffet->FECHA := ::dFechaVenta
buffet->HORA := Time()
buffet->PASADOR := ::cPASADOR
buffet->NOMBRE := ::oSayNOM:cCaption
buffet->INSUMO := ::cPRODU
buffet->PESO_ENTRA:= nKilos
buffet->PESO_SALE := 0
buffet->PESO_FINAL:= 0
buffet->( DBUnlock() )
ENDIF
ENDIF
ENDIF
ELSE
IF AddRecord( "BUFFET" )
buffet->FECHA := ::dFechaVenta
buffet->HORA := Time()
buffet->PASADOR := ::cPASADOR
buffet->NOMBRE := ::oSayNOM:cCaption
buffet->INSUMO := ::cPRODU
buffet->PESO_ENTRA:= nKilos
buffet->PESO_SALE := 0
buffet->PESO_FINAL:= 0
buffet->( DBUnlock() )
ENDIF
ENDIF
RETURN NIL
Re: Ayuda para leer peso de una bascula
Posted: Sun Jul 14, 2013 3:28 pm
by EBM
Hola devtuxtla
Te paso el codigo que utilice para hacer funcionar una bascula torrey, solo debes enviarle el codigo chr(80) para que la bascula te regrese el peso, espero te sirva:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNCTION LeeBascula()
LOCAL nComm, cBloque
nComm := AbrePuertoCom( "3" )
cBloque := LeePuertoCom( nComm,31 )
CloseComm( nComm )
//MsgInfo( "Lectura bascula: |" + cBloque + "|",Str( Len( cBloque ) ) )
Return Val( SubStr( cBloque,1,7 ) )
/////////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION AbrePuertoCom( cPuerto )
LOCAL nComm, cDcb, nError
nComm := OpenComm( "COM" + cPuerto + ":9600,N,8,1",2048,512)
If nComm <= 0
nError := GetCommError( nComm )
MsgInfo( "Error al abrir bascula: " + Str( nError ) )
EndIf
If ! BuildCommDcb( "COM" + cPuerto + ":9600,n,8,1" , @cDcb )
nError := GetCommError( nComm )
MsgInfo( "Error al Configurar bascula: " + Str( nError ) )
Return 0
EndIf
If ! SetCommState( nComm, cDcb )
nError := GetCommError( nComm )
MsgInfo( "Error al setear bascula: " + Str( nError ) )
Return 0
EndIf
Return nComm
////////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION LeePuertoCom( nComm,n )
LOCAL cBloque := Space( n ), bcc1, nBytes, i :=1, nWBytes, c
Do While .t.
nBytes := ReadComm( nComm, @cBloque )
i++
If Empty( cBloque )
MsgWait( "Leyendo báscula...","Espere",0.1 )
If ( nWBytes := WriteComm( nComm, Chr( 80 ) ) ) <= 0 // <------ aqui le envias el codigo para que te devuelva el peso
MsgStop( "Error en la báscula al enviar datos","Error" )
Return " "
EndIf
EndIf
If i > 20 .or. cBloque <> Space( n )
Exit
EndIf
EndDo
Return cBloque
Saludos !!
LCP Eduardo Borondón Muñiz
Re: Ayuda para leer peso de una bascula
Posted: Mon Aug 05, 2013 8:40 pm
by lggavinho
Dears People,
I need some help to read a industrial machina using USB. It needs first a command (like CHR(5)) but is a frase and, after this command, I must to read data from machine. The port is a RS485, but I'm using a USB conversor. How can I to address the USB port? What do I do?
thank you in advanced.
Luciano
Re: Ayuda para leer peso de una bascula
Posted: Sun Feb 04, 2018 6:06 am
by Busmatic_wpb
Friend lggavinho.
You managed to do something with the USB 485 converter, I'm just like you. You managed to read the port, I have not managed to send data .. I would appreciate if you share any idea that helped you.
I would apreciate it a lot .
Thx.