This is topic Драйверы для связи с УСО in forum Работа в MS Windows (ODBC/DDE/OPC/NET) / Working under MS Windows at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/13/t/000083.html

Posted by Игорь (Участник № / Member № 1027) on :
 
Можно написать драйвер на Delhpi? Если да,где можно посмотреть примеры или документацию таковых? Целесообразность написания драйвера на Delhpi?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Если Вы планируете писать драйвер типа TYPE11, TYPE12, TYPE13 или RWH, то ничего не получится - только VC++. Если драйвер как ОРС-сервер, то можно.
 
Posted by Sergei (Участник № / Member № 161) on :
 
Ну зачем же так категорично? Вот, например, главный модуль рабочей RWH-ки:
code:
 
library RWH;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes,
IniFiles,
records in 'records.pas',
WinSock2 in 'WinSock2.pas',
ServerThread in 'ServerThread.pas',
ClientThread in 'ClientThread.pas',
syncobjs,
shared in 'shared.pas',
uSockErrors in 'uSockErrors.pas';

{$R *.RES}
{$DEFINE debug}

//procedure CheckArbitr(const Value: chan); forward;

var //ChanArr: Channels;
t1: TServerThread;
ClThr: TClientThread;


/////////////////////////////////////////////////////////////////////

procedure rwh_start(); cdecl;
var iniFile: TiniFile;
host: string;
portIn, portOut: Integer;
Server: boolean;
begin

IniFile := TIniFile.Create('C:\TraceMode5_Professional\RWH.ini');
host := IniFile.Readstring('Adres', 'Host', 'localhost');
PortIn := IniFile.ReadInteger('Adres', 'Port_In', 2000);
PortOut := IniFile.ReadInteger('Adres', 'Port_Out', 2001);
Server := IniFile.ReadBool('Adres', 'Server', true);

ArbitrBaseOut := IniFile.ReadInteger('Arbitr stat masterom', 'Base', 0);
ArbitrChOut := IniFile.ReadInteger('Arbitr stat masterom', 'Ch', 0);
ArbitrMuxOut := IniFile.ReadInteger('Arbitr stat masterom', 'Mux', 0);
ArbitrBitOut := IniFile.ReadInteger('Arbitr stat masterom', 'bit', 0);

ArbitrBaseIn := IniFile.ReadInteger('Arbitr sostoyanie', 'Base', 0);
ArbitrChIn := IniFile.ReadInteger('Arbitr sostoyanie', 'Ch', 0);
ArbitrMuxIn := IniFile.ReadInteger('Arbitr sostoyanie', 'Mux', 0);
ArbitrBitIn := IniFile.ReadInteger('Arbitr sostoyanie', 'bit', 0);

SignRabBaseOut := IniFile.ReadInteger('Signal raboti dlya soseda', 'Base', 0);
SignRabChOut := IniFile.ReadInteger('Signal raboti dlya soseda', 'Ch', 0);
SignRabMuxOut := IniFile.ReadInteger('Signal raboti dlya soseda', 'Mux', 0);
SignRabBitOut := IniFile.ReadInteger('Signal raboti dlya soseda', 'bit', 0);

SignRabBaseIn := IniFile.ReadInteger('Signal raboti', 'Base', 0);
SignRabChIn := IniFile.ReadInteger('Signal raboti', 'Ch', 0);
SignRabMuxIn := IniFile.ReadInteger('Signal raboti', 'Mux', 0);
SignRabBitIn := IniFile.ReadInteger('Signal raboti', 'bit', 0);

UseArbitr := IniFile.ReadBool('Arbitr', 'UseArbitr', false);

//если файла небыло, создастся со значениями по умолчанию
IniFile.WriteString('Adres', 'Host', Host);
IniFile.WriteInteger('Adres', 'Port_In', POrtIn);
IniFile.WriteInteger('Adres', 'Port_Out', POrtOut);
IniFile.WriteBool('Adres', 'Server', Server);

IniFile.WriteInteger('Arbitr stat masterom', 'Base', ArbitrBaseOut);
IniFile.WriteInteger('Arbitr stat masterom', 'Ch', ArbitrChOut);
IniFile.WriteInteger('Arbitr stat masterom', 'Mux', ArbitrMuxOut);
IniFile.WriteInteger('Arbitr stat masterom', 'bit', ArbitrBitOut);

IniFile.WriteInteger('Arbitr sostoyanie', 'Base', ArbitrBaseIn);
IniFile.WriteInteger('Arbitr sostoyanie', 'Ch', ArbitrChIn);
IniFile.WriteInteger('Arbitr sostoyanie', 'Mux', ArbitrMuxIn);
IniFile.WriteInteger('Arbitr sostoyanie', 'bit', ArbitrBitIn);

IniFile.WriteInteger('Signal raboti dlya soseda', 'Base', SignRabBaseOut);
IniFile.WriteInteger('Signal raboti dlya soseda', 'Ch', SignRabChOut);
IniFile.WriteInteger('Signal raboti dlya soseda', 'Mux', SignRabMuxOut);
IniFile.WriteInteger('Signal raboti dlya soseda', 'bit', SignRabBitOut);

IniFile.WriteInteger('Signal raboti', 'Base', SignRabBaseIn);
IniFile.WriteInteger('Signal raboti', 'Ch', SignRabChIn);
IniFile.WriteInteger('Signal raboti', 'Mux', SignRabMuxIn);
IniFile.WriteInteger('Signal raboti', 'bit', SignRabBitIn);

IniFile.WriteBool('Arbitr', 'UseArbitr', UseArbitr);

iniFile.Free;

csTMValues := TCriticalSection.Create;
CsBuffer := TCriticalSection.Create;
CsLog := TCriticalSection.Create;

ARBITR_MASK_IN := (1 shl (ArbitrBitIn - 1));
ARBITR_MASK_OUT := (1 shl (ArbitrBitOut - 1));
G01_MASK_IN := (1 shl (SignRabBitIn - 1));
G01_MASK_OUT := (1 shl (SignRabBitOut - 1));

BuffNow := 1; //будет одна лишняя посылка, зато сервер сразу отдаст тек знач-я
setLength(Buffer, 1000);

if Server = true then
begin
assignFile(log, 'C:\TraceMode5_Professional\rwh_Server.log');
rewrite(log);
//Запускаем поток, который "слушает" сеть
t1 := TServerThread.create(true);
t1.portIn := PortIn;
t1.Host := Host;
{$IFDEF DEBUG}
Add2Log('==', 'RWH Перед запуском сервера. threadHandle=' + inttostr(t1.handle));
{$ENDIF}
t1.Resume; //запускаем на прослушивание
end
else
begin
assignFile(log, 'C:\TraceMode5_Professional\rwh_client.log');
rewrite(log);
ClThr := TClientThread.create(true);
ClThr.portIn := PortIn;
ClThr.portOut := PortOut;
ClThr.Host := Host;
ClThr.Resume; //запускаем на прослушивание
end;
end;

procedure rwh_stop(); cdecl;
begin
if t1 <> nil then
t1.Terminate;
if ClThr <> nil then
begin
ClThr.Terminate;
ClThr.WaitFor;
end;
Add2Log('==', 'Завершаем работу');
closefile(log);
csBuffer.Free;
csTMValues.Free;
csLog.Free;
// Form.Free;
end;

procedure rwh_aio_init(var IA: x); cdecl;
var ToWrite, temp: chan;

begin
toWrite.ia := ia;
ToWrite.val := 0;
WriteArray(toWrite);
end;

procedure rwh_dio_init(var IA: x); cdecl;
var ToWrite: chan;
begin
toWrite.ia := ia;
ToWrite.val := 0;
WriteArray(toWrite);
end;

function rwh_aio_write(var IA: x; v: word): integer; cdecl;
var
mes: chan;
begin
mes.ia := ia;
mes.val := v;
AddBuffer(mes);
ReSult := 0;
// {$IFDEF Debug}
{ showmessage('добавил в отправку аналог'
+#13 + #10 + 'adr=' + IntToStr(ia.base)
+ #13 + #10 + 'CH=' + IntToStr(ia.ch)
+ #13 + #10 + 'mux=' + IntToStr(ia.mux)
+ #13 + #10 + 'значение ' + intToStr(v));
}// {$ENDIF}

end;

function rwh_aio_read(var IA: x; var v: word): integer; cdecl;
begin
v := ReadArray(ia);
result := 0;
{ showmessage('прочитал аналог'
+#13 + #10 + 'adr=' + IntToStr(ia.base)
+ #13 + #10 + 'CH=' + IntToStr(ia.ch)
+ #13 + #10 + 'mux=' + IntToStr(ia.mux)
+ #13 + #10 + 'значение ' + intToStr(v));
}end;

function rwh_dio_write({q : byte;}var IA: x; v: word): integer; cdecl;
var
mes: chan;
begin
mes.ia := ia;
mes.val := v;
AddBuffer(mes);
result := 0;
end;

function rwh_dio_read(var IA: x; var v: word): integer; cdecl;
begin
v := ReadArray(ia);
result := 0;
end;

function rwh_atr_read(var IA: x; var v: word): integer; cdecl;
begin
result := 0;
end;

function rwh_atr_write(var IA: x; var v: word): integer; cdecl;
begin
result := 0;
end;


exports
rwh_start name '?rwh_start@@YAXXZ',
rwh_stop name '?rwh_stop@@YAXXZ',
rwh_aio_init name '?rwh_aio_init@@YAXAATIA@@@Z',
rwh_dio_init name '?rwh_dio_init@@YAXAATIA@@@Z',
rwh_aio_write name '?rwh_aio_write@@YAHAATIA@@G@Z',
rwh_aio_read name '?rwh_aio_read@@YAHAATIA@@AAG@Z',
rwh_dio_write name '?rwh_dio_write@@YAHAATIA@@G@Z',
rwh_dio_read name '?rwh_dio_read@@YAHAATIA@@AAG@Z',
rwh_atr_read name '?rwh_atr_read@@YAHAATIA@@AAM@Z',
rwh_atr_write name '?rwh_atr_write@@YAHAATIA@@AAM@Z';
end.


 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2