Jump to content

    
C2000

Банальный ModBus RTU

Recommended Posts

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

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

Раньше я это точно видел в RM.

Сегодня неожиданно оказалось что ни в свежем RM ни в даташите явно не указана длительность паузы для IDLE.

PS. Попробую завтра измерить на F103, F407 и F030.

 

Share this post


Link to post
Share on other sites
2 минуты назад, SSerge сказал:

Сегодня неожиданно оказалось что ни в свежем RM ни в даташите явно не указана длительность паузы для IDLE.

Странно. В моих есть:

Цитата

An Idle character is interpreted as an entire frame of “1”s (the number of “1”s includes the number of stop bits).

 

Share this post


Link to post
Share on other sites
On 10/28/2020 at 12:02 AM, Arlleex said:

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

В этом случае тайм-ауты будут не четкие. Будут плавать +-1t.

Тут либо есть аппаратный таймер для таймаута (который не по фронту на ноге а по окончанию приема очередного символа сбрасывается), либо только через прерывания.

On 10/28/2020 at 12:31 AM, AlexRayne said:

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

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

Много чего можно придумать, если нет задачи/желания чётко соответствовать стандарту.

Если же следовать стандарту, то там всё чётко описано, что да как должно происходить.

Share this post


Link to post
Share on other sites
5 часов назад, C2000 сказал:

В этом случае тайм-ауты будут не четкие. Будут плавать +-1t.

Почему?

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

Тут либо есть аппаратный таймер для таймаута (который не по фронту на ноге а по окончанию приема очередного символа сбрасывается), либо только через прерывания.

А чем отличается фронт на ноге от окончания приема в данном случае? Ничем. STOP-бит это установка линии в 1. То есть передний фронт.
Так что когда сработает таймаут по 1.5t, это будет значить, что он сработал от STOP последнего байта. Прерывание RX формируется где-то очень близко к STOP.

Share this post


Link to post
Share on other sites
26 minutes ago, Arlleex said:

Так что когда сработает таймаут по 1.5t, это будет значить, что он сработал от STOP последнего байта...

Нет не от STOP, а от последнего фронта. Если последний передаваемый байт будет 0xFF, то таймаут сработает раньше.

Share this post


Link to post
Share on other sites
5 минут назад, C2000 сказал:

Нет не от STOP, а от последнего фронта. Если последний передаваемый байт будет 0xFF, то таймаут сработает раньше.

Ну, будет 0xFF и что? У этого 0xFF будет свой START-бит, и расстояние между ним и STOP-ом предыдущего байта сбросит таймер.

Share this post


Link to post
Share on other sites
10 часов назад, C2000 сказал:

Много чего можно придумать, если нет задачи/желания чётко соответствовать стандарту.

Если же следовать стандарту, то там всё чётко описано, что да как должно происходить.

Стандарту соответствует вполне. На наше щастье, его разрабатывали не депутаты едра, и неконструктивной жести там нет, стандарт к разработчику милостив

 

Edited by AlexRayne

Share this post


Link to post
Share on other sites
6 hours ago, Arlleex said:

Ну, будет 0xFF и что? У этого 0xFF будет свой START-бит, и расстояние между ним и STOP-ом предыдущего байта сбросит таймер.

А если будет 0x00? То таймер сброситься на 8 бит позже чем при 0xFF. А говорите нет разницы))

2 hours ago, AlexRayne said:

Стандарту соответствует вполне. На наше щастье, его разрабатывали не депутаты едра, и неконструктивной жести там нет, стандарт к разработчику милостив

Там есть чёткие предписания, какие таймауты и как надо отслеживать. И этот пункт стандарта помечен как "обязательно"

Share this post


Link to post
Share on other sites

По мне так хороший прибор соблюдает сам стандарт, но подстраивается под некритичное отклонение от стандарта своих собеседников. Пользователю прибора не нужно строгое соблюдение стандарта в ущерб надежности связи с различными коммуникационными устройствами. Ему не важна химия, ему важно чтобы спички горели.
Пример. Некоторые преобразователи Ethernet<->RS485 (например moxa) разбивают длинные modbus пакеты на несколько более коротких. В результате, по шине RS485 пакет приходит частями с паузой превышающей требование стандарта. Ваш принципиальный прибор не сможет работать с такими преобразователями, и очень вероятно будет заменен на продукцию конкурента.

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

Share this post


Link to post
Share on other sites
1 час назад, C2000 сказал:

Там есть чёткие предписания, какие таймауты и как надо отслеживать. И этот пункт стандарта помечен как "обязательно"

и какой таймаут не соблюден?

Share this post


Link to post
Share on other sites
1 час назад, C2000 сказал:

А если будет 0x00? То таймер сброситься на 8 бит позже чем при 0xFF...

Ну да. Будет фигня:crazy: Ищите лучше другой контроллер с более развитой периферией UART-а.
Ну или в STM32 работать тупо по прерываниям в максимальном приоритете, настроив какой-нибудь таймер для ручной оценки таймаутов...
А лучше все-таки досконально разобраться с аппаратными возможностями обнаружения таймаутов в той STM32, с которой Вы работаете.

Share this post


Link to post
Share on other sites
16 hours ago, Arlleex said:

Ну да. Будет фигня:crazy: Ищите лучше другой контроллер с более развитой периферией UART-а.
Ну или в STM32 работать тупо по прерываниям в максимальном приоритете, настроив какой-нибудь таймер для ручной оценки таймаутов...
А лучше все-таки досконально разобраться с аппаратными возможностями обнаружения таймаутов в той STM32, с которой Вы работаете.

Я то давно разобрался. Есть там таймаут настраиваемый в битах, он вполне подходит. А вот таймер по внешнему пину и IDLE флаги пролетают))

17 hours ago, vguard said:

..
Пример. Некоторые преобразователи Ethernet<->RS485 (например moxa) разбивают длинные modbus пакеты на несколько более коротких. В результате, по шине RS485 пакет приходит частями с паузой превышающей требование стандарта. Ваш принципиальный прибор не сможет работать с такими преобразователями, и очень вероятно будет заменен на продукцию конкурента.

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

Можно сделать и конфигурируемыми, можно вообще много чего на придумывать. Но в первую очередь нужно сделать так чтобы прибор мог полностью соответствовать стандарту, а уж возможность подстройки под кривые недопреобразователи это уже опционально. Иначе понаделаете больших таймаутов под кривое оборудование, а у заказчика окажется система "правильная" с приборами работающими по стандарту и Ваш прибор тогда придется заменить на "правильный".

И речь о ModBus RTU он вроде бы как не подразумевает Ethernet, для этих целей лучше ASCII использовать там и таймауты можно настроить не поломав стандарт. 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.