Нет уж, я направлю свою энергию сразу на постройку протокола общения, не тратя время на борьбу с ошибками и коллизиями.
Ну, кому что нравится. Многие и на Модбасе делают, и на 1-wire, и даже на I2C пытаются. А свободная топология прокладки кабелей - весьма лакомый кусочек.
Насчет дешeвизны MCP2515: цена у него почти такая же, как у Ардуино Мини Про.
Что же касается "распростаненности CAN" - так ведь UART еще более стандартный и широко распростаненный. Построить CSMA/CD займет несколько десятков строчек кода. Надстройка над CAN-ом, позволяющая передавать длинные сообщения по кусочкам, займет больше. Даже просто общение с MCP2515 займет больше. Не говоря уж о куче всяких разномастных регистров у него (как и любого другого CAN контроллера), с которыми надо работать - настраивать фильтры и маски, обрабатывать ошибки, и т.д. и т.п.
Есть еще одна проблема, которую я пока не затронул. Работа любой системы состоит из двух этапов: конфигурирования и, собственно, самой работы. Вот про конфигурирование все как-то забывают. А делать конфигурирование при помощи CAN - нетривиальное занятие: получится или сложно, или ограниченно по возможностям, или вообще и то и другое.
Любительские системы обычно полагаются на непосредственный доступ к узлам и прямую заливку кода программатором. "Своя ноша не тянет", подумаешь, лишний десяток раз, пока все не отладишь: слазить на чердак, вытащить узел, принести его к РС, залить скомпилированный конкретно под него код, опять залезть на чердак и поставить его на место.
Профессиональные системы позволяют конфигурировать узлы уже после установки. Но программное обеспечение, которое позволяет это делать, сложное.
Используя UART, Ардуино и свой протокол, эту проблему можно решить, например, так. В протокол вводятся две обязательные к исполнению всеми узлами команды:
- "Сброс" - программный сброс для конкретного узла (выбор узла производится по уникальному адресу узла или по его серийному номеру), после чего у него запускается бутлодер
- "Пауза" - запрет всем узлам реагировать на любой трафик в сети на некоторое время, скажем, на 10 сек
Подав эти две команды, можно дистанционно залить скетч в выбранный узел.
Что же касается "распростаненности CAN" - так ведь UART еще более стандартный и широко распростаненный. Построить CSMA/CD займет несколько десятков строчек кода. Надстройка над CAN-ом, позволяющая передавать длинные сообщения по кусочкам, займет больше. Даже просто общение с MCP2515 займет больше. Не говоря уж о куче всяких разномастных регистров у него (как и любого другого CAN контроллера), с которыми надо работать - настраивать фильтры и маски, обрабатывать ошибки, и т.д. и т.п.
Дело в том, что низкий (канальный) уровень общения с CAN уже налажен, в общем-то, до нас - при помощи библиотеки. Поэтому во все эти регистры мы особо не вникаем и не тратим на это время. А вот надстройку (прикладной уровень) над CAN ом (в том числе и длинные сообщения) мы сейчас и делаем. Эта надстройка и есть, собственно, протокол общения элементов умного дома. Т.е. какие типы сообщений в шине, какие ответы от узлов, что будет если узел "отпал", что будет если получил одну и туже команду дважды, какие полезные данные будут летать между узлами, и т.д. и т.п. перечислять можно бесконечно. Такую надстройку нужно всё равно придумывать при ЛЮБОМ физическом протоколе подключения, будь то RS485, 1-wire , CAN или другой канал связи.
А про несколько десяток строк кода с CSMA/CD, про которые вы говорите, в нашем случае это только лишь та составляющая общения, которая реализована аппаратно в MCP2515 и за счёт библиотеки работы с MCP2515 (канальный уровень). Всё остальное точно также городить придётся (прикладной уровень).
triac пишет:
Есть еще одна проблема, которую я пока не затронул. Работа любой системы состоит из двух этапов: конфигурирования и, собственно, самой работы. Вот про конфигурирование все как-то забывают. А делать конфигурирование при помощи CAN - нетривиальное занятие: получится или сложно, или ограниченно по возможностям, или вообще и то и другое.
Любительские системы обычно полагаются на непосредственный доступ к узлам и прямую заливку кода программатором. "Своя ноша не тянет", подумаешь, лишний десяток раз, пока все не отладишь: слазить на чердак, вытащить узел, принести его к РС, залить скомпилированный конкретно под него код, опять залезть на чердак и поставить его на место.
Профессиональные системы позволяют конфигурировать узлы уже после установки. Но программное обеспечение, которое позволяет это делать, сложное.
если почитать посты выше, то можно увидеть, что мой , скажем так, коллега по CANу, решил этот вопрос при помощи ESP wifi. И теперь заливает прошивки по воздуху. К тому же по wifi, я так понял, у него будет дублирование общения с узлами в случае возникновения проблем с шиной CAN.
Эта надстройка и есть, собственно, протокол общения элементов умного дома. Т.е. какие типы сообщений в шине, какие ответы от узлов, что будет если узел "отпал", что будет если получил одну и туже команду дважды, какие полезные данные будут летать между узлами, и т.д. и т.п. перечислять можно бесконечно. Такую надстройку нужно всё равно придумывать при ЛЮБОМ физическом протоколе подключения, будь то RS485, 1-wire , CAN или другой канал связи.
В этом треде сообщений много, большинство из них чисто "технические", искать по зернышку в этом потоке сознания текущее состояние вашего проекта довольно затруднительно. Поэтому я не особо вникаю в детали вашей реализации. Тем более что CAN мне неинтересен. Я когда-то тоже на него западАл, но потом одумался.
Что касается протокола "вообще", то замечу, что RS485 в принципе не позволяет сделать интерфейс типа "производитель-потребитель", который можно сделать при помощи "открытого коллектора" (или при помощи шинного формирователя CAN, что по сути то же самое). А вот наоборот - можно. Можно сделать из CAN ординарный интерфейс мастер-слэйв, а ля Модбас.
Так что надстройку придумывать, конечно, придется, но ход мыслей будет задан как физическим уровнем, так и шаблонами мышления.
Там у вас в переписке упоминаются какие-то "адреса узлов". Для конфигурирования они нужны, для работы в режиме "производитель-потребитель" - категорически нет. Поскольку выясняется, что конфигурирование у вас через WiFi, то, наверное, все-таки вы из CAN подобие Модбаса делаете.
MaksVV пишет:
если почитать посты выше, то можно увидеть, что мой , скажем так, коллега по CANу, решил этот вопрос при помощи ESP wifi. И теперь заливает прошивки по воздуху. К тому же по wifi, я так понял, у него будет дублирование общения с узлами в случае возникновения проблем с шиной CAN.
Я видел это сообщение, но не придал ему особого значения. Подумал, что вы шлюз в интернет на WiFi делаете, что было бы логично. А вы, значит, в каждый узел собрались WiFi ставить, просто для заливки кода? Но если у вас в каждом узле уже есть WiFi, зачем вам вообще CAN? И неужели лишних 80 мА тока потребления не жалко тратить на одну только редко используемую заливку кода?
#ifdef ARD_DUE
CAN3.init_Mask(0,1,0x0000FF00); // Init first mask...
CAN3.init_Mask(1,1,0x0000FF00); // Init second mask...
CAN3.init_Filt(1,1,0x00000000); //Broadcast // Init first filter...
CAN3.init_Filt(2,1,0x00000400); //Node addr // Init second filter...
CAN3.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
#else
CAN0.init_Mask(0,1,0x0000FF00); // Init first mask...
CAN0.init_Mask(1,1,0x0000FF00); // Init second mask...
CAN0.init_Filt(1,1,0x00000000); //Broadcast // Init first filter...
CAN0.init_Filt(2,1,0x00000400); //Node addr // Init second filter...
CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
#endif
Нет, перебрал скорости, терминаторы, всеравно глючит, и видимо все же CAN контроллер, начинает выдавать в мегу то, что он получает Standart ID то нули, т.е получается нужно видимо фильтровать лишнее. Вот разбираюсь.
попробуй такой скетч залить на узлы и мастер (выбираешь соответственно адрес , тип и железо МК вверху скетча. ) Поставь на ночь и наблюдай канхакером что будет происходить.
по поводу аппаратной фильтрации нужно так сделать . Проверил, работает.
void CAN_Start () { // это setup
bool can_ok = 0;
if(can.begin(MCP_STDEXT, CAN_500KBPS, MCP_8MHZ) == CAN_OK) can_ok = 1;
can.init_Mask(0,1,0x0000FF00); // Init first mask...
can.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8); // Init first filter...
can.init_Filt(1,1,0x00000000); // Init second filter...
can.init_Mask(1,0,0x7FF); // Init second mask...
#ifdef debug
Serial.begin(115200);
if (can_ok) Serial.println(F("MCP2515 Initialized Successfully!"));
else
Serial.println(F("Error Initializing MCP2515..."));
Serial.println(); Serial.print(F("Мой адрес в сети CAN: ")); PrintADDR (node_address);
#ifdef type_node_master
Serial.println (F(" MASTER!"));
#endif
Serial.println();
timeoutsConfigControl ();
#endif
can.setMode(MCP_NORMAL);
pinmode(); // настройка портов (в зависимости от конфигурации массива device)
}
Заметь, строка инита MCP отличается. Данная фильтрация пропускает все широковещательные сообщения и с нашим адресом, а также все фреймы со стандартным (маленьким 0х000) ID.
Заметь, строка инита MCP отличается. Данная фильтрация пропускает все широковещательные сообщения и с нашим адресом, а также все фреймы со стандартным (маленьким 0х000) ID.
Мы делаем протокол над 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, то от этого ничего не изменится, это все равно будет "мастер-слэйв".
Впрочем, делайте как хотите, меня это не касается.
Мы делаем протокол над 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М и самое главное использование готовых плат и модулей.
На сегдня для ардуино есть коммуникационные модули
да я так, на скорую руку просто поставил, можешь вообще запретить короткие ID. Ты упрощённый скетч то попробовал?
pinmode () она и раньше была (см. большой скетч). в фунции pinmode () настраиваются порты ардуино автоматически в зависимости от конфигурации исполнительных устройств в can_struct.h
И если вы сделаете нечто подобное Модбасу на CAN, то от этого ничего не изменится, это все равно будет "мастер-слэйв".
от этого много что изменится. На модбасе rs485 всё идёт через мастера, и как бы слейв не хотел крикнуть в шину что-нибудь, ему нужно дождаться запроса мастера.
В CAN шине: захотел - сразу сказал. Реакция мгновенна. В нашей системе любой узел может говорить с любым узлом, даже если мастера вообще отключить. На Мастер лишь стекается вся информация от узлов для передачи её на уровень выше.
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 натягиваете допотопный Модбас. Хотя вольному воля, конечно, делайте что хотите.
Залил. Та же петрушка. Узлы по одному перестают отвечать. Пока пропал №9.
значит дело не в софте, а в железе. остаётся попробовать тоже самое, положив рядом все МК на коротком проводе CAN. Если будет гуд - то кабель неправильный и/или неправильная топология и/или длина и/или терминаторы нужно както по сопротивлению подбирать. Видимо от разных свойств кабеля (волновое сопротивление? хз чё это , почитать нужно) нужны разные терминаторы.
у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно.
у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно.
А почему сомневаетесь, если не секрет? Что особенного есть в контроллере CAN, из-за чего байты, отправленные им, непременно доходят до другого МК? И какой волшебной субстанции не хватает обычному UART, чтобы достичь того же результата?
у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно.
А почему сомневаетесь, если не секрет? Что особенного есть в контроллере CAN, из-за чего байты, отправленные им, непременно доходят до другого МК? И какой волшебной субстанции не хватает обычному UART, чтобы достичь того же результата?
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.
И видим что SN65HVD230 просто передатчик к которому нужно подвести сигнал. Без DSP или МК который этот сигнал сформирует, определив логику обмена, ничего не заработает.
Как точка точка на UART возможно пойдет, тут мысмль интересная. Хотя для этого есть 485.
Можно попробовать.
На приемопередатчике (трансивере) RS485 нельзя сделать обмен "производитель-потребитель", поскольку он не расчитан на коллизии. А на на трансивере CAN - можно, для него коллизии - это обычное дело. Не играет роли, что протокол делается при помощи UART с программным обнаружением коллизий, CSMA/CD. Для малонагруженных сетей это практически неотличимо от CSMA/CA (иногда то же самое обозначают CSMA/CR), поскольку коллизии очень редки. Я об этом уже писал выше. И точка-точка можно, и точка-многоточка.
На PIC-ах, у которых есть CLC (конфигурируемая логика) при помощи UART-а можно даже CSMA/CA сделать, но для домашних сетей это лишнее, овчинка выделки не стоит.
И видим что 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.
Мы с уважаемым MaksVV пишем протокол обмена уровня 3 модели OSI (даже скорее 3-4) , вы же насколько я понял используя трансивер хотите замахнуться на уровень 2 и 3 одновременно, обеспечивая управление коллизиями и передачу данных, так как Вас не устраивает обработка колизий у CAN.
Просьба всеже внимательно прочитать датиашит и не путать трансивер 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, остальное лишнее.
А в CAN меня не обработка коллизий не устраивает, а ненужная для такой задачи сложность.
Я не совсем понял про сложность.
У нас есть MCP2515, это трансивер и контроллер перекрывающи задачу не только фиксации но разрешения колизий, т.е на уровне 2 сообщение гарантированно будет доставлено.
Т.е мы сразу пошли к уровню 3 адресация и контроль доставки сообщений уровень 4. Пробустив СЛОЖНЕЙШИЙ уровень 2.
Т.е вы считаете что уровень 2 аналогичный Ethernet, ATM, CAN и пр. протоколам проще чем просейший протокол который мы делаем?
И еще вопрос, алгоритм работы KNX на уровне бит байт фрейм у Вас есть чтобы его повторять. Ну или алгоритм работы Вашего протокола. Интересно посмотреть.
короче не смог я найти второй трансивер. Один только есть.
Вместо CAN трансивера вы можете использовать RS-485 трансивер. Они довольно хорошо совместимы, особенно на малых скоростях. Выход UART-а надо подать на DE трансивера, а вход DI посадить на землю.
Когда-то очень давно, пока не разработали специальные CAN трансиверы, все так и делали.
Т.е вы считаете что уровень 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.
triac, бит/байт стаффинг обычно используют в синхронных каналах передачи данных. UART по определению асинхронный, есть более простые способы обозначить начало пакета: 9й бит, бит паритета, межпакетный интервал.
В общем полная победа, суточный прогон прошли без сбоев.
Помогли фильтры, причем пробовал оба варианта. Видимо все же буфер приемный переполнялся и в МК начинал просачиваться мусор, на который тот уже переставал реагировать.
Да и скорость до 250 уронил, думаю твою прошивку уже на 500 гонять.
Так, что вопрос был не в топологиии и терминаторах
#ifdef ARD_DUE
//CAN3.init_Mask(0,1,0x0000FF00); // Init first mask...
//CAN3.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8); // Init first filter...
//CAN3.init_Filt(1,1,0x00000000); // Init second filter...
//CAN3.init_Mask(1,0,0x7FF); // Init second mask...
CAN3.init_Mask(0,1,0x0000FF00); // Init first mask...
CAN3.init_Mask(1,1,0x0000FF00); // Init second mask...
CAN3.init_Filt(1,1,0x00000000); //Broadcast // Init first filter...
CAN3.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8); // Init first filter...
CAN3.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
#else
//CAN0.init_Mask(0,1,0x0000FF00); // Init first mask...
//CAN0.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8); // Init first filter...
//CAN0.init_Filt(1,1,0x00000000); // Init second filter...
//CAN0.init_Mask(1,0,0x7FF); // Init second mask...
CAN0.init_Mask(0,1,0x0000FF00); // Init first mask...
CAN0.init_Mask(1,1,0x0000FF00); // Init second mask...
CAN0.init_Filt(1,1,0x00000000); //Broadcast // Init first filter...
CAN0.init_Filt(0,1,(node_address & 0xFFFFFFFF)<<8); // Init first filter...
CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
#endif
Так что давай последнюю прошивку с фильтрами, буду компилировать и заливать.
Я только сейчас понял что один из основных Ваших аргументов за 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 любому контроллеру сети.
В общем полная победа, суточный прогон прошли без сбоев.
Помогли фильтры, причем пробовал оба варианта. Видимо все же буфер приемный переполнялся и в МК начинал просачиваться мусор, на который тот уже переставал реагировать.
это не может не радовать! Сейчас хоть дальше скетч писать можно. Вечером выложу основной скетч с фильтрами.
бит/байт стаффинг обычно используют в синхронных каналах передачи
Представьте какой-нибудь пруф своему утверждению, если можно. Чтобы стало понятно, почему байт-стаффинг как-то связан с синхронными каналами, и почему в асинхронных его использовать некошерно.
Andy пишет:
И причем здесь вообще KNX?
Все было уже сказано много раз выше. KNX является определенным эталоном сети домашней автоматизации, успешной и проверенной временем. Поэтому любые другие сети для таких применений имеет смысл делать с оглядкой на KNX. Кроме KNX есть и другие сети для этих же применений, построенные на совсем иных принципах, LonWorks, например (передача токена), и даже и Модбас кое-кто применяет (мастер-слэйв), и как ни странно не только любители. Однако для автоматизации домов/зданий менее распространены и, соответственно, менее успешны. Поэтому я ориентируюсь на перечисленные ранее сети автоматизации зданий, построенные по принципу "производитель-потребитель": KNX, C-Bus, VelBus. Из перечисленных трех наименее распространен бельгийский VelBus, построенный на CAN.
Весь обмен идет на скорости 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 мастер и слейв находятся на 4-7 уровне модели OSI
Вам приходится этим заниматься вследствие изначальной кривизны протокола CAN: всего 8 или 11 байт во фрейме, а по жизни надо больше. Если же уровень 2 настроен на прикладное применение, как в KNX, C-bus или у меня, то все уровни от 3 до 6 не нужны. Мне 128 байт во фрейме и порядка 100 узлов в сегменте хватает для того, чтобы для моего дома не заботиться ни о маршрутах, ни о сегментах, ни о сеансах.
Что касается 6-го уровня, то рассматривал разные варианты представления и шифрование тоже. Но потом решил все это пока отложить. В принципе представление типа MessagePack и шифрование типа XTEA можно ввести, но пока особой нужды в этом нет.
riv пишет:
и их задача контроль состояния сети и узлов, сбор информации датчиках и ИУ, шлюзование в MQTT поверх TCP/IP с возможностью послать reset любому контроллеру сети.
Вы перечисляете в основном задачи, принадлежащие 7 уровню.
Пока ваш пакет из 128 байт летит на низкой скорости кстати, остальные молчат?
Угу. Такой пакет передается примерно 70 мс. В это время все молчат. Правда, передается он редко когда. Но раз уж передается, то не беда, помолчат 70 мс. Все равно никто этого не заметит.
В статусе узла один параметр поменялся и что весь длинный пакет изза одного например бита отправлять?
Вообще-то статус передается по запросу, это точка-точка.
Ну а в случаях, когда некий статус бродкастится по каким-то причинам, то да, передавать весь пакет. Это решение принимается на стадии проектирования, когда и что передавать. Скажем, температуру вам вряд ли надо бродкастить каждую миллисекунду.
Представьте какой-нибудь пруф своему утверждению, если можно. Чтобы стало понятно, почему байт-стаффинг как-то связан с синхронными каналами
Забавный ты. Прежде чем изобретать "колёсное транспортное средство, приводимое в движение мускульной силой человека" посмотри, что такое велосипед.
В синхронных каналах нет другого способа формирования пакетов кроме, как битстаффинг и байтстаффинг. Познакомься хотя бы с 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 байт информации. мне на ум не приходят.
В синхронных каналах нет другого способа формирования пакетов кроме, как битстаффинг и байтстаффинг.
Это неверно. Например, 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 - асинхронный
Ну, кому что нравится. Многие и на Модбасе делают, и на 1-wire, и даже на I2C пытаются. А свободная топология прокладки кабелей - весьма лакомый кусочек.
Насчет дешeвизны MCP2515: цена у него почти такая же, как у Ардуино Мини Про.
Что же касается "распростаненности CAN" - так ведь UART еще более стандартный и широко распростаненный. Построить CSMA/CD займет несколько десятков строчек кода. Надстройка над CAN-ом, позволяющая передавать длинные сообщения по кусочкам, займет больше. Даже просто общение с MCP2515 займет больше. Не говоря уж о куче всяких разномастных регистров у него (как и любого другого CAN контроллера), с которыми надо работать - настраивать фильтры и маски, обрабатывать ошибки, и т.д. и т.п.
Есть еще одна проблема, которую я пока не затронул. Работа любой системы состоит из двух этапов: конфигурирования и, собственно, самой работы. Вот про конфигурирование все как-то забывают. А делать конфигурирование при помощи CAN - нетривиальное занятие: получится или сложно, или ограниченно по возможностям, или вообще и то и другое.
Любительские системы обычно полагаются на непосредственный доступ к узлам и прямую заливку кода программатором. "Своя ноша не тянет", подумаешь, лишний десяток раз, пока все не отладишь: слазить на чердак, вытащить узел, принести его к РС, залить скомпилированный конкретно под него код, опять залезть на чердак и поставить его на место.
Профессиональные системы позволяют конфигурировать узлы уже после установки. Но программное обеспечение, которое позволяет это делать, сложное.
Используя UART, Ардуино и свой протокол, эту проблему можно решить, например, так. В протокол вводятся две обязательные к исполнению всеми узлами команды:
- "Сброс" - программный сброс для конкретного узла (выбор узла производится по уникальному адресу узла или по его серийному номеру), после чего у него запускается бутлодер
- "Пауза" - запрет всем узлам реагировать на любой трафик в сети на некоторое время, скажем, на 10 сек
Подав эти две команды, можно дистанционно залить скетч в выбранный узел.
Есть еще одна проблема, которую я пока не затронул. Работа любой системы состоит из двух этапов: конфигурирования и, собственно, самой работы. Вот про конфигурирование все как-то забывают. А делать конфигурирование при помощи CAN - нетривиальное занятие: получится или сложно, или ограниченно по возможностям, или вообще и то и другое.
Любительские системы обычно полагаются на непосредственный доступ к узлам и прямую заливку кода программатором. "Своя ноша не тянет", подумаешь, лишний десяток раз, пока все не отладишь: слазить на чердак, вытащить узел, принести его к РС, залить скомпилированный конкретно под него код, опять залезть на чердак и поставить его на место.
Профессиональные системы позволяют конфигурировать узлы уже после установки. Но программное обеспечение, которое позволяет это делать, сложное.
если почитать посты выше, то можно увидеть, что мой , скажем так, коллега по CANу, решил этот вопрос при помощи ESP wifi. И теперь заливает прошивки по воздуху. К тому же по wifi, я так понял, у него будет дублирование общения с узлами в случае возникновения проблем с шиной CAN.
Я видел это сообщение, но не придал ему особого значения. Подумал, что вы шлюз в интернет на WiFi делаете, что было бы логично. А вы, значит, в каждый узел собрались WiFi ставить, просто для заливки кода? Но если у вас в каждом узле уже есть WiFi, зачем вам вообще CAN? И неужели лишних 80 мА тока потребления не жалко тратить на одну только редко используемую заливку кода?
Разобрался я с фильтрами.
как дела со стабильностью ? разобрался в чем косяк?
Нет, перебрал скорости, терминаторы, всеравно глючит, и видимо все же CAN контроллер, начинает выдавать в мегу то, что он получает Standart ID то нули, т.е получается нужно видимо фильтровать лишнее. Вот разбираюсь.
Тут пример https://yadi.sk/d/ozOcbX7B3V5hYy can_mask1 и can_mask2
попробуй такой скетч залить на узлы и мастер (выбираешь соответственно адрес , тип и железо МК вверху скетча. ) Поставь на ночь и наблюдай канхакером что будет происходить.
по поводу аппаратной фильтрации нужно так сделать . Проверил, работает.
Заметь, строка инита MCP отличается. Данная фильтрация пропускает все широковещательные сообщения и с нашим адресом, а также все фреймы со стандартным (маленьким 0х000) ID.
Заметь, строка инита MCP отличается. Данная фильтрация пропускает все широковещательные сообщения и с нашим адресом, а также все фреймы со стандартным (маленьким 0х000) ID.
А смысл пропускать все 0х000 ID?
И что за зверь
pinmode();?
Полистал топик, нашел такую декларацию:
Для справки:
- Modbus был разработан в 70-е годы
- CAN был разработан в 80-е годы
- KNX был разработан в 90-е годы
Основные применения таких скоростей это управление светом (согласитесь ждать 1-2 сек когда мастер опросит датчики движения а потом передаст УК команду включить реле света, немного не комфортно), управление медиа (звук, видео - переключение радио, оповещения о событиях) и др. приложениях где задержка вызывает дискомфорт или просто опасна.
Повторю, что за счет работы по принципу "производитель-потребитель" KNX способен без задержек управлять светом даже в многоэтажных оффисных зданиях и т.п., но при этом работает на скорости 9.6 кбит/сек. Модбас, работающий по принципу "мастер-слэйв", на это не способен даже при 1 Мбит/сек. И если вы сделаете нечто подобное Модбасу на CAN, то от этого ничего не изменится, это все равно будет "мастер-слэйв".
Впрочем, делайте как хотите, меня это не касается.
Полистал топик, нашел такую декларацию:
Для справки:
- Modbus был разработан в 70-е годы
- CAN был разработан в 80-е годы
- KNX был разработан в 90-е годы
Основные применения таких скоростей это управление светом (согласитесь ждать 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 модуль?
А смысл пропускать все 0х000 ID?
И что за зверь
pinmode();?
да я так, на скорую руку просто поставил, можешь вообще запретить короткие ID. Ты упрощённый скетч то попробовал?
pinmode () она и раньше была (см. большой скетч). в фунции pinmode () настраиваются порты ардуино автоматически в зависимости от конфигурации исполнительных устройств в can_struct.h
Сегодня скомпилирую и залью.
Залил. Та же петрушка. Узлы по одному перестают отвечать. Пока пропал №9.
от этого много что изменится. На модбасе rs485 всё идёт через мастера, и как бы слейв не хотел крикнуть в шину что-нибудь, ему нужно дождаться запроса мастера.
В CAN шине: захотел - сразу сказал. Реакция мгновенна. В нашей системе любой узел может говорить с любым узлом, даже если мастера вообще отключить. На Мастер лишь стекается вся информация от узлов для передачи её на уровень выше.
В общем пора брать осцилограф и смотреть топологию. Буду отключать кустами и смотреть что получится.
Намек на то, что вы движитесь в обратном направлении, надстраивая нечто наподобие Модбаса поверх CAN для того, чтобы решать задачи, на которые заточен KNX.
Ссылка на KNX дана не для того, чтобы все бросить и перейти на KNX. Но знать, как он устроен, полезно, хотя бы на самом базовом уровне: https://www.ixbt.com/home/knx-intro.shtml
Все команды можно разделить на два класса:
- точка-точка, с индивидуальной адресацией узлов; эти команды используются для конфигурирования и диагностики системы
- точка-многоточка, т.е. бродкаст, адрес узла отсутствует; эти команды используются для собственно работы
Ключевое понятие - "групповой адрес". Его можно назвать "виртуальным проводом", которым связана группа устройств. Устройства ввода (выключатели, регуляторы) меняют состояние этого "провода". Устройства вывода (релейные выключатели, диммеры) выполняют действия в соответствии с текущим состоянием "провода". Все устройства (т.е. и устройства ввода, и устройства вывода) в группе отслеживают текущее состояние "провода".
При конфигурировании создаются эти группы, т.е. устройства настраиваются на принадлежность той или иной группе. Заодно настраиваются и другие параметры устройств, например, скорость диммирования при нажатии на кнопку, и т.п. Устройства могут входить в несколько групп. Например, кнопочный выключатель с двумя кнопками управляет двумя группами, релейный модуль на 4 реле отрабатывает состояния 4-х "виртуальных проводов".
Это достаточно хорошо ложится на MQTT, групповой адрес вполне соответствует топику. Ну а все команды конфигурирования в принципе можно свести в один топик.
В принципе вполне возможно сделать 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, за что вам отдельное спасибо, это как раз то, что мне нужно.
Залил. Та же петрушка. Узлы по одному перестают отвечать. Пока пропал №9.
значит дело не в софте, а в железе. остаётся попробовать тоже самое, положив рядом все МК на коротком проводе CAN. Если будет гуд - то кабель неправильный и/или неправильная топология и/или длина и/или терминаторы нужно както по сопротивлению подбирать. Видимо от разных свойств кабеля (волновое сопротивление? хз чё это , почитать нужно) нужны разные терминаторы.
Сам-то я планирую к обычному UART-у Ардуино Мини Про присоединить голый CAN трансивер, например, такой: https://ru.aliexpress.com/item/SN65HVD230-CAN-bus-transceiver-communication-module-for-arduino/32686393467.html Шина CAN трансивер связи-модуль для Arduino
у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно.
у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно.
А почему сомневаетесь, если не секрет? Что особенного есть в контроллере CAN, из-за чего байты, отправленные им, непременно доходят до другого МК? И какой волшебной субстанции не хватает обычному UART, чтобы достичь того же результата?
у меня валяется два кан трансивера. Не поленюсь подключу к уарт. Посмотрим, долетят ли байты от одного МК до другого. Что то я сомневаюсь, если честно.
А почему сомневаетесь, если не секрет? Что особенного есть в контроллере CAN, из-за чего байты, отправленные им, непременно доходят до другого МК? И какой волшебной субстанции не хватает обычному UART, чтобы достичь того же результата?
вечером подключу, отпишусь.
Просьба всеже внимательно прочитать датиашит и не путать трансивер CAN который по сути просто усилитель и формироватиель биимпульса и CAN контроллера который как раз протокол CSMA делает.
Для MaksVV
Именно это я имел виду выше говоря что в связке с 232 может и полететь, а наш MCP2515 состоит из 2х частей
ТРАНСИВЕРА TJA1050 и КОНТРОЛЛЕРА MCP2515. SN65HVD230 имеет только ТРАНСИВЕР SN65 и его можно использовать например в связке с DUE.
Для triac
Мы с уважаемым MaksVV пишем протокол обмена уровня 3 модели OSI (даже скорее 3-4) , вы же насколько я понял используя трансивер хотите замахнуться на уровень 2 и 3 одновременно, обеспечивая управление коллизиями и передачу данных, так как Вас не устраивает обработка колизий у CAN.
Задача весьма интересная но и весьма сложная.
Просьба всеже внимательно прочитать датиашит и не путать трансивер 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, остальное лишнее.
Это все, что нужно, чтобы создать узел сети, функционально соответствующий узлу KNX.
В следующем сооющении я как раз об этом и написал, про Ваше желание написать протокол канального уровня. +сетевого.
Из 7-уровневой модели ISO/OSI под эту задачу нужны только 1,2 и 7, остальное лишнее.
Модель оси создана конечно не как догма а как руководство к действию.
Но как обойтись без адресации сетевого уровня и контроля доставки транспортного и сразу перейти к передаче сообщений и команд я не понимаю.
А в CAN меня не обработка коллизий не устраивает, а ненужная для такой задачи сложность.
Я не совсем понял про сложность.
У нас есть MCP2515, это трансивер и контроллер перекрывающи задачу не только фиксации но разрешения колизий, т.е на уровне 2 сообщение гарантированно будет доставлено.
Т.е мы сразу пошли к уровню 3 адресация и контроль доставки сообщений уровень 4. Пробустив СЛОЖНЕЙШИЙ уровень 2.
Т.е вы считаете что уровень 2 аналогичный Ethernet, ATM, CAN и пр. протоколам проще чем просейший протокол который мы делаем?
И еще вопрос, алгоритм работы KNX на уровне бит байт фрейм у Вас есть чтобы его повторять. Ну или алгоритм работы Вашего протокола. Интересно посмотреть.
короче не смог я найти второй трансивер. Один только есть. Заказал ещё пару (на этот раз другой решил взять) - mcp2551
короче не смог я найти второй трансивер. Один только есть.
Вместо CAN трансивера вы можете использовать RS-485 трансивер. Они довольно хорошо совместимы, особенно на малых скоростях. Выход UART-а надо подать на DE трансивера, а вход DI посадить на землю.
Когда-то очень давно, пока не разработали специальные CAN трансиверы, все так и делали.
Проще
И еще вопрос, алгоритм работы 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.
triac, бит/байт стаффинг обычно используют в синхронных каналах передачи данных. UART по определению асинхронный, есть более простые способы обозначить начало пакета: 9й бит, бит паритета, межпакетный интервал.
И причем здесь вообще KNX?
Для MaksVV
В общем полная победа, суточный прогон прошли без сбоев.
Помогли фильтры, причем пробовал оба варианта. Видимо все же буфер приемный переполнялся и в МК начинал просачиваться мусор, на который тот уже переставал реагировать.
Да и скорость до 250 уронил, думаю твою прошивку уже на 500 гонять.
Так, что вопрос был не в топологиии и терминаторах
Так что давай последнюю прошивку с фильтрами, буду компилировать и заливать.
Для 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 любому контроллеру сети.
Помогли фильтры, причем пробовал оба варианта. Видимо все же буфер приемный переполнялся и в МК начинал просачиваться мусор, на который тот уже переставал реагировать.
это не может не радовать! Сейчас хоть дальше скетч писать можно. Вечером выложу основной скетч с фильтрами.
Кстати шлюзование в MQTT для мастера я тоже отладил, потом оформлю отдельным файлом mqtt.ino, так же как web
в коде до setup && loop
setup()
в loop()
В коде
Ну и основная функция - она выводит статус опроса в serial, в UDP порт, на MQTT сервер, с которого подбирает Majordomo. Пока только отдаю на сервер.
Да кстати здесь вывод времени в часах, минутах секундах от запуска, можно еще дни добавить для полного счастья, Millis раз в 50 суток обнуляется. Кстати нужно еще watchdog ставить на МК. (https://uscr.ru/arduino-watchdog-bootloop-i-proshivka-zagruzchika-optiboot/)
Представьте какой-нибудь пруф своему утверждению, если можно. Чтобы стало понятно, почему байт-стаффинг как-то связан с синхронными каналами, и почему в асинхронных его использовать некошерно.
Все было уже сказано много раз выше. KNX является определенным эталоном сети домашней автоматизации, успешной и проверенной временем. Поэтому любые другие сети для таких применений имеет смысл делать с оглядкой на KNX. Кроме KNX есть и другие сети для этих же применений, построенные на совсем иных принципах, LonWorks, например (передача токена), и даже и Модбас кое-кто применяет (мастер-слэйв), и как ни странно не только любители. Однако для автоматизации домов/зданий менее распространены и, соответственно, менее успешны. Поэтому я ориентируюсь на перечисленные ранее сети автоматизации зданий, построенные по принципу "производитель-потребитель": KNX, C-Bus, VelBus. Из перечисленных трех наименее распространен бельгийский VelBus, построенный на CAN.
Весь обмен идет на скорости 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?
Практические опыты уже проводили? Код, железо? Или вы пока на этапе НИР?
Кто нибудь приведите пример использования кадра размером более 8 байт информации. мне на ум не приходят.
Что аудио или видео что ли передавать или страницы текста?
в своём дейсвующем протоколе я использую каждый бит в байте. Таким образом, в одном 8-байтном фрейме я могу передать состояние света в 64 комнатах
Наш с уважаемым MaksVV мастер и слейв находятся на 4-7 уровне модели OSI
Вам приходится этим заниматься вследствие изначальной кривизны протокола CAN: всего 8 или 11 байт во фрейме, а по жизни надо больше. Если же уровень 2 настроен на прикладное применение, как в KNX, C-bus или у меня, то все уровни от 3 до 6 не нужны. Мне 128 байт во фрейме и порядка 100 узлов в сегменте хватает для того, чтобы для моего дома не заботиться ни о маршрутах, ни о сегментах, ни о сеансах.
Что касается 6-го уровня, то рассматривал разные варианты представления и шифрование тоже. Но потом решил все это пока отложить. В принципе представление типа MessagePack и шифрование типа XTEA можно ввести, но пока особой нужды в этом нет.
и их задача контроль состояния сети и узлов, сбор информации датчиках и ИУ, шлюзование в MQTT поверх TCP/IP с возможностью послать reset любому контроллеру сети.
Вы перечисляете в основном задачи, принадлежащие 7 уровню.
Практические опыты уже проводили? Код, железо? Или вы пока на этапе НИР?
Есть работающий шлюз в USB, с гальваноразвязкой. Сделан на PIC24, так мне было удобнее. Узлы на Ардуинах в процессе.
Кто нибудь приведите пример использования кадра размером более 8 байт информации. мне на ум не приходят.
- Ответ на запрос о типе и текущей ревизии узла (если не разбивать на много мелких команд и ответов)
- Ответ на запрос статуса узла (аналогично, без разбивки)
- Практически любой текст.
- Дата лог
- Данные от сенсора в XML или JSON
Пока ваш пакет из 128 байт летит на низкой скорости кстати, остальные молчат?
В статусе узла один параметр поменялся и что весь длинный пакет изза одного например бита отправлять?
Угу. Такой пакет передается примерно 70 мс. В это время все молчат. Правда, передается он редко когда. Но раз уж передается, то не беда, помолчат 70 мс. Все равно никто этого не заметит.
Вообще-то статус передается по запросу, это точка-точка.
Ну а в случаях, когда некий статус бродкастится по каким-то причинам, то да, передавать весь пакет. Это решение принимается на стадии проектирования, когда и что передавать. Скажем, температуру вам вряд ли надо бродкастить каждую миллисекунду.
Для MaksVV
Вот еще код автономной метеостанции без CAN только на ESP8266 через esp-link mqtt
Как я и предполагал, скорость реакции очень низкая и годится только для сенсоров. Реального времени добится не получится.
RIV_full_typemsg6
В синхронных каналах нет другого способа формирования пакетов кроме, как битстаффинг и байтстаффинг. Познакомься хотя бы с HDLC, Frame Relay (биториентированные протоколы), или ATM, BSC (байториентированные протоколы).
1000 кбит - 40м
500кбит - 110м
250кбит - 240м
125кбит - 500м
50кбит - 1 300м
20кбит - 3 300м
10кбит - 6 300м
5кбит - 13 000м
Дистанционная загрузка ПО.
Забавный ты.
Я не заметил, когда мы с вами перешли на "ты".
В синхронных каналах нет другого способа формирования пакетов кроме, как битстаффинг и байтстаффинг.
Это неверно. Например, C-bus - синхронный, но не использует ни бит-стаффинг, ни байт-стаффинг, ни даже кодирование по типу 8b/10b или 6b/8b, при помощи которого это тоже можно сделать.
Или посмотрите как сделан синхронный интерфейc чипов WS2812 для управления RGB лентами. Там вообще ничего из перечисленного выше не использовано, а тем не менее работает.
Познакомься хотя бы с HDLC, Frame Relay (биториентированные протоколы), или ATM, BSC (байториентированные протоколы).
Каким образом из того, что некоторые синхронные протоколы используют бит-стаффинг, следует, что мне не надо использовать байт-стаффинг там, где мне это удобно? Где логика?
По-вашему SLIP или COBS можно только в синхронных интерфейсах применять? Скорей всего вы вообще не знаете что такое байт-стаффинг. Для примера, ознакомьтесь с Wake http://caxapa.ru/lib/wake/
Другими словами предлагаемая реализация не имеет ничего общего с KNX, потому как, ни аппаратно, ни программно не совместима с KNX
Совершенно верно, несовместима. Задачи сделать их совместимыми не ставилось и нигде этого не обещалось. Непонятно с чего вы вдруг заговорили о совместимости.
Более того, KNX (EIB) и C-Bus тоже между собой несовместимы, хотя изначально их разрабатывали одни и те же люди. По сути своей они очень похожи, однако C-bus синхронный, а KNX - асинхронный
Выпало 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