Просмотр полной версии : Библиотека UNM помогите разобраться.
Библиотека 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
По крайней мере у меня так работает.
приблрист count обнуляется за циклом
а по поводу бибки, каждый байт принимается раз в цикл плк, по этому вместо while в примерах используется IF
рабочий кусочек кода можете показать? голову всю сломал уже... вроде все ясно , но нифига не работает...(
и ещё вопрос. как упорядочить все? есть байт который означает начало сообщения и есть байт конца передачи. как все упорядочить?
как сложить все по порядку?
использовать кольцевой буфер? как есго реализовать в codesys?
А пример опроса счетчика Меркурий смотрели ? как там реализовано не помню... Пример как раз использует UNM
там запрос ответ. а у меня устройство спрашивать не надо, оно само сыпит сообщения....
а в чем разница непосредственно при приеме ответа ? кроме того, что нужна проверка что вы не с середины принимаете... паузы ведь между посылками наверняка есть...
вот я и не могу понять как мне начать прием именно с начала?
попробовал вот так выхватывать сообщения :
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
ничего хорошего пока из этого не вышло
просто документации нет на прибор(джойстик) он просто сыпит сообщения и все. начало и конец разглядеть можно.
Ну так когда вы разглядели конец (увеличилась пауза) и начните читать с начала...
мысль понял) а в коде как это будет выглядеть,не пойму чот...
Никитака
03.07.2017, 14:58
Добрый день .Использую библиотеку UNM. Аналогичная проблема необходимо получить значение с динамометра GSE 350.Подключил его по 485 интерфейсу. Высылать что то в него не требуется он постоянно шлет в сеть значение что на индикаторе. Благодаря проведенным часам на форуме, получилось принимать на контроллер посылку поэлементно. Эти элементы я склеиваю в строку.Как мне синхронизировать прием посылки чтобы в итоге получилась строка где все элементы на сових местах. После этого я хочу вырезать нужный мне кусок строки (только значение).
в мануале нормально описано с какого символа начинается посылка(STX) и чем заканчивается(CR), просто в потоке данных находите начальный символ и от него начинаете наполнять строку пока не придет конечный символ
Кто может вообще в целом все это объяснить? Что-то очень сложно разобраться
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot