Форум TRACE MODE: техническая поддержка   
мой профиль / my profile авторизация / login | регистрация / register | поиск / search | часто задаваемые вопросы / faq | начало / forum home

  Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
» Форум TRACE MODE: техническая поддержка » ТЕХНИЧЕСКАЯ ПОДДЕРЖКА / TECHNICAL SUPPORT TRACE MODE 5 » Работа в MS Windows (ODBC/DDE/OPC/NET) / Working under MS Windows » Драйверы для связи с УСО

   
Автор / Author Тема / Topic: Драйверы для связи с УСО
BloDenEk
Junior Member / Новичок
Участник № / Member № 1027


Icon 1 отправлено / posted      Профиль для / Profile for BloDenEk           Редактировать/удалить сообщение / Edit/Delete Post 
Можно написать драйвер на Delhpi? Если да,где можно посмотреть примеры или документацию таковых? Целесообразность написания драйвера на Delhpi?
Сообщения / Posts 22 | Из / From: Украина  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
AdAstra Technical Support
Moderator
Участник № / Member № 4


Icon 2 отправлено / posted      Профиль для / Profile for AdAstra Technical Support           Редактировать/удалить сообщение / Edit/Delete Post 
Если Вы планируете писать драйвер типа TYPE11, TYPE12, TYPE13 или RWH, то ничего не получится - только VC++. Если драйвер как ОРС-сервер, то можно.
Сообщения / Posts 15201 | Из / From: Russia  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Sergei
Forum Professor / Завсегдатай форума
Участник № / Member № 161


Icon 13 отправлено / posted      Профиль для / Profile for Sergei           Редактировать/удалить сообщение / Edit/Delete Post 
Ну зачем же так категорично? Вот, например, главный модуль рабочей 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.


Сообщения / Posts 157 | Из / From: russia  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
   

   Закрыть тему / Close Topic   Feature Topic   Переместить топик / Move Topic   Удалить топик / Delete Topic Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
 - Printer-friendly view of this topic
Перейти к / Hop To


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

Rambler's Top100 Rambler's Top100



Powered by Infopop Corporation
UBB.classic™ 6.7.2