- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
// ComPort1: TComPort; компонент для работы RS-232
type
Tst5=string[5];
var
Form1: TForm1;
lastcnl:byte;
CommonShiftTT:integer;
roundtt:integer;
Start_Proces:boolean;
intN,intdg0,intdg50:integer;
cerr,cerr0,cerr50:integer;
intdg:integer;
cnl:integer;
b:array [1..5]of byte;
s,sdg50,sdg0,ss:Tst5;
tt,realdg:real;
implementation
{$R *.dfm}
procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer;
Count: Integer);
var
i:integer;
p:pointer;
begin
for i:=1 to 5 do b[i]:=0;
ListBox1.Items.clear;
if ComPort1.Connected then begin
p:=@Buffer;
b[1]:=byte(p^);
end
else begin
exit;
end;
cnl:=b[1];
if cnl=0 then begin
Start_Proces:=true;
end;
ListBox1.Items.Add(inttostr(cnl));
if Start_Proces=true then begin
b[2]:=Byte(pointer(longint(p)+1)^);
b[3]:=Byte(pointer(longint(p)+2)^);
b[4]:=Byte(pointer(longint(p)+3)^);
b[5]:=Byte(pointer(longint(p)+4)^);
if (b[2] and $20)>0 then ss[1]:='+' else ss[1]:='-';
if (b[2] and $40)>0 then ss[2]:='0' else ss[2]:='1';
FOR i:=3 TO 5 DO begin
case b[i] of
$82:ss[i]:='0';
$CF:ss[i]:='1';
$A4:ss[i]:='2';
$85:ss[i]:='3';
$C9:ss[i]:='4';
$91:ss[i]:='5';
$90:ss[i]:='6';
$C7:ss[i]:='7';
{min}$80:ss[i]:='8';
$81:ss[i]:='9';
$FF:ss[i]:='x'
else ss[i]:=chr(b[i]);
end;
ss[0]:=#5;
case cnl of
0:begin
vaL(ss,intdg0,cerr0);
stR(intdg0,sdg0);
Label1.Caption:=inttostr(intdg0);
end;
1:begin
vaL(ss,intdg50,cerr50);
stR(intdg50,sdg50);
Label2.Caption:=inttostr(intdg50);
end;
2..26:begin
vaL(ss,intN,cerr);
intN:=intN-intdg0+CommonShiftTT;
realdg:=intN/((intdg50-intdg0)/500);{real type}
intdg:=SMALLINT(round(realdg));{integer type}
tt:=intdg/10;
roundtt:=SMALLINT(round(tt));{integer}
stR(roundtt:5,s);
end;
end;
end;
ListBox1.Items.Add('float='+floattostr(tt));
ListBox1.Items.Add(inttostr(cnl)+'='+ss+' = '+inttostr(roundtt));
end;
end;
Процедура приема и обработки Кодов АЦП с контроллера. Контроллер обрабатывает данные полученные с температурных (аналоговых) датчиков и передает на COM в цифровом виде.
Сделано для АКГУП Индустриальный г. Барнаул
Sulik78 25.02.2011 14:12 # −6
TarasB 25.02.2011 15:11 # −2
Анонимус 25.02.2011 16:08 # 0
TarasB 25.02.2011 16:19 # +1
Lure Of Chaos 25.02.2011 23:45 # 0
Skelet0n 26.02.2011 12:08 # 0
сейчас заминусют
Lure Of Chaos 26.02.2011 12:13 # 0
Sulik78 25.02.2011 15:50 # −3
bugmenot 25.02.2011 19:44 # 0
gb12335 26.02.2011 02:34 # −1
Таскать за собой в каждую функцию самопальную struct *context - еще хуже.
Издержки чистого процедурного программирования. Даешь ООП?
PS: название Start_Proces доставляет. Как минимум одна опечатка.
ctm 01.03.2011 06:08 # 0
ну и глобальные переменные - фи, если это не тестовый (для экспериментов) модуль.
1291 24.08.2011 23:07 # 0
stR(intdg50,sdg50);
Label2.Caption:=inttostr(intdg50);
Просто прелесть. А также
if Start_Proces=true then begin
b[2]:=Byte(pointer(longint(p)+1)^);
b[3]:=Byte(pointer(longint(p)+2)^);
b[4]:=Byte(pointer(longint(p)+3)^);
b[5]:=Byte(pointer(longint(p)+4)^);
Move(Buffer, B, SizeOf(B)), очевидно, не устраивает.