PDA

Просмотр полной версии : Библиотека UNM



Сергей71
13.04.2007, 18:24
Подскажите как передавать и принимать двоичные данные.

Пример.
Передать 1 2 9 0 0 3 ('$01$02$09$00$00$03')
Принять 2 1 9 0 0 3 ('$02$01$09$00$00$03')
и тд.

UNM передает и принимает только строку. Если в середине двоичных данных ноль, то строка заканчивается.

Как в строку вставить двочное число.
Пример
str:string := '$01$02$09$00$00$03';
dat:byte := 10;
надо получить '$01$02$09$00$00$03'+10 = '$01$02$09$00$00$03$0A'

незарегистрированный
15.04.2007, 13:21
Примерно так
a:pointer to array [0...2000] of byte;
x:string(255);
a:=ADR(X);
a[4]:=0;

Филоненко Владислав
16.04.2007, 08:46
1. SetByte принимает номер устройства, указатель на массив байт (в его качестве может выступать и строка и число байт, к-е необходимо передать.
UNM передает и принимает только строку. Если в середине двоичных данных ноль, то строка заканчивается. Не UNM обрывает передачу, а функции копирования строк=> не не надо их использовать, воспользуйтесь методом в предыдущем сообщении

Anis
27.05.2008, 14:17
Подскажите пожалуйста на простом примере как при помощи б.UNM и
указателей передать строку имеющую нули в том числе. SetByte всегда
просит STRING.

незарегистрированный
27.05.2008, 18:09
Подскажите пожалуйста на простом примере как при помощи б.UNM и
указателей передать строку имеющую нули в том числе. SetByte всегда
просит STRING.

Где-то так
a: array [0..255] of byte;
p:pointer to string;
p:=adr(a);
len:dword:=255;
SetByte(p,len);

Anis
27.05.2008, 19:50
Спасибо, попробуем.

EvgenKinchin
23.12.2009, 12:56
Добрый день.

дабы не плодить однотипные темы, подниму эту.
никак не получается реализовать обмен данными с помощью библиотеки UNM.
пока пытаюсь элементарно отправить некое сообщение (любое) в порт Rs-485 и принять его на ПК (в качестве преобразователя rs-485 в rs-323 icp con i-7520).
итак, сам код:


FUNCTION_BLOCK unmPort1
VAR_INPUT
disable: BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
res: DWORD;
res1:INT;
res2: DWORD;
sended: BOOL := FALSE;
END_VAR

IF NOT disable AND NOT sended THEN
res:=LockDevice(0);
res1:=DWORD_TO_INT(SetByte(0, 'hello', 5));
sended:=TRUE;
res2:=ReleaseDevice(0);
END_IF;

//флаг sended для того, чтобы код выполнился лишь один раз, а то на форуме были упоминания о возможном переполнении буфера.

в конфигурации ПЛК добавлен universal network module, интерфейс rs-485, режим ascii.

в res и res2 при выполнении записывается единица, т.е. захват и освобождение порта происходят успешно.
а вот в res1 -1, и, соответственно, мое приветствие ПК не отсылается =( а ведь так хочется с ним поздороваться.

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

SergeyNG
24.12.2009, 09:49
Может подождать немного с ReleaseDevice(0) или вообще не использовать.
Никогда не использовал Release, раз захватил и работай пока контроллер не выключат.

EvgenKinchin
28.12.2009, 13:20
нашел сегодня время продолжить воевать (ну или пытаться подружиться) с плк150 и UNM.
залил в него последнюю стабильную версию прошивки (соответствующий таргет установил).
теперь в порт уходят нули. лучше чем ничего, но хуже, чем хотелось бы.
в res1 записывается количество отправленных байт (соответствует реальности).

что с ReleaseDevice, что без - результат не меняется.

EvgenKinchin
28.12.2009, 14:09
если б я перекрестил контроллер, то сказал бы "вот что крест животворящий делает". а так буду думать, какого лешего пошел обмен. все в порядке. самопроизвольно.

zin_starch
19.01.2012, 18:15
Доброго дня участникам!
Кто-то сможет ответить - удалось ли отправить в порт посылку, содержащую $00 в строке, используя UNM.lib? Изучение примеров (http://www.owen.ru/forum/showthread.php?p=68124&highlight=%E1%E8%E1%EB%E8%EE%F2%E5%EA%E0+UNM#post6 8124) использования библиотеки UNM пока не помогает справиться с задачей отсылки строки, содержащей такое включение. Происходит обрезание посылки по этому символу $00. Кодесис 2.3 и библиотека UNM c диска, идущего вместе с ПЛК 160, выпуска ноября 2011г.