Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-05-2024
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 110
Poder: 20
javicho_villa Va por buen camino
Smile Extraer peso de balanza por puerto com

Buenas tardes amigos:

Ante todo muchas gracias por leer este hilo y quisiera pedirles que me apoyen en resolver este problema que tengo y estoy dando vueltas en círculos y no logro entender muchas cosas. bueno les detallo:

Quiero extraer de una balanza por el puerto com el peso, actualmente tengo lectura de la balanza a través del Hyper Terminal, y lo lee sin problema alguno.

he probado 2 cosas, que puede encontrar en este foro:

(1) La Clase TRS232 que encontré en un hilo de este foro, lamentablemente no lo se usar y no se que parámetros tengo que poner

Código Delphi [-]
   TRS232 = class
     private
        sPuerto: string;
        hCommFile: THandle;
     public
        function LeerBuffer: string;
        procedure EscribirBuffer(lsMensaje: string);
        constructor Create(lsPuerto: string; liBanda: Cardinal; liByteSize, liParidad, liBitParada: Byte);
   end;

por ejemplo para usar esta clase pongo las siguientes lineas:

Código Delphi [-]
var MiBalanza:TRS232;
begin
  MiBalanza := TRS232.Create('COM4',9600,8,NOPARITY,1);
  self.lbDisplay.Caption := MiBalanza.LeerBuffer;

me sale un montón de errores, que he comentado en la implementación de la clase para que pueda correr pero al final cuando ya va a votar el resultado no lee esta linea:

Código Delphi [-]
function TRS232.LeerBuffer: string;
var
  sTmp: string;
  c1: integer;
  chBuffer: array[0..255] of char;
  NumberOfBytesRead: dword;
begin
  if hCommFile=INVALID_HANDLE_VALUE then
    Exit;
  if not ReadFile(hCommFile, chBuffer,
    sizeof(chBuffer), NumberOfBytesRead, nil) then
      raise Exception.Create('Imposible leer datos desde el puerto');
  for c1:= 0 to NumberOfBytesRead - 1 do
    sTmp:= sTmp+chBuffer[c1];
  result:=sTmp;
end;

sale del código y no da ningún resultado

(2) La opción que probé es el uso de un componente que descarge e instalé , por siacaso estoy usando XE8, este componente TComPort, que tiene todas las propiedades que tiene el HyperTerminal, las pongo pero no sale nada y tampoco puedo conectarme oca les paso el código:

Código Delphi [-]

  self.ComPort1.BaudRate    := br9600;
  self.ComPort1.StopBits    := sbOneStopBit;
  self.ComPort1.DataBits    := dbEight;
  self.ComPort1.Parity.Bits := prNone;

  self.ComPort1.Timeouts.ReadInterval         := 100;
  self.ComPort1.Timeouts.ReadTotalConstant    := 0;
  self.ComPort1.Timeouts.ReadTotalMultiplier  := 0;
  self.ComPort1.Timeouts.WriteTotalConstant   := 250;
  self.ComPort1.Timeouts.WriteTotalMultiplier := 1;

  //self.ComPort1.Open;    ESTAS LINEA DA ERROR
  //self.ComPort1.Connected := true;  ESTA LINEA DA ERROR

Quiero agradecerles de antemano su tiempo e interés, por ayudarme muchas gracias.

Atentamente,

Javier Villa - PERU
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
  #2  
Antiguo 10-05-2024
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 110
Poder: 20
javicho_villa Va por buen camino
Unable to open com port (Error: 5)

El error que sale es:

Unable to open com port (Error: 5)
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
  #3  
Antiguo 10-05-2024
xolo xolo is offline
Registrado
 
Registrado: may 2024
Posts: 1
Poder: 0
xolo Va por buen camino
Possible solución

Buenos días javicho,
A mi en el trabajo me toco hacer lo mismo, por medio de un puerto COM en una bascula.
Por lo que veo, o no lo has pasado, no inicias o le pones un valor al Handle.
En mi caso yo lo hago asi, es como si abrieras un archivo:

Código:
hComm := CreateFile(PChar('\\.\COM3'), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Cambiando el puerto por el tuyo, obviamente, .
Esto iria antes del IF(INVALID_HANDLE_VALUE).

El otro problema que me encontré es que leer y escribir són asincronos, es decir, el hace la escritura y no se espera, inmediatamente hace la lectura y nunca me devolvía nada, tuve que hacer un sleep(300) para poder darle tiempo a enviar algo.

También debo decirte que yo el búfer lo tengo con ANSIChar, con Char no me iba.

En el momento de de leer los datos de vuelta, no los leas todos. En mi caso solo me eran utiles los primeros 7 (000.000) el resto era basura.
Por cierto la variable sTmp(donde guardas el resultado de la comunicación en ningún momento la inicializas (el típico [varible] := ''), si no lo haces puede que te mantenga los datos que tenia anteriormente en esa dirección de memoria y lo que tu quieras te lo ponga al final de esa línea de caracteres residuales.
Con todo esto, te debería de funcionar, si no lo hace me comentas y lo miramos.
Responder Con Cita
  #4  
Antiguo 10-05-2024
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
También es necesario saber qué protocolo usa esa balanza.
Responder Con Cita
  #5  
Antiguo 14-05-2024
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 110
Poder: 20
javicho_villa Va por buen camino
Muchas gracias por las respuestas compañeros, he avanzado algo instale el componente TComPort y estuve probando y probando hasta que agarro y me devolvió el peso, aunque esta solución implica que tienes que instalar ese componente en el Delphi que uses y también no se puede usar el HyperTerminal a la vez con mi programa, solo accede una sola aplicación, esto me demoró mucho en darme cuenta (principiante jejejeje).

Pero tengo otros problemas.
1. es que se des configura los puerto COM en mi maquina, igual tuve que poner el driver anterior y ahí funcionó.

2. Solo funciona una vez que hago el pesado, para la segunda vez tengo que desconectar y volver a conectar y nuevamente ingresar al sistema para que se logre conectar nuevamente a la balanza.

Amigos si me pudieran ayudar por favor, que podría ser:

1. Les comento mi programa ejecuta una pantalla sonde en un Grid lista rollos tejidos para pesar.
2. Selecciona el rollo a pesar y sale una pantalla donde se conecta la balanza, se pone el código del tejedor y luego graba.
durante el primer rollo funciona perfecto, pero cuando quiero ingresar al segundo rollo ya no se conecta a la balanza.

pongo en un timer el siguiente código:

Código Delphi [-]
procedure TRolloDatoForm.Timer2Timer(Sender: TObject);
var Peso, Limpio:String;
    Ancho,i:integer;
begin
  Try
    self.ComPort1.Connected := false;

    self.cmbPuerto.ItemIndex  := 0;
    //self.ComPort1.Port        := self.cmbPuerto.Text;
    self.ComPort1.Port        := 'COM4';


    self.ComPort1.BaudRate    := br9600;
    self.ComPort1.StopBits    := sbOneStopBit;
    self.ComPort1.DataBits    := dbEight;
    self.ComPort1.Parity.Bits := prNone;
    self.ComPort1.Timeouts.ReadInterval         := 100;
    self.ComPort1.Timeouts.ReadTotalConstant    := 0;
    self.ComPort1.Timeouts.ReadTotalMultiplier  := 0;
    self.ComPort1.Timeouts.WriteTotalConstant   := 250;
    self.ComPort1.Timeouts.WriteTotalMultiplier := 1;
    self.ComPort1.Connected := true;
    self.ComPort1.ReadStr(Peso,15);

    Ancho  := length(Peso);
    Limpio := '';
    for I := 1 to Ancho do
      if (Peso[i]='0') or (Peso[i]='1') or (Peso[i]='2') or (Peso[i]='3') or (Peso[i]='4')
      or (Peso[i]='5') or (Peso[i]='6') or (Peso[i]='7') or (Peso[i]='8') or (Peso[i]='9')
      or (Peso[i]='.') then
          Limpio := Limpio + Peso[i];

      self.PesoEdit.Text := Limpio;

  Except
    self.Timer2.Enabled := false;
    self.PesoEdit.Text  := '0.00';
    self.Id_TrabajadorCalcEdit.TabOrder := self.Id_TrabajadorCalcEdit.TabOrder - 1;
    self.PesoEdit.TabOrder              := self.Id_TrabajadorCalcEdit.TabOrder + 1;

    //Application.MessageBox(PChar('No se puede conectar con la balanza, ingrese manualamente el peso'),
    //'Error de ingreso de información ...',Mb_ok+mb_IconExclamation);

  End;

Queridos amigos si me pudieran ayudar se los agradeceria enormemente, de antemano les agradezco por haberme respondido.

Un abrazo,

Javier Villa - PERU.
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
  #6  
Antiguo 14-05-2024
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Así a simple vista creo que no estás usando el sistema lógicamente.
La balanza siempre está funcionando, por lo que tú solamente debes leer su respuesta cuando te haga falta.
No es necesario un timer para hacer eso.
Responder Con Cita
  #7  
Antiguo 14-05-2024
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 110
Poder: 20
javicho_villa Va por buen camino
Gracias por tu pronta respuesta hermano.

Lo que pasa es que el efecto del Timer es que a medida que se acomode el peso del rollo de tela, también se refleja en la pantalla del sistema.

El problema es que esa pantalla una vez capturado el peso, graba el dato en la base de datos, cierra el formulario y sigue con otro pesaje y nuevamente vuelve a cargar esa pantalla, pero ya desde la segunda vez no logra conectarse a la balanza.

Me parece que es un atributo del TComPort, o es algo que se me esta pasando por alto.

Javier Villa - PERU
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
  #8  
Antiguo 14-05-2024
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 110
Poder: 20
javicho_villa Va por buen camino
Smile Solucion Final

Ante todo, quiero agradecer por las respuestas que me brindaron desinteresadamente, muchas gracias por eso.

era super sencilla la solución, a la hora de cerrar la pantalla o formulario, antes de liberar la memoria con FreeAndNil, Etc... se tiene que desconectar el TComPort, y parar el timer

Código Delphi [-]
     self.Timer2.Enabled     := false;
     self.ComPort1.Connected := false;

Nuevamente muchas gracias.

Saludos hermanos,

JAVIER VILLA - PERU
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
  #9  
Antiguo 14-05-2024
tsk tsk is offline
Miembro
 
Registrado: dic 2017
Posts: 56
Poder: 7
tsk Va por buen camino
Aun así, como dice Casimiro, a simple vista podrías tener errores en tu lógica.

Hace mucho, pero mucho que no uso Delphi, pero yo no metería la conexión y/o configuración del puerto serie dentro del evento del timer.

Prueba creando un botón en el que le des conectar/desconectar de la balanza. Ahí metes el código necesario para conectar y desconectar la aplicación del puerto serie.

Igual, esto no se porque lo haces

Código PHP:
self.ComPort1.Connected := false
Si observas los ejemplos del TComPort, ellos usan el ComPort.Close y ComPort.Open para abrir y cerrar el puerto. Connected sería más como una variable del estado del puerto, si está o no conectado.

Sólo deberías comprobar si el puerto está conectado, y si no está conectado tratar de conectarlo o informar que la balanza no está disponible.

Después verifica si la balanza que usas envía o no caracteres de finalización, porque lo que estas haciendo es leer 15, que me imagino son 15 bytes, pero pudiera haber más, por lo que también sería conveniente poder detectarlos para evitar errores en las lecturas posteriores.
Responder Con Cita
  #10  
Antiguo 14-05-2024
javicho_villa javicho_villa is offline
Miembro
 
Registrado: feb 2005
Ubicación: Lima - Perú
Posts: 110
Poder: 20
javicho_villa Va por buen camino
Smile

Muchas gracias por los aportes,

si voy a probar de toda maneras. Como esta balanza la usan todos los días las 24 horas, tengo que esperar un turno para que me la habiliten, pero igual voy a probar con el open y close, para ver su comportamiento, porque usaron el código que puse en los mensajes anteriores y funciona bien, pero después de 1 hora se colgó, no se a que se debió, cerre deconecte y conecte fisicamente la balanza de la computadora y nuevamente funcionó bien.

Por que uso el Timer?
Cuando uso el timer, el sistema refleja la misma pantalla que la balanza, conforme se acomoda el rollo, el peso va cambiando hasta que se queda en el peso exacto, de igual manera y en forma sincronizada se ve en el formulario, debido al Timer.

JAVIER VILLA - PERU.
__________________
Javier Villa Sánchez
jvilla@andreaproducciones.com
Responder Con Cita
  #11  
Antiguo 15-05-2024
tsk tsk is offline
Miembro
 
Registrado: dic 2017
Posts: 56
Poder: 7
tsk Va por buen camino
Si tienes esas limitaciones, lo que te podría sugerir es que captures a un archivo de texto la comunicación entre la PC y la balanza.

Después ya sea que crees un puerto virtual con algo como

https://freevirtualserialports.com/

O con un arduino cualquiera, y simplemente emulas la balanza.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Leer Scanner y Peso de Balanza Datologic Magellan 8300/ 8400 ambiorixml Varios 6 11-04-2021 11:25:33
Envío de datos a balanza puerto serie espinete Varios 8 20-04-2009 15:26:05
Leer codigo de barras y peso a travez de un puerto serie Wolfyx Conexión con bases de datos 4 04-12-2006 06:23:32
Problemas con una balanza. Gabriel2 Varios 2 07-12-2005 00:41:07
peso del installshield. kwan Varios 2 26-09-2003 13:06:32


La franja horaria es GMT +2. Ahora son las 19:57:01.


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