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

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MaksVV пишет:
Нет уж, я направлю свою энергию сразу на постройку протокола общения, не тратя время на борьбу с ошибками и коллизиями.

Ну, кому что нравится. Многие  и на Модбасе делают, и на 1-wire, и даже на I2C пытаются.  А свободная топология прокладки кабелей - весьма лакомый кусочек.

Насчет дешeвизны MCP2515: цена у него почти такая же, как у Ардуино Мини Про.

Что же касается "распростаненности CAN" - так ведь UART еще более стандартный и широко распростаненный. Построить CSMA/CD займет несколько десятков строчек кода. Надстройка над CAN-ом, позволяющая передавать длинные сообщения по кусочкам, займет больше.  Даже просто общение с MCP2515 займет больше. Не говоря уж о куче всяких разномастных регистров у него (как и любого другого CAN контроллера), с которыми надо работать - настраивать фильтры и маски, обрабатывать ошибки, и т.д. и т.п.

Есть еще одна проблема, которую я пока не затронул. Работа любой системы состоит из двух этапов: конфигурирования и, собственно, самой работы. Вот про конфигурирование все как-то забывают. А делать конфигурирование при помощи CAN - нетривиальное занятие: получится или сложно, или ограниченно по возможностям, или вообще и то и другое.

Любительские системы обычно полагаются на непосредственный доступ к узлам и прямую заливку кода программатором.  "Своя ноша не тянет", подумаешь, лишний десяток раз, пока все не отладишь: слазить на чердак, вытащить узел, принести его к РС, залить скомпилированный конкретно под него код, опять залезть на чердак и поставить его на место.

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

Используя UART, Ардуино и свой протокол, эту проблему можно решить, например, так. В протокол вводятся две обязательные к исполнению всеми узлами команды:

- "Сброс" - программный сброс для конкретного узла (выбор узла производится по уникальному адресу узла или по его серийному номеру), после чего у него запускается бутлодер

- "Пауза" - запрет всем узлам реагировать на любой трафик в сети на некоторое время, скажем, на 10 сек

Подав эти две команды, можно дистанционно залить скетч в выбранный узел.

MaksVV
Offline
Зарегистрирован: 06.08.2015
triac пишет:
Что же касается "распростаненности CAN" - так ведь UART еще более стандартный и широко распростаненный. Построить CSMA/CD займет несколько десятков строчек кода. Надстройка над CAN-ом, позволяющая передавать длинные сообщения по кусочкам, займет больше.  Даже просто общение с MCP2515 займет больше. Не говоря уж о куче всяких разномастных регистров у него (как и любого другого CAN контроллера), с которыми надо работать - настраивать фильтры и маски, обрабатывать ошибки, и т.д. и т.п.
 
Дело в том, что низкий (канальный) уровень общения с CAN уже налажен, в общем-то, до нас  - при помощи библиотеки. Поэтому во все эти регистры мы особо не вникаем и не тратим на это время. А вот надстройку (прикладной уровень) над CAN ом (в том числе и длинные сообщения) мы сейчас и делаем. Эта надстройка и есть, собственно, протокол общения элементов умного дома. Т.е. какие типы сообщений в шине, какие ответы от узлов, что будет если узел "отпал", что будет если получил одну и туже команду дважды, какие полезные данные будут летать между узлами, и т.д. и т.п. перечислять можно бесконечно. Такую надстройку нужно всё равно придумывать при ЛЮБОМ физическом протоколе подключения, будь то RS485, 1-wire , CAN или другой канал связи. 
 
А про несколько десяток строк кода с CSMA/CD, про которые вы говорите, в нашем случае это только лишь та составляющая общения, которая реализована аппаратно в MCP2515 и за счёт библиотеки работы с MCP2515 (канальный уровень). Всё остальное точно также городить придётся (прикладной уровень).  

triac пишет:

Есть еще одна проблема, которую я пока не затронул. Работа любой системы состоит из двух этапов: конфигурирования и, собственно, самой работы. Вот про конфигурирование все как-то забывают. А делать конфигурирование при помощи CAN - нетривиальное занятие: получится или сложно, или ограниченно по возможностям, или вообще и то и другое.

Любительские системы обычно полагаются на непосредственный доступ к узлам и прямую заливку кода программатором.  "Своя ноша не тянет", подумаешь, лишний десяток раз, пока все не отладишь: слазить на чердак, вытащить узел, принести его к РС, залить скомпилированный конкретно под него код, опять залезть на чердак и поставить его на место.

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

если почитать посты выше, то можно увидеть, что мой , скажем так, коллега по CANу, решил этот вопрос при помощи ESP wifi. И теперь заливает прошивки по воздуху. К тому же по wifi, я так понял, у него будет дублирование общения с узлами в случае возникновения проблем с шиной CAN. 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MaksVV пишет:
Эта надстройка и есть, собственно, протокол общения элементов умного дома. Т.е. какие типы сообщений в шине, какие ответы от узлов, что будет если узел "отпал", что будет если получил одну и туже команду дважды, какие полезные данные будут летать между узлами, и т.д. и т.п. перечислять можно бесконечно. Такую надстройку нужно всё равно придумывать при ЛЮБОМ физическом протоколе подключения, будь то RS485, 1-wire , CAN или другой канал связи.

В этом треде сообщений много, большинство из них чисто "технические", искать по зернышку в этом потоке сознания текущее состояние вашего проекта довольно затруднительно.  Поэтому я не особо вникаю в детали вашей реализации. Тем более что CAN мне неинтересен. Я когда-то тоже на него западАл, но потом одумался.
 
Что касается протокола "вообще", то замечу, что RS485 в принципе не позволяет сделать интерфейс типа "производитель-потребитель", который можно сделать при помощи "открытого коллектора" (или при помощи шинного формирователя CAN, что по сути то же самое). А вот наоборот - можно.  Можно сделать из CAN ординарный интерфейс мастер-слэйв, а ля Модбас.
 
Так что надстройку придумывать, конечно, придется, но ход мыслей будет задан как физическим уровнем, так и шаблонами мышления.
 
Там у вас в переписке упоминаются какие-то "адреса узлов". Для конфигурирования они нужны, для работы в режиме "производитель-потребитель" - категорически нет. Поскольку выясняется, что конфигурирование у вас через WiFi, то, наверное, все-таки вы из CAN подобие Модбаса делаете.

MaksVV пишет:
если почитать посты выше, то можно увидеть, что мой , скажем так, коллега по CANу, решил этот вопрос при помощи ESP wifi. И теперь заливает прошивки по воздуху. К тому же по wifi, я так понял, у него будет дублирование общения с узлами в случае возникновения проблем с шиной CAN.

Я видел это сообщение, но не придал ему особого значения. Подумал, что вы шлюз в интернет на WiFi делаете, что было бы логично. А вы, значит, в каждый узел собрались WiFi ставить, просто для заливки кода? Но если у вас в каждом узле уже есть WiFi, зачем вам вообще CAN? И неужели лишних 80 мА  тока потребления не жалко тратить на одну только редко используемую заливку кода?

riv
Offline
Зарегистрирован: 20.07.2017

Разобрался я с фильтрами.

01#ifdef ARD_DUE   
02  CAN3.init_Mask(0,1,0x0000FF00);                // Init first mask...
03  CAN3.init_Mask(1,1,0x0000FF00);                // Init second mask...
04  CAN3.init_Filt(1,1,0x00000000); //Broadcast    // Init first filter...
05  CAN3.init_Filt(2,1,0x00000400); //Node addr    // Init second filter...
06  CAN3.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
07 
08#else
09  CAN0.init_Mask(0,1,0x0000FF00);                // Init first mask...
10  CAN0.init_Mask(1,1,0x0000FF00);                // Init second mask...
11  CAN0.init_Filt(1,1,0x00000000); //Broadcast    // Init first filter...
12  CAN0.init_Filt(2,1,0x00000400); //Node addr    // Init second filter...
13  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
14 
15#endif

 

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

как дела со стабильностью ? разобрался в чем косяк? 

riv
Offline
Зарегистрирован: 20.07.2017

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

Тут пример https://yadi.sk/d/ozOcbX7B3V5hYy can_mask1 и can_mask2

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

попробуй такой скетч залить на узлы и мастер (выбираешь соответственно адрес , тип и железо МК вверху скетча. ) Поставь на ночь и  наблюдай канхакером что будет происходить. 

 

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

по поводу аппаратной фильтрации нужно так сделать . Проверил, работает. 

01void CAN_Start () {               // это setup
02   
03  bool can_ok = 0;
04  if(can.begin(MCP_STDEXT, CAN_500KBPS, MCP_8MHZ) == CAN_OK) can_ok = 1;
05  can.init_Mask(0,1,0x0000FF00);                       // Init first mask...
06  can.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8);   // Init first filter...
07  can.init_Filt(1,1,0x00000000);                       // Init second filter...
08  can.init_Mask(1,0,0x7FF);                            // Init second mask... 
09#ifdef debug
10Serial.begin(115200);
11      if (can_ok) Serial.println(F("MCP2515 Initialized Successfully!"));
12    else
13                  Serial.println(F("Error Initializing MCP2515..."));
14 
15Serial.println(); Serial.print(F("Мой адрес в сети CAN:  ")); PrintADDR (node_address);
16#ifdef type_node_master
17Serial.println (F("  MASTER!"));
18#endif
19Serial.println();
20 
21timeoutsConfigControl ();
22#endif
23   
24  can.setMode(MCP_NORMAL);                    
25 
26  pinmode(); // настройка портов (в зависимости от конфигурации массива device)
27  
28   }

Заметь, строка инита MCP отличается. Данная фильтрация пропускает все широковещательные сообщения и с нашим адресом, а также все фреймы со стандартным (маленьким 0х000) ID. 

riv
Offline
Зарегистрирован: 20.07.2017

MaksVV пишет:

Заметь, строка инита MCP отличается. Данная фильтрация пропускает все широковещательные сообщения и с нашим адресом, а также все фреймы со стандартным (маленьким 0х000) ID. 

А смысл пропускать все  0х000 ID?

И что за зверь  pinmode();?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Полистал топик, нашел такую декларацию:

riv пишет:
Мы делаем протокол над CAN но под MQTT анологичный ModbusRTU. Если бы был Modbus не только overTCP но и overCAN, даже заморачиваться не стали бы.

Для справки:

- Modbus был разработан в 70-е годы

- CAN был разработан в 80-е годы

- KNX был разработан в 90-е годы

riv пишет:
Все зависит от требований и задач. Мы с уважаемым MaksVV ставим требование к системе по задержкам 0,01 а то и 0,001 сек.  Это конечно не "реальное время" но что то рядом. 

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

Повторю, что за счет работы по принципу "производитель-потребитель" KNX способен без задержек управлять светом даже в многоэтажных оффисных зданиях и т.п., но при этом работает на скорости 9.6 кбит/сек. Модбас, работающий по принципу "мастер-слэйв", на это не способен даже при 1 Мбит/сек. И если вы сделаете нечто подобное Модбасу на CAN, то от этого ничего не изменится, это все равно будет "мастер-слэйв".

Впрочем, делайте как хотите, меня это не касается.

riv
Offline
Зарегистрирован: 20.07.2017

triac пишет:

Полистал топик, нашел такую декларацию:

riv пишет:
Мы делаем протокол над CAN но под MQTT анологичный ModbusRTU. Если бы был Modbus не только overTCP но и overCAN, даже заморачиваться не стали бы.

Для справки:

- Modbus был разработан в 70-е годы

- CAN был разработан в 80-е годы

- KNX был разработан в 90-е годы

riv пишет:
Все зависит от требований и задач. Мы с уважаемым MaksVV ставим требование к системе по задержкам 0,01 а то и 0,001 сек.  Это конечно не "реальное время" но что то рядом. 

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

Повторю, что за счет работы по принципу "производитель-потребитель" KNX способен без задержек управлять светом даже в многоэтажных оффисных зданиях и т.п., но при этом работает на скорости 9.6 кбит/сек. Модбас, работающий по принципу "мастер-слэйв", на это не способен даже при 1 Мбит/сек. И если вы сделаете нечто подобное Модбасу на CAN, то от этого ничего не изменится, это все равно будет "мастер-слэйв".

Впрочем, делайте как хотите, меня это не касается.

1. Не совсем понятна логика по первому утверждению. Я пишу если бы был аналог протокола over CAN то мы бы свой не писали. (Кстати аналог есть это CanOPEN и еще несколько протоколов, но оин черезмерно сложны). Вы отвечаете годами разработки протоколов. Возможно я что то упустил и потерял цепь размышлений.

2. У нас есть задача автоматизировать дом. Есть дешевое железо. Есть понятная среда программирования. Мы решаем свою задачу. Не для продажи, для себя.

Предложите KNX контроллер для связки с ардуино за разумные деньги, и я готов буду воспользоваться предложенным решением.

Иначе получаются теоретические изыскания на практическом форуме который на минуточку называется http://arduino.ru, что по моему скромному мнению означает, что здесь собрались самодельщики которым близка именно платформа ардуино, модульная сборка изделий без трассировки плат, разработки Э3 и Т5М и самое главное использование готовых плат и модулей.

На сегдня для ардуино есть коммуникационные модули

1. RS485 - 100 руб

2. Ethernet -400 руб

3. Wi-Fi - 200 руб

4. CAN - 200 руб

5. X-bee - 400 руб

Дадите ссылку на KNX модуль?

 

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

riv пишет:

 

А смысл пропускать все  0х000 ID?

И что за зверь  pinmode();?

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

pinmode () она и раньше была (см. большой скетч). в фунции pinmode () настраиваются порты ардуино автоматически в зависимости от конфигурации исполнительных устройств в can_struct.h

riv
Offline
Зарегистрирован: 20.07.2017

Сегодня скомпилирую и залью.

riv
Offline
Зарегистрирован: 20.07.2017

Залил.  Та же петрушка. Узлы по одному перестают отвечать. Пока пропал №9.

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

triac пишет:
  И если вы сделаете нечто подобное Модбасу на CAN, то от этого ничего не изменится, это все равно будет "мастер-слэйв".

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

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

riv
Offline
Зарегистрирован: 20.07.2017

В общем пора брать осцилограф и смотреть топологию. Буду отключать кустами и смотреть что получится.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

riv пишет:
1. Не совсем понятна логика по первому утверждению. Я пишу если бы был аналог протокола over CAN то мы бы свой не писали. (Кстати аналог есть это CanOPEN и еще несколько протоколов, но оин черезмерно сложны). Вы отвечаете годами разработки протоколов. Возможно я что то упустил и потерял цепь размышлений.

Намек на то, что вы движитесь в обратном направлении, надстраивая нечто наподобие Модбаса поверх CAN для того, чтобы решать задачи, на которые заточен KNX.

riv пишет:
Дадите ссылку на KNX модуль?

Ссылка на KNX дана не для того, чтобы все бросить и перейти на KNX. Но знать, как он устроен, полезно, хотя бы на самом базовом уровне: https://www.ixbt.com/home/knx-intro.shtml

Все команды можно разделить на два класса:

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

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

Ключевое понятие - "групповой адрес". Его можно назвать "виртуальным проводом", которым связана группа устройств. Устройства ввода (выключатели, регуляторы) меняют состояние этого "провода". Устройства вывода (релейные выключатели, диммеры) выполняют действия в соответствии с текущим состоянием "провода". Все устройства (т.е. и устройства ввода, и устройства вывода) в группе отслеживают текущее состояние "провода".

При конфигурировании создаются эти группы, т.е. устройства настраиваются на принадлежность той или иной группе. Заодно настраиваются и другие параметры устройств, например, скорость диммирования при нажатии на кнопку, и т.п.  Устройства могут входить в несколько групп. Например, кнопочный выключатель с двумя кнопками управляет двумя группами, релейный модуль на 4 реле отрабатывает состояния 4-х "виртуальных проводов".

Это достаточно хорошо ложится на MQTT, групповой адрес вполне соответствует топику. Ну а все команды конфигурирования в принципе можно свести в один топик.

riv пишет:
Иначе получаются теоретические изыскания на практическом форуме который на минуточку называется http://arduino.ru, что по моему скромному мнению означает, что здесь собрались самодельщики которым близка именно платформа ардуино, модульная сборка изделий без трассировки плат, разработки Э3 и Т5М и самое главное использование готовых плат и модулей.

В принципе вполне возможно сделать KNX узел на 8-битном Ардуино, ресурсов зватает с лихвой. Более того, я уверен, что рано или поздно кто-то это сделает.  Однако я не призываю вас это делать. Мне просто странно видеть, как вы на CAN натягиваете допотопный Модбас.  Хотя вольному воля, конечно, делайте что хотите.

Сам-то я планирую к обычному UART-у Ардуино Мини Про присоединить голый CAN трансивер, например, такой: https://ru.aliexpress.com/item/SN65HVD230-CAN-bus-transceiver-communication-module-for-arduino/32686393467.html Шина CAN трансивер связи-модуль для Arduino

То есть, возьму от CAN  один только шинный формирователь, от KNX - принцип работы, а от Ардуино - наидешевейшую процессорную плату, среду программирования  и бутлодер. Благо тут в теме ранее  вы http://arduino.ru/forum/proekty/ocherednoi-umnyi-dom-na-etot-raz-modulnaya-sistema?page=3 давали ссылку на Optiboot, за что  вам отдельное спасибо, это как раз то, что мне нужно.

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

riv пишет:

Залил.  Та же петрушка. Узлы по одному перестают отвечать. Пока пропал №9.

значит дело не в софте, а в железе. остаётся попробовать тоже самое, положив рядом все МК на коротком проводе CAN. Если будет гуд - то кабель неправильный и/или неправильная топология и/или длина и/или терминаторы нужно както по сопротивлению подбирать. Видимо от разных свойств кабеля (волновое сопротивление? хз чё это , почитать нужно) нужны разные терминаторы. 

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

triac пишет:

Сам-то я планирую к обычному UART-у Ардуино Мини Про присоединить голый CAN трансивер, например, такой: https://ru.aliexpress.com/item/SN65HVD230-CAN-bus-transceiver-communication-module-for-arduino/32686393467.html Шина CAN трансивер связи-модуль для Arduino

у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно. 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MaksVV пишет:

у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно. 

А почему сомневаетесь, если не секрет?  Что особенного есть в контроллере CAN, из-за чего байты, отправленные им, непременно доходят до другого МК? И какой волшебной субстанции не хватает обычному UART, чтобы достичь того же результата?

riv
Offline
Зарегистрирован: 20.07.2017

triac пишет:

MaksVV пишет:

у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно. 

А почему сомневаетесь, если не секрет?  Что особенного есть в контроллере CAN, из-за чего байты, отправленные им, непременно доходят до другого МК? И какой волшебной субстанции не хватает обычному UART, чтобы достичь того же результата?

Смотрим даташит на SN65HVD230 https://static.chipdip.ru/lib/204/DOC000204848.pdf 
The SN65HVD230, SN65HVD231, and SN65HVD232 controller area network (CAN) transceivers are designed
for use with the Texas Instruments TMS320Lx240x 3.3-V DSPs with CAN controllers, or with equivalent
devices. They are intended for use in applications employing the CAN serial communication physical layer in
accordance with the ISO 11898 standard. Each CAN transceiver is designed to provide differential transmit
capability to the bus and differential receive capability to a CAN controller at speeds up to 1 Mbps.
 
И видим что SN65HVD230 просто передатчик к которому нужно подвести сигнал. Без DSP или МК который этот сигнал сформирует, определив логику обмена, ничего не заработает. 
 
Как точка точка на UART возможно пойдет, тут мысмль интересная. Хотя для этого есть 485.
Можно попробовать.
MaksVV
Offline
Зарегистрирован: 06.08.2015

вечером подключу, отпишусь. 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

riv пишет:
Смотрим даташит на SN65HVD230 https://static.chipdip.ru/lib/204/DOC000204848.pdf 

И видим что SN65HVD230 просто передатчик к которому нужно подвести сигнал. Без DSP или МК который этот сигнал сформирует, определив логику обмена, ничего не заработает. 
 
Как точка точка на UART возможно пойдет, тут мысмль интересная. Хотя для этого есть 485.
Можно попробовать.
 
На приемопередатчике (трансивере) RS485 нельзя сделать обмен "производитель-потребитель", поскольку он не расчитан на коллизии. А на на трансивере CAN - можно, для него коллизии - это обычное дело. Не играет роли, что протокол делается при помощи UART с программным обнаружением коллизий, CSMA/CD. Для малонагруженных сетей это практически неотличимо от CSMA/CA (иногда то же самое обозначают CSMA/CR), поскольку коллизии очень редки. Я об этом уже писал выше.  И точка-точка можно, и точка-многоточка.
 
На PIC-ах, у которых есть CLC (конфигурируемая логика) при помощи UART-а можно даже CSMA/CA сделать, но для домашних сетей это лишнее, овчинка выделки не стоит.
riv
Offline
Зарегистрирован: 20.07.2017

triac пишет:

riv пишет:
Смотрим даташит на SN65HVD230 https://static.chipdip.ru/lib/204/DOC000204848.pdf 

И видим что SN65HVD230 просто передатчик к которому нужно подвести сигнал. Без DSP или МК который этот сигнал сформирует, определив логику обмена, ничего не заработает. 
 
Как точка точка на UART возможно пойдет, тут мысмль интересная. Хотя для этого есть 485.
Можно попробовать.
 
На приемопередатчике (трансивере) RS485 нельзя сделать обмен "производитель-потребитель", поскольку он не расчитан на коллизии. А на на трансивере CAN - можно, для него коллизии - это обычное дело. Не играет роли, что протокол делается при помощи UART с программным обнаружением коллизий, CSMA/CD. Для малонагруженных сетей это практически неотличимо от CSMA/CA (иногда то же самое обозначают CSMA/CR), поскольку коллизии очень редки. Я об этом уже писал выше.  И точка-точка можно, и точка-многоточка.
 
На PIC-ах, у которых есть CLC (конфигурируемая логика) при помощи UART-а можно даже CSMA/CA сделать, но для домашних сетей это лишнее, овчинка выделки не стоит.

Просьба всеже внимательно прочитать датиашит и не путать трансивер CAN который по сути просто усилитель и формироватиель биимпульса и CAN контроллера который как раз протокол CSMA делает.

Для MaksVV

Именно это я имел виду выше говоря что в связке с 232 может и полететь, а наш MCP2515 состоит из 2х частей

ТРАНСИВЕРА TJA1050 и КОНТРОЛЛЕРА MCP2515. SN65HVD230 имеет только ТРАНСИВЕР SN65 и его можно использовать например в связке с DUE.

 

riv
Offline
Зарегистрирован: 20.07.2017

Для triac

Мы с уважаемым MaksVV пишем протокол обмена уровня 3 модели OSI (даже скорее 3-4) , вы же насколько я понял используя трансивер хотите замахнуться на уровень 2 и 3 одновременно, обеспечивая управление коллизиями и передачу данных, так как Вас не устраивает обработка колизий у CAN.  

Задача весьма интересная но и весьма сложная.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

riv пишет:

Просьба всеже внимательно прочитать датиашит и не путать трансивер CAN который по сути просто усилитель и формироватиель биимпульса и CAN контроллера который как раз протокол CSMA делает.

ТРАНСИВЕРА TJA1050 и КОНТРОЛЛЕРА MCP2515. SN65HVD230 имеет только ТРАНСИВЕР SN65 и его можно использовать например в связке с DUE.

Я-то не путаю. Скорей это вы невнимательно читаете то, что я написал. Я уже несколько раз повторил, что контроллер CAN мне не нужен. Мне нужен любой микроконтроллер, имеющий обычный UART, например, Атмега 328 в составе Ардуино Мини Про. И к нему мне нужен трансивер CAN, т.е. шинный формирователь,  один только физический уровень CAN.  Это все, что нужно, чтобы создать узел сети, функционально соответствующий узлу KNX.

Я более-менее в курсе, как делаются узлы KNX и C-bus. Их уже 25 лет делают серийно. И микроконтроллер, который использовался для такого узла, в разы слабее Атмеги, и по скорости, и по памяти.

А в CAN меня не обработка коллизий не устраивает, а ненужная для такой задачи сложность.

Из 7-уровневой модели ISO/OSI под эту задачу нужны только 1,2 и 7, остальное лишнее.

riv
Offline
Зарегистрирован: 20.07.2017

triac пишет:

Это все, что нужно, чтобы создать узел сети, функционально соответствующий узлу KNX.

В следующем сооющении я как раз об этом и написал, про Ваше желание написать протокол канального уровня. +сетевого.

triac пишет:

Из 7-уровневой модели ISO/OSI под эту задачу нужны только 1,2 и 7, остальное лишнее.

Модель оси создана конечно не как догма а как руководство к действию.

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

 

riv
Offline
Зарегистрирован: 20.07.2017

triac пишет:

А в CAN меня не обработка коллизий не устраивает, а ненужная для такой задачи сложность.

Я не совсем понял про сложность.

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

Т.е мы сразу пошли к уровню 3 адресация и контроль доставки сообщений уровень 4. Пробустив СЛОЖНЕЙШИЙ уровень 2.

Т.е вы считаете что уровень 2 аналогичный Ethernet, ATM, CAN и пр. протоколам проще чем просейший протокол который мы делаем?

И еще вопрос, алгоритм работы KNX на уровне бит байт фрейм у Вас есть чтобы его повторять. Ну или алгоритм работы Вашего протокола. Интересно посмотреть.

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

короче не смог я найти второй трансивер. Один только есть. Заказал ещё пару (на этот раз другой решил взять) -  mcp2551

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MaksVV пишет:

короче не смог я найти второй трансивер. Один только есть.

Вместо CAN трансивера вы можете использовать RS-485 трансивер. Они довольно хорошо совместимы, особенно на малых скоростях. Выход UART-а надо подать на DE трансивера, а вход DI посадить на землю.

Когда-то очень давно, пока не разработали специальные CAN трансиверы, все так и делали.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

riv пишет:
Т.е вы считаете что уровень 2 аналогичный Ethernet, ATM, CAN и пр. протоколам проще чем просейший протокол который мы делаем?

Проще

riv пишет:

И еще вопрос, алгоритм работы KNX на уровне бит байт фрейм у Вас есть чтобы его повторять. Ну или алгоритм работы Вашего протокола. Интересно посмотреть.

Весь обмен идет на скорости 19.2 кбит/сек. Любой узел может начать обмен, если шина находится в пассивном состоянии в течении не менее 3 мс. При передаче узел обязан контролировать свое "эхо" на шине,  если принятый символ не совпал с переданным он немедленно переводит трансивер в режим Standby и ждет псевдо-случайный интервал. Длительность этого интервала зависит от номера попытки передачи, при повторных попытках он ждет меньше, т.е. его приоритет становится выше.

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

Для организации фреймов я использую байт-стаффинг, специальным символом выбран 0xFF

- начало фрейма (старт) для обмена точка-точка - пара 0xFF-0x02

- начало фрейма (старт) для обмена точка-многоточка - пара 0xFF-0x03

- конец фрейма (стоп) - пара 0xFF-0x04

- одиночные байты 0xFF в потоке данных заменяются на пару 0xFF-0x05

- пары байт 0xFF-0xFF в потоке данных заменяются на пару 0xFF-0x06

Между стартом и стопом идут данные (от 8 до 128 байт), после данных - 2 байта CRC.

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

triac, бит/байт стаффинг обычно используют в синхронных каналах передачи данных. UART по определению асинхронный, есть более простые способы обозначить начало пакета: 9й бит, бит паритета, межпакетный интервал.

И причем здесь вообще KNX?

riv
Offline
Зарегистрирован: 20.07.2017

Для MaksVV

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

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

Да и скорость до 250 уронил, думаю твою прошивку уже на 500 гонять.

Так, что вопрос был не в топологиии и терминаторах

1#ifdef ARD_DUE
2  if(CAN3.begin(MCP_STDEXT, CAN_250KBPS, MCP_8MHZ) == CAN_OK)
3#else
4  if(CAN0.begin(MCP_STDEXT, CAN_250KBPS, MCP_8MHZ) == CAN_OK)
5#endif

 

01#ifdef ARD_DUE   
02  //CAN3.init_Mask(0,1,0x0000FF00);                       // Init first mask...
03  //CAN3.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8);   // Init first filter...
04  //CAN3.init_Filt(1,1,0x00000000);                       // Init second filter...
05  //CAN3.init_Mask(1,0,0x7FF);                            // Init second mask...  
06  CAN3.init_Mask(0,1,0x0000FF00);                // Init first mask...
07  CAN3.init_Mask(1,1,0x0000FF00);                // Init second mask...
08  CAN3.init_Filt(1,1,0x00000000); //Broadcast    // Init first filter...
09  CAN3.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8);   // Init first filter...
10  CAN3.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
11#else
12  //CAN0.init_Mask(0,1,0x0000FF00);                       // Init first mask...
13  //CAN0.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8);   // Init first filter...
14  //CAN0.init_Filt(1,1,0x00000000);                       // Init second filter...
15  //CAN0.init_Mask(1,0,0x7FF);                            // Init second mask... 
16  CAN0.init_Mask(0,1,0x0000FF00);                // Init first mask...
17  CAN0.init_Mask(1,1,0x0000FF00);                // Init second mask...
18  CAN0.init_Filt(1,1,0x00000000); //Broadcast    // Init first filter...
19  CAN0.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8);   // Init first filter...
20  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
21#endif

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

riv
Offline
Зарегистрирован: 20.07.2017

Для triac

Я только сейчас понял что один из основных Ваших аргументов за KNX это дальность 1000м на скорости 19,2 кбит.

Вот что пишут про CAN

1000 кбит - 40м

500   кбит - 110м

250   кбит - 240м

125   кбит - 500м

50     кбит - 1 300м

20     кбит - 3 300м

10     кбит - 6 300м

5       кбит - 13 000м

Да и CAN все же мультимастер, как и Ethernet. Т.е любой узел может начать передачу самостоятельно (инициативно) любому узлу сети с гарантией доставки сообщения.

Наш с уважаемым MaksVV мастер и слейв находятся на 4-7 уровне модели OSI и их задача контроль состояния сети и узлов, сбор информации датчиках и ИУ, шлюзование в MQTT поверх TCP/IP с возможностью послать reset любому контроллеру сети.

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

riv пишет:
В общем полная победа, суточный прогон прошли без сбоев.

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

это не может не радовать! Сейчас хоть дальше скетч писать можно. Вечером выложу основной скетч с фильтрами. 

riv
Offline
Зарегистрирован: 20.07.2017

Кстати шлюзование в MQTT для мастера я тоже отладил, потом оформлю отдельным файлом mqtt.ino, так же как web

в коде до setup && loop

01  ///MQTT begin
02  #ifdef node_mqtt_eth
03  #include <PubSubClient.h>
04    IPAddress    mqtt_server(192, 168, 2, 101);
05    void callback(char* topic, byte* payload, unsigned int length)
06    {
07      /*
08      Serial.print(F("Message arrived ["));
09      Serial.print(topic);
10      Serial.print(F("] "));
11      for (int i=0;i<length;i++)
12      {
13        Serial.print(F((char)payload[i]));
14      }
15      Serial.println();
16      */
17    }
18 
19    EthernetClient ethClient;
20    PubSubClient mqttClient(ethClient);
21 
22  void reconnect()
23  {
24    // Loop until we're reconnected
25    while (!mqttClient.connected())
26    {
27      Serial.print("Attempting MQTT connection...");
28      if (mqttClient.connect("node_4_Net_center_Due1_Eth", "test", "test"))
29      
30        Serial.println("connected");
31        mqttClient.subscribe("inTopic");
32      }
33      else
34      {
35        Serial.print("failed, rc=");
36        Serial.print(mqttClient.state());
37        Serial.println(" try again in 5 seconds");
38        delay(5000); ///!!!!!!!!Заменить на миллс
39    }
40  }
41}
42     
43  #endif
44  //MQTT END

setup()

1#ifdef node_mqtt_eth
2  mqttClient.setServer(mqtt_server, 1883);
3  mqttClient.setCallback(callback);  
4  if (!mqttClient.connected()) {
5  reconnect(); }
6#endif

в loop()

1#ifdef node_mqtt_eth
2mqtt();
3#endif
1print_nodes_status()

В коде

1#ifdef node_mqtt_eth
2void mqtt()
3{
4  if (!mqttClient.connected()) {
5   reconnect();
6 }
7 mqttClient.loop();
8}
9#endif

Ну и основная функция - она выводит статус опроса в serial, в UDP порт, на MQTT сервер, с которого подбирает Majordomo. Пока только отдаю на сервер.

001void print_nodes_status()
002{
003char mqqt_string;
004char buffer[50];
005 
006if(curMillis - prev_print > interval_repeat_req_mk1+10000)
007{
008UDP.beginPacket(dest, remPort);
009UDP.write("\n\r");
010UDP.write("--------------------------\n\r");
011UDP.write("\n\r");
012UDP.endPacket();
013 
014Serial.println("                  Состояние опроса узлов по CAN от RIV");
015Serial.println("-----------------------------------------------------");
016 
017for (int i = 4; i<NODS_NUMBER; i++)
018{
019Serial.print("                  ");
020//PrintADDR(i);
021Serial.print("Node_");Serial.print(i);
022 
023Serial.print (F(" ")) ;Serial.print (i);
024Serial.print(" Статус");
025if (array_request_status[i][4])
026{
027  Serial.println (F("  OK")) ;
028  mqqt_string=2;
029}
030else
031{
032  if (i==node_address || i==16 || i==17)
033  {
034    if (i==node_address)
035    {
036    Serial.println (F("  OK"));
037    mqqt_string=2;
038    }
039    else
040    {
041    Serial.println (F("        >>>OFF"));
042    mqqt_string=1;
043    }
044  }
045  else
046  {
047   Serial.println (F("        >>>>> FAIL")) ;
048   mqqt_string=0;
049  
050}
051 
052#ifdef node_mqtt_eth
053char buf1[12];
054char buf2[12];
055itoa(i, buf1, 10);
056itoa(mqqt_string, buf2, 10);
057mqttClient.publish(buf1, buf2);
058#endif
059 
060       
061      if (mqqt_string==2)
062      sprintf(buffer, "Node_%.ld  - ON\n\r",i);
063      else if (mqqt_string==1)
064      sprintf(buffer, "Node_%.ld  -      OFF\n\r",i);
065      else if (mqqt_string==0)
066      sprintf(buffer, "Node_%.ld  -             FAIL\n\r",i);
067       
068      UDP.beginPacket(dest, remPort);
069      UDP.write(buffer);
070      UDP.endPacket();
071       
072 
073}
074Serial.println("-----------------------------------------------------");
075       
076int time=curMillis/1000;
077if (time/60/60<10) { Serial.print ("0"); }
078Serial.print (time/60/60);
079Serial.print (":");
080if (time/60%60<10) { Serial.print ("0"); }
081Serial.print ((time/60)%60);
082Serial.print (":");
083if (time%60<10) { Serial.print ("0"); }
084Serial.println (time%60);
085 
086 
087 
088 
089      UDP.beginPacket(dest, remPort);
090      sprintf(buffer, "Time - %.2d:%.2d:%.2d\n\r", time/60/60, (time/60)%60, time%60);  
091      UDP.write("\n\r");
092      UDP.write(buffer);
093      UDP.write("\n\r");
094      UDP.write("--------------------------\n\r");
095      UDP.endPacket();
096 
097 
098 prev_print = curMillis;
099 
100
101 
102}

Да кстати здесь вывод времени в часах, минутах секундах от запуска, можно еще дни добавить для полного счастья,  Millis раз в 50 суток обнуляется. Кстати нужно еще watchdog ставить на МК. (https://uscr.ru/arduino-watchdog-bootloop-i-proshivka-zagruzchika-optiboot/)

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Andy пишет:
бит/байт стаффинг обычно используют в синхронных каналах передачи

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

Andy пишет:
И причем здесь вообще KNX?

Все было уже сказано много раз выше. KNX является определенным эталоном сети домашней автоматизации, успешной и проверенной временем. Поэтому любые другие сети для таких применений имеет смысл делать с оглядкой на KNX.  Кроме KNX есть и другие сети для этих же применений, построенные на совсем иных принципах, LonWorks, например (передача токена), и даже и Модбас кое-кто применяет (мастер-слэйв), и как ни странно не только любители.  Однако для автоматизации домов/зданий менее распространены и, соответственно, менее успешны. Поэтому я ориентируюсь на перечисленные ранее сети автоматизации зданий, построенные по принципу "производитель-потребитель": KNX, C-Bus, VelBus. Из перечисленных трех наименее распространен бельгийский VelBus, построенный на CAN.

 

riv
Offline
Зарегистрирован: 20.07.2017

triac пишет:

Весь обмен идет на скорости 19.2 кбит/сек. Любой узел может начать обмен, если шина находится в пассивном состоянии в течении не менее 3 мс. При передаче узел обязан контролировать свое "эхо" на шине,  если принятый символ не совпал с переданным он немедленно переводит трансивер в режим Standby и ждет псевдо-случайный интервал. Длительность этого интервала зависит от номера попытки передачи, при повторных попытках он ждет меньше, т.е. его приоритет становится выше.

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

Для организации фреймов я использую байт-стаффинг, специальным символом выбран 0xFF

- начало фрейма (старт) для обмена точка-точка - пара 0xFF-0x02

- начало фрейма (старт) для обмена точка-многоточка - пара 0xFF-0x03

- конец фрейма (стоп) - пара 0xFF-0x04

- одиночные байты 0xFF в потоке данных заменяются на пару 0xFF-0x05

- пары байт 0xFF-0xFF в потоке данных заменяются на пару 0xFF-0x06

Между стартом и стопом идут данные (от 8 до 128 байт), после данных - 2 байта CRC.

Правильно ли я понял, что Вы собираетесь эту логику на ардуино поднимать? Вместо специализированного контроллера MCP2515?

Практические опыты уже проводили? Код, железо? Или вы пока на этапе НИР?

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

Кто нибудь приведите пример использования кадра размером более 8 байт информации. мне на ум не приходят. 

Что аудио или видео что ли передавать или страницы текста? 

в своём дейсвующем протоколе я использую каждый бит в байте. Таким образом, в одном 8-байтном фрейме я могу передать состояние света в 64 комнатах 

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

riv пишет:

Наш с уважаемым MaksVV мастер и слейв находятся на 4-7 уровне модели OSI

Вам приходится этим заниматься вследствие изначальной кривизны протокола CAN: всего 8 или 11 байт во фрейме, а по жизни надо больше. Если же уровень 2 настроен на прикладное применение, как в KNX, C-bus или у меня, то все уровни от 3 до 6 не нужны. Мне 128 байт во фрейме и порядка 100 узлов в сегменте хватает для того, чтобы для моего дома не заботиться ни о маршрутах, ни о сегментах, ни о сеансах. 

Что касается 6-го уровня, то рассматривал разные варианты представления и шифрование тоже. Но потом решил все это пока отложить. В принципе представление типа MessagePack и шифрование типа XTEA можно ввести, но пока особой нужды в этом нет.

riv пишет:

и их задача контроль состояния сети и узлов, сбор информации датчиках и ИУ, шлюзование в MQTT поверх TCP/IP с возможностью послать reset любому контроллеру сети.

Вы перечисляете в основном задачи, принадлежащие 7 уровню.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

riv пишет:

Практические опыты уже проводили? Код, железо? Или вы пока на этапе НИР?

Есть работающий шлюз в USB, с гальваноразвязкой. Сделан на PIC24, так мне было удобнее. Узлы на Ардуинах в процессе.

MaksVV пишет:

Кто нибудь приведите пример использования кадра размером более 8 байт информации. мне на ум не приходят.

- Ответ на запрос о типе и текущей ревизии узла (если не разбивать на много мелких команд и ответов)

- Ответ на запрос статуса узла (аналогично, без разбивки)

- Практически любой текст.

- Дата лог

- Данные от сенсора в XML или JSON

 

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

Пока ваш пакет из 128 байт летит на низкой скорости кстати, остальные молчат?

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

В статусе узла один параметр поменялся и что весь длинный пакет изза одного например бита отправлять?

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MaksVV пишет:
Пока ваш пакет из 128 байт летит на низкой скорости кстати, остальные молчат?

Угу. Такой пакет передается примерно 70 мс. В это время все молчат. Правда, передается он редко когда. Но раз уж передается, то не беда, помолчат 70 мс. Все равно никто этого не заметит.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

MaksVV пишет:
В статусе узла один параметр поменялся и что весь длинный пакет изза одного например бита отправлять?

Вообще-то статус передается по запросу, это точка-точка.

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

riv
Offline
Зарегистрирован: 20.07.2017

Для MaksVV

Вот еще код автономной метеостанции без CAN только на ESP8266 через esp-link mqtt

Как я и предполагал, скорость реакции очень низкая и годится только для сенсоров.  Реального времени добится не получится.

 

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

triac пишет:
Представьте какой-нибудь пруф своему утверждению, если можно. Чтобы стало понятно, почему байт-стаффинг как-то связан с синхронными каналами
Забавный ты. Прежде чем изобретать "колёсное транспортное средство, приводимое в движение мускульной силой человека" посмотри, что такое велосипед.

В синхронных каналах нет другого способа формирования пакетов кроме, как битстаффинг и байтстаффинг. Познакомься хотя бы с HDLC, Frame Relay (биториентированные протоколы), или ATM, BSC (байториентированные протоколы).

triac пишет:
KNX является определенным эталоном сети домашней автоматизации
Другими словами предлагаемая реализация не имеет ничего общего с KNX, потому как, ни аппаратно, ни программно не совместима с KNX

riv пишет:
Вот что пишут про CAN
1000 кбит - 40м
500кбит - 110м
250кбит - 240м
125кбит - 500м
50кбит - 1 300м
20кбит - 3 300м
10кбит - 6 300м
5кбит - 13 000м
Это только для UTP с согласованием. Подели на 100 если простые провода и без согласования.

MaksVV пишет:
Кто нибудь приведите пример использования кадра размером более 8 байт информации. мне на ум не приходят.

Дистанционная загрузка ПО.

triac
triac аватар
Offline
Зарегистрирован: 03.05.2018

Andy пишет:

Забавный ты.

Я не заметил, когда мы с вами перешли на "ты".

Andy пишет:

В синхронных каналах нет другого способа формирования пакетов кроме, как битстаффинг и байтстаффинг.

Это неверно. Например, C-bus - синхронный, но не использует ни бит-стаффинг, ни байт-стаффинг, ни даже кодирование по типу 8b/10b или 6b/8b, при помощи которого это тоже можно сделать.

Или посмотрите как сделан синхронный интерфейc чипов WS2812 для управления RGB  лентами. Там вообще ничего из перечисленного выше не использовано, а тем не менее работает.

Andy пишет:

Познакомься хотя бы с HDLC, Frame Relay (биториентированные протоколы), или ATM, BSC (байториентированные протоколы).

Каким образом из того, что некоторые синхронные протоколы используют бит-стаффинг, следует, что мне не надо использовать байт-стаффинг там, где мне это удобно? Где логика?

По-вашему SLIP или COBS можно только в синхронных интерфейсах применять? Скорей всего вы вообще не знаете что такое  байт-стаффинг. Для примера, ознакомьтесь с Wake http://caxapa.ru/lib/wake/

Andy пишет:

Другими словами предлагаемая реализация не имеет ничего общего с KNX, потому как, ни аппаратно, ни программно не совместима с KNX

Совершенно верно, несовместима. Задачи сделать их совместимыми не ставилось и нигде этого не обещалось. Непонятно с чего вы вдруг заговорили о совместимости.

Более того, KNX (EIB) и C-Bus тоже между собой несовместимы, хотя изначально их разрабатывали одни и те же люди.  По сути своей они очень похожи, однако C-bus синхронный, а KNX - асинхронный

riv
Offline
Зарегистрирован: 20.07.2017

Выпало 3 узла

7 через 03:46:30 

9 через 04:02:30

14 через 06:34:30

У них в логе

Принято из CAN: NULL_C От Кого: ШИРОКОВЕЩАТЕЛЬНО

Лог с мастера смотри https://yadi.sk/d/ozOcbX7B3V5hYy    

файл log_13.05.18-14.05.18.txt