Столкнулся с проблемой при работе с COM-портом (RS485, MOXA CP-114) с использованием Synapse в Windows.
Имеется несколько портов, на который висят разные устройства, у каждого порта отличаются настройки (скорость, чётность).
Никакие устройства не отвечают на запросы программы после перезагрузки ПК, но если перед её запуском, открыть другую, которая обменяется данными с устройствами, то после этого моя программа работает отлично и бесконечно долго!
Опытным путём выяснил, что запустить программу для настройки модулей icpDas (DCON_utility) и прочитать модули на одном из портов, то моя программа после этого будет видеть только этот порт, а если с помощью той-же DCON_utility поискать модули icpDAS на порту, где их нет, но есть другие устройства (специализированные, со своим бинарным протоколом), то моя программа устройства с этого порта всё равно не видит. Если почитать там-же устройства другой программой, которая обменяется с ними данными, то после этого и моя будет прекрасно работать.
Не помогает и то, если в DCON_utility выставить правильные настройки порта.
При перезагрузке ПК, питание с устройств не снимается.
Код, отвечающий за работу с портом с устройствами DCON.
- Код: Выделить всё
...
const
COM_TIMEOUT = 300;
var
...
ser: TBlockSerial;
Baud: integer = 38400;
...
procedure TECfgForm.FormCreate(Sender: TObject);
begin
...
ser:=TBlockSerial.Create;
...
end;
procedure TECfgForm.FillITO;
var
n: integer;
r: ansistring;
i: shortint;
b: byte;
h: string;
ofs: single;
begin
ITOgrid.Enabled:=True;
t_tin.Enabled:=True;
b_set.Enabled:=True;
b_reset.Enabled:=True;
ITOgrid.Clean;
ITOgrid.Cells[0,0]:='Адрес';
ITOgrid.Cells[1,0]:='Порт';
ITOgrid.Cells[2,0]:='Данные';
ITOgrid.Cells[3,0]:='Смещение';
if (l_a7015.Items.Count<3) then exit;
if (l_a7015.ItemIndex > 0) and (toint(l_com2.Text)>0) then
begin
for n:=1 to 12 do
begin
ITOgrid.Cells[0,n]:=inttostr((n-1) div 6 + l_a7015.ItemIndex);
ITOgrid.Cells[1,n]:=inttostr((n-1) mod 6);
end;
//Получаем данные от IcpCon i-7015
try
ser.Connect(l_com2.Text);
ser.Config(Baud, 8, 'N', 1, False, False);
for n:=1 to 12 do
begin
ProgressBar1.Position:=100*n div 12;
r:='#0'+inttostr((n-1) div 6 + l_a7015.ItemIndex) + inttostr((n-1) mod 6);
ITOgrid.Cells[2,n]:=r;
Application.ProcessMessages;
ser.SendString(r+CRC(r)+chr(13));
r:=ser.RecvPacket(COM_TIMEOUT);
//В ответ ничего не приходит, если до этого не запустить DCON_utility
if (length(r)>1) then ITOgrid.Cells[2,n]:=FloatToStrF(todouble(r),ffFixed,2,2) else ITOgrid.Cells[2,n]:='н/д';
Application.ProcessMessages;
r:='@0'+inttostr((n-1) div 6 + l_a7015.ItemIndex) + 'A3C' + inttostr((n-1) mod 6);
ser.SendString(r+CRC(r)+chr(13));
ITOgrid.Cells[3,n]:=r;
Application.ProcessMessages;
r:=ser.RecvPacket(COM_TIMEOUT);
if (length(r)>5) then
begin
h:='$'+r[4]+r[5];
b:=strtoint(h);
i:=0;
move(b,i,1);
ofs:=i / 10;
if (toint(r[3])=(n-1) div 6 + l_a7015.ItemIndex) then
ITOgrid.Cells[3,n]:=FloatToStrF(ofs,ffFixed,1,1) else ITOgrid.Cells[3,n]:='н/д';
end
else ITOgrid.Cells[3,n]:='н/д';
Application.ProcessMessages;
end;
finally
ser.CloseSocket;
ProgressBar1.Position:=0;
end;
end else
begin
ITOgrid.Enabled:=False;
t_tin.Enabled:=False;
b_set.Enabled:=False;
b_reset.Enabled:=False;
end;
end;
Добавление:
- Код: Выделить всё
ser.Flush;
ser.Purge;
вместе и по отдельности после подключения к порту не решают проблему.
Может кто-то сталкивался с подобной проблемой?