PDA

Просмотр полной версии : Библиотека UNM помогите разобраться.



канавал
13.12.2016, 11:35
Библиотека UNM помогите разобраться. с передачей разобрался, никак прием не могу осилить. вроде все понятно а на практике не работает ничего.
надо принимать сообщения по 22 байта длиной. запросы отсылвть не надо, просто принимать ответы, устройство сыпит их постоянно.
делаю вот так:


otvet_RB: POINTER TO RBDATA; (*Структура ответа*)
otvet: ARRAY [0..21] OF BYTE := 22(0); (*Ответ*)
count:INT:=0; (*Число принятых байт*)


otvet_RB:=GetByte(0);
WHILE otvet_RB<>0 DO
otvet_RB:=GetByte(0);
otvet[count]:=otvet_RB^.data;
count:=count+1;

END_WHILE

count:=0;


что я делаю не правильно?

приборист
13.12.2016, 11:41
Зачем в каждом цикле count:=0?

Надо буффер заполнить, потом разобрать.
Что-то из разряда
If count>20 then
(*разбираем буфер*)
count:=0;
end_if

Но по-хорошему надо буффер делать больше ожидаемой строки (на случай возникновения мусора), потом разбирать пришедший пакет с учетом CRC и т.д.

И цикл while мне кажется не нужен.
В примере же было так:


otvet_RB:= GetByte(0);
IF otvet_RB >0 THEN
p:=ADR(otvet)+count;
p^:=otvet_RB^.data;
count:=count+1;
END_IF

По крайней мере у меня так работает.

capzap
13.12.2016, 11:53
приблрист count обнуляется за циклом

а по поводу бибки, каждый байт принимается раз в цикл плк, по этому вместо while в примерах используется IF

канавал
13.12.2016, 11:57
рабочий кусочек кода можете показать? голову всю сломал уже... вроде все ясно , но нифига не работает...(


и ещё вопрос. как упорядочить все? есть байт который означает начало сообщения и есть байт конца передачи. как все упорядочить?

канавал
13.12.2016, 15:34
как сложить все по порядку?

канавал
14.12.2016, 09:13
использовать кольцевой буфер? как есго реализовать в codesys?

melky
14.12.2016, 09:22
А пример опроса счетчика Меркурий смотрели ? как там реализовано не помню... Пример как раз использует UNM

канавал
14.12.2016, 10:09
там запрос ответ. а у меня устройство спрашивать не надо, оно само сыпит сообщения....

melky
14.12.2016, 10:47
а в чем разница непосредственно при приеме ответа ? кроме того, что нужна проверка что вы не с середины принимаете... паузы ведь между посылками наверняка есть...

канавал
14.12.2016, 11:08
вот я и не могу понять как мне начать прием именно с начала?

попробовал вот так выхватывать сообщения :

IF otvet_RB >0 THEN
p:=ADR(otvet)+count;
p^:=otvet_RB^.data;
count:=count+1;
END_IF

IF otvet[0]=new AND otvet[21]=end THEN

FOR j:=0 TO 21DO
out[j]:=otvet[j];
END_FOR

END_IF
ничего хорошего пока из этого не вышло

просто документации нет на прибор(джойстик) он просто сыпит сообщения и все. начало и конец разглядеть можно.

melky
14.12.2016, 11:46
Ну так когда вы разглядели конец (увеличилась пауза) и начните читать с начала...

канавал
14.12.2016, 12:57
мысль понял) а в коде как это будет выглядеть,не пойму чот...

Никитака
03.07.2017, 14:58
Добрый день .Использую библиотеку UNM. Аналогичная проблема необходимо получить значение с динамометра GSE 350.Подключил его по 485 интерфейсу. Высылать что то в него не требуется он постоянно шлет в сеть значение что на индикаторе. Благодаря проведенным часам на форуме, получилось принимать на контроллер посылку поэлементно. Эти элементы я склеиваю в строку.Как мне синхронизировать прием посылки чтобы в итоге получилась строка где все элементы на сових местах. После этого я хочу вырезать нужный мне кусок строки (только значение).

capzap
03.07.2017, 15:48
в мануале нормально описано с какого символа начинается посылка(STX) и чем заканчивается(CR), просто в потоке данных находите начальный символ и от него начинаете наполнять строку пока не придет конечный символ

petya35
21.10.2017, 16:58
Кто может вообще в целом все это объяснить? Что-то очень сложно разобраться