Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> считать данные с контроллера по СОМ-порту, не получается 
:(
    Опции темы
Тиль
Дата 21.9.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



Есть контроллер. К нему прилагается описание производителя. необходимо считать данные с данного контроллера, но с теми параметрами, которые есть в документации не получается. ВОт мой код:
Код

procedure TMainFrm.Button1Click(Sender: TObject);
const
  SendBuf: array [0..6] of Byte = ($01, $03, $00, $02D, $02E, $02F, $30);
var
  ReadBuf: PByte; // буф. чтения
  Count: Integer; // ск. прочитано
  S: String;
  I: Integer;
begin
  MyPort.Write(@SendBuf[0], Length(SendBuf));  // запись
  Count := MyPort.SleepAndRead(100, Pointer(ReadBuf)); // пауза 100 мс и чтение
   if (Count > 0) then
  for I := 0 to Count -1 do
  begin
    S := S + '/' + IntToStr(ReadBuf^);
    Inc(ReadBuf);
  end else
    S := 'нет данных...';
  Memo1.Lines.Add(S);
end


в чем может быть пробьлема?данных при чтении нет просто...

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  MODBUS.pdf 130,95 Kb
--------------------
Казалось нам пипец, оказалось что не казалось
PM MAIL   Вверх
UniBomb
Дата 21.9.2010, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Тиль, по коду мало чего могу сказать, но вот первое что бросилось в глаза - неправильно составленная команда. Должно быть восемь байт (01 03 00 2D 2E 2F 89 BF). 89 BF - это контрольная сумма. Но даже если бы запрос был правильным, то вам пришли бы не данные, а исключение: 2E, 2F - это количество считываемых регистров. Столько регистров в тех приборах нет, и максимальное количество передаваемых байт равно 133.


--------------------
PM MAIL ICQ Skype   Вверх
Тиль
Дата 21.9.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



а как тогда их считать? с другим блоком у меня так канало
ВОТ:
Код

SendBuf: array [0..7] of Byte = ($33, $04, $02, $40, $00, $06, $74, $76);

--------------------
Казалось нам пипец, оказалось что не казалось
PM MAIL   Вверх
UniBomb
Дата 21.9.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Тиль, расскажите мне какой смысл вкладываете в этот набор данных.


--------------------
PM MAIL ICQ Skype   Вверх
Тиль
Дата 21.9.2010, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



в них содержатся значения о контроллере, которые мне необходимо считать.......или вы про что спрашиваете?
--------------------
Казалось нам пипец, оказалось что не казалось
PM MAIL   Вверх
UniBomb
Дата 21.9.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Тиль, нет, я хотел, что бы вы рассказали мне что означает каждый байт в ваших посылках. У меня просто складывается впечатление, что вы совершенно незнакомы с модбасом. Команда 03 выглядит следующим образом:

|адрес устройства|команда|первый регистр (ст.б.)|первый регистр (мл.б.)|количество регистров(ст.б.)|количество регистров(мл.б.)|crc16(ст.б.)|crc16(мл.б.)|

Таким образом получается, что вы пытаетесь запросить 11823 регистров (это $02E, $02F в вашем запросе) начиная с регистра номер 2D. Правильной контрольной суммы вы не предоставили и прибор имеет полное право проигнорировать ваш запрос. Запрашивать надо столько регистров, что бы ответ не превышал 133 байта. Т.е. максимум 64 регистра.

О том как считать crc16 можно почитать например здесь.


Цитата(Тиль @  21.9.2010,  14:44 Найти цитируемый пост)
с другим блоком у меня так канало

Если верить описанию прибора из аттача, то "канать" ну никак не могло, ибо функция 04 приборами не поддерживается.

Добавлено через 2 минуты и 57 секунд
И да, для отладки работы c различными приборами лучше всего пользоваться различными терминальными программами с поддержкой нужных протоколов. Для работы с модбасом рекомендую использовать modbus tester.


--------------------
PM MAIL ICQ Skype   Вверх
Тиль
Дата 22.9.2010, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



в том то и дело что незнаком...
--------------------
Казалось нам пипец, оказалось что не казалось
PM MAIL   Вверх
UniBomb
Дата 22.9.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



Цитата(Тиль @  22.9.2010,  06:21 Найти цитируемый пост)
в том то и дело что незнаком... 

Так с этого и надо было начинать. Ознакомление с протоколом можно начать с этой страницы. Так же в интернетах не так уж и редко встречаются описания протокола на русском.

Что можно добавить: из описания прибора видно, что поддерживаются функции 3 и 6. Функция 3 - это чтение регистров (одного или нескольких) хранения, функция 6 соответсвенно запись (правда только одного).

Формат функции чтения я уже приводил выше. С учётом описания прибора функция может иметь следующий вид:

Код

01 03 00 2D 00 10 D4 0F
|  |    |    |     |
|  |    |    |     +-- CRC16
|  |    |    +-------- количество регистров, которые хотим прочитать
|  |    +------------- адрес первого регистра
|  +------------------ команда
+--------------------- адрес устройства в сети



Читать 16 регистров (т.е. все) начиная с адреса 2D.

ответ будет такого вида:

01 03 20 xx xx xx .... xx xx crc crc

Число 20 (в 16-ричной сс) означает количество байт данных в поле данных (это байты xx).

Функция 06 ничем не сложнее и имеет схожий синтаксис:

Код

01 06 00 2D xx xx yy yy
|  |    |    |     |
|  |    |    |     +-- CRC16
|  |    |    +-------- значение переписываемого регистра
|  |    +------------- адрес перезаписываемого регистра
|  +------------------ команда
+--------------------- адрес устройства в сети


Если команда успешно выполнена, то ответ совпадает с запросом.


Что касается CRC16 - в интернете полно реализаций (например здесь), только следует помнить, что для модбаса полином должен быть A001 и начальное сначение FFFF.

Это сообщение отредактировал(а) UniBomb - 22.9.2010, 13:20


--------------------
PM MAIL ICQ Skype   Вверх
northener
Дата 23.9.2010, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: нет
Всего: 20



Цитата(Тиль @  22.9.2010,  05:21 Найти цитируемый пост)
в том то и дело что незнаком... 

А для кого мы пишем описания, документацию и т.п.?
И это при том при всём, что писать документацию - нет более ненавистной работы!


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Тиль
Дата 30.9.2010, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 27.2.2006

Репутация: нет
Всего: нет



все нормально все читается за исключением одного: у меня в первом регистре лежит четырехзначтное число, вот оно то и не читается..
мне выдается такой ответ от прибора:
/1/3/32/8/50/165/0/0/0/170/0/132/0/0/0/0/0/248/0/209/255/255/6/92/0/9/0/0/0/0/0/0/0/0/33/50
я нашел программу производителя которая считывает с этого прибора, там показатели такие:см.аттач
сразу видно что все данные нашлись:
/1/3/32/8/50/0/165/0/0/0/170/0/132/0/0/0/0/0/248/0/209/255/255/6/92/0/9/0/0/0/0/0/0/0/0/33/50
а вот верхнее значение, которое стоит самым первым нет(2126)
в чем может быть дело? 
я так понял из этого ответа:
1-адрес устройства,3-функция чтения, 32-количество отданных байт, и вот в 8/50 и кроется это число 2126...только вот как прочитать его?


все очень оказалось просто:8*256+50=2098

Это сообщение отредактировал(а) Тиль - 30.9.2010, 14:03

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  __________.JPG 45,74 Kb
--------------------
Казалось нам пипец, оказалось что не казалось
PM MAIL   Вверх
UniBomb
Дата 1.10.2010, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 97



/*невнимательно прочитал последнее сообщение*/

Это сообщение отредактировал(а) UniBomb - 1.10.2010, 10:53


--------------------
PM MAIL ICQ Skype   Вверх
tyro
Дата 7.3.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 8.10.2006

Репутация: нет
Всего: нет



Подскажите пожалуйста, а как разделить фреймы (то есть определить начало следующего сообщения) при приеме информации по протоколу modbus rtu?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1138 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.