Байты, которые приходят в последовательный порт ПЛК от внешнего устройства сохраняются в буфере порта или никакого буфера нет и надо следить за приходом каждого байта ?
Вид для печати
Байты, которые приходят в последовательный порт ПЛК от внешнего устройства сохраняются в буфере порта или никакого буфера нет и надо следить за приходом каждого байта ?
вычитывать каждый байт,насчет слежения за приходом не знаю
все от кода зависит, после записи сразу переходят на чтение порта и даже если абонент долго не отвечает, можно организовать тайм-аут, но чтоб потерять данные это надо постараться
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) ?
не надо его обнулять, это же указатель
по поводу таймера, незнаю какой пример Вы брали, я бы рекомендовал просмотреть бибку меркурия, общая часть у Вас идентична, но не хватает анализа как принимаемых байт так и самой передачи данных. Невстречал протоколы, у которых неизвестна длинна данных, всегда можно определить когда заканчивается ответ