Очередной "Умный дом", на этот раз модульная система...

alex_r61
Offline
Зарегистрирован: 20.06.2012

Через Дуню лучше ничего не запитывать, А 12 вольт на VCC - смерть для Дуни. На RAW надо подавать питание, да и 12 вольт много для неё. Я приблизительно накидал схему питания у себя, там всем рулить будет отдельный МК.

vde69
Offline
Зарегистрирован: 10.01.2016

я перепутал, разумеется 12 вольт на VIN а не на VCC... можно не 12 а 10, но блок питания на 12 проще найти...

6 вольт на шину - явно мало, во первых ампер потребуется много (и следовательно кабель толстый), во вторых будут просадки на длине..

MaksVV
Offline
Зарегистрирован: 06.08.2015
alex_r61
Offline
Зарегистрирован: 20.06.2012

6 вольт это шина для МК, большинство МК у меня будут работать на 3.3 вольт. Так что даже 9 вольт уже много, не говоря про 12. Тем более что на Pro Mini  ставят маломощные стабилизаторы. И какие там будут амперы.

vde69
Offline
Зарегистрирован: 10.01.2016

ModBus мне чего-то не покатил, решить строить свой велосипед...

наваял простой класс для передачи по RS485 пакетов, немного похоже на многие протоколы сразу, но как мне кажется в понимании будет попроще, имеет всего одну процедуру send и одну подключаемую процедуру на получение валидного пакета.

Критика приветствуется :)

01#include <busrs485.h>
02 
03 
04BusRS485 Bus(0, 0, 2); // this is master and RS-232 or USB-FTDI
05 
06void setup() {
07  Bus.begin( 19200 );                      // baud-rate at 19200
08  Bus.attachInPackInterrupt(BusInPack);    // подключим процедуру для обработки полученых пакетов
09}
10 
11void loop() {
12  Bus.poll(); // вызов процедур чтения порта
13}
14 
15// процедура вызывается при получении валидного пакета
16void BusInPack (){
17  // тут делаем, что нам надо при получении пакета
18  // например перешлем его другому адресату
19  if (Bus.Id_Destination() == 0) {
20    if (Bus.send(22,             // ID получателя
21                 Bus.Type(),     // тип пакета
22                 Bus.Func(),     // номер функции
23                 Bus.SizeDate(), // размер дополнительных данных
24                 Bus.Date()))    // указатель на буфер дополнительных данных
25    {;}      // удачно отпрвили
26    else {;} // ошибка при отправки 
27  }
28   
29}

а это BusRS485.h

AndrF
Offline
Зарегистрирован: 10.04.2016

Не вижу контрольной суммы посылки

vde69
Offline
Зарегистрирован: 10.01.2016

AndrF пишет:

Не вижу контрольной суммы посылки

есть 2 байта XOR ов, один на шапку и второй на доп данные...

vde69
Offline
Зарегистрирован: 10.01.2016

полевые испытания показали некоторые проблемы в классе доработал немного, добавил маркер начала кадра и перевел контрольные биты с XOR на XOR+циклический сдвиг, стало вполне надежно...

а это BusRS485.h

 

AndrF
Offline
Зарегистрирован: 10.04.2016

vde69 пишет:

скорость допустим 9600 бит в сек

А если допустить скорость хотя бы 115200? Зачем на 9600-то, если интерфейс позволяет гораздо большую скорость?

vde69
Offline
Зарегистрирован: 10.01.2016

AndrF пишет:

vde69 пишет:

скорость допустим 9600 бит в сек

А если допустить скорость хотя бы 115200? Зачем на 9600-то, если интерфейс позволяет гораздо большую скорость?

скорость определяется двумя фактами

1. физическими характеристиками трассы (длинна, волновое сопротивление, затухание, помехи и т.д.)

2. используемыми интерфейсами и сопряжениями.

 

да скорость можно разгонять значительно выше, но классически рекомендумая - 19200, а для длинных линий (например 1 км) еще ниже, это связано с физическими своствами кабеля...

AndrF
Offline
Зарегистрирован: 10.04.2016

vde69 пишет:

да скорость можно разгонять значительно выше, но классически рекомендумая - 19200, а для длинных линий (например 1 км) еще ниже, это связано с физическими своствами кабеля...

IMHO - на ваших расстояниях (домашне-огородных) скорость 485 интерфейса 115200 - вполне нормальна, причем с запасом.

При лучшем кабеле можно было бы сделать и мегабит. Но это уже вряд ли стоит.

Да просто попробуйте, взяв бухту кабеля...

vde69
Offline
Зарегистрирован: 10.01.2016

AndrF пишет:

vde69 пишет:

да скорость можно разгонять значительно выше, но классически рекомендумая - 19200, а для длинных линий (например 1 км) еще ниже, это связано с физическими своствами кабеля...

IMHO - на ваших расстояниях (домашне-огородных) скорость 485 интерфейса 115200 - вполне нормальна, причем с запасом.

При лучшем кабеле можно было бы сделать и мегабит. Но это уже вряд ли стоит.

Да просто попробуйте, взяв бухту кабеля...

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

кроме того сейчас UART работает паралеьно и на rs485 и на USB к компу (в режиме эмуляции COM), то есть еще тут могут быть заморочки....

кстати попутный вопрос:

использую "альтернативный" монитор порта https://sites.google.com/site/terminalbpp/ вроде все устраивает кроме одного, при подключении ардуинка уходит в ребут, а мне очень хочется подключатся "на живую" без ребута ардуинки...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vde69 пишет:

использую "альтернативный" монитор порта https://sites.google.com/site/terminalbpp/ вроде все устраивает кроме одного, при подключении ардуинка уходит в ребут, а мне очень хочется подключатся "на живую" без ребута ардуинки...

Читал где-то, что это из-за линии DTR, которая на дуинах соединена с reset для удобства загрузки скетчей. Вариантов, помнится, предлагалось несколько: не юзать DTR, перерезать дорожку на плате, ещё чего-то там.

Вот что сходу нашёл:

http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection

http://atroshin.ru/ru/content/avtomaticheskaya-perezagruzka-arduino-pri-...

 

 

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

vde69
Offline
Зарегистрирован: 10.01.2016

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

Протокол ориентирован на системы с малым ОЗУ, один пакет максимум 8 байт заголовок и до 24 байт данных, в заголовок встроено 4 битовых флага, одна команда может содержать до 8 пакетов данных (192 байта), всего команд - 16 из которых часть (наверно 10) будет свободно для пользовательского использования.

Шина будет уметь

1. находить и устранять конфликты ID

2. выбирать максимальную скорость обмена

3. планирую несколько ID зарезервировать на управление с компа и дебугер, по этому шина будет поддерживать слейвы с 1 по 240 ID.

из железа почти собрал один модуль, он будет мастером и в нем будет встроено SD хранилище + часы реального времени... не выкладываю все это по причине недоделок... осталось кнопки навесить и светодиоды.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

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

я тут думал над такой концепцией. если слейвы шлют в шину свои данные(на пример с датчиков температуры или движения), но не постоянно а только когда происходят значительные изменения (изменения которые достаточны для того, чтобы что то сделать, на пример изменение температуры на 3 градуса, или наличие движения, или резко запахло газом...) то есть в большинстве своем шина простаивает в ожидании важных команд. Когда слейв крикнул что то другие его слушают, и если информация им нужна, запоминают ее. (на пример контроллер освещения получил информацию об освещенности и движении и в зависимости от времени и режима работы (автоуправление по движению, охрана) принял решение о включении такой-то лампы). Другие же слейвы не связанные с освещенностью (на пример обогрев) эту информацию игнорируют и не учитывают в своей работе. а мастер ее принимает и пишет в лог.

При этом если слейв, которому нужна какая либо информация может получить ее как из лога мастера, так от слейва, если поймал её. Получается что система будет вполне жизнеспособна в плане связи между слейвами, даже если мастер молчит. Как то так...

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Цитата:
я тут думал над такой концепцией. если слейвы шлют в шину свои данные
Это уже token ring, несколько сложнее, чем мастер/слейв, но тоже реализуемо. Вопрос только в целесообразности.

vde69
Offline
Зарегистрирован: 10.01.2016

Mr.Privet пишет:

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

При этом если слейв, которому нужна какая либо информация может получить ее как из лога мастера, так от слейва, если поймал её. Получается что система будет вполне жизнеспособна в плане связи между слейвами, даже если мастер молчит. Как то так...

такую систему нельзя реализовать на простых железках типа RS485, такое реально реализуемо только на буферизируемых устройствах (например HUB Ethernet), это уже и сложнее и дороже...

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

vde69 пишет:

Mr.Privet пишет:

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

При этом если слейв, которому нужна какая либо информация может получить ее как из лога мастера, так от слейва, если поймал её. Получается что система будет вполне жизнеспособна в плане связи между слейвами, даже если мастер молчит. Как то так...

такую систему нельзя реализовать на простых железках типа RS485, такое реально реализуемо только на буферизируемых устройствах (например HUB Ethernet), это уже и сложнее и дороже...

RS-485 всего лишь физический уровень, причём, допускающий подключения нескольких устройств параллельно - шина. На нём возможно реализовать любой протол верхнего уровня, в т.ч. и токентинг, и несколько мастеров, и конкурентную среду. Например, модбас допускает несколько мастеров.

vde69
Offline
Зарегистрирован: 10.01.2016

faeton пишет:

RS-485 всего лишь физический уровень, причём, допускающий подключения нескольких устройств параллельно - шина. На нём возможно реализовать любой протол верхнего уровня, в т.ч. и токентинг, и несколько мастеров, и конкурентную среду. Например, модбас допускает несколько мастеров.

ModBus - не допускает одновременно несколько мастеров, если мы говорим о нем как о транспорте нулевого уровня. Он допускает цикличного передача мастера, но мастер всегда в сети один на один момент, если это условие не соблюдать -будет бред в шине... банально две команды от двух мастеров сложатся на физическом уровне...

alex_r61
Offline
Зарегистрирован: 20.06.2012

Зациклились просто с мастерами. Я уже выше давал ссылку на пример с режимом мульти мастер. Только зачем дома нужен космический корабль? Если у меня дома что то потечёт, то контроллер в ванной сразу перекроет воду. А через сколько об этом узнает мастер, через 1 или 2 секунды, какая разница. Что от этого изменится?

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

vde69 пишет:

faeton пишет:

RS-485 всего лишь физический уровень, причём, допускающий подключения нескольких устройств параллельно - шина. На нём возможно реализовать любой протол верхнего уровня, в т.ч. и токентинг, и несколько мастеров, и конкурентную среду. Например, модбас допускает несколько мастеров.

ModBus - не допускает одновременно несколько мастеров, если мы говорим о нем как о транспорте нулевого уровня. Он допускает цикличного передача мастера, но мастер всегда в сети один на один момент, если это условие не соблюдать -будет бред в шине... банально две команды от двух мастеров сложатся на физическом уровне...

Я разве где-то говорил об одновременной работе двух мастеров в ModBus?

alex_r61
Offline
Зарегистрирован: 20.06.2012

faeton пишет:

Я разве где-то говорил об одновременной работе двух мастеров в ModBus?

И я не об этом. Просто зачем всё усложнять, если в с системе будет от трёх-четырёх до десятка МК.

vde69
Offline
Зарегистрирован: 10.01.2016

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

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

NE_XT
NE_XT аватар
Offline
Зарегистрирован: 22.05.2012

vde69 пишет:

 вот теперь думаю - выкладывать в нахаляву или нет :)

Пилите Шура, пилите (с)

 

alex_r61
Offline
Зарегистрирован: 20.06.2012

Ну что УСЁ? Все по норам и тему закрыли?

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

ну че разобрались с интерфейсом?? хотел сделать мнемо схему состояния и контроля устройств по интерфейсу вот с интерфейсом возникли проблеммы, если кому интересно пишите почту скину саму мнемо схему, 

vde69
Offline
Зарегистрирован: 10.01.2016

по железу:

почти собрал модуль мастера (состоит NANO+часы+SD), осталось поставить диоды на питание (которых пока нет) + 3 кнопки и 5 светодиодов, и лицевую панель, сейчас все собрано в корпусе и работает, но пока без кнопок...

сделал генератор трафика (на NANO)

 

практически доделал по софту:

1. классы для ардуино и общий шаблон скеча для мастера и слейвов

2. анализатор трафика на дельфи (с разбором пакетов, фильтрами, показателями мусорности и т.д.)

3. отладчик на дельфи (позволяет выделять обмен между мастером и одним слейвом, при этом умеет заставлять мастера посылать в степовом режиме, при этом вся остальная шина работает в штатном режиме)

4. отдельный канал для отладочных сообщений (приходят только отладчику)

осталось реализовать:

1. автоматическая смена ID слейвом

2. обработку широковещательных пакетов

 

после этого можно будет приступать к слейвам, первый слейв будет: NANO+давление+шина с датчиками температуры (улица и дома по зонам), тут у меня все есть и даже скетч я писал перед новым годом, останется его адаптировать. Следующий этап будет - это экранчик...

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

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

vde69
Offline
Зарегистрирован: 10.01.2016

дошел до состояния когда нужно отлаживать одновременно несколько устройств, есть вопросы

1. можно- ли подключить несколько NANO по USB к одному компу на разные COM порты ? что для этого надо? и как их различать?

2. стоит-ли делать отдельный макетный модуль (NANO+RS485) который использовать как эталонный ответчик мастеру / генератор помех / и т.д. или использовать реальные устройства?

alex_r61
Offline
Зарегистрирован: 20.06.2012

1, Можно, различаются по номеру СОМ порта, у меня от одного-двух до трёх-четырёх висят.

2. Это уже как удобнее. Я связь сначала в симуляторе отлаживаю, а затен в железо переношу. И быстрее, и для МК лучше.

AndrF
Offline
Зарегистрирован: 10.04.2016

vde69 пишет:

1. можно- ли подключить несколько NANO по USB к одному компу на разные COM порты ? что для этого надо? и как их различать?

Логичней и комп подключать через 485

vde69
Offline
Зарегистрирован: 10.01.2016

AndrF пишет:

vde69 пишет:

1. можно- ли подключить несколько NANO по USB к одному компу на разные COM порты ? что для этого надо? и как их различать?

Логичней и комп подключать через 485

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

vde69
Offline
Зарегистрирован: 10.01.2016
vde69
Offline
Зарегистрирован: 10.01.2016

нужен совет по удобству компоновки скетчей.... сейчас у меня есть некий общий базовый функционал, дальше я вижу 2 пути развития

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

2. делать один большой проект который будет подходить всем модулям (в зависимости от директив компилятору)

минусы первого подхода: при внесении изменений в общую часть, или при внесение взаимо зависимых данных нужно будет перелопачивать все проекты

минус второго подхода - будет очень много файлов, и куча директив которые будут существенно усложнять читабельность кода

сам пока склоняюсь ко второму подходу... кто чего посоветует?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Я юзаю второй подход, читабельность кода от этого не страдает, если он правильно отформатирован табуляциями, разнесён на функциональные блоки, оформлен комментариями.

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

посмотрите ссылочку там есть связь блоков по rs485

http://bigbarrel.ru/tag/%D1%83%D0%BC%D0%BD%D1%8B%D0%B9-%D0%B4%D0%BE%D0%BC/page/2/

vde69
Offline
Зарегистрирован: 10.01.2016

Anton_Kos87 пишет:

посмотрите ссылочку там есть связь блоков по rs485

http://bigbarrel.ru/tag/%D1%83%D0%BC%D0%BD%D1%8B%D0%B9-%D0%B4%D0%BE%D0%BC/page/2/

сейчас у меня реально работает на столе

1. мастер с RTC часами

2. слейв с 4х строчным дисплеем

3. слейв с датчиками температуры даллас на он вире

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

Сейчас занимаюсь переписыванием кода на более универсальный с прицелом на расширение, жду тачскринов (буду переделывать на тачи) и еще мелочевки. Так что лично для меня вопрос протокола - не актуален уже, то что сейчас работает я пока не пробовал на больших расстояниях, но на 10 метровом кабеле вообще никаких проблемм (уже 3суток работают на стенде и комп ловит "мусор", пока ни одного ошибочного байта)

зы

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

vde69 пишет:

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

GitHub наше всё ;)

vde69
Offline
Зарегистрирован: 10.01.2016

не пойму как туда выкладывать вложеные каталоги, конечно можно zip но для меня это не подходит...

наверно можно как отдельную ветку (ибо по смыслу это подходит), может еще какие варианты?

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

меня интересует как вывести все на мнемосхему с помощью web, ethernet шилда, с помощью Ajax неплохой внешний вид получится!!!! скиньте пожалуйста свой проект очень интересно!!! у меня в проекте управление скважины (Насос включение выключение по давлению, подогрев трубы в мороз, состояния температуры в скважине и самой воды,), уличный датчик (Температура, влажность), и септик (Температура, состояние, аварийное переполнение) вот думал сделать на RS485 и поставить мегу 2560 как мастера с Ethernet шилдом с смартфона или с компьютера открываем страничку и смотрим что там происходит (мнемосхема), или задаем параметры включения и выключения например подогрева трубы в мороз!! вот ищу подоные проекты что бы осущиствить свои планы, у вас помойму есть чему поучится скиньте пожалуйста скетч на почту Anton_Kos87@mail.ru

vde69
Offline
Зарегистрирован: 10.01.2016

выложу наброски через неделю, другую сейчас очень сыро еще...

в качестве затравки кину 2 модуля сюда (они пока еще не полностью переписаны на новую идеологию, но все более менее понятно), что-бы было понятно в каком оформление это будет дальше, может кто покритикует...

 

Baks
Baks аватар
Offline
Зарегистрирован: 11.01.2016

vde69 пишет:

выложу наброски через неделю, другую сейчас очень сыро еще...

в качестве затравки кину 2 модуля сюда (они пока еще не полностью переписаны на новую идеологию, но все более менее понятно), что-бы было понятно в каком оформление это будет дальше, может кто покритикует...

похоже автор статьи забыл выложить вкусняшку и пропал

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброго времени суток!!!

Долго и внимательно читал тему, но так и не осознал ответа на свой вопрос, как бороться на rs485 с коллизиями? Уважаемый vde69 как ТС и остальная общественность, не могли бы Вы дать комментарий по следующим вопросам

1. Я наивно полагал, что если один что-то передает, то у других Serial.available>0 что говорит о том, что линия занята и надо просто  дождаться ее освобождения

01bool Transfer_Message(RS485Message Message) {
02  bool result = false;
03  while (RS485.available() > 0) {
04    RS485.read();
05  }
06  digitalWrite(DIR, HIGH); // включаем передачу
07  delay(2);
08  RS485.write(Message_to_send.reciver_id);
09  RS485.write(Message_to_send.reciver_adress);
10  RS485.write(Message_to_send.sender_id);
11  RS485.write(Message_to_send.sender_adress);
12  RS485.write(Message_to_send.command);
13  RS485.write(Message_to_send.data1);
14  RS485.write(Message_to_send.data2);
15  RS485.write(Message_to_send.data3);
16  RS485.write(Message_to_send.sign);
17  RS485.flush();
18  digitalWrite(DIR, LOW);
19  delay(2);
20  /*digitalWrite(LED1, HIGH);
21    delay(100);
22    digitalWrite(LED1, LOW);*/
23  result = true;
24  return result;
25}

но на практике столкнулся с тем, что когда два устройства начинают что-то вещать у меня не просто на шине каша, у меня они перестают вообще что-либо слать.

2. Так можно или нет реализовать схему с мультимастером, и как тогда бороться с коллизиями. 

Объясню свою позицию: я согласен с звучавшими в теме мнениями, что вариант запрос-ответ не совсем здорово, потому как нажав кнопку я хочу увидеть реакцию в течении одной секунды а не ждать пока Мастер опросит "мое" устройство. То есть, я нажимаю кнопку, МК посылает данные на Мастер, получает команду и выполняет ее.  

В интеренте есть описания протоколов типа KNX, SmartBus но я не нашел готовых реализаций. 

В общем темой живо интересуюсь, есть готовые наработки, но при усложнении системы возникли непонятки с коллизиями, и главный вопрос, помему при коллизии больше до МК не достучаться до его перезагрузки. 

alex_r61
Offline
Зарегистрирован: 20.06.2012

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

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

gonzales пишет:
Так можно или нет реализовать схему с мультимастером, и как тогда бороться с коллизиями.
Маркерное кольцо и есть мультимастерная схема, только она в реализации несколько сложнее. RS485 не позволяет определить наличие колизии, для этого используют CAN.

gonzales пишет:
я согласен с звучавшими в теме мнениями, что вариант запрос-ответ не совсем здорово, потому как нажав кнопку я хочу увидеть реакцию в течении одной секунды а не ждать пока Мастер опросит "мое" устройство. То есть, я нажимаю кнопку, МК посылает данные на Мастер, получает команду и выполняет ее. 
Даже в маркерном кольце устройство должно дождаться, пока ему не передадут маркер, и только после этого оно становится мастером на шине. Что мешает в схеме мастер-слэйв опрашивать подчиненные устройства чаще, чем раз в 1 сек?

gonzales пишет:
и главный вопрос, помему при коллизии больше до МК не достучаться до его перезагрузки.
Кривая реализация протокола обмена.

alex_r61
Offline
Зарегистрирован: 20.06.2012

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

gonzales
Offline
Зарегистрирован: 13.07.2015

Маркерное кольцо - это не мультимастер, по сути это тот же мастер-слейв, только вместо запроса от мастера я гоняю по сети маркер. Или я не прав?

>Что мешает в схеме мастер-слэйв опрашивать подчиненные устройства чаще, чем раз в 1 сек?

по моим подсчетам в сети будет около 100 устройств. Пакет у меня 10 байтный. При скорости 19200 это получается с небольшим запасом 0.01с на запрос-ответ. То есть мастер только и будет занят тем, что опрашивать устройства. Как только на это наложатся временные лаги на выполнение команд самим мастером будет просадка по времени отклика.

>RS485 не позволяет определить наличие колизии, для этого используют CAN

уже читаю про CAN, правда с реализациями на ардуино под can достаточно туго.

>Кривая реализация протокола обмена.

А что тут может быть кривого? Не сочтите за труд посмотрите скеч

01bool SendMessage(byte Reciver_ID, byte Reciver_Adress, byte Sender_ID, byte Sender_Addres, byte Command, byte Data1, byte Data2, byte Data3) {
02  Fill_Message(Reciver_ID, Reciver_Adress, Sender_ID, Sender_Addres, Command, Data1, Data2, Data3);
03  Transfer_Message(Message_to_send);
04}
05 
06bool Fill_Message(byte Reciver_ID, byte Reciver_Adress, byte Sender_ID, byte Sender_Adress, byte Command, byte Data1, byte Data2, byte Data3) {
07  bool result = false;
08  byte Sign = (Reciver_ID + Reciver_Adress + Sender_ID + Sender_Adress + Command + Data1 + Data2 + Data3) & 255;
09  Message_to_send.reciver_id = Reciver_ID;
10  Message_to_send.reciver_adress = Reciver_Adress;
11  Message_to_send.sender_id = Sender_ID;
12  Message_to_send.sender_adress = Sender_Adress;
13  Message_to_send.command = Command;
14  Message_to_send.data1 = Data1;
15  Message_to_send.data2 = Data2;
16  Message_to_send.data3 = Data3;
17  Message_to_send.sign = Sign;
18  result = true;
19  return result;
20}
21 
22bool Transfer_Message(RS485Message Message) {
23  bool result = false;
24  while (RS485.available() > 0) {
25    RS485.read();
26  }
27  digitalWrite(DIR, HIGH); // включаем передачу
28  delay(2);
29  RS485.write(Message_to_send.reciver_id);
30  RS485.write(Message_to_send.reciver_adress);
31  RS485.write(Message_to_send.sender_id);
32  RS485.write(Message_to_send.sender_adress);
33  RS485.write(Message_to_send.command);
34  RS485.write(Message_to_send.data1);
35  RS485.write(Message_to_send.data2);
36  RS485.write(Message_to_send.data3);
37  RS485.write(Message_to_send.sign);
38  RS485.flush();
39  digitalWrite(DIR, LOW);
40  delay(2);
41  /*digitalWrite(LED1, HIGH);
42    delay(100);
43    digitalWrite(LED1, LOW);*/
44  result = true;
45  return result;
46}
47 
48bool CheckRS485() {
49  digitalWrite(DIR, LOW);
50  delay(2);
51  if (RS485.available() == 9) { // если пришло 9 байт
52    Message.reciver_id = RS485.read();
53    Message.reciver_adress = RS485.read();
54    Message.sender_id = RS485.read();
55    Message.sender_adress = RS485.read();
56    Message.command = RS485.read();
57    Message.data1 = RS485.read();
58    Message.data2 = RS485.read();
59    Message.data3 = RS485.read();
60    Message.sign = RS485.read();
61    /*if (RS485.available() ==0){
62      digitalWrite(LED1, HIGH);
63    delay(100);
64    digitalWrite(LED1, LOW);
65    }*/
66    //DebugWrite(Message.command, 1);
67    byte TestSign = (Message.reciver_id + Message.reciver_adress + Message.sender_id + Message.sender_adress + Message.command + Message.data1 + Message.data2 + Message.data3) & 255;
68    if (TestSign == Message.sign) {
69      if (Message.reciver_id == ID) {
70        while (RS485.available() > 0) {
71          RS485.read();
72        }
73        ParseMessage();
74        return true;
75      }
76      else {
77        DebugWrite("NOT FOR ME", 1);
78        return false;
79      }
80    }
81    else {
82      DebugWrite("BAD SIGN", 1);
83      return false;
84    }
85  }
86  else {
87    return false;
88  }
89 
90 
91}

 

alex_r61
Offline
Зарегистрирован: 20.06.2012

>А что тут может быть кривого? Не сочтите за труд посмотрите скеч

Кривая сама IDE, при такой загрузке нужен прямой доступ к ресурсам МК.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Маркерное кольцо в каждый конкретный промежуток времени это мастер-слейв. Мастером может быть любое устройство, которому передан маркер - следовательно это мультимастерная схема.

gonzales пишет:
по моим подсчетам в сети будет около 100 устройств.
Рискну предположить, интерфейс реализован на MAX485, а он позволяет только 32 устройства на шине.

gonzales пишет:
А что тут может быть кривого?
Строка 51. Что если пришло не 9 символов, а меньше или больше?