Lectura Bascula

Lectura Bascula

Postby leandro » Mon May 27, 2019 3:40 pm

Buenas tardes para todos, me surge la necesidad en este momento de leer el peso desde una báscula, la cual está conectada a un puerto COMM y con un convertidor TREND NET USB. Buscando en este maravilloso foro encontre algo de código, logrando que la báscula me entregue una respuesta, el problema es que la respuesta me la entrega en un idioma que no entiendo. :shock:

Valores que devuelve
Code: Select all  Expand view
=042630

Code: Select all  Expand view
=026525

Code: Select all  Expand view
=078905


Asumo que son paquetes de datos, pero no se como hacer la traducción de los mismos, alguien entiende este idioma? :D y me podria indicar como traducirlos.

De antemano gracias

El código que compile
Code: Select all  Expand view

#include 'Fivewin.ch'
#include 'fileio.ch'

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNCTION LeeBascula()
LOCAL nComm, cBloque

nComm := AbrePuertoCom( "1" )
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
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1482
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Lectura Bascula

Postby karinha » Mon May 27, 2019 8:06 pm

Leandro, creo sea mejor que uses la HBCOMM.LIB del xHarbour. Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7266
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Lectura Bascula

Postby joseluisysturiz » Tue May 28, 2019 1:09 am

leandro wrote:Buenas tardes para todos, me surge la necesidad en este momento de leer el peso desde una báscula, la cual está conectada a un puerto COMM y con un convertidor TREND NET USB. Buscando en este maravilloso foro encontre algo de código, logrando que la báscula me entregue una respuesta, el problema es que la respuesta me la entrega en un idioma que no entiendo. :shock:

Valores que devuelve
Code: Select all  Expand view
=042630

Code: Select all  Expand view
=026525

Code: Select all  Expand view
=078905


Asumo que son paquetes de datos, pero no se como hacer la traducción de los mismos, alguien entiende este idioma? :D y me podria indicar como traducirlos.

De antemano gracias

El código que compile
Code: Select all  Expand view

#include 'Fivewin.ch'
#include 'fileio.ch'

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNCTION LeeBascula()
LOCAL nComm, cBloque

nComm := AbrePuertoCom( "1" )
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 Leandro, tambien estoy en un proyecto de lectura de bascula, podrias compartir como hacer la lectura y que marca y modelo de bascula estas usando.? la que voy a usar, bueno, mi cliente es ua ACLAS, no tengo a la mano el modelo, saludos, gracias... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Lectura Bascula

Postby russimicro » Tue May 28, 2019 11:13 am

Buen día...

Anexo código que funciona....
Pero realmente poco la uso, dado que termine haciéndolo con java, que es mas rápida, me sirve para cualquier bascula, me sirve para conexiones de terminal server.

Code: Select all  Expand view


Function Comunica(nTieEsp)

Local XPortId, cBloque, cbloque2
LOCAL nNroPue := CAJ->nSerEn1Caj // 7
LOCAL nVelTra := CAJ->nSerEn2Caj // 9600
LOCAL cTipPar := CAJ->cSerEn3Caj // "N"
LOCAL nLonDat := CAJ->nSerEn4Caj // 8
LOCAL nBitPar := CAJ->nSerEn5Caj // 1
LOCAL nLonPic := CAJ->nSerEn6Caj  // 15
LOCAL cSarSub := CAJ->cSarSubCaj
LOCAL cOrdSar := CAJ->cSarRevCaj
LOCAL X := 0, Y := 0 , nPosGui := 0

IF !EMPTY(cSarSub)  //'18,5' o vacio
   nPosGui := ATNUM(',',cSarSub,1)
   cSarSub := ALLTRIM(cSarSub)

   IF nPosGui > 0
      X := VAL(ALLTRIM(SUBS(cSarSub,1,nPosGui-1)))
      Y := VAL(ALLTRIM(SUBS(cSarSub,nPosGui+1)))
   ENDIF
ENDIF


xPortId := abrirport(nTieEsp,nNroPue,nVelTra,cTipPar,nLonDat,nBitPar)

IF (XPortId <= 0 )
   CloseComm(XPortId)
   RETURN "0"
ENDIF

MySleep(nTieEsp)


cbloque = leer_bloque(XPortId,nLonPic,X,Y,cOrdSar,nTieEsp)


if FlushComm( XPortId, 0 ) != 0
   nError = GetCommError( XPortId )
   MsgInfo( "FlushComm Error: " + Str( nError ) )
endif


if ! CloseComm( XPortId )
    nError = GetCommError( XPortId )
    MsgInfo( "CloseComm Error: " + Str( nError ) )
endif


RETURN cBloque

//**************************************************************


STATIC FUNCTION abrirport(nTieEsp,nNroPue,nVelTra,cTipPar,nLonDat,nBitPar)

LOCAL IdPort := 0, oErr
LOCAL cDcb, nError := 0
LOCAL sarta := "COM"+STR(nNroPue,1)+":"+ALLTRIM(STR(nVelTra,5))+","+cTipPar+","+STR(nLonDat,1)+","+STR(nBitPar,1)

IdPort := OpenComm("COM"+STR(nNroPue,1), 1024,128)  //,2048,512


if FlushComm( IdPort, 0 ) != 0
   nError = GetCommError( IdPort )
   MsgInfo( "FlushComm Error: " + Str( nError ) )
endif



   IF IdPort <= 0
      nError = GetCommError( IdPort)
      MsgInfo( "Error al abrir: " + Str( nError ) )
      RETURN 0
   ELSE
      //MsgRun("Puerto abierto como " + STR(IdPort))
   ENDIF

   MySleep(nTieEsp)

   IF ! BuildCommDcb(sarta, @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,x,y,cOrdSar,nTieEsp)

LOCAL bloque:= SPACE(n),bcc1,nBytes,i:=1, NLONSAR := 0
local cNueSar := '' , cCarLei := "" ,   SW_NUMBER := 0 , sw := 0
LOCAL cSarNum := "", J:= 0  , nPosIni := 0, II := 0 , nError := 0


mandar_enq(port,64)

DO WHILE .T.  .AND. I < 20

   i++

   nBytes := ReadComm( port,@bloque)


   nError = GetCommError( port )

   IF nError > 0
      MsgInfo( "ReadComm Error: " + Str( nError ) )
   ENDIF

   MySleep(nTieEsp)


   IF ASC(alltrim(bloque)) == 6
      //MsgWait("Esperando ENQ 6","Espere",1)
      //bloque := SPACE(31)
      mandar_enq(port,17)
      LOOP
   ENDIF

   IF EMPTY(alltrim(bloque))
      //MsgWait("Esperando ENQ","Espere",1)
      mandar_enq(port,5)
      LOOP
   ENDIF

   IF i > 20 .or. LEN(alltrim(bloque)) == n   // 15
      EXIT
   ENDIF

ENDDO


bloque := ALLTRIM(bloque)



IF PARAMETRO(200)

   FOR J := 1 TO LEN(bloque)
       IF SUBS(bloque,J,1) $ "0123456789."
          IF II == 0
             nPosIni := J
             II := 9999
          ENDIF
          cSarNum += SUBS(bloque,J,1)
       ENDIF
   NEXT J

   ALERTA("SARTA LEIDA        : "+bloque + CRLF + ;
           "LONGITUD SARTA    : " + STR( LEN(ALLTRIM(bloque)),2)+ CRLF + ;
           "PESO HALLADO      : " + cSarNum+ CRLF + ;
           "POSICION DEL PESO : "+str(nPosIni+1,10) )
ENDIF


IF !EMPTY(cOrdSar) // TIPO DE BASCULA LEXUS

   IF UPPER(cOrdSar) == "S"  // orden contrario si      // OJO SE ASUME QUE SOLO VIENE UNA SARTA DE NUMEROS ??

      nLonSar := LEN(ALLTRIM(bloque))
      cNueSar := ''
      SW := 0
      SW_NUMBER := 0
      cOrdSar := "S"
      cValLei := bloque

      I := 1
      DO WHILE I <= nLonSar
          J := nLonSar

          cCarLei := SUBS(cValLei,J,1)


          IF cCarLei $ '0123456789.'
             SW_NUMBER := 1
             cNueSar += cCarLei
          ELSE  // ENCONTRO UN CARACTER NO VLIDO
             IF SW_NUMBER == 1  // YA HABIA ENCONTADO UN NUMERO
                SW := 0
                EXIT    // NO LEE MAS YA TERMINO LA SARTA DE NUMERO
             ENDIF
          ENDIF

          IF PARAMETRO(200) // para analizar lectura, en pruebas
             ALERTA("SARTA : "+cNueSar+" CON CARACTER = "+cCarLei)
          ENDIF

          --nLonSar
      ENDDO

   ELSE // ORDEN NORMAL

      nLonSar := LEN(ALLTRIM(bloque))
      cNueSar := ''
      SW := 0
      SW_NUMBER := 0
      cValLei := bloque

      FOR I := 1 TO nLonSar
          cCarLei := SUBS(cValLei,I,1)
          IF cCarLei $ '0123456789.'
             cNueSar += cCarLei
             SW_NUMBER := 1
          ELSE
             IF SW_NUMBER == 1  // YA HABIA ENCONTADO UN NUMERO
                SW := 0
                EXIT    // NO LEE MAS YA TERMINO LA SARTA DE NUMERO
             ENDIF
          ENDIF

           IF PARAMETRO(200) // para analizar lectura, en pruebas
             ALERTA("SARTA : "+cNueSar+" CON CARACTER = "+cCarLei)
          ENDIF
      NEXT I

   ENDIF

   bloque := cNueSar

ENDIF

IF X > 0

   bloque := SUBS(bloque,X,Y)

ELSE

   nPosGui := ATNUM('.',bloque,1)
   IF nPosGui > 0
      bloque := SUBS(bloque,nPosGui)
   ENDIF


ENDIF


IF PARAMETRO(200)

   ALERTA(BLOQUE)
ENDIF

RETURN bloque   //  subs(bloque,nPosIni+1,Y) // subs(bloque,X,Y)

//******************************************************************

STATIC FUNCTION mandar_enq(port,nchar)

LOCAL mcont,retorno,nBytes, IX := 0

retorno = .t.
                                    //CHR(nchar)
FOR mcont := 1 TO 10
    IF ( nBytes := WriteComm( port, CHR(nchar)  )) <= 0
       MsgAlert("Mando mal ENQ")
       retorno := .f.
    ELSE
       retorno := .t.
       EXIT
    ENDIF
    //MsgWait("Enviando datos...","Espere ...",3)
    MySleep( 10 )
NEXT

RETURN retorno

//****************************************************


 
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Lectura Bascula

Postby leandro » Tue May 28, 2019 2:48 pm

Gracias a todos por contestar...

Jose Luis, no tengo a la mano la marca ni el modelo :shock: dejame le digo al cliente que me envie los datos, lo que si es que es una báscula para pesar camiones; en el primer mensaje adjunte el código de lo que estoy compilando y las respuestas que arroja.

russimicro... gracias por el código, intente compilar el ejemplo que publicaste pero me dice que no existen algunas funciones:

ALERTA --> La reemplace por MSGINFO()
MySleep( 10 ) --> La reemplace por MSGWAIT()

Pero la función PARAMETRO no logro asumir que hace, podrías por favor compartir el código de dicha función?

De antemano muchas gracias... :D
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1482
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Lectura Bascula

Postby russimicro » Wed May 29, 2019 5:02 am

IF VER_ESTADO == "SI"
// VER ESTADO DE LA LECTURA
ENDIF
russimicro
 
Posts: 229
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Lectura Bascula

Postby leandro » Wed May 29, 2019 5:49 pm

Jose Luis Buenas tardes, adjunto la imagen de las bascula que tiene el cliente:
Has podido avanzar en algo?
Image

Gracias russimicro, hare las pruebas respectivas.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1482
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Lectura Bascula

Postby joseluisysturiz » Thu May 30, 2019 1:03 am

leandro wrote:Jose Luis Buenas tardes, adjunto la imagen de las bascula que tiene el cliente:
Has podido avanzar en algo?
Image

Gracias russimicro, hare las pruebas respectivas.


Saludos Leandro, no he podido ir donde el cliente, pero delante de tu bascula lo que tiene mi cliente es mas una balanza de pocos kilos, lo que necesito es saber como leer el valor peso asi como se hace con un lector de codigo de barra, imagino no sera tan facil como eso, he buscado un emulador de la balanza pero el fabricante no tiene, solo da algunas SDK para programadores y que estoy esperando me los haga llegar el cliente con la compra de la balanza, apenas obtenga algo comento, igual probare los codigos que han publicado, aun no se por cual puerto es la lectura de la balanza...saludos...gracias... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 13 guests