Не пойму как при работе с библиотекой unm.lib выбрать порт и задать его параметры.
Вид для печати
Не пойму как при работе с библиотекой unm.lib выбрать порт и задать его параметры.
первый созданный будет нулевой далее плюс один
Понял, в конфигураторе.
Мне надо работать через RS-232. Сделал так. Это правильно ?
да вроде правильно все, кстати есть описалово к бибке http://www.owen.ru/catalog/codesys_v2/67395347 там вроде можно порт и из самой бибки настроить, но я пользовался настройками конфигуратора всегда
Связь не рвется при работе через unm.lib ?
Вот настройки порта. Frame orient я правильно задал ?
RTU или ASCII ни на что не влияет. Я предпочитаю 38400, поэтому не знаю будут ли ошибки на более высоких скоростях, у меня что на ПЛК100 проблем небыло, как бы его некоторые не ругали
Ясно, спасибо.
Библиотека UNM
Добрый вечер.
Необходимо послать во внешнее устройство через RS-232 (номер порта 1) ПЛК100 команду с кодом FEA1.
Правильно ли записана функция Передать в интерфейс строку байт данных: SetByte(1, 'FEA1', 4)
Или надо записать так: SetByte(1, '$FE$A1', 4)
FEA1 это набор символов или WORD?
Я обычно держал константный массив байт для каждой команды, а в функцию отправлял через указатель на строку, гарантированно работает. Но для такого вида тоже должно работать
Так как правильно будет отправить в порт два байта FE и A1 - SetByte(1, 'FEA1', 4) или SetByte(1, '$FE$A1', 4) ?
stuff : ARRAY[0..1] OF BYTE := 16#FE,16#A1
ptr : POINTER TO STRING;
*****
ptr :=ADR(stuff);
SetByte(1, ptr^, 2);
как то так, за комп.орфографию не ручаюсь, по памяти сочинил
А может должно быть не ptr: POINTER TO STRING; а ptr: POINTER TO BYTE;
stuff это же байтовый массив.
нет, в описании функции что сказзано, вторым аргументом идет строка, значит подавать надо тоже строку, а формировать её можно хоть из массива байт, хоть содержимое файла передать, хоть банально строку
Байты, которые приходят в последовательный порт ПЛК от внешнего устройства сохраняются в буфере порта или никакого буфера нет и надо следить за приходом каждого байта ?
вычитывать каждый байт,насчет слежения за приходом не знаю
все от кода зависит, после записи сразу переходят на чтение порта и даже если абонент долго не отвечает, можно организовать тайм-аут, но чтоб потерять данные это надо постараться
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 сек.
Правильно у меня все сделано ?
ну я бы поправил переменную count, сменил ей тип на DWORD, чтоб одинаково было с указателем. И дописал бы как в примерах таймаут
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) ?
не надо его обнулять, это же указатель
по поводу таймера, незнаю какой пример Вы брали, я бы рекомендовал просмотреть бибку меркурия, общая часть у Вас идентична, но не хватает анализа как принимаемых байт так и самой передачи данных. Невстречал протоколы, у которых неизвестна длинна данных, всегда можно определить когда заканчивается ответ
Здравствуйте!
Подскажите пример чтения данных по RS-485 по нестандартному протоколу (надо читать данные с датчиков температуры-влажности th-485). Чnо-то никак разобраться с библиотекой не могу, нужен пример. Спасибо.