-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComEmulation.pas
More file actions
122 lines (98 loc) · 3.24 KB
/
ComEmulation.pas
File metadata and controls
122 lines (98 loc) · 3.24 KB
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
(*
До того, как шкаф электроники готов, или после того, как уже отдан заказчику,
программу как-то нужно разрабатывать и тестировать, для чего был создан
эмулятор устройств который полностью имитировал работу всех устройств на предприятии,
обеспечивая отсутствие (по крайней мере очевидных) ошибок при обновлении.
Этот модуль отвечает за связь с эмулятором (имитирует com-порт).
Возможно, эмулятор тоже как-нибудь выложу.
*)
unit ComEmulation;
interface
uses ScktComp, SyncObjs, SysUtils;
type
TEmulator = class
private
FCS: TClientSocket;
FEvent: TEvent;
procedure CSRead(Sender: TObject; Socket: TCustomWinSocket);
procedure CSError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
public
constructor Create;
destructor Destroy; override;
procedure Send(Str: String; WaitTime: Cardinal);
end;
var
Emulator: TEmulator;
implementation
uses Communication;
//==================================================================================================
procedure TEmulator.CSRead(Sender: TObject; Socket: TCustomWinSocket);
var
i: Integer;
Str, st: AnsiString;
Data: Array of Byte;
begin
//Getting answer
Str:=Socket.ReceiveText;
Delete(Str, 1, 1);
i:=Pos(#1, Str); //Every data begins from #1
Delete(Str, i, Length(Str)-i+1); //Delete excess data
Str:=Str+' ';
//Parsing answer
st:='';
For i:=1 to Length(Str) do
Begin
if Str[i] in ['0'..'9'] then
st:=st+Str[i]
else
begin
SetLength(Data, Length(Data)+1);
Data[Length(Data)-1]:=StrToInt(st);
st:='';
end;
End;
If not Commun.Suspended then
for i:=Low(Data) to High(Data) do
Commun.InData[i]:=Data[i];
FEvent.SetEvent; //We've got an answer
end;
procedure TEmulator.CSError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
end;
//--------------------------------------------------------------------------------------------------
constructor TEmulator.Create;
begin
FCS:=TClientSocket.Create(nil);
FCS.Address:='127.0.0.1';
FCS.Port:=1200;
FCS.Open;
FCS.OnRead:=Self.CSRead;
FCS.OnError:=Self.CSError;
FEvent:=TEvent.Create(nil, False, False, '');
Sleep(100);
end;
destructor TEmulator.Destroy;
begin
FCS.Close;
FreeAndNil(FCS);
FreeAndNil(FEvent);
end;
procedure TEmulator.Send(Str: String; WaitTime: Cardinal);
begin
If Commun.Suspended or not Assigned(FCS) then Exit;
Try
FCS.Open;
FCS.Socket.SendText(#1+Str); //Sending data
FEvent.WaitFor(WaitTime); //Waiting answer
Except
End;
end;
//==================================================================================================
initialization
Emulator:=TEmulator.Create;
finalization
Emulator.Free;
end.