Показано с 1 по 10 из 21

Тема: Одновременный прием данных по двум UART в панель СП310

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #21

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Суть вызова этой функции у вас был из кода ST ? а я спрашиваю про СИ подобный язык для макросов, даже если он к этой же функции будет обращаться.
    Я обращался из макроса.

    Цитата Сообщение от melky Посмотреть сообщение
    для панели указано, что возможна реализация нестандартных протоколов. Имеется 2 порта RS485, как бы предполагается, что на каждом порту может быть два устройства
    RS485 с двумя устройствами на шине будет работать с панелью в режиме master. В этом режиме проблемы нет. Опросил датчики поочереди.
    Режим Modbus ASCII Master и позволяет вам реализовать свой протокол. Я и работаю по своему протоколу, отличному от modbus.

    Цитата Сообщение от melky Посмотреть сообщение
    Ведь сделав даже последовательные запросы к устройствам они могут отвечать разными длинами сообщений на порты.
    Не вижу тут проблемы. Опросили, в функцию Receive передали нужное вам количество байт и таймаут ожидания. Получили, перешли к опросу второго датчика.

    В общем, пока такой максимум удалось выжать с помощью забавного способа.
    У панели есть строб («пульсирующий бит») по адресу PSB3. 50 мс — вкл., 50 мс — выкл.
    Два макроса для двух независимых каналов включаются — 1-й по переднему фронту, 2-й по заднему.
    Функция Receive(xxx,DataReceive,1,0,0) с нулевыми таймаутами.
    Одновременный прием данных работает с одним «но»: байты должны следовать с интервалом не менее 50 мс.
    Пробовал разные пульсирующие биты (50, 150 и 500 мс) с разными таймаутами для Receive().
    Это максимум, который мне удалось выжать%)


    UPD: проблема вроде как решена. Еще потестирую.
    Абзац выше — и есть решение. Только надо принимать не по 1 байту, а по 28 (именно такого размера моя посылка).
    Таймауты нулевые, т. к. чтение происходит из внутренних буферов без ожидания.
    Не лишним будет добавить, что при старте панели один раз открываем порты (Enter) и больше их не закрываем (Leave).
    В случае, если пакеты приходят реже, чем раз в секунду, можно использовать пульсирующий бит PSB4 с периодом 1 сек. (500 мс — вкл., 500 мс — выкл.).

    EFrol, еще раз благодарю за подсказку.


    UPD2: дополнение по работе функции Receive().
    «Таймауты нулевые, т. к. чтение происходит из внутренних буферов без ожидания».
    Это не так работает. При нулевом таймауте функция уходит в бесконечное ожидание, пока буфер на заполнится до требуемого значения.
    Важное дополнение для понимание ее работы.
    В моем случае она ждет пакет, но при этом второй скрипт продолжает работать с приемом по второму каналу.
    Третий скрипт отсчитывает таймаут и ставит флаг «Нет связи».
    Панель вполне себе умеет в многозадачность, но только в рамках разных макросов.

    Отдельного внимания заслуживает вопрос передачи этого всего по Ethernet (пункт моего ТЗ). Тоже есть подводные камни, как оказалось.
    Если нет связи с Slave-устройством, то функция передачи данных Write() завешивает выполнение скрипта, внося неопределенные задержки.
    Требуется реализовывать арбитраж вызова ф-ии передачи по флагу, используя признак PSB54 (Ошибка связи с TCP Slave), чтобы при отсутствии связи не тормозилось выполнение макроса.
    Но это для другой темы
    Последний раз редактировалось zaurm; 27.08.2025 в 20:36.

Похожие темы

  1. Ответов: 26
    Последнее сообщение: 31.01.2023, 17:42
  2. Сенсорная панель СП310
    от Jerniks в разделе Панели оператора (HMI)
    Ответов: 9
    Последнее сообщение: 08.09.2022, 17:44
  3. Ответов: 21
    Последнее сообщение: 24.03.2020, 18:29
  4. Прием данных по Com порту
    от Klik в разделе ПЛК1хх
    Ответов: 24
    Последнее сообщение: 21.03.2008, 14:13

Ваши права

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