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

Post Reply
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

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

Post 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.
Last edited by Loren on Mon Mar 16, 2020 7:38 pm, edited 3 times in total.
User avatar
gdeteran
Posts: 110
Joined: Fri Oct 14, 2005 7:10 pm
Location: Puerto Montt - CHILE

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

Post 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
 
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

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

Post 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

 
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

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

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