Подключение DLL в Delphi (RDTCP.PAS):
unit RDTCP;
interface
type
PDat=^TDat;
TDat=packed record
PVal:single; // Значение, для дискретных 1.0 - это true, 0.0 - это false
IsOK:byte;
end;
function TCP_Init(ip:PChar; port:word; tconnect:cardinal; tread:cardinal):pointer;stdcall;
procedure TCP_Close(H:pointer);stdcall;
function TCP_Connect(H:pointer):integer;stdcall; // 0-OK -1-error
procedure TCP_Disconnect(H:pointer);stdcall; // 0-OK -1-error
function TCP_GetAKolPar(H:pointer):integer;stdcall;
function TCP_RdAllAn(H:pointer):integer;stdcall;
function TCP_GetAnPar(H:pointer;s:PChar):TDat;stdcall;
function TCP_RdAnPar(H:pointer; s:PChar; var D:TDat):integer;stdcall; // 0-OK -1-error
function TCP_GetDKolPar(H:pointer):integer;stdcall;
function TCP_RdAllDi(H:pointer):integer;stdcall;
function TCP_GetDiPar(H:pointer;s:PChar):TDat;stdcall;
function TCP_RdDiPar(H:pointer; s:PChar; var D:TDat):integer;stdcall; // 0-OK -1-error
implementation
function TCP_Init; external 'RDTCP.DLL';
procedure TCP_Close; external 'RDTCP.DLL';
function TCP_Connect; external 'RDTCP.DLL';
procedure TCP_Disconnect; external 'RDTCP.DLL';
function TCP_GetAKolPar; external 'RDTCP.DLL';
function TCP_RdAllAn; external 'RDTCP.DLL';
function TCP_GetAnPar; external 'RDTCP.DLL';
function TCP_RdAnPar; external 'RDTCP.DLL';
function TCP_GetDKolPar; external 'RDTCP.DLL';
function TCP_RdAllDi; external 'RDTCP.DLL';
function TCP_GetDiPar; external 'RDTCP.DLL';
function TCP_RdDiPar; external 'RDTCP.DLL';
end.
Использование функций DLL в Delphi (MAIN.PAS):
procedure TForm1.FormShow(Sender: TObject);
begin
// TCP_Init вызывается при запуске проги
Hnd_Bl:=nil;
// В этом примере для хоста 172.28.72.2 используется порт 9123.
// А вообще по умолчанию везде порт 9000
Hnd_Bl:=TCP_Init('192.168.7.5',9000,5000,5000); // IP, port, timeout_connect, timeout_read
if Hnd_Bl=nil then begin
MessageDlg('Ошибка TCP_Init',mtError,[mbOK],0);
Close;
end;
ReadAndShow;
CNT:=0;
end;
//---
procedure TForm1.ReadAndShow;
const cOK=$0080FFFF;
cER=clGray;
var D:TDat;
begin
// TCP_RdAllAn читает значения всех параметров во внутренний буфер
// Если TCP_RdAllAn возвр. 0 - ОК, если <0 - error
if TCP_RdAllAn(Hnd_Bl)=0 then begin
StBar1.SimpleText:=FormatDateTime('dd-mm-yyyy hh:nn:ss',Now)+' - чтение данных - ОК';
end else StBar1.SimpleText:=FormatDateTime('dd-mm-yyyy hh:nn:ss',Now)+' - чтение данных - ERROR !!!';
// А дальше вытаскиваем значения параметров по их идентификаторам
D:=TCP_GetAnPar(Hnd_Bl,'BLT_TG1_PSUM');
if D.IsOK=1 then stP1.Color:=cOK else stP1.Color:=cER;
stP1.Caption:=FloatToStrF(D.PVal,ffFixed,5,1)+' ';
Попытка работать с DLL в Python:
import ctypes RDTCP = ctypes.WinDLL("RDTCP.dll") IP = ctypes.c_char_p('192.168.7.5'.encode('cp1251')) port = ctypes.c_ushort(9000) timeout_connect = ctypes.c_ulong(5000) timeout_read = ctypes.c_ulong(5000) Hnd_Bl = RDTCP.TCP_Init(IP, port, timeout_connect, timeout_read) print(RDTCP.TCP_RdAllAn(Hnd_Bl)) print(RDTCP.TCP_GetAKolPar(Hnd_Bl)) BLT_TG1_PSUM = ctypes.c_char_p('BLT_TG1_PSUM'.encode('cp1251')) print(RDTCP.TCP_GetAnPar(Hnd_Bl, BLT_TG1_PSUM))
Подключение успешно, запрос количества параметров успешно, запрос конкретного параметра - access violation error.

Возможно это следствие того, что возвращается структура TDat.
Нашел функции для переноса структур
def send(self): return buffer(self)[:] def receiveSome(self, bytes): fit = min(len(bytes), ctypes.sizeof(self)) ctypes.memmove(ctypes.addressof(self), bytes, fit)
Попробовал описать структура
class TDat(object): def __init__(self, PVal=ctypes.c_float(0.0), IsOK=ctypes.c_byte(0)): self.PVal = PVal self.IsOK = IsOK
Но как это использовать?