Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Solicitar datos a balanza (https://www.clubdelphi.com/foros/showthread.php?t=94189)

newtron 24-09-2019 18:29:59

Solicitar datos a balanza
 
Hola a tod@s.


Tengo un problema con una balanza que debe de ser una tontada pero no soy capaz de resolverlo.


Hasta ahora todas las balanzas que he conectado a mis programas llevan un protocolo (no recuerdo como se llama) pero que envían de forma continua el peso al puerto com al que están conectadas, de esta manera es fácil abrir el puerto y leer el valor.


Ahora me encuentro con una balanza que tiene el protocolo TINSA que consiste en que hay que enviarle un carácter "$" y la balanza te devuelve el peso.



He hecho un formulario de prueba en el que he incluido un componente TCommportDriver en el que, una vez configurada la velocidad, paridad, etc. hago lo siguiente:


CommportDriver1.Connect; // y conecta
CommportDriver1.SendString('$');


Intuyo que después de esto debería de pasar por el evento "OnReceiveData" pero ni se inmuta.


También he probado con:


CommportDriver1.SendString('$#13');
CommportDriver1.SendString('$#13#10');




y nada.


¿Alguien que se haya peleado antes con esto?


Gracias y un saludo

Casimiro Noteví 24-09-2019 19:09:01

Debería devolver la info en un array de bytes.
Creo que devuelve una cadena más o menos así: xx1234567xxxxx
Donde los valores del peso son de la posición 3 a 9, o sea 2 a 8 teniendo que empieza a contar desde cero.

También, dependiendo de la balanza, hay que configurarla para que devuelva en formato tinsa, porque algunas sabes que ofrecen distintos protocolos.

Te paso el código en otro lenguaje y para otro sistema operativo, por si acaso sirve de algo:
Código:

' cada tick se pide el peso
Sub tmscale_tick
    getWeight
End Sub

' pedir el peso
Sub getWeight
    asytreamms.Write( Array As Byte(Asc("$")) )    ' la balanza está configurada para recibir un $ y devolver info con el peso leido
End Sub

' devuelve la info
Private Sub balanza_Streamm_NewData( Buffer() As Byte )
    Dim cPeso As String
    Dim fPeso As Double
    '
    cPeso = byc.StringFromBytes(Buffer,"ASCII")
    '
    If Not (IsNumber(cPeso)) Then
        cPeso = funciones.LimpiarNumeroDecimal(cPeso)
        If cPeso="" Then cPeso="0"
    End If   
    '
    If (cPeso.CompareTo(cLastPeso)<>0) Then
        cPeso = byc.StringFromBytes(Buffer,"ASCII")       
        If Not (IsNumber(cPeso)) Then
            cPeso = funciones.LimpiarNumeroDecimal(cPeso)
            If cPeso="" Then cPeso="0"
        End If       
        '
        cLastPeso=cPeso
        fPeso = cPeso
        '       
        If fPeso=0 Then
            lbBalanza.Text = ""
        Else
          lbBalanza.Text = NumberFormat2(fPeso,1,3,3,False) &" g"
        End If
        '       
    End If   
End Sub

Private Sub dibal_Stream_NewData( Buffer() As Byte )
    Dim peso As Int
    '
    peso = decodePeso( Buffer )
    CallSubDelayed2( a, subResultArrived, peso )
End Sub
 
Private Sub decodePeso( buf() As Byte ) As Int
    Dim cTxt As String
    Dim peso As Int
    '
    cTxt=bc.StringFromBytes(buf,"ASCII")
    cTxt=cTxt.SubString2(2,8)
    peso=(0+cTxt)/1000
    Return peso   
End Sub


dec 24-09-2019 19:12:37

Hola newtron,

Seguramente digo una tontería, pero, ¿has probado a enviar el ASCII del $ en lugar del caracter tal cual? ¿Y has visto si acaso hubiera algún otro evento del componente que pudiera serte útil? Por probar... hasta todos...

P.S. No borro este mensaje por si sirviese de algo... pero Casimiro me adelantó acaso con la respuesta correcta. :)

newtron 24-09-2019 19:25:19

Gracias a los dos por contestar.

Bueno... la línea:

asystreamms.write(Array As Byte (Asc("$"))

me suena a mi...

CommportDriver1.SendString('$');

también he probado (como sugiere el amigo Dec):

CommportDriver1.SendByte(36); // el código ascii del signo $
o también:
CommportDriver1.SendString(#36);

pero nada, no salta nada en ninguno de los dos eventos del componente (OnReceiveData, OnReceivePacket)

Tiene que ser una tontada pero ....

Gracias y un saludo

Casimiro Noteví 24-09-2019 19:35:17

Comprobaciones previas:

¿Está encendida la balanza?
¿El cable está conectado y es bueno?
:D

egostar 25-09-2019 01:03:17

Hola.

Para esos menesteres utilizo la famosa hiperterminal de Windows. Lo que a mi me parece es que tienes un problema de configuración del puerto serial en cuanto a velocidad, bits de datos, bit de parada, paridad e incluso si es XON/ XOFF

Con dicha hiperterminal no tienes problema ya que se auto configura a lo que el puerto requiere.

Saludos

newtron 25-09-2019 09:42:16

Cita:

Empezado por Casimiro Notevi (Mensaje 533578)
Comprobaciones previas:

¿Está encendida la balanza?
¿El cable está conectado y es bueno?
:D


:mad:

Cita:

Empezado por egostar (Mensaje 533582)
Hola.

Para esos menesteres utilizo la famosa hiperterminal de Windows. Lo que a mi me parece es que tienes un problema de configuración del puerto serial en cuanto a velocidad, bits de datos, bit de parada, paridad e incluso si es XON/ XOFF

Con dicha hiperterminal no tienes problema ya que se auto configura a lo que el puerto requiere.

Saludos


La conexión es correcta porque he localizado un programa por internet que recibe datos de la balanza con distintos protocolos, lo pruebo con esta y recibe el peso correctamente. El problema es que es un ejecutable y no sé cómo leches lo hace :(


Seguro que hay que enviar la cadena para preguntar el peso de una forma especial pero no doy con ella.


Seguiremos dando cabezazos.
Gracias y un saludo

Casimiro Noteví 25-09-2019 09:53:09

Por probar:
Código Delphi [-]
buf : array [1] of byte;
buf[0] := '$'
CommportDriver1.SendString(buf);

newtron 25-09-2019 10:01:31

Cita:

Empezado por Casimiro Notevi (Mensaje 533589)
Por probar:
Código Delphi [-]buf : array [1] of byte; buf[0] := '$' CommportDriver1.SendString(buf);


Antonio.


La linea:

buf: array [1] of byte

no compila. La he cambiado por:
buf: array [0..1] of byte

y ya si que compila pero luego no puedo hacer un "Sendstring", imagino que habría que hacerlo de otra manera.


No te apures porque sé que no tienes ningún delphi a mano para probar las instrucciones. Ya me apaño.


Gracias y un saludo

Casimiro Noteví 25-09-2019 10:44:11

Creo que el problema es de configuración del puerto, prueba con el hyperterminal o algo similar, ve probando distintas velocidades, paridad, etc.

newtron 25-09-2019 11:13:54

He estado echando un vistazo a este hilo antiguo del compañero espinete y creo que los tiros van por ahí.


He hecho una prueba enviando el mismo código que él en el hilo y si que la balanza responde.


Seguiremos investigando.


Gracias y un saludo

Casimiro Noteví 25-09-2019 11:32:41

1 Archivos Adjunto(s)
Eso no es para leer el peso, es para enviarle el precio a la balanza y lo multiplique por el peso.
Te adjunto el fichero (es una 'class') que trata la balanza, en un software que tú conoces para android, a ver si te sirve.
Es para protocolo tinsa en balanzas dibal, y supongo que otras que usen el mismo protocolo.

Neftali [Germán.Estévez] 25-09-2019 12:52:56

Cita:

Empezado por newtron (Mensaje 533574)
Ahora me encuentro con una balanza que tiene el protocolo TINSA que consiste en que hay que enviarle un carácter "$" y la balanza te devuelve el peso.

Ya se que no es lo que has preguntado [newtron], y a lo mejor me dices que ya lo has mirado, pero te lo comento por si acaso.
Muchas de estas balanzas tienen los 2 protocolos o modos de funcionamiento implantados (el "continuo" y el "bajo poetición").

Normalmente como tú comentas, el protocolo activado por defecto es el continuo (envían el pero continuamente) y sólo hay que leerlo cuando interesa. Que no sea que en este caso venga activado con el otro, pero se pueda cambiar.
Sólo para que lo mires...

newtron 25-09-2019 13:14:13

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 533596)
Ya se que no es lo que has preguntado [newtron], y a lo mejor me dices que ya lo has mirado, pero te lo comento por si acaso.
Muchas de estas balanzas tienen los 2 protocolos o modos de funcionamiento implantados (el "continuo" y el "bajo poetición").

Normalmente como tú comentas, el protocolo activado por defecto es el continuo (envían el pero continuamente) y sólo hay que leerlo cuando interesa. Que no sea que en este caso venga activado con el otro, pero se pueda cambiar.
Sólo para que lo mires...


Efectivamente, según el protocolo que tengan predeterminado, envían el peso directamente o esperan a recibir el carácter de marras para enviarlo. Podría cambiar el protocolo y leer lo que va enviando pero me ha "picado" un poco el usar el protocolo TINSA y tener resueltas las dos opciones.


Gracias y un saludo

Neftali [Germán.Estévez] 25-09-2019 13:20:03

Cita:

Empezado por newtron (Mensaje 533598)
Efectivamente, según el protocolo que tengan predeterminado, envían el peso directamente o esperan a recibir el carácter de marras para enviarlo. Podría cambiar el protocolo y leer lo que va enviando pero me ha "picado" un poco el usar el protocolo TINSA y tener resueltas las dos opciones.
Gracias y un saludo


OK. ^\||/^\||/^\||/^\||/

newtron 25-09-2019 13:51:53

Bueno.


A lo tontorrón me estoy dando cuenta de que en el ejemplo del amigo espinete para enviar el precio a la balanza devuelve una cadena de caracteres entre la que se encuentra el peso. Así que la táctica podrá ser enviar un precio 0 y leer el peso que devuelve. :D


Gracias a todos y un saludo

newtron 26-09-2019 13:26:30

Hola de nuevo a tod@s.


Comentar (a quien le sirva) que al implementar el código de envío/captura de datos a la balanza me doy cuenta de que aproximadamente un 20% de las veces la balanza me devuelve datos erroneos. Después de algunas horas dando cabezazos opto por cambiar el componente que estaba usando para manejar el puerto serie del "TCommPortDriver" a otro que se llama "TCommPort" y han desaparecido los problemas. O sea, era problema del componente "TCommPortDriver".


Saludos

Casimiro Noteví 26-09-2019 15:01:49

Era demasiado raro que ni saltara el evento.
^\||/^\||/^\||/

newtron 26-09-2019 16:28:29

Cita:

Empezado por Casimiro Notevi (Mensaje 533628)
Era demasiado raro que ni saltara el evento.
^\||/^\||/^\||/


No me has entendido. El evento salta con los dos componentes al enviar un precio según el código de espinete, con el $ nidecoña.


El problema es que con un componente el 20% de las veces me devolvía cadenas erroneas y con el otro todo correcto.


Saludos

Casimiro Noteví 26-09-2019 18:22:06

Pues sigue siendo raro, aunque menos mal que asi funciona.


La franja horaria es GMT +2. Ahora son las 14:53:30.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi