Page 1 of 1

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

Posted: Tue Mar 10, 2020 8:07 pm
by Loren
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

 
 ......
 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.

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

Posted: Tue Mar 10, 2020 9:20 pm
by gdeteran
Lorenzo, alguna vez este código me sirvió para lo que tu quieres.

Code: Select all

 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
 

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

Posted: Tue Mar 10, 2020 10:34 pm
by leandro
Este código nos funciona perfectamente, también fue recuperado de este foro

Code: Select all


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

 

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

Posted: Wed Mar 11, 2020 1:09 pm
by Loren
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.