Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2010, 09:50   #1
xBugiman
 
Аватар для xBugiman
 
Регистрация: 10.06.2010
Сообщений: 6
По умолчанию RS232, Библиотека Игоря Павлова TComPort

Использую библиотеку Игоря Павлова - TComPort.

Задача: опросить устройство, формат опроса [посылка команды - прием ответа] в асинхронном режиме.

Трабл №1. Посылка команды проходит, ответ по с помощью onRead не считывается, а надо бы

Трабл №2. Формат команды настройки конфигурации девайса (ICP CON 7018) : "%AANN...FF". Первый символ "%" дублируется и получается "%%AANN...FF", любой другой символ отправляется как есть. Как победить?
Вложения
Тип файла: rar class_TComPort.rar (15.5 Кб, 128 просмотров)
xBugiman вне форума Ответить с цитированием
Старый 10.06.2010, 12:39   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...и что? ...не видно как вы посылаете отсюда было-бы понятно, если студент так вопрос задал, но по краткой ремарке "ICP CON 7018" вы же работаете с оборудованием, значит должны были научится формулировать мысли ...подробнее
Цитата:
Трабл №1. Посылка команды проходит
а как узнали, что проходит?
Цитата:
Трабл №2. Формат команды настройки конфигурации девайса (ICP CON 7018) : "%AANN...FF". Первый символ "%" дублируется
дублируется где? чем проверили? пробовали-ли другие способы отправки? собственно, опять не видно как отправляете, текстом или буфером, правильно ли настроили порт ...ничего этого нет тут, чтобы вам помочь.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.06.2010, 16:20   #3
xBugiman
 
Аватар для xBugiman
 
Регистрация: 10.06.2010
Сообщений: 6
По умолчанию

Цитата:
было-бы понятно, если студент так вопрос задал, но по краткой ремарке "ICP CON 7018" вы же работаете с оборудованием, значит должны были научится формулировать мысли ...подробнее
Студент. За замечание спасибо, постараюсь исправиться.

Цитата:
а как узнали, что проходит?
Отслеживаю PortMon'ом.

Цитата:
дублируется где? чем проверили?
В терминале того же PortMon'а.

Посылка: %0000050600

Как посылается, лог Портмона:
Код HTML:
0.00041492	Project1.exe IRP_MJ_WRITE Serial2	SUCCESS Length 12: %%0000050600.	
Отправлял и через буфер, и напрямую текстом. Результат одинаков.
xBugiman вне форума Ответить с цитированием
Старый 10.06.2010, 16:32   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Как посылается, лог Портмона:
в идеале, это глянуть внешним девайсом, терминал на какой шине висит ? просто на 232 или 485? ... за неимением под "как посылается" имелось ввиду код отправки, а не лог чужой программы.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 10.06.2010, 17:06   #5
xBugiman
 
Аватар для xBugiman
 
Регистрация: 10.06.2010
Сообщений: 6
По умолчанию

На RS485 -> USB -> Виртуальный COM.

PHP код:
procedure TComPort.Write(WriteBytes: array of Byte);
var
  
dwWriteDWORD;
begin
  
if  (not WriteFile(FPortWriteBytesSizeOf(WriteBytes), dwWrite, @FOverWrite))
  and (
GetLastError <> ERROR_IO_PENDINGthen
    raise EComPortError
.Create('Error writing port ' PortName);
end
xBugiman вне форума Ответить с цитированием
Старый 10.06.2010, 17:29   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

TC, вы прикалываетесь? не нужно приводить код отправки с самого компонента, вы думаете мы не можем заглянуть внутрь ...приведите полный код того как вы формируете пакет, как настроен компонент и как вызываете отправку ...к примеру:
Код:
function CRC(BufferData: TDataByte): word;
var
  Data: word;
  i,j : integer;
const polinomio: word= $A001;
begin
  result:= $FFFF;
  for i:=0 to high(BufferData)- 2 do
  begin
    data:= BufferData[i];
    for j:=1 to 8 do
    begin
      if (((data xor result) and $0001) = 1) then
         result:=(result shr 1) xor polinomio
      else
         result:=result shr 1;
      data:= data shr 1;
    end;
  end;
end;

MASTER
…
procedure set_smh(net,kod,reg,val: word);
var Cadena: TDataByte;
    crcc  : word;
    i     : integer;
    s     : string;
begin
 Setlength(Cadena,8);
 Cadena[0]:= net;// 
 Cadena[1]:= kod;// 
 Cadena[2]:= hi(reg);// 
 Cadena[3]:= lo(reg);// —
 Cadena[4]:= hi(val);
 Cadena[5]:= lo(val);// —
 crcc:= CRC(Cadena);// crc
 Cadena[6]:= lo(crcc);
 Cadena[7]:= hi(crcc);
 //log-
 s:= “”; for i:= 0 to 7 do s:= s + inttohex(cadena[i],2)+’ “; 
 s:= “”; for i:= 0 to 7 do s:= s + chr(cadena[i]);
 if en_com then
  mf.com.WriteCommData(pchar(s), length(s))
end;
в идеале - это промониторить аппаратно повешенным параллельно на шину RS-485 вторым модулем i7552, в конце концов пакет можно проследить на осциллографе.

Добавлено
пока пробуете, потестьте на другом модуле http://www.programmersforum.ru/showp...69&postcount=8 (BСomPort, одиночный модуль)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 10.06.2010 в 17:37.
raxp вне форума Ответить с цитированием
Старый 11.06.2010, 21:14   #7
xBugiman
 
Аватар для xBugiman
 
Регистрация: 10.06.2010
Сообщений: 6
По умолчанию

Спасибо. Попробовал, потестил, нашел свои ошибки.

Возник еще вопрос.

ПО опрашивает порт и парралельно фиксирует с помощью таймера время прихода ответа.

Из-за возникающих таймингов при чтении, значение переменной инкрементирующейся в таймере, не соответствует реальному значению времени.

Значения таймингов:

Цитата:
CT.ReadTotalTimeoutConstant := 90;
CT.ReadIntervalTimeout :=MAXWORD;
CT.ReadTotalTimeoutMultiplier := 0;
CT.WriteTotalTimeoutMultiplier := 0;
CT.WriteTotalTimeoutConstant := 0;
Как определить точное время прихода ответа? Или может быть есть другой вариант реализации учета времени?
xBugiman вне форума Ответить с цитированием
Старый 11.06.2010, 21:33   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

ммм... достаточно вызвать логгирование при появлении данных на COM порте comReceiveData()...
Код:
procedure Tmf._log(mode: string); //LOG-
var s : string;
    tt: TStringList;
begin
  s:= extractfilepath(application.ExeName);
  tt:= TStringList.Create;
  if FileExists(s+'log.txt') then tt.LoadFromFile(s+'log.txt');
  //
  if mode[1] = '=' then begin
   tt.Add('');
   tt.Add(mode+formatdatetime(' dd.mm.yy ',date));
   tt.Add('');
  end else tt.Add(mode+formatdatetime(' hh:nn:ss.zzz',time)); // ФИКСАЦИЯ ВРЕМЕНИ ПРИХОДА ДАННЫХ
  tt.SaveToFile(s+'log.txt');
  tt.Free
end;


procedure Tmf.packet(Str: String);
var i        : integer;
    Cadena   : TDataByte;
    CadenaCRC: word;
    temp,s   : string;
begin
 //расшифровка пакета -mlink-
 if length(str)=14 then begin
  for i:=1 To length(str) do mlnbuf[i]:= byte(char(str[i]));
  //
  chann4:= mlnbuf[3];
  chann5:= mlnbuf[5]+mlnbuf[6];
  chann6:= mlnbuf[9]+mlnbuf[10]+mlnbuf[11]+mlnbuf[12]
 end;

 //расшифровка пакета -modbus-
 if (length(str)=9)or(length(str)=8)or(length(str)=7) then begin

  inc(rx);
  //наполнение-
  for i:=1 To length(str) do
   modbuf[i-1]:= byte(char(str[i]));

  //SET OPC
  chann8  := modbuf[0]; //NET
  if length(str)=8 then begin
   chann9 := hextoint(inttohex(modbuf[2],2)+ inttohex(modbuf[3],2)); //REG
   chann10:= hextoint(inttohex(modbuf[4],2)+ inttohex(modbuf[5],2)); //VAL
  end else begin
   chann9 := modbuf[2];                                              //REG
   chann10:= hextoint(inttohex(modbuf[5],2)+ inttohex(modbuf[6],2)+
             inttohex(modbuf[3],2)+ inttohex(modbuf[4],2));          //VAL
  end;

  //LCRC + CRC
  Setlength(Cadena,8);
  Cadena[0]:= modbuf[0];
  Cadena[1]:= modbuf[1];
  Cadena[2]:= modbuf[2];
  Cadena[3]:= modbuf[3];
  Cadena[4]:= modbuf[4];
  Cadena[5]:= modbuf[5];
  Cadena[6]:= modbuf[6];
  CadenaCRC:= CRC(Cadena);
  Cadena[high(Cadena)-1]:= lo(CadenaCRC);
  Cadena[high(Cadena)]  := hi(CadenaCRC);

  //log-
  s:= ''; for i:=0 to 7 do s:= s + inttohex(cadena[i],2)+' '; 
  _log('RX: ' + s);
  //
  if {(lo(CadenaCRC) = modbuf[7])and(hi(CadenaCRC) = modbuf[8])and} //ERR-
   (modbuf[0] = gl_net)and(modbuf[1] = 4)and(modbuf[2] = 4) then begin //выделение ARCHIVE -
     glp := not glp;
     temp:= inttohex(modbuf[5],2) + inttohex(modbuf[6],2) +
            inttohex(modbuf[3],2) + inttohex(modbuf[4],2);

     if glp then sb1.Caption:= ' LH: ' + temp
      else sb1.Caption:= ' LL: ' + temp
  end
 end
end;


type tb = array[1..255] of Char;  //Определяем символьный массив
     pb = ^tb;
procedure Tmf.comReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var PX : pb;
    i  : integer;
    str: string;
begin
 PX:= buffer; str:='';
 for i:= 1 to BufferLength do
  str:=str+PX^[i];
 packet(str)
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 12.06.2010, 13:24   #9
xBugiman
 
Аватар для xBugiman
 
Регистрация: 10.06.2010
Сообщений: 6
По умолчанию

Угумс. Спасибо. Сделал чуть раньше чем прочитал, через GetCurrenttime.

Еще вопрос о структурах данных.

Задача программы построения графика зависимости температуры на каждом канале от времени.

Требуемая точность довольно высокая, показания снимаются три раза в секунду.

Для отображения данных использую StringGrid. Но ее возможности ограничены Integer'ом.

То есть 32 767.

Получается, что теоретический потенциал это:
32 767 / 3 / 60 / 60 = 3 часа измерений.

Что в принципе может быть достаточно, но хотелось бы часов 5 или 6.

Есть идея хранить значения в массиве и отказаться от StringGrid, но вроде они более ресурсо_затратны? Если я не прав, поправьте меня.

То есть вопрос в следующем, сможет ли программа адекватно работать с 8 массивами с ~ 50 000 значений, какие директивы, алгоритмы и настройки для этого надо использовать?
xBugiman вне форума Ответить с цитированием
Старый 12.06.2010, 13:28   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще то integer -2147483648-2147483647.
мы не в паскале где было так как вы говорите
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с RS232 в DELPHI 100GRamm Общие вопросы Delphi 9 17.09.2021 00:18
Delphi 2009 - проблема с установкой компонента TComPort cadil Компоненты Delphi 8 05.09.2010 03:27
Delphi 2009: проблема с работой компоненты TComPort cadil Компоненты Delphi 10 01.04.2010 10:55
Поддержим Игоря Акинфеева Квэнди Свободное общение 8 23.06.2008 22:23