Показать сообщение отдельно
  #7  
Старый 10.12.2018, 22:22
Рубь Рубь вне форума
Прохожий
 
Регистрация: 09.12.2018
Сообщения: 6
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Извиняюсь заранее за об'ем, но так наверно понятнее будет почему я хочу получить доступ к анализу данных из порта.
Есть простой файл с координатами, структура строки X2.54Y10.16
для примера 3 строки.
читаем, строим команды для моторХ и моторY, отправляем на контроллер проверяем ответ.
Если есть ответ значит есть связь, значит можно отправлять запрос на окончание отработки команды. Ситуация стандартная.
Вот как это пытался реализовать (на получении доступа к ответу из порта застрял )
Код:
procedure TForm1.Button6Click(Sender: TObject);
var
i,k,z  :integer;
motorX :string;
motorY :string;
memstr :string;

begin
  if form1.OpenDialog1.Execute then Memo3.Lines.LoadFromFile(OpenDialog1.FileName);
  i:=Memo3.Lines.Count;
  while i >= 0   do
  begin
    if (copy(Memo3.Lines.Strings[i],1,1) <>'X') then Memo3.Lines.Delete(i);
    i:=i-1;
  end;
//-------------------------------------файл загрузили в мемо3
k:=0;
while(k <= Memo3.Lines.Count-1) do     // цикл по записям(всего 3 строки по 2е координаты
                                       // структура строки X2.54Y7.62)
begin
  memstr := Memo3.Lines.Strings[k];
  i:=2;
  while memstr[i]<>'Y' do                         //собираем в tmpstr координату Х
  begin
    if memstr[i]<>'.'then motorX := motorX+memstr[i];  //игнорим разделитель х100
    inc(i);
  end;
  inc(i);

  while i<= length(memstr) do                     //собираем в tmpstr координату Y
  begin
    if memstr[i]<>'.'then motorY := motorY+memstr[i];  //игнорим разделитель х100
    inc(i);
  end;
//-------------------------------------------------------
 // точки вытащили  далее отправляем команды

//  ststX:='NO';               //глобальный флаг состояния мотора X
//  ststY:='NO';               //глобальный флаг состояния мотора Y
//  Memo1.Lines.Clear;         // чистим мемо
//  Memo2.Lines.Clear;

  motorY := 'ATS=Y'+motorY;  //собираем команду для X
  WriteComm(motorY);         // отправляем на двигатель
  sleep(100);                //это очень много но для отладки норм

  motorX := 'ATS=X'+motorX;  //собираем команду для Y
  WriteComm(motorX);         // отправляем на двигатель
  sleep(100);                //это очень много но для отладки норм

  // в контроллере код написан так, что ответка формируется сразу при приёме команды
  // т.е время отклика небольшое менее ~10мс
  // Т.О. в этот момент должен дважды прийти ответ и отработать TForm1.Memo1Change.
  // если я правильно понимаю то должно быть 6 вызавов TForm1.Memo1Change из 3х строк

  if((ststX='OK')and(ststY='OK'))then
  begin
   Form1.Caption:= IntToStr(k)+'  OK';
   sleep(1000);         // это что бы понять где мы
  //сдесь планировалось послать запрос на окончание отработки команды
  //проанализировать окончание и перейти к след. строке
  inc(k);
  end
  else
  begin
    Form1.Caption:= IntToStr(k)+'  No';
    sleep(1000);         // это что бы понять где мы
    inc(k);              //пока переход на след строку, нодолжен быть обработчик ошибки
  end;

end;
end;

procedure TForm1.Memo1Change(Sender: TObject);
var
j :integer;
begin
  Memo2.Lines.Text := Memo1.Lines.Text;
  for j:=0 to Memo2.Lines.Count-1 do
  begin
    if pos('ATSXOK',Memo2.Lines.Strings[j])>0 then ststX:='OK' else ststX:='NO';
    if pos('ATSYOK',Memo2.Lines.Strings[j])>0 then ststY:='OK' else ststY:='NO';
  end;
  inc(nn);
  Form1.Caption:= Form1.Caption + '  '+ IntToStr(nn); //считаем сколько раз отработало
end;

после выполнения в caption метки о трёх проходах, о трех вызовах Memo1Change и не одного успешного отклика.
Ответить с цитированием