PDA

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



Newcomer
12.11.2016, 18:30
Не пойму как при работе с библиотекой unm.lib выбрать порт и задать его параметры.

capzap
12.11.2016, 18:34
первый созданный будет нулевой далее плюс один

Newcomer
12.11.2016, 18:36
первый созданный будет нулевой далее плюс один

А параметры порта как задать ?

Newcomer
12.11.2016, 18:39
Понял, в конфигураторе.

Newcomer
12.11.2016, 18:43
Мне надо работать через RS-232. Сделал так. Это правильно ?

capzap
12.11.2016, 18:46
да вроде правильно все, кстати есть описалово к бибке http://www.owen.ru/catalog/codesys_v2/67395347 там вроде можно порт и из самой бибки настроить, но я пользовался настройками конфигуратора всегда

Newcomer
12.11.2016, 18:56
Связь не рвется при работе через unm.lib ?

Newcomer
12.11.2016, 19:01
Вот настройки порта. Frame orient я правильно задал ?

capzap
12.11.2016, 20:30
RTU или ASCII ни на что не влияет. Я предпочитаю 38400, поэтому не знаю будут ли ошибки на более высоких скоростях, у меня что на ПЛК100 проблем небыло, как бы его некоторые не ругали

Newcomer
12.11.2016, 20:57
Ясно, спасибо.

Newcomer
15.11.2016, 18:29
Библиотека UNM

Добрый вечер.

Необходимо послать во внешнее устройство через RS-232 (номер порта 1) ПЛК100 команду с кодом FEA1.

Правильно ли записана функция Передать в интерфейс строку байт данных: SetByte(1, 'FEA1', 4)

Или надо записать так: SetByte(1, '$FE$A1', 4)

capzap
15.11.2016, 18:34
FEA1 это набор символов или WORD?

Newcomer
15.11.2016, 18:36
FEA1 это набор символов или WORD?

Это два байта (FE и A1), которые надо послать в порт.

capzap
15.11.2016, 18:46
Я обычно держал константный массив байт для каждой команды, а в функцию отправлял через указатель на строку, гарантированно работает. Но для такого вида тоже должно работать

Newcomer
15.11.2016, 19:23
Так как правильно будет отправить в порт два байта FE и A1 - SetByte(1, 'FEA1', 4) или SetByte(1, '$FE$A1', 4) ?

capzap
15.11.2016, 19:37
stuff : ARRAY[0..1] OF BYTE := 16#FE,16#A1
ptr : POINTER TO STRING;
*****
ptr :=ADR(stuff);
SetByte(1, ptr^, 2);

как то так, за комп.орфографию не ручаюсь, по памяти сочинил

Newcomer
15.11.2016, 19:41
stuff : ARRAY[0..1] OF BYTE := 16#FE,16#A1
ptr : POINTER TO STRING;
*****
ptr :=ADR(stuff);
SetByte(1, ptr^, 2);

как то так, за комп.орфографию не ручаюсь, по памяти сочинил

А ptr^ что означает ?

capzap
15.11.2016, 20:06
А ptr^ что означает ?

обратное преобразование из указателя в строку

Newcomer
15.11.2016, 20:14
А может должно быть не ptr: POINTER TO STRING; а ptr: POINTER TO BYTE;

stuff это же байтовый массив.

capzap
15.11.2016, 20:28
нет, в описании функции что сказзано, вторым аргументом идет строка, значит подавать надо тоже строку, а формировать её можно хоть из массива байт, хоть содержимое файла передать, хоть банально строку

Newcomer
16.11.2016, 16:49
Байты, которые приходят в последовательный порт ПЛК от внешнего устройства сохраняются в буфере порта или никакого буфера нет и надо следить за приходом каждого байта ?

capzap
16.11.2016, 17:49
вычитывать каждый байт,насчет слежения за приходом не знаю

Newcomer
16.11.2016, 19:38
вычитывать каждый байт,насчет слежения за приходом не знаю

После отправки из ПЛК запроса данных во внешнее устройство делается пауза, далее начинается чтение данных. Если пауза перед чтением будет слишком велика, то часть данных, приходящих из внешнего устройства, можно потерять ?

capzap
16.11.2016, 19:55
все от кода зависит, после записи сразу переходят на чтение порта и даже если абонент долго не отвечает, можно организовать тайм-аут, но чтоб потерять данные это надо постараться

Newcomer
16.11.2016, 20:16
otvet_RB: POINTER TO RBDATA; (*Структура ответа *)
otvet: ARRAY [0..127] OF BYTE := 128(0); (*Ответ *)
p:POINTER TO BYTE; (* Указатель *)
count: WORD; (* Число принятых байт *)

90: count := 0; N := 100;

100: (* Чтение данных *)
EN := TRUE; SET := UT_5s; (* Запустили таймер *)
otvet_RB := GetByte(0);
IF (otvet_RB > 0) THEN (* Если получили новый байт, то собираем его в результат и ведем подсчет принятых байт *)
p:=ADR(otvet) + count;
p^ := otvet_RB^.data;
count := count + 1;
END_IF
IF (OUT1) THEN EN := FALSE; N := 110; END_IF

Сделал чтение данных из порта по аналогию с примером.

Предполагается, что внешнее устройство выдает данные не более 5 сек.

Правильно у меня все сделано ?

capzap
16.11.2016, 22:20
ну я бы поправил переменную count, сменил ей тип на DWORD, чтоб одинаково было с указателем. И дописал бы как в примерах таймаут

Newcomer
17.11.2016, 09:55
ну я бы поправил переменную count, сменил ей тип на DWORD, чтоб одинаково было с указателем. И дописал бы как в примерах таймаут

Таймаут на что ?

Newcomer
17.11.2016, 10:55
otvet_RB: POINTER TO RBDATA; (*Структура ответа *)
otvet: ARRAY [0..127] OF BYTE := 128(0); (*Ответ *)
p:POINTER TO BYTE; (* Указатель *)
count: WORD; (* Число принятых байт *)

90: count := 0; N := 100;

100: (* Чтение данных *)
EN := TRUE; SET := UT_5s; (* Запустили таймер *)
otvet_RB := GetByte(0);
IF (otvet_RB > 0) THEN (* Если получили новый байт, то собираем его в результат и ведем подсчет принятых байт *)
p:=ADR(otvet) + count;
p^ := otvet_RB^.data;
count := count + 1;
END_IF
IF (OUT1) THEN EN := FALSE; N := 110; END_IF


У меня в программе циклически повторяется шаг 100. На этом шаге заполняется массив otvet. Не пойму как сделать чтобы в каждом цикле массив otvet заполнялся начиная с нулевого элемента. Тут дело в строке p:=ADR(otvet) + count;, count у меня обнуляется. А как обнулить ADR(otvet) ?

capzap
17.11.2016, 11:09
не надо его обнулять, это же указатель
по поводу таймера, незнаю какой пример Вы брали, я бы рекомендовал просмотреть бибку меркурия, общая часть у Вас идентична, но не хватает анализа как принимаемых байт так и самой передачи данных. Невстречал протоколы, у которых неизвестна длинна данных, всегда можно определить когда заканчивается ответ

Newcomer
17.11.2016, 11:37
не надо его обнулять, это же указатель

Все таки как сделать чтобы каждый раз массив otvet заполняться начиная с нулевого элемента ? Как обнулить индекс этого массива ?

capzap
17.11.2016, 11:40
Все таки как сделать чтобы каждый раз массив otvet заполняться начиная с нулевого элемента ? Как обнулить индекс этого массива ?
делать count равным нулю и всё

Newcomer
17.11.2016, 11:55
делать count равным нулю и всё

ADR(otvet) всегда указывает на нулевой элемент массива ?

capzap
17.11.2016, 12:08
ADR(otvet) всегда указывает на нулевой элемент массива ?

для пущей гарантии я выставляю иногда так ADR(otvet[0])

Newcomer
17.11.2016, 12:33
для пущей гарантии я выставляю иногда так ADR(otvet[0])

Мне то же такое на ум пришло.

repinandrey
20.11.2018, 18:27
Здравствуйте!
Подскажите пример чтения данных по RS-485 по нестандартному протоколу (надо читать данные с датчиков температуры-влажности th-485). Чnо-то никак разобраться с библиотекой не могу, нужен пример. Спасибо.