Conexión con balanza a través del puerto RS232 (SOLUCIONADO)

Conexión con balanza a través del puerto RS232 (SOLUCIONADO)

Postby Loren » Tue Mar 10, 2020 8:07 pm

Compañeros, buenas noches:

Necesito, por favor, de vuestra ayuda. Llevo varias horas intentando conectar con una balanza a través del puerto RS232 y pero la balanza NO me reporta ningún dato.

Mi código copiado y adaptado de otro hilo de este foro:
Code: Select all  Expand view

 ......
 nComm:=OpenComm( nPuerto, 1024, 256)
 IF nComm >= 0
  else
   msgalert('ERROR al NO encontrar el puerto '+nPuerto,'error...') ; return .f.
 endif
 If !BuildCommDcb( nPuerto+":"+alltrim(str(nbaudios))+","+nParidad+","+alltrim(str(nbitdatos))+","+alltrim(str(nbitparad)) , @cDcb )
  nError := GetCommError( nComm )
  Msgalert( "ERROR al Configurar el puerto "+nPuerto,'Error de conexión con el puerto...') ; return .f.
 endif
 if ! SetCommState( nComm, cDcb )
  nError = GetCommError( nComm )
  Msgalert( "Error al setear Puerto : " + Str( nError ),'Aviso de error...' ) ; return .f.
 endif                    && <-------- HASTA AQUÍ TODO PERFECTO !!!      
 ncomand="chr(0X44)"
 if ( nBytes := WriteComm( nComm, ncomand +Chr( 10 ) )) < 0      && <------- HE PROBADO TAMBIEN INSERTANDO CHR(13) Y CHR(13)+CHR(10).  AQUÍ ESTÁ EL PROBLEMA
   nError = GetCommError( nComm )
   Msgalert( "Error al realizar la petición a la báscula : " + Str( nError ),'Aviso de error...' )
 else
   DEFINE DIALOG oDlg TITLE "" OF oWPpal FROM 1,1 TO 12,44 STYLE nOr( WS_THICKFRAME, WS_POPUP )
    @ 2,2 SAY oText PROMPT "Capturando el peso de la báscula...    [ Salir: tecla ESC ]" OF oDlg
   ACTIVATE DIALOG oDlg NOWAIT CENTER
   Inkey(1)
 endif
 cBuffer:=Space(100)
 nBytes := ReadComm (nComm,@cBuffer)
 If FlushComm( nComm, 0 ) != 0
   nError = GetCommError( nComm )
   Msgalert("Error al vaciar el puerto de la báscula : " + Str( nError ),'Aviso de error...' )
 endif
 if ! CloseComm( nComm )
   nError = GetCommError( nComm )
   Msgalert( "Error al cerrar el puerto de la báscula : " + Str( nError ) )
 endif
 odlg:end()
? 'lectura balanza: '+cBuffer
  cKilos :=Substr(cBuffer,nPosIniEn,nPosFinEn-nPosIniEn)
  cGramos:=Substr(cBuffer,nPosIniDe,nposFinDe-nPosIniDe)
  nPesoBascula:=Val(Alltrim(cKilos)+"."+Alltrim(cGramos))  ; onPesoBascula:Refresh()
  SysRefresh()
return
 


La lectura de la balanza es siempre la misma: NADA, es decir cBuffer=space(0)
NO muestra problemas a la hora de configurar el puerto, conectar ni setear. Creo que el problema está a la hora de hacer la petición a la báscula (comando WriteComm)

La balanza es marca GRAM modelo ZFOC y según su manual instrucciones el protocolo de comunicación via RS232 es el siguiente:
1. El PC transmite 0X44
2. El PC transmite el package una vez recibida la respuesta de la balanza 0x02
3. PC transmite el comando una vez recibida la respuesta de la balanza 0x02
4. Despues de que el PC reciba los datos de la balanza 0x02 , si se precisa transmitir el comando switch a c
5. PC envia el final del package
6. PC finaliza despues de recibir la respuesta 0x02

Comenzo del package, fixed 6 bytes: 11 00 00 00 00 EF5
Final del package, fixed 6 bytes: 33 00 00 00 00 CD

Por favor, necesito ayuda...

Mil gracias!!
LORENZO.
Last edited by Loren on Mon Mar 16, 2020 7:38 pm, edited 3 times in total.
Loren
 
Posts: 479
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

Re: Conexión con balanza a través del puerto RS232

Postby gdeteran » Tue Mar 10, 2020 9:20 pm

Lorenzo, alguna vez este código me sirvió para lo que tu quieres.

Code: Select all  Expand view

 STATIC FUNCTION LeePeso(aVars)
*-----------------------------------------
/* Rutina de lectura de Balanza
// Parametros de transmision de datos a Balanza
   nComPort    := 1
   nBaudRate   := 9600
   cParity     := "N"
   nDataLen    := 8
   nStopBits   := 2
*/


   cBuffer     := SPACE(20)
   cString     := ""
   nPesoLeido  := 0


   cRetOpen := CommOpen(aVars, cComPort, cBaudRate) // Abro COM

   IF .NOT. EMPTY(cRetOpen)
      MsgInfo(cRetOpen)
      RETURN 0
   ENDIF

   IF FlushComm( nComm, 0 ) != 0
      nError = GetCommError( nComm )
      MsgInfo( "FlushComm Error: " + Str( nError ) )
   ENDIF

   nTry=0
   do while nTry<10 // can remove this nTry if not applicable
      if ( nBytes := ReadComm( nComm, @cBuffer) ) > 0
           MsgWait ("...", , .1)
         exit
      else
         nTry++
         MsgWait ("...", ,.1)
      endif
      if nTry==10
         exit
      endif
   enddo

// Extraigo 6 carateres anteriores a ultimo CHR(13) o CR o  CHR(75) Letra K

   DO CASE
      CASE nTipoBal = 1        // CAIR Pesaje y chicas Kretz
         cString  := SUBSTR( cBuffer,( RAT(CHR(13),cBuffer) - 6), 6)  // Enter
      CASE nTipoBal = 2        // CAIR Amaraillo
         cString  := SUBSTR( cBuffer,( RAT(CHR(75),cBuffer) - 6), 6)  // Letra K
      CASE nTipoBal = 3       // Trebol
         cString  := SUBSTR( cBuffer,2, 3)+"."+SUBSTR( cBuffer,5, 3)  // D003450 = 3 enteros con 3 decimales
      CASE nTipoBal = 4      //  CAIR LR-22
         cString  := SUBSTR( cBuffer,2, 4)+"."+SUBSTR( cBuffer,6, 2)  // D003450 = 4 enteros con 2 decimales
   ENDCASE

   nPesoLeido  := VAL(cString)

   IF FlushComm( nComm, 0 ) != 0
      nError = GetCommError( nComm )
      MsgInfo( "FlushComm Error: " + Str( nError ) )
   ENDIF

   IF ! CloseComm( nComm )
      nError = GetCommError( nComm )
      MsgInfo( "CloseComm Error: " + Str( nError ) )
   ENDIF

   RETURN nPesoLeido

 STATIC Function CommOpen ( aVars, cPort, cSpeed )
*----------------------------------------------------------------
   LOCAL cDcb, cRv := '', cS := 'COM' + cPort + ':' + cSpeed + ',' +  cParity + ',' +  cDataLen + ',' +  cStopBits

   nComm := OpenComm( 'COM' + cPort, 1024 , 128 )

   IF nComm >= 0                     // We have a valid port...
      IF BuildCommDcb( cS, @cDcb ) // Set Speed, etc
         IF SetCommState( nComm, cDcb )
            cRv := ''
         ELSE
            cRv := 'Falló SetCommState en COM' + cPort + ' a ' + cSpeed
         ENDIF
      ELSE
         cRv := 'Falló BuildCommDCB en COM' + cPort + ' a ' + cSpeed
      ENDIF
   ELSE
      cRv := 'Falló al buscar COM' + cPort
   ENDIF

   Return cRv
 
User avatar
gdeteran
 
Posts: 115
Joined: Fri Oct 14, 2005 7:10 pm
Location: Puerto Montt - CHILE

Re: Conexión con balanza a través del puerto RS232

Postby leandro » Tue Mar 10, 2020 10:34 pm

Este código nos funciona perfectamente, también fue recuperado de este foro

Code: Select all  Expand view


nComm := AbrePuertoCom()
Sleep(250) //1000 = 1 segundo
cBloque := LeePuertoCom( nComm,31 )
Sleep(250) //1000 = 1 segundo
CloseComm( nComm )

STATIC FUNCTION AbrePuertoCom( cPuerto )
LOCAL nComm, cDcb, nError
Local vGVelo := "9600" //siempre es la misma para nuestra bascula

//BUSCAMOS EL PRTO DISPONIBLE EN LA DBF
SELE d_comm
Dbgotop()
cPuerto := d_comm->PUERTO

nComm := OpenComm( "COM" + cPuerto + ":"+vGVelo+",N,8,1",2048,512)

If nComm <= 0
nError := GetCommError( nComm )
MsgInfo( "Error al abrir bascula: " + Str( nError ) )
EndIf

If ! BuildCommDcb( "COM" + cPuerto + ":"+vGVelo+",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: 1669
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Conexión con balanza a través del puerto RS232 (SOLUCIONADO)

Postby Loren » Wed Mar 11, 2020 1:09 pm

Gracias por contestar, compañeros.

El problema estaba en la balanza que habia que configurarla según "protocolo dollar". De esta manera, solo hay que enviar un "$" para que responda con el peso. NI en el manual de la balanza viene esa indicación... tuve que ponerme en contacto con el equipo SAT del fabricante.

WriteComm( nComm, '$' ) ) <= 0

Mil gracias, por todo!!

saludos.
LORENZO.
Loren
 
Posts: 479
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 26 guests