Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (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/.

Надеюсь, это поможет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)