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.