Fórum Delphi não sabe fazer conta? #284468

13/06/2005

0

Estou desenvolvendo um aplicativo para Km de arrancada, e tenho alguns sensores no trecho, porém ao fazer as contas para cálculo de velocidade, onde emprego milisegundos, e o delphi fornece números absurdos, vamos as contas
Tenho 2 sensores distantes a 0.5m, pego a diferença de tempo gasta para efetuar o trecho(calculando este pequeno trecho como aceleração zero) para calcular a velocidade, então tenho
Velocidade = (distanciaentresensores /(temponosensor2-temponosensor1)) * 3.6
isto forneceria a velocidade em km/h, porém quando faço a conta na calculadora ele me fornece a velocidade correta, mas quando mando o delphi calcular obtenho um número maluco.
ex: velocidade = (0.5 / 0,010) * 3.6 ->considerando a distância entre sensores de 0.5m e o tempo de 100 milésimos de segundo o que a calculadora me fornece 180km/h, porém com as mesmas contas o delphi me fornece 15552000 km/h.
Alguém sabe explicar o porquê disto?


Edilcimar

Edilcimar

Responder

Posts

13/06/2005

Massuda

ex: velocidade = (0.5 / 0,010) * 3.6 ->considerando a distância entre sensores de 0.5m e o tempo de 100 milésimos de segundo o que a calculadora me fornece 180km/h, porém com as mesmas contas o delphi me fornece 15552000 km/h.
100 milésimos de segundo não seriam 0.1 segundo? Nesse caso a velocidade seria 18 km/h.

Com relação ao cálculo feito pelo Delphi, teria como postar o código que você está usando (incluindo os tipos das variáveis)?


Responder

Gostei + 0

13/06/2005

Edilcimar

desculpa, erro de digitação, na realidade são 10 milésimos mesmo


Responder

Gostei + 0

13/06/2005

Marco Salles

A leitura dos sensores que não estaõ compativeis e não especificamente erro de conta ...

é claro que se colocar no delphi os valores corretos ele ira fazer a conta correta.. Porque não iria faze-lo... :?: :?: :?:

se os dois sensores não estiverem bem sincronizados , qualquer leitura errada é um desastre :cry: :cry: :cry:

Porque que voce não tarabalha com a função GetTickCount , se não me engano retorna valores ate em milisegundos

//Api do windows --->> Permite a sincronização .. Ao fim do processo podemos
//medir qual o tempo gasto na operação
  t := GetTickCount;



Responder

Gostei + 0

13/06/2005

Edilcimar

a parte que está sendo desenvolvida ainda é da cronometragem manual, ou seja a pessoa entra com o tempo encontrado para o programa calcular, na segunda fase é que será feita a automação pois a pessoa ainda está procurando alguém para desenvolver a interface para o computador segue o código para que vc possa ver
Try
Tempo2 := EncodeTime(0,StrToInt(Copy(MaskEdit9.Text,1,2)),StrToInt(Copy(MaskEdit9.Text,4,2)),StrToInt(Copy(MaskEdit9.Text,7,3)));
Except
ShowMessage(´ESTE NÃO É UM TEMPO VÁLIDO´+#13+10+
´PREENCHA TODO O CAMPO, COM´+13+10+
´ZEROS À ESQUERDA SE NECESSÁRIO´+13+10+
´NO FORMATO ESCRITO EM VERMELHO´);
MaskEdit9.SetFocus;
End;
If TempoMeio > 0 then
Begin
VelocidadeMeio := (Sensor1 / (Tempo2 - TempoMeio)) * 3.6;
MaskEdit7.Text := FloatToStrF(VelocidadeMeio, ffFixed,5,2);
End;
este princípio é utilizado em todos maskedit onde são entrados os tempos


Responder

Gostei + 0

13/06/2005

Marco Salles

pessoa entra com o tempo encontrado para o programa calcular


e qual são os valores que a pessoa esta entrando para o tempo2 e o tempoMeio e velocidademeio
e como esta a msacara do maskedits

e como voce definiu o tipo dessas variáveis

so para fazer um teste aqui


Responder

Gostei + 0

13/06/2005

Massuda

...Tempo2 := EncodeTime(...
O valor retornado por EncodeTime [b:a55e88689e]não[/b:a55e88689e] está em segundos ou milissegundos, esse valor está em dias.

Para um valor de 10 ms, EncodeTime retorna algo como 1,5x10e-7.

Para obter o tempo em segundos, multiplique o resultado de EncodeTime por 24*60*60.


Responder

Gostei + 0

13/06/2005

Marco Salles

O valor retornado por EncodeTime não está em segundos ou milissegundos, esse valor está em dias.


o valor retornado por EncodeTime é um TTime.. Porque voce disse quu que esta em dias , se le não passa de 1

so quando

var
 Valor:TTime; 
begin
Valor:=encodeTime(23,59,59,59);
showmessage(FloatToStr(valor));end; //ou
showmessage(timeToStr(valor));end;
//ou

Ele se aproxima de 1....


Responder

Gostei + 0

13/06/2005

Edilcimar

É realmente como é um TTime deveria retornar hora, uma vez que eu mando hora, minuto, segundo e milisegundo, porém o massuda está certo, ele retorna em dias, após raciocinar sobre dias e refazer as contas ele funcionou correto


Responder

Gostei + 0

13/06/2005

Marco Salles

ele retorna em dias,


pode ate ter dado certo... mas que retorna em dias.. HA , isto eu to duvidando.. :cry: :cry: :cry: :cry:

[b:9c93b1a633]Com eu disse anteriromente , o valor não passa de um...[/b:9c93b1a633]

tanto que não retorna em dias , que se testar o codigo abaixo:

var
 Tempo:TTime;
begin
 Tempo:=EncodeTime(23,59,59,59);
 showmessage(FloatToStr(tempo));
 showmessage(TimeToStr(tempo));
 showmessage(DateTimeToStr(tempo));
end;


:arrow: sera a velha e conhecida data 30/12/1899...

eu acho , que o problema estava na sua conta , onde voce teria que fazer a conta levando em conta so o milesegundo , voce levava em conta a Hora toda....


Responder

Gostei + 0

13/06/2005

Edilcimar

Marcos eu concordo contigo, mas o que acontece é que apesar de eu ter utilizado encodetime e não incodedatetime o delphi está dando o resultado em dias e não em hh:mm:ss:zzz, coloque um maskedit com máscara com este formato e teste.


Responder

Gostei + 0

13/06/2005

Marco Salles

Eu quero testar.. Foi isso mesmo que lhe pedi anteriormente e voce não forneceu :cry: :cry: :cry:

Código: pessoa entra com o tempo encontrado para o programa calcular e qual são os valores que a pessoa esta entrando para o tempo2 e o tempoMeio e velocidademeio e como esta a msacara do maskedits e como voce definiu o tipo dessas variáveis so para fazer um teste aqui



Responder

Gostei + 0

13/06/2005

Edilcimar

mas o código já está logo ali em cima, é só testar, a única coisa que tem que fazer é colocar 2 maskedit com máscara hh:mm:ss:zzz, sendo que o segundo terá um valor um pouquinho maior que o primeiro, os dados que estou utilizando são distancia entre as tomadas de tempo 0.50m e uma diferença de tempo de 0.010s


Responder

Gostei + 0

13/06/2005

Massuda

[quote:614acece57=´Marco Salles´]o valor retornado por EncodeTime é um TTime.. Porque voce disse quu que esta em dias....[/quote:614acece57]Segundo a Ajuda do Delphi, [url=http://www.delphibasics.co.uk/RTL.asp?Name=EncodeTime]EncodeTime[/url] retorna um TDateTime.

A interpretação do TDateTime depende do que está medindo... se for uma data, é o total de dias decorridos desde 30/12/1899 12:00:00.

Se você quiser encarar de outra forma, pode pensar que o valor retornado por EncodeTime é a hora expressa como sendo uma fração de um dia.


Responder

Gostei + 0

13/06/2005

Edilcimar

massuda, se eu tenho uma fração do dia então a diferença entre duas frações do dia continua a chegando aos milisengundos, o que deveria fazer com que a minha conta desse certo, mas no entanto não dá, só dá com a transformação que vc falou!


Responder

Gostei + 0

13/06/2005

Massuda

se eu tenho uma fração do dia então a diferença entre duas frações do dia continua a chegando aos milisengundos, o que deveria fazer com que a minha conta desse certo, mas no entanto não dá...
Não... a diferença continuará dando fração de dia. Se você tem 0.5 dia (12h) e subtrair 0.25 dia (6h) dá 0.25 dia (6h) e não 0.25 ms.

...só dá com a transformação que vc falou!
A conversão que eu falei converte de fração de dia para segundos. Note que 24*60*60 é o total de segundos em um dia.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar