Столкнулся с проблемой при работе с 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;
вместе и по отдельности после подключения к порту не решают проблему.
Может кто-то сталкивался с подобной проблемой?


