Перейти к содержанию
    

Вот есть в RTU правило, между двумя фреймами внутри посылки не должно быть более 1.5 на данной скорости.

Окончание посылки определять по таймауту 3.5 после передачи последнего фрейма.

   1. Есть мнение что 1.5 это для того кто передаёт а 3.5 для того кто принимает а разница это некий "гистерезис". И тот кто принимает отслеживает лишь таймаут 3.5

   2. Другое мнение, если между фреймами внутри посылки была задержка более 1.5 (но мене 3.5), то принимающий всё же должен забраковать посылку. Тогда тот кто принимает должен отслеживать два таймаута 1.5 и 3.5.

Хотелось бы услышать аргументированные мнения по этому поводу, желательно с ссылками на документацию на https://modbus.org/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, C2000 сказал:

   2. Другое мнение, если между фреймами внутри посылки была задержка более 1.5 (но мене 3.5), то принимающий всё же должен забраковать посылку. Тогда тот кто принимает должен отслеживать два таймаута 1.5 и 3.5.

А если передающий чётко выдержал правило "1.5 бита", но из-за рассогласования тактирующих частот у приёмника получилось >1.5 и он забраковал (ни за что)? 

Поэтому имхо - всё же п.1.

PS: Аргументировать не стану.  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jcxz said:

Поэтому имхо - всё же п.1.

Я двумя руками за вариант 1))) Выглядит логичнее да и в реализации проще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрим сюда: https://modbus.org/specs.php

в настоящее время действует Modbus Serial Line Protocol and Implementation Guide V1.02

в котором в разделе 2.5.1.1 MODBUS Message RTU Framing есть недвусмысленное требование к приёмнику отслеживать оба таймаута.

Уже обсуждали эту тему:

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=126198

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Действительно все однозначно. Именно такой ответ и нужен был)

Вопрос снят. Спасибо!

Другой вопрос как это реализовать, минимально нагрузив ядро?

В некоторых STM32 есть аппаратный таймер на таймаут UART-а, но он один, как правильно второй прикрутить?

Кто как реализовывал? Может есть ссылки на GitHub где код (правильный) портированный под различные STM32?

 

И еще, таймаут между запросом и ответом никак не регламентируется? Можно устанавливать любое значение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, C2000 сказал:

но он один, как правильно второй прикрутить?

заводят рх на внешний вход таймера, как правило я такое видел - редкий микроконтролер имеет таймер приемлемый на уарте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

52 минуты назад, AlexRayne сказал:

заводят рх на внешний вход таймера, как правило я такое видел - редкий микроконтролер имеет таймер приемлемый на уарте

А зачем внешний вход Таймера и как следствие не разумно использованная нога контроллера под это дело? Софтово нельзя делать все тоже самое?

3 часа назад, C2000 сказал:

В некоторых STM32 есть аппаратный таймер на таймаут UART-а

А какой этот Таймер не подскажите? Я вот новичок пока что в STM32 и не встретил, что называется, такой Таймер. Но я когда-то спрашивал у людей, вроде бы давно знакомых с STM32, про подобные аппаратные возможности для лова таймаута в UART-приеме и никто не говорил мне что такой Таймер есть. Может не там и не у тех спрашивал. В PIC32MX/MZ нет таких аппаратных вещей и там я софтово ловил (как написал выше) этот таймаут. Подскажите или намекните если можете тут. Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, AleksBak сказал:

не разумно использованная нога контроллера под это дело? Софтово нельзя делать все тоже самое?

если у вас под завязку ноги - значит неразумно подобран контролер.

софтово сделать тоже - это гемор, и ннпредсказуемые пенальти. и не всякий контролер выдюжит.

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

1 час назад, AleksBak сказал:

никто не говорил мне что такой Таймер есть

он гдето есть, гдето нет. гдето он умеет 3.5символа засеч, гдето только 4 или только 3, или както еще. если есть таймер с точностью до бита - то это конечно большое облегчение.

Изменено пользователем AlexRayne

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, AlexRayne сказал:

софтово сделать тоже - это гемор, и ннпредсказуемые пенальти. и не всякий контролер выдюжит.

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

Здесь имелось ввиду (мной), что "софтово" - т.е. используется тот же самый Таймер на генерацию через чуть больше чем 3.5 символа прерывания и при приеме очередного байта по каналу ModBus мы каждый раз обнуляем счетчик этого Таймера (можем и в соотв. прерывании DMA). Т.е. буквально 1-2 команды контроллера тратим на это и очень быстрый вход в прерывание. Если очередного байта нет при приеме, то тут же, следом, появляется прерывание Таймера и в нем можем и проанализировать и принять соотв. решение. Когда ног контроллера под завязку, то вполне норм. решение по-моему.

Кроме того, у PIC32MX/MZ есть возможность одновременного внутреннего подключения 2-х входов от каких-то периферийных модулей - например RX входа UART и входа от Таймера на один и тот же физический пин контроллера. Т.е. опять-таки не используется не разумно лишняя нога контроллера. В STM32 я такой возможности не обнаружил к сожалению (но у STM32 есть много др. своих "плюшек").

5 часов назад, AlexRayne сказал:

он гдето есть, гдето нет. гдето он умеет 3.5символа засеч, гдето только 4 или только 3, или както еще. если есть таймер с точностью до бита - то это конечно большое облегчение.

В каком конкретном контроллере из серии STM32 Вы его видели. Это интересная возможность, но сколько не спрашивал пока что все пишут "что вроде есть и где-то там", а конкретно так и не понял где и в каком контроллере. Спасибо.

11 часов назад, C2000 сказал:

В некоторых STM32 есть аппаратный таймер на таймаут UART-а

Вот где он? В каком конкретном контроллере Вы его видели? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, AleksBak said:

Вот где он? В каком конкретном контроллере Вы его видели? Спасибо.

Есть например в STM32F031

В RM пункт: 27.5.8 Modbus communication using USART

Но он как  уже говорил отслеживает только один таймаут, более 1.5t. Второй 3.5t все же придется отдельно отслеживать.

Удобнее конечно было бы с одним таймаутом работать, не понимаю зачем нужен второй - сильно всё усложняет, но в стандарте чётко указан алгоритм.

3 hours ago, AleksBak said:

Здесь имелось ввиду (мной), что "софтово" - т.е. используется тот же самый Таймер на генерацию через чуть больше чем 3.5 символа прерывания и при приеме очередного байта по каналу ModBus мы каждый раз обнуляем счетчик этого Таймера (можем и в соотв. прерывании DMA). Т.е. буквально 1-2 команды контроллера тратим на это и очень быстрый вход в прерывание. Если очередного байта нет при приеме, то тут же, следом, появляется прерывание Таймера и в нем можем и проанализировать и принять соотв. решение. Когда ног контроллера под завязку, то вполне норм. решение по-моему.

По прерыванию DMA не совсем понимаю как это можно?

А входить в прерывание по каждому принятому байту, конечно можно на скорости 9600)) На больших скоростях будет заметно нагружать CPU.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну если скорость небольшая, можно и по прерываниям работать. Так проще. Но при желании можно и DMA прикрутить.
Я никогда не использовал в STM32 возможность отслеживания символьной тишины на периферии UART. Но можно придумать с таймером.
Заводим сигнал RX одновременно на вход RX UART-периферии и на внешний вход (например, ETR) таймера (пусть TIM1).
Таймер настраиваем так, чтобы передний фронт ETR сбрасывал счетчик. Период таймера настраиваем на 3.5 символа для выбранной скорости UART.
Также настраиваем один из каналов сравнения этого же таймера на таймаут 1.5 символа для выбранной скорости UART. Разрешаем прерывания.
По первому принятому символу по UART запускаем таймер и (либо/либо):

  • запрещаем прерывания по UART и запускаем DMA на прием, если хочется работать через DMA;
  • складываем символ в буфер, дожидаясь очередного; это работа по прерываниям.

В любом случае рано или поздно придут события 'TIMEOUT 1.5' и 'TIMEOUT 3.5' по порядку. Они возможны с расстоянием по времени между ними.
Тут лишь необходимо знать следующее. Если в потоке байт произошел 'TIMEOUT 1.5', а до 'TIMEOUT 3.5' пришел еще один - вся посылка должна быть отброшена.
Если в потоке байт произошел 'TIMEOUT 1.5', а после него 'TIMEOUT 3.5' - кадр принят корректно. В этом случае его можно будет обрабатывать.
Все байты, пришедшие в интервале от 1.5 до 3.5 символов тишины приведут к последовательности 'TIMEOUT 1.5', 'TIMEOUT 1.5', ..., 'TIMEOUT 1.5', 'TIMEOUT 3.5'.
Такие кадры тоже придется сбросить - тут произойдет как бы "синхронизация" с потоком. Ну и, естественно, в нужных местах выключать таймер и DMA.

Сам я с MODBUS не работал, но, ИМХО, реализовать обнаружение двух интервалов вполне реально. Что с ними делать тоже, в целом, понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там проще немного делали: по таймауту1.5 заканчивали прием. И обрабатывали пакет

По таймауту3.5 - запускали ответ в шину, если есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 часов назад, C2000 сказал:

В RM пункт: 27.5.8 Modbus communication using USART

Но он как  уже говорил отслеживает только один таймаут, более 1.5t. Второй 3.5t все же придется отдельно отслеживать.

Что-то не то Вы там в RM вычитали.

У F031 USART может за всеми таймаутами следить самостоятельно.

1. USART во всех семействах может обнаруживать интервал t1.5. При этом взводится бит IDLE в регистре ISR. 

2. В семействах посвежее есть бит RTOEN в регистре CR2 и регистр RTOR, где можно задать длительность второго таймаута (на 2 символа для t3.5), флаг RTOF в регистре ISR.

По IDLE и RTOF можно разрешить прерывания ( IDLEIE и RTOIE).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я особо и не вчитывался пока что.

Спасибо за комментарий, буду знать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/28/2020 at 3:59 AM, SSerge said:

Что-то не то Вы там в RM вычитали.

А Вы уверены что все прочитали и правильно поняли? IDLE вроде бы определяется не через 1.5t а через 1t.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...