TODOPIC
Lenguajes de programación para PC => Delphi => Mensaje iniciado por: Rseliman en 27 de Octubre de 2018, 11:03:04
-
Hola a todos , estoy programando en Lazarus , que es casi o mismo que delphi , por eso pregunto aca , el tema es el siguiente
Quiero leer un evento externo ..pulsos para ser mas exacto ...de un caudalimetro , el tema es que lo intento leer por medio de un timer cada 1 milisegundos , y deberia cada vuelta del caudalimetro leer 4 pulsos , pero me pasa que leo solo la mitad , es evidente que hay algun proceso que me ocupa tiempo y pierdo pulsos
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin
Caudal := Main.GPIO.PinValue[PinCaudal1];
if Caudal = TPinValue.Low then CauState :=0 else CauState :=1;
if (CauState <> CauLastState) then
begin
if Caudal = TPinValue.High then // Si cambia el estado incremento Pulsos
begin
inc(Pulsos) ; // if the current state is HIGH then the button went from off to on:
Mililitro:= round(Pulsos/calibrado);
LabMili.Caption:= 'Ml ' + FloatToStr(Mililitro) ;
A esto mismo lo hago en el form de calibrado y me anda perfecto , he intentado de todo y no me doy cuenta de donde esta el problema
Por favor si alguien me puede dar una mano le estaria muy agradecido
Saludos
-
Faltan un par de cosas ahi en el codigo..
Falta la asignacion de CauLastState, faltan los end de los if.
Ademas de eso, si es que lo tenes, entonces no veo otro problema, podrias tratar de accionar una salida y verlo con algun osciloscopio para saber si es que se esta ejecutando como vos queres.
Tambien podrias ver la señal del caudalimetro para ver que los señales respondan al tiempo que vos le estas dando.
-
Hola KiLLERJC como estas ...antes que nada muchas gracias ...si si no puse el codigo completo ...el tema es el siguiente , ya mire la salida del caudalimetro con un osciloscopio ...y los pulsos son perfectos , tengo un form de calibracion que es casi igual a este , y en este form los pulsos se leen completos , por eso no entiendo la diferencia en realidad son 5 forms , en el form 3 decido si es calibracion o consumo de mililitros , si elijo calibracion los pulsos los cuenta perfecto con un timer de 1 milisegundo , en cambio si elijo el form4 que es el de consumo , me pierdo la mitad de los pullsos o sea me lee 2 de 4 tambien con un timer de 1 milisegundo ...y no me doy cuenta de donde pierdo tiempo
Muchas gracias
-
Por eso comentaba si ademas podes cambiar el estado de una salida cada ves que entra al form que cuenta los pulsos, para asi determinar cada cuanto es que entra, a leer los pulsos,
así determinas si es problema de tiempos entre procesos, algo hay que ir eliminando de la lista, si ves que lee demasiado lento algo debe haber distinto que seguramente no estemos teniendo en cuenta.
-
Por eso comentaba si ademas podes cambiar el estado de una salida cada ves que entra al form que cuenta los pulsos, para asi determinar cada cuanto es que entra, a leer los pulsos,
así determinas si es problema de tiempos entre procesos, algo hay que ir eliminando de la lista, si ves que lee demasiado lento algo debe haber distinto que seguramente no estemos teniendo en cuenta.
Perdoname no te entiendo ...
yo entro al form de calibracion , habilito el timer , y hago esto
procedure TForm5.TimerCaudalCalibraTimer(Sender: TObject);
begin
CaudalCali := Main.GPIO.PinValue[PinCaudal1];
if CaudalCali = TPinValue.Low then CauStateCali :=0 else CauStateCali :=1;
if (CauStateCali <> CauLastStateCali) then
begin
if CaudalCali = TPinValue.High then // Si cambia el estado incremento Caupuscounter
begin
inc(PulsosCali) ; // if the current state is HIGH then the button went from off to on:
EditCalibra.Text:= 'Pulsos ' + IntToStr(PulsosCali) ;
end;
end
else
SystemCore.Delay(30); // rebote caudalimetro
// save the current state as the last state, for next time through the loop
CauLastStateCali := CauStateCali;
end;
Ahi me cuenta perfectamente los pulsos , los 4 de cada vuelta del caudalimetro
El tema es que en el form que me muestra el caudal consumido , si hago un copy paste de esta subrutina , me cuenta la mitad , y no hay muchas diferencias entre forms , estoy mirando variables , lectura de la base de datos , pero no lo veo al problema , es evidente que es un proceso , pero no te entiendo lo que me propones ...
Gracias y disculpa
-
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin
// Aca todo de los pulsos
//Activo una salida Main.GPIO.PinValue[Salida] := Main.GPIO.PinValue[Salida] ^ 1;
end;
O... la otra forma es usar unicamente el Form5, y preguntar alli si es Calibrar o Consumo, para hacer una cosa u otra. (Si el problema es que hay 2 codigos usando el mismo Timer)
-
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin
// Aca todo de los pulsos
//Activo una salida Main.GPIO.PinValue[Salida] := Main.GPIO.PinValue[Salida] ^ 1;
end;
O... la otra forma es usar unicamente el Form5, y preguntar alli si es Calibrar o Consumo, para hacer una cosa u otra. (Si el problema es que hay 2 codigos usando el mismo Timer)
Ahora si entendi , no entendia a que te referias con salida ...voy a probar ...la otra pregunta , en delphi no existe una manera de obtener interrupciones como en los microcontroladores ??
Saludos y mil gracias
-
procedure TForm4.TimerCaudal1Timer(Sender: TObject);
begin
// Aca todo de los pulsos
//Activo una salida Main.GPIO.PinValue[Salida] := Main.GPIO.PinValue[Salida] ^ 1;
end;
O... la otra forma es usar unicamente el Form5, y preguntar alli si es Calibrar o Consumo, para hacer una cosa u otra. (Si el problema es que hay 2 codigos usando el mismo Timer)
Ahora si entendi , no entendia a que te referias con salida ...voy a probar ...la otra pregunta , en delphi no existe una manera de obtener interrupciones como en los microcontroladores ??
Saludos y mil gracias
Estimado KILLERJC , queria comentarte del problema , acabo de resolverlo , parece mentira pero es asi , un tlabel , demora mas en ejecutarse que un tedit , solo cambie la forma de mostrar el resultado y todo anduvo perfecto ...no vi exactamente los tiempos con el osciloscopio , pero es evidente que el tlabel se demora bastante para mostrar el resultado , es para tenerlo en cuenta en este tipo de programas donde los tiempos son muy exactos en el formulario numero 4 mostraba el resultado con una label y en el 5 con un edit y ahi estaba el problema
Muchas gracias por tu colaboracion ....te mando un abrazo
-
bueno me alegro que encontraste cual era el problema, no entiendo el porque deberia tardar tanto para actualizar un label, tal ves al considerarlo fijo al label este en otro lado y "actualizarlo" sea algo "complejo"...
Y lo correcto sea un "edit" deshabilitado.
-
En Delphi es "mano de santo" llamar a "Application.ProcessMessages;" cada vez que actualizas un Tlabel,Tedit o TMemo. No sé si en Lazarus sirve igualmente.
Saludos,
Miquel