| Autor |
Beitrag |
deluxe083
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 13.01.06 22:03
Hallo
Ich bin noch anfänger und programmiere gerade an einer wichtigen arbeit herum.
Ich steure über ein programm pumpen an, um flüssigkeiten genau zu dosieren.
Das programm befindet sich in 2unterschiedlichen Units.
Wenn ich ein Button anklicke laufen mehrere pumpen an und schalten nach einer bestimmten zeit wieder ab.
Nun ist mein problem, das diese zeit immer unterschiedlich ist.
Kann mir vielleicht jemand bei diesem Problem helfen???
Hier ein Auszug aus meinem Programm:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm3.Button3Click(Sender: TObject); begin Form2.CheckBox3.Checked:=True; Form2.CheckBox5.Checked:=True; Form2.CheckBox2.Checked:=True; Timer10.Enabled:= True; Timer11.Enabled:= True; Timer12.Enabled:= True; end;
procedure TForm3.Timer10Timer(Sender: TObject); begin Form2.CheckBox3.Checked:=False; end;
procedure TForm3.Timer11Timer(Sender: TObject); begin Form2.CheckBox5.Checked:=False; end; |
Moderiert von Christian S.: Delphi-Tags hinzugefügtModeriert von Christian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 13.01.2006 um 22:04
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Fr 13.01.06 22:39
Wie ermittelst du denn die Zeit, wann die Pumpen wieder ausgemacht werden sollen? Du musst dann diese Zeit in Millisekunden der Eigenschaft 'Interval' den jeweiligen Timer zuordnen.
Greetz KOLLER
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
deluxe083 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 13.01.06 22:53
Die zeiten habe ich vorgegeben bekommen und auch jeweils richtig in den verschiedenen Timern bei INTERVAL eingegeben.
Deshalb wundert es mich ja auch, dass die zeit, die ich am ende messe nicht mit der eingegebenen übereinstimmt.
Aber Danke!!!
|
|
AceKiller73
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 13.01.06 22:55
Wie misst du die Zeit denn?
|
|
deluxe083 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 13.01.06 23:03
Über den strom der von meiner interface karte zu den Relais geht.
|
|
Marco D.
      
Beiträge: 2750
Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
|
Verfasst: Fr 13.01.06 23:07
Du sagst du bist Anfänger und redest von Relais und irgendwelchen Pumpen und Messwerden? Respekt! 
_________________ Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
|
|
Opa
      
Beiträge: 22
|
Verfasst: Sa 14.01.06 02:28
Zum einen benötigtst du NICH 3 Timer einer tut es auch! Was Du benötigt sind ein paar Variabeln mit dem du die Startzeit mit der Laufzeit vergleichst (am einfachsten ist ein TDateTime). Die Differenz ist dann die genaue Laufzeit.
Ganz genaue Zeiten, mit einen Timer in Millisekunden-Bereich ist eh nicht möglich, kommt auf den Rechner an so um 300 mms geht gerade noch.
Das deine Zeiten nicht übereinstimmen liegt nämlich schlicht daran dass ein Timer mit einer Intervall-Einstellung von 1000 mms nicht genau 1000 mms macht, sondern er wartet bis er mal dran ist. Umso mehr Timer um so ungenauer wird das dann auch noch.
Ergo nehme einen Timer und ein paar Variabeln.
Auf die schnelle mal ein Vorschlag
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| const PuppenMax = 5; type TMyTimer = record StartZeit : array[0..PuppenMax] of TDateTime; LaufZeit : array[0..PuppenMax] of TDateTime; AmPuppen : array[0..PuppenMax] of boolean; Gesamtlaufzeit :array[0..PuppenMax] of TDateTime; end;
var MyTimer : TMyTimer;
procedure Form1.Create; I : integer; begin with MyTimer do begin for I := low(StartZeit) to high(StartZeit) do begin StartZeit[I] := now; Gesamtlaufzeit := 0; end; end;
procedure Form1.Timer; begin with MyTimer do begin if AmPuppen[0] then LaufZeit[0] := now else if LaufZeit[0] <> 0 then SpeicherDatenAndInit(0); if AmPuppen[1] then LaufZeit[1] := now else StartZeit[1] := now; end;
Der Rest ist ein paar Differrenzen berechnen: procedure SpeicherDatenAndInit(Wert:integer); with MyTimer do begin Gesamtlaufzeit[Wert]:= Gesamtlaufzeit[Wert] + LaufZeit [Wert]- StartZeit[Wert]; Laufzeit[Wert]:= 0; end; |
MyTimer.AmPuppen[X] und MyTimer. StartZeit[X] über einen Schalter neu Initialisieren
Achtung: Das ist nur ein ungeprüftes Schema!!!
Moderiert von Christian S.: Delphi-Tags hinzugefügt
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 14.01.06 08:29
Vorschlag:
man nehme einen Thread (mit der Prio TimeCritical) der das steuert, und nicht über irgentwelche Timer (die wie gesagt sehr ungenau sind) sondern die systemzeit, die man konfortable mit der Unit Dateutils verrödeln kann.
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
deluxe083 
Hält's aus hier
Beiträge: 8
|
Verfasst: Sa 14.01.06 11:17
Hallo Opa!!!
Zunächst mal danke für deine Tipps!
Nur habe ich noch nie mit variablen gearbeitet.
Wie ist denn da die vorgehensweiße und was bringen mir diese?
Und das mit dem TDateTimer (oder wie von MSCH geschrieben mit TimeCritical) habe ich auch nicht ganz begriffen. Wo ich solche Timer her bekomme und wie ich sie programmiere vielleicht könntest du mir das noch mal erklären. Oder kann ich den "normalen timer" so umgestallten?
Bin eben doch noch Neuling auf dem gebiet:
Danke an alle!
|
|
Opa
      
Beiträge: 22
|
Verfasst: Sa 14.01.06 20:08
Den Rest bitte alleine machen  zu mehr habe ich keine Lußt.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
const C_PumpenMax = 3; type TMyTimer = record StartZeit : array[0..C_PumpenMax] of TDateTime; LaufZeit : array[0..C_PumpenMax] of TDateTime; AmPuppen : array[0..C_PumpenMax] of boolean; Gesamtlaufzeit : array[0..C_PumpenMax] of TDateTime; Button : array[0..C_PumpenMax] of TButton; LabelText : array[0..1,0..C_PumpenMax] of TLabel; end; TForm1 = class(TForm) TimerPumpe: TTimer; procedure FormCreate(Sender: TObject); procedure TimerPumpeTimer(Sender: TObject); private MyTimer : TMyTimer; procedure ButtonLabelInit(B:TButton;Index:integer); procedure OnButtonClick(Sender: TObject); public end;
var Form1: TForm1;
implementation {$R *.dfm} resourcestring RS_Pumpe = 'Pumpe[%d]= %s %s'; RS_Gesamt = 'Gesamtlaufzeit'; procedure TForm1.FormCreate(Sender: TObject); var I : integer; begin TimerPumpe.Interval := 500; with MyTimer do begin for I := 0 to C_PumpenMax do begin StartZeit[I] := now; Gesamtlaufzeit[I] := 0; LaufZeit [I] := 0; AmPuppen [I] := false; Button[I] := TButton.Create(self); LabelText[0,I] := TLabel.Create(self); LabelText[1,I] := TLabel.Create(self); ButtonLabelInit(Button[I],I); end; end; Height := 640; Width := 800; Position := poScreenCenter; WindowState := wsNormal; end; procedure TForm1.TimerPumpeTimer(Sender: TObject); var I : integer; begin for I := 0 to C_PumpenMax do with MyTimer do begin if AmPuppen[I] then begin LaufZeit[I] := now; Button[I].Caption := format(RS_Pumpe,[I,'On', FormatDateTime('hh:mm:ss,zzz',LaufZeit[I]-StartZeit[I])]); end; end; end;
procedure TForm1.ButtonLabelInit(B:TButton;Index:integer); procedure LabelInit(L:TLabel;Flag:boolean); begin with L do begin L.Parent := self; if Flag then begin Top:=B.Top+B.Height+10; Caption := RS_Gesamt; end else begin Top:=B.Top+B.Height+10+13+5; Caption := FormatDateTime('hh:mm:ss,zzz',0); Font.Style := [fsBold]; end; Left := B.Left; end; end; begin with B do begin Parent := self; Caption := format(RS_Pumpe,[Index,'Off', FormatDateTime('hh:mm:ss,zzz',0)]); Width := 150; Tag := Index; Top := self.Height div 2 - Height; Left := 10+Width*Tag+10*Tag; OnClick := OnButtonClick; end; with MyTimer do begin LabelInit(LabelText[0,Index],true); LabelInit(LabelText[1,Index],false); end; end; procedure TForm1.OnButtonClick(Sender: TObject); begin with TButton(Sender),MyTimer do begin AmPuppen[Tag] := not AmPuppen[Tag]; if AmPuppen[Tag] then begin StartZeit[Tag]:= now; end else begin Caption := format(RS_Pumpe,[Tag,'Off', FormatDateTime('hh:mm:ss,zzz',0)]); Gesamtlaufzeit[Tag]:=Gesamtlaufzeit[Tag]+LaufZeit[Tag]- StartZeit[Tag]; LabelText[1,Tag].Caption := FormatDateTime('hh:mm:ss,zzz',Gesamtlaufzeit[Tag]); end; end; TimerPumpeTimer(nil); end; end. |
Moderiert von raziel: Code- durch Delphi-Tags ersetzt
Moderiert von Christian S.: Code- durch Delphi-Tags ersetzt
|
|
deluxe083 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 15.01.06 15:59
Hallo Opa also danke nochmal für deine hilfe!!!!
ich werde da jetzt nochmal etwas daran herum probieren.
Irgendwie bekomme ich des schon hin (hoffe ich)!!!
|
|
Tigu
      
Beiträge: 93
XP
Delphi 7
|
Verfasst: Di 17.01.06 13:00
Hallo!
Hast du deine Timereigenschaft Intervall richtig eingestellt, so das auch alle im gleichen Maße darauf zugreifen?
Ich hoffe, dass dich dieser Denkanstoß weiter bringt
Tigu
|
|
deluxe083 
Hält's aus hier
Beiträge: 8
|
Verfasst: Di 17.01.06 15:01
Hallo Tigu
Wie mache ich denn das und was bringt mir das?
Kann ich nicht irgendwie meinen Timer mit der Systemzeit verknüpfen
um dann so die zeit sekundengenau zu steuern???
PS: Gibt es nirgends eine Übersicht was die einzelnen timer machen und wie man sie erstellt?
Gruß
|
|