PDA

Просмотр полной версии : библиотека Unm и нулевые символы



vojt
22.02.2010, 13:20
Подскажите будет ли работать такой скрипт с библиотекой UNM и структурой RBDATE, чтоб вместо принятия строки принимать байты, тем самым обойти нулевые символы в строке:
<
VAR
LockDevise: RBDATA;
RB_0: BYTE; (*Принятые байты *)

RB_8: BYTE;
i2:INT;
END _VАR
….
(*побайтно а не в строку*)
CASE i2 OF
0:
dat:=GetByte(DeviceNumber :=id_dev);
RB_0:=LockDevise.data;
i2:=1;
1:
dat:=GetByte(DeviceNumber :=id_dev);
RB_1:=LockDevise.data;
i2:=2;


8:
dat:=GetByte(DeviceNumber :=id_dev);
RB_8:=LockDevise.data;
i2:=0
END_CASE
……
>
Вместо принятия строки:
<
FOR i:=1 TO 9 DO
dat:=GetByte(DeviceNumber :=id_dev);
rcv_str:=CONCAT(rcv_str,RBDATA_TO_STRING(dat));
END_FOR
>
Или ‘date’ в структуре ‘RBDATE’ не являеться байтом принятой посылки?

vojt
22.02.2010, 23:37
Не работает такой скрипт. Просто 'date’ постоянно равно нулю. Очевидно 'date’ в структуре ‘RBDATE’ не являеться байтом принятой посылки.
Похоже библиотека Unm не подоходит. С передачей проблем нет передаются и нулевые символы, а вот прочитать входную посылку ни как не удается.
С одной стороны библиотека Unm дает возможность использовать нестандартные протоколы, а с другой - через невозможность считать нулевые символы все сводится на нет.

Филоненко Владислав
23.02.2010, 12:30
да все там возможно.

vojt
23.02.2010, 16:42
владислав, подскажите, что я не так делаю.

vojt
23.02.2010, 16:58
посмотрите пример

vojt
03.03.2010, 23:35
только через Rs-232 удается добиться стабильного приема посылки, но нужно учитывать, что если в посылке будут нулевые символы 16#00, они в буфер не записываются а просто пропускаются. в некоторых темах пользователи подключались через ас-3м <плк-232-ас-3м-485-прибор>
в том случае если у внешнего прибора не было Rs-232 .
все-таки у Rs-485 в режиме приема где-то есть косяк.

Филоненко Владислав
04.03.2010, 08:51
Нулевые символы записываются и обрабатываются.
Но самими CoDeSys не отображаются и стираются строковыми функциями.

На диске ПЛК есть пример, на форуме примеров море. Но каждый не читает документацию и строем идет по граблям. Поиск по сайту рулит!

vojt
07.03.2010, 03:26
Спасибо Владислав, действительно похожая тема уже была на форуме:
http://www.owen.ru/forum/showthread.php?t=1193&page=2

RBDATA - структура из 2-х байт, в первом - принятый символ, во втором - флаги.

В приведённом коде:

IF n1_out THEN LockDevice(0);
SetByte(0, Line, LEN); ...
dd:=GetByte(0);
END_IF

dd - это указатель, его надо разименовать.

data:byte;

data:=dd^.data;
Переменной "data" присваивается значение принятого символа. Далее его можно складывать в массив, анализировать и пр.


Что-то более-мене прояснилось со структурой RBDATA. Но при запуске в режиме эмуляции в онлайн на "data:=dd^.data;" выдает ошибку
"Доступ по не существующему адресу. ПЛК остановлен". Почему?
Неужели работает только в ПЛК. Просто сейчас нет возможности попробовать на ПЛК.

vojt
27.03.2010, 21:04
Действительно "data:=dd^.data;" работает только в ПЛК. В режиме эмуляции выдает ошибку. В остальном все нормально читается по Rs-232. По Rs-485 читается, но проскакивают ошибки, точнее смещение байт принимаемой посылки. Считаю тему закрытой. Спасибо за помощь.