Autor Beitrag
deluxe083
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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:

ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 13.01.2006 um 22:04
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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



BeitragVerfasst: Fr 13.01.06 22:55 
Wie misst du die Zeit denn?
deluxe083 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 13.01.06 23:03 
Über den strom der von meiner interface karte zu den Relais geht.
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Fr 13.01.06 23:07 
Du sagst du bist Anfänger und redest von Relais und irgendwelchen Pumpen und Messwerden? Respekt! :wink:

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ausblenden volle Höhe Delphi-Quelltext
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;
    {evtl.}
    Gesamtlaufzeit :array[0..PuppenMax] of TDateTime;
    //usw.
  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 user profile iconChristian S.: Delphi-Tags hinzugefügt
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Sa 14.01.06 20:08 
Den Rest bitte alleine machen :) zu mehr habe ich keine Lußt.
ausblenden volle Höhe Delphi-Quelltext
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
    { Public-Deklarationen }
  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 user profile iconraziel: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
deluxe083 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 93

XP
Delphi 7
BeitragVerfasst: Di 17.01.06 13:00 
Hallo!
Hast du deine Timereigenschaft Intervall richtig eingestellt, so das auch alle im gleichen Maße darauf zugreifen? :gruebel:
Ich hoffe, dass dich dieser Denkanstoß weiter bringt
Tigu
deluxe083 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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ß