ModbusRTU и STM32F103
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
ModbusRTU и STM32F103
Добрейшего времени суток всем.
Понадобилось мне запустить ModbusRTU на ранее готовом устройстве, МК STM32F103, через UART2, порты А2 и А3.
Прошу индейку как лучше это сделать. Так как устройство физически уже есть и заточено под некоторые задачи, то внутренние аппаратные ресурсы очень ограничены.
Таймер 2 однозначно занят, запускается не всегда и от внешнего события. Другие таймеры не хотелось бы выделять под это дело, но рассмотреть можно.
Фиксировать и анализировать время приема каждого байта не вариант, так как уверен что не хватит ресурсов, чтобы укладываться вовремя. Сейчас скорость 9600 и понижать не хочется.
Сейчас я сделал через событие IDLE UART и DMA. В принципе работает. Но я нарушаю стандарт RTU. Вместо интервалов <1.5 и >3.5 между байтами и пакетами соответственно, у меня получается <1 и >1.
Если нечего не придумается, то я так и оставлю. Но все же хотелось бы соответствовать стандарту.
Спасибо.
З.Ы. Modbus ASCII не хочу.
Понадобилось мне запустить ModbusRTU на ранее готовом устройстве, МК STM32F103, через UART2, порты А2 и А3.
Прошу индейку как лучше это сделать. Так как устройство физически уже есть и заточено под некоторые задачи, то внутренние аппаратные ресурсы очень ограничены.
Таймер 2 однозначно занят, запускается не всегда и от внешнего события. Другие таймеры не хотелось бы выделять под это дело, но рассмотреть можно.
Фиксировать и анализировать время приема каждого байта не вариант, так как уверен что не хватит ресурсов, чтобы укладываться вовремя. Сейчас скорость 9600 и понижать не хочется.
Сейчас я сделал через событие IDLE UART и DMA. В принципе работает. Но я нарушаю стандарт RTU. Вместо интервалов <1.5 и >3.5 между байтами и пакетами соответственно, у меня получается <1 и >1.
Если нечего не придумается, то я так и оставлю. Но все же хотелось бы соответствовать стандарту.
Спасибо.
З.Ы. Modbus ASCII не хочу.
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: ModbusRTU и STM32F103
А не получится его на G0 заменить? По ногам более-менее должно совпадать по идее. А у G0 есть аппаратная поддержка этого идиотского модбаса.
Re: ModbusRTU и STM32F103
Для соблюдения требований протокола нужно задействовать таймер или использовать МК с полноценным UART, имеющим RTO, а не кастрата как в F1. Для STM32F103 оставь приём по IDLE и забей. Работает вполне нормально на небольших скоростях или при обменен с узлами, отправляющими через DMA или FIFO.Z_h_e писал(а):Но я нарушаю стандарт RTU. Вместо интервалов <1.5 и >3.5 между байтами и пакетами соответственно, у меня получается <1 и >1.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: ModbusRTU и STM32F103
Не.Это невозможно.Eddy_Em писал(а):А не получится его на G0 заменить?
Наверное, но вдруг существуют какие-то решения, а я не знаю. Например, как-ниубдь умудрится 3 раза подряд взвести флаг IDLE.tonyk писал(а):приём по IDLE и забей
Re: ModbusRTU и STM32F103
Никак он три раза _сам_ не установится. На F1 других решений нет.Z_h_e писал(а):как-ниубдь умудрится 3 раза подряд взвести флаг IDLE.
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: ModbusRTU и STM32F103
Z_h_e, а почему вдруг невозможно? Нужно много операций деления что ли? Или по производительности не канает?
Если что, есть еще F303, у которого тоже на аппаратном уровне поддержка модбаса. Там уж точно по ногам практически 1-в-1 получается F103, сам делал не так давно универсальную "вундервафлю" для тестирования F0x2, F103 и F302/303 в корпусе LQFP64. Плюсом является бóльшая производительность, наличие флоатов, наличие ЦАПов и еще разнообразные фишки. По цене, конечно, не 50 рублей, как F103C6T6, но рублей в400 уложиться можно (если LQFP-48).
Если что, есть еще F303, у которого тоже на аппаратном уровне поддержка модбаса. Там уж точно по ногам практически 1-в-1 получается F103, сам делал не так давно универсальную "вундервафлю" для тестирования F0x2, F103 и F302/303 в корпусе LQFP64. Плюсом является бóльшая производительность, наличие флоатов, наличие ЦАПов и еще разнообразные фишки. По цене, конечно, не 50 рублей, как F103C6T6, но рублей в400 уложиться можно (если LQFP-48).
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: ModbusRTU и STM32F103
Менять МК не вариант однозначно.
Отвлекать МК на принятие каждого байта, при наличии DMA, имхо зло. Да еще модбас планируется постоянно молотящий.
Я что вопрос то задал, вдруг упускаю какое-то интересное и оригинальное решение.
Отвлекать МК на принятие каждого байта, при наличии DMA, имхо зло. Да еще модбас планируется постоянно молотящий.
Я что вопрос то задал, вдруг упускаю какое-то интересное и оригинальное решение.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: ModbusRTU и STM32F103
Я все не пойму, почему МК заменить нельзя?
F103 худшее детище ST!
F103 худшее детище ST!
Re: ModbusRTU и STM32F103
С учетом но рассмотреть можно опишу пару жутких костылей, до чего дошел:
1) Базовый таймер, настроенный на 3.5, счетчик которого сбрасывается при приеме каждого байта (но придется вешать обработчик на прием или окончание каждого байта DMA)
2) Если найдется свободный таймер общего назначения, то можно его настроить на 3,5 и линию RX завести на вход ETR, у таймера настроить триггер на сброс (фронт тут уж без разницы, наверно), каждый бит посылки будет счетчик сбрасывать.
3*(чисто посмеяться): завести еще на один UART линию RX и настроить его таким образом, чтобы по DMA он сбрасывал счетчик таймера, настроенного на 3.5.
Для пунктов 2-3, разумеется, надо таймеры активировать, но, наверно, ничего критичного не случится, если UART при приеме первого байта в прерывании эту операцию выполнит и тут же сам себе прерывание отключит.
1) Базовый таймер, настроенный на 3.5, счетчик которого сбрасывается при приеме каждого байта (но придется вешать обработчик на прием или окончание каждого байта DMA)
2) Если найдется свободный таймер общего назначения, то можно его настроить на 3,5 и линию RX завести на вход ETR, у таймера настроить триггер на сброс (фронт тут уж без разницы, наверно), каждый бит посылки будет счетчик сбрасывать.
3*(чисто посмеяться): завести еще на один UART линию RX и настроить его таким образом, чтобы по DMA он сбрасывал счетчик таймера, настроенного на 3.5.
Для пунктов 2-3, разумеется, надо таймеры активировать, но, наверно, ничего критичного не случится, если UART при приеме первого байта в прерывании эту операцию выполнит и тут же сам себе прерывание отключит.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: ModbusRTU и STM32F103
azhel12, да первая мысль была запускать и сбрасывать таймер по спаду на входе RX в режиме однократного счета. Однако таймер занят и ни один ремапинг не подходит.
Re: ModbusRTU и STM32F103
Если твой девайс будет опрашивать мастер, не допускающий больших пауз между байтами, то IDLE будет нормально работать.Z_h_e писал(а): Однако таймер занят
Согласен. Хотя начинал изучение STM32 именно с F103. Потом сравнил с другими сериями, после чего отказался от линейки F1.Eddy_Em писал(а):F103 худшее детище ST!
Если в проекте изначально предполагается много работы через UART, то нужно брать МК с полноценным UART, а не кастратом как во всей линейке F1. МК с полноценным UART есть во всех линейках, кроме F1.
Re: ModbusRTU и STM32F103
Вам нужна задержка без tim?
- "два" байта "левым" уартом;
- да, любой процесс на свободной периферии, устраивающий вас по времени и способу использования, флаги - хоть выполнения, хоть таймаута;
- время преобразования ацп - то же задержка; (это так, до кучи)
- две свободные ноги и цепочка rc;
за шутку извиняюсь, навеяло - схемы конца 70-х часто перед глазами.
сфотографировать можно и на спичечный коробок, но если "спортом" не заниматься - tonyk прав - по задаче и инструмент.
- "два" байта "левым" уартом;
- да, любой процесс на свободной периферии, устраивающий вас по времени и способу использования, флаги - хоть выполнения, хоть таймаута;
- время преобразования ацп - то же задержка; (это так, до кучи)
- две свободные ноги и цепочка rc;
за шутку извиняюсь, навеяло - схемы конца 70-х часто перед глазами.
сфотографировать можно и на спичечный коробок, но если "спортом" не заниматься - tonyk прав - по задаче и инструмент.
Re: ModbusRTU и STM32F103
Имхо, я бы взял библ freeModbus и портировал её. Порт там несложный и работает все четко
Re: ModbusRTU и STM32F103
[uquote="Cheeseman",url="/forum/viewtopic.php?p=4353993#p4353993"]Имхо, я бы взял библ freeModbus и портировал её. Порт там несложный и работает все четко[/uquote]Тут дело не в этом, модуль UART в F103 в принципе не имеет возможности аппаратно отслеживать простой в 3,5 байта, как того требует стандарт.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: ModbusRTU и STM32F103
[offtop]А весь прикол ситуации в том, что автор вместо какого-либо вменяемого современного протокола (да пусть даже CANopen) выбрал убогое дерьмо мамонта, которое еще 30 лет назад закопать надо было![/offtop]
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: ModbusRTU и STM32F103
Eddy_Em, ты не знаешь ни схемы девайса, ни назначения, почему нет возможности сменить МК и остальную схематехнику и пр. Но ты все решил и сделал выводы.
UART древнее модбас, закапывай и его тоже.
Интересно, на автофоруме, на вопрос что подкрутить чтобы приора бензин меньше жрала, ты бы посоветовал Лексус взять?
Я всего-лишь спросил
UART древнее модбас, закапывай и его тоже.
Интересно, на автофоруме, на вопрос что подкрутить чтобы приора бензин меньше жрала, ты бы посоветовал Лексус взять?
Я всего-лишь спросил
. Ты предложил сменить МК, я тебя и других услышал. Это сделать нельзя, вот ещё раз отвечаю, что это обсуждать?вдруг существуют какие-то решения, а я не знаю
Re: ModbusRTU и STM32F103
Просто сидя в анальном закутке очень сложно понять, почему этот мамонт живее всех протоколов от Eddy_Em.Eddy_Em писал(а):выбрал убогое дерьмо мамонта, которое еще 30 лет назад закопать надо было!
ТС, не слушай Eddy_Em. Он старый, поэтому умные слова, которые он не понимает, его раздражают.
Добавлено after 3 minutes 22 seconds:
Ага, только с одним UART. ТС ведь не уточнял, сколько у него портов требуют обслуживания Modbus. Касаемо чёткости: в этой библе косяк с койлами исправили?Cheeseman писал(а):Имхо, я бы взял библ freeModbus и портировал её. Порт там несложный и работает все четко
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: ModbusRTU и STM32F103
Я тоже не молод
. Скоро пердеть буду чаще, чем проект собирать.
Можно 100500 примеров привести нового современного промышленного оборудования с модбасом. И пообсуждать это. Очередной топик будет содержать все что угодно, кроме сути.
Re: ModbusRTU и STM32F103
Z_h_e писал(а):Скоро пердеть буду чаще, чем проект собирать.
Одной из причин моего ухода с F1 было отсутствие у него полноценного UART. Когда у тебя один порт с Модбас на 9600, то пофиг, чё и как там реализовано. А когда у МК и так загрузка большая, да ещё и 4-6 портов на высоких скоростях, то уже ищешь МК с полноценным UART, чтобы как можно меньше грузить процессор в МК. Полноценный UART умеет и сигналом DIR трансивера управлять, и задержки после его переключения на передачу сам отрабатывать, и 3.5 символа сам отмерять. В итоге получается 1 прерывание на приём посылки, и 2 на отправку.



