Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 35

Тема: Библиотека unm.lib

  1. #21

    По умолчанию

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

  2. #22
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    вычитывать каждый байт,насчет слежения за приходом не знаю
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #23

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    вычитывать каждый байт,насчет слежения за приходом не знаю
    После отправки из ПЛК запроса данных во внешнее устройство делается пауза, далее начинается чтение данных. Если пауза перед чтением будет слишком велика, то часть данных, приходящих из внешнего устройства, можно потерять ?
    Последний раз редактировалось Newcomer; 16.11.2016 в 19:43.

  4. #24
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    все от кода зависит, после записи сразу переходят на чтение порта и даже если абонент долго не отвечает, можно организовать тайм-аут, но чтоб потерять данные это надо постараться
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #25

    По умолчанию



    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 сек.

    Правильно у меня все сделано ?
    Последний раз редактировалось Newcomer; 16.11.2016 в 21:14.

  6. #26
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    ну я бы поправил переменную count, сменил ей тип на DWORD, чтоб одинаково было с указателем. И дописал бы как в примерах таймаут
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #27

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну я бы поправил переменную count, сменил ей тип на DWORD, чтоб одинаково было с указателем. И дописал бы как в примерах таймаут
    Таймаут на что ?

  8. #28

    По умолчанию



    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) ?
    Последний раз редактировалось Newcomer; 17.11.2016 в 10:59.

  9. #29
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,243

    По умолчанию

    не надо его обнулять, это же указатель
    по поводу таймера, незнаю какой пример Вы брали, я бы рекомендовал просмотреть бибку меркурия, общая часть у Вас идентична, но не хватает анализа как принимаемых байт так и самой передачи данных. Невстречал протоколы, у которых неизвестна длинна данных, всегда можно определить когда заканчивается ответ
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  10. #30

    По умолчанию

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

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Похожие темы

  1. Библиотека для ПЧВ
    от evgeni293 в разделе ПЛК3хх
    Ответов: 2
    Последнее сообщение: 27.10.2016, 20:41
  2. Библиотека ST
    от иван50 в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 01.10.2015, 10:57
  3. Библиотека UNM
    от Сергей71 в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 19.01.2012, 18:15

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •