| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > Modbus обмен данными с весами СВЕДА |
| Автор: myshara 14.5.2014, 11:42 |
| Доброго времени суток всем форумчанам!!! Модераторов прошу не пинать меня ногами и не швырять в меня камни если тема не в том разделе. Очень нужна помощь в решении задачи. А то я уже совсем себе мозг сломал. Задача: Считать регистры с весового терминала СВЕДА ПВ-310 (http://oscada.org/forum/attachments/att91/) страница 54 часть 2 протокол modbus ascii II. ПРОТОКОЛ «MODBUS». В приборе реализован стандартный для промышленных контроллеров протокол MODBUS - режим ASCII, семибитный с кон- тролем четности/нечетности и одним стоповым битом либо без контроля четности с двумя стоповыми битами. Формат: : [адрес] [функция] [данные][LCR][0d,0a] Поле данных может отсутствовать. Адресное поле фрейма содержит два символа (ASCII). Утройству присваивается адрес в пределах от 1 до 247. Адрес 0 используется для широковещательной передачи, его распознает каждое устрой- ство в сети. Допустимая длина сообщения 256 байтов. Если подчиненное устройство не приняло запрос или в пакете была обнаружена ошибка, то пакет не возвращается. Если честно не могу понять как правильно сформировать запрос. пишу на VB: В программе три поля txt_addr, txt_fn, txt_data Формируем строку: sQwery = Chr("&h" & Hex(Form1.txt_addr.Text)) sQwery = sQwery & Chr("&h" & Hex(Form1.txt_fn.Text)) sQwery = sQwery & Chr("&h" & Hex(Form1.txt_data.Text)) считаем и добавляем LRC vLRC = LRC_16(sQwery) sQwery = sQwery & Chr("&h" & Hex(vLRC)) Добавляем : в начало и DA в конец sQwery = Chr("&h" & Hex(58)) & sQwery & Chr("&h" & Hex(218)) Подключаемся к COM и передаем запрос sQwery в ответ 0 класс для COM написан ранее и проверен на ИСТОК-ТМ Пример: txt_addr=5 txt_fn=3 txt_data1 LRC=9 sQwery=3A5319DA Com настроен ("2400,7,0,2") те в COM передаем - 3A5319DA Спасибо! |
| Автор: Romikgy 14.5.2014, 15:00 |
| так вопрос в чем? |
| Автор: ФедосеевПавел 14.5.2014, 20:42 |
| del |
| Автор: myshara 15.5.2014, 08:17 |
| Подключаемся к COM и передаем запрос sQwery в ответ 0 |
| Автор: ФедосеевПавел 15.5.2014, 16:06 |
| Мне кажется, что ты не то передаёшь в запросе. Например, адрес устройства - "5". А он не "5", а "05" - два байта. Номер функции - то же самое - не "3", а "03". Итого. Ещё не начиная передавать данные, уже передаём 5 байт ":0503". Кроме того, конец передачи CR и LF записываются "как есть", без трансляции в символы "0D0A", а прям сразу в виде символов с кодами 13 и 10. Кажется, так. Я не очень знаком с ascii вариантом. Один лишь раз работал - с rtu. Вот http://elektrokip.narod.ru/19.doc на перевод официального документа с английского на родной. Оттуда мои сведения о ":", CR и LF. И ещё http://autoworks.com.ua/setevye-resheniya/modbus-ascii/. Надеюсь, это поможет. |