-
Библиотека UNM, отправка и получение запроса.
Здравствуйте.
Все никак не могу разобраться с отправкой и получение посылок в rs485 с помощью библиотеки UNM.
В мурзилке на прибор написано следующее:
Есть 4 основные команды:
I - Десятичный код - 73 - Выдать идентификационный код устройства.
Т - Десятичный код -84 - Тест на эхо.
. - Десятичный код - 46 - Выдать ответ по бит маске.
К - Десятичный код - 75 - Имитация нажатий кнопок.
В свою очередь команда 46 имеет байт-параметр:
Бит 0 - Код АЦП
Бит 1 - Текущее значение брутто
Бит 2 - Текущее значение нетто
Бит 3 - Текущее значение тары
Бит 4 - Ноль
Бит 5 - Биты состояний
Бит 6 - Индикация (0-флаг мигания,1-позиция точки,2-состояние веса,3-светодиоды,4-9 - маски семисегментных индикаторов)
Бит 7 -Статус RS485 (0-битмаска ошибки,1-количество ошибок связи,2-количество принятых пакетов)
Пример:
Посылать в прибор нужно:
SOH <0x21> <0x20> <46> <1> <0xD1> ETX, где
0х21 - Адрес кому(1)
0х20 - Адрес от кого(0)
46 - Адрес команды "ответ по бит-маске"
1 - маска (только поле "Код АЦП")
0хD1 - значение CRC
В свою очередь на это прибор должен ответить:
SOH <0x20> <0x21> <46> <1> DLE <0> <0x6D> <0x52> <0x11> ETX,где
До DLE тоже самое что было в запросе,
DLE <0> - 0xFF - бит маска новостей
0x6D - Поле Код АЦП , старший бит
0x52 - Поле Код АЦП , младший бит
0х11 - CRC.
Кто-нибудь может подсказать как должна выглядеть правильная посылка?
Вообще необходимо получать вес из прибора.
-
1. Что такое SOH,DLE,ETX?
2. Мурзилку не выложите, многое может стать яснее.
-
SOH u ETX - Ограничители пакета, тоесть начало и конец пакета
DLE - служит для возможности передачи зарегистрированные символы как данные.
Вобщем часть мурзилки я написал выше. А полная версия вот:
Последний раз редактировалось приборист; 04.01.2010 в 13:45.
-
Любят же извращаться...
Значит так.
В строке с CoDeSys забиваете нужные значения через $xx, где xx - требуемый 16-ти ричный код спецсимвола. И отправляете эту строку в порт. Приём - читаете побайтно и скрадываете в буфер в соотв. с байтами - ограничителями пакета.
-
Владислав, так я так понимаю команда будет выглядеть так:
SetByte(0,'$2e',1); (*Отправляем в прибор код . *)
GetByte(0);(*Получаем от прибора ответ*)
Так?
-
-
Я сделал так :
var
a:dword;
b:POINTER TO rbdATA;
end_var;
LockDevice(0);
a:=SetByte(0,'$2E',1);
b:=GetByte(0);
В итоге
a=1 и иногда перескакивает в значение a=4294967295
b=<00000000>.
В чем поблема и почему ничего не показывает я понять не могу((
-
SetByte - возвращает число переданных символов, если возвращает -1, то это значит вы слишком много символов положили в буффер - он переполнился. Послали запрос - дождитесь ответа или разумного таймаута 50-150 мс. И только после этого новый запрос
GetByte - возвращает указатель на след. символ.
Если символа нет - то указатель нулевой, если есть - отличный от нуля, его надо разименовать и получить доступ к данным и флагам. Разименовывание через ^
-
Ну в общих чертах оно вроде понятно, но все такие непонимаю почему он нехочет отвечать.
Сейчас пробую так:
P:POINTER TO RBDATA;
IF
SetByte(0,'$2E',1)=1 THEN
P:=GetByte(0);
ELSE
error:=1;
end_if;
И запускаю пошагово. Получается что байт 2E он передает в прибор, а в ответ Нули.
По идее то при отправке единичного запроса он должен хоть чтото ответить.
И еще не дают мне покоя эти SOH, ETX,DLE. Почему мы отбрасываем их? Может быть прибор просто непонимает пустые 2Е?
-
Судя по мурзилке SOH, ETX,DLE - это символы , к-е надо тоже передавать.
Учитывая мурзилку Вам надо добавить SOH, 2 адреса, команду 2Е+1 байт данных, CRC и ETX, итого 7байт.
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
-
Правила форума