unit RS232Mar_Unit1;
(*Dieses Programm liest die Temperatur über eine RS232-Schnittstelle
aus einem Temperatur-Messsystem aus.*)
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, StdCtrls, ExtCtrls, ComCtrls, Menus,
SerialNG,
peterlib;
type
TForm1 =
class(TForm)
Timer_Messung: TTimer;
Messwerte: TRichEdit;
MainMenuMessung: TMainMenu;
Start1: TMenuItem;
Ende1: TMenuItem;
Datei: TMenuItem;
Beenden1: TMenuItem;
COM_1: TSerialPortNG;
procedure Formactivate(Sender: TObject);
procedure Start1Click(Sender: TObject);
procedure SerialPortNGRxClusterEvent(Sender: TObject);
procedure Timer_MessungTimer(Sender: TObject);
procedure Messinterval1Click(Sender: TObject);
procedure Ende1Click(Sender: TObject);
procedure Beenden1Click(Sender: TObject);
private
{ Private-Deklarationen }
COMStr:
String;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
n_messstellen = 1;
var
messzeit, messzeit0: TDateTime;
Messstellen_name:
array [1 .. n_messstellen]
of string;
MesswerteArray:
array [0..n_messstellen]
of real;
Messung: Boolean;
(*--------------Start-Proceduren-----------------------------------*)
procedure TForm1.FormActivate(Sender: TObject);
begin
Messwerte.Text:= '
';
(* alles ausschalten *)
Messung := False;
end;
procedure TForm1.Start1Click(Sender: TObject);
procedure start_rs232;
begin
COM_1:= TSerialPortNG.Create(
nil);
with COM_1
do
begin
CommPort:= '
COM1';
BaudRate:= CBR_2400;
ParityType:= noparity;
DataBits:= 8;
StopBits:= 1;
Active:= true;
end;
messstellen_name[1]:= '
Temperatur';
end;
(*start_rs232 in start1click*)
begin (*Main of Start1Click*)
Messung:= True;
Messwerte.Text:= '
Startzeit = ' +
DateToStr (date) + '
' + TimeToStr(time) + '
'#13#10;
start_rs232;
messzeit0:= now;
end;
(*-----------------Messung-------------------------------------------*)
(*COM wird laufend in einen Test-String ausgelesen.*)
procedure TForm1.SerialPortNGRxClusterEvent(Sender: TObject);
begin
if TSerialPortNG(Sender).NextClusterSize >= 0
then // Data available?
begin
if TSerialPortNG (Sender).NextClusterCCError = 0
then // Error during receiveing?
COMStr:= '
9999999'
else
COMStr:= TSerialPortNG(Sender).ReadNextClusterAsString;
end;
end;
procedure TForm1.Timer_MessungTimer(Sender: TObject);
procedure messung_rs232;
var
COMStr:
String;
messwert: real;
zeit_ende: TDateTime;
Daten_OK: Boolean;
ftimeout_s: integer;
ftimeout_d: real;
begin
COMStr:= '
';
Daten_OK:= False;
ftimeout_s:= 500;
(*TimeOut in ms*)
ftimeout_d:= ftimeout_s / 1000 / 60 / 60 / 24;
(*Zeit berechnen, wann timeout erreicht wird.*)
zeit_ende:= now + ftimeout_d;
(* While (now < zeit_ende) and (not Daten_OK) do
begin
if COM_1.nextClusterSize > 0 then
COMStr:= COMStr + COM_1.ReadNextClusterAsString;
if copy (COMStr, length (COMStr), 1) = #13 then
Daten_OK:= true;
sleep (50);
end; (*while (getTime() ... *)
messwert:= COMtoReal (COMStr);
(*Extrahiert die Werte aus dem String*)
COMStr:= '
';
messwerte.text:= Messwerte.Text +
messstellen_name [1] + '
= '
+ FloatToStrF (messwert, ffFixed, 7, 2) + #13#10;
end;
(*messung_rs232 in in Timer_MessungTimer*)
begin (*Main in Timer1Timer*)
IF Messung
Then
BEGIN
messzeit:= now;
MesswerteArray[0]:= (messzeit - messzeit0)*24*60*60;
Messwerte.text:= '
Zeit / s: '
+ FloatToStrF (MesswerteArray[0],ffFixed,7, 0) + #13#10;
messung_rs232;
END;
(*IF Messung*)
end;
(*Timer_MessungTimer*)
(*-------------------------------------Parameter verändern--------------*)
procedure TForm1.Messinterval1Click(Sender: TObject);
var
str_zeitkonstante:
String;
begin
str_zeitkonstante:= inttostr (form1.timer_Messung.interval
DIV 1000);
str_zeitkonstante:= inputbox ('
Zeitkonstante', '
Zeitkonstante in s:',
str_zeitkonstante);
form1.timer_Messung.interval:= StrToInt (str_zeitkonstante) * 1000;
end;
(*----------------------Messung beenden-------------------------------*)
procedure TForm1.Ende1Click(Sender: TObject);
begin
(* alles ausschalten *)
Messung := False;
end;
(*-----------------------------Programm beenden------------------------*)
procedure TForm1.Beenden1Click(Sender: TObject);
begin
IF not messung
then
application.terminate;
end;
end.