тип данных параметров в массиве содержится в нулевом элементе первого измерения массива
т.е. #define TYPE_VAR 0
правильно ты показал для air_t это BYTE_1_SIGNED. При отправке по CAN эта инфа (тип данных) будет содержаться в фрейме и приёмник соответствующим образом интерпретирует этот параметр.
Параметр отсылается на один выбранный узел по изменению или периодически, в зависимости от того, что наступит раньше. На ещё один узел я не сделал возможности так отправлять параметры. НО, если какому то узлу нужен параметр - он может запросить у нашего узла и наш узел ему ответит этим параметром. (Сообщение - запрос параметра).
Параметр отсылается на один выбранный узел по изменению или периодически, в зависимости от того, что наступит раньше. На ещё один узел я не сделал возможности так отправлять параметры. НО, если какому то узлу нужен параметр - он может запросить у нашего узла и наш узел ему ответит этим параметром. (Сообщение - запрос параметра).
Можно ( и это в принципе не сложно) добавить в код, чтобы был выбор - чтобы на ещё один узел отправлять параметры. Т.е. в целом будут выбирается два адреса, на которые будут передаваться параметры периодически или по изменению (смотря что наступит раньше).
А если нужно больше узлов, то проще уж широковещательное сообщение делать, из которого все кому надо возмут инфу. Так и шина меньше нагружаться будет.
судя о канхакингу , ты сначала видимо отправлял команды id 11xxxxxx,соответственно потом приходили отчеты о командах - id 12xxxxxx. а все что ниже (id начинается c 14xxxxxx) это периодически узлы отправляют свои параметры на мастер и узел 21 (15h). Смотри там в can_struct.h я специально отправку одного параметра поставил не на мастер, а на узел 21.
судя о канхакингу , ты сначала видимо отправлял команды id 11xxxxxx,соответственно потом приходили отчеты о командах - id 12xxxxxx. а все что ниже (id начинается c 14xxxxxx) это периодически узлы отправляют свои параметры на мастер и узел 21 (15h). Смотри там в can_struct.h я специально отправку одного параметра поставил не на мастер, а на узел 21.
Так что всё гуд.
Я про это говорю, команды не отправлял. Все само. (Либо как вариант сыпется мусор из web потра 8266) К этому и спрашивал. Надо думаю test везде кроме мастера отключить.
И еще глобальная просба, на тему структуризации кодо и его наследования. Просьба переделать немного основной файл и System_Functions следующим образом:
Выделить отдельно
main_init в него настройка сериала, версий и пр. общего
can_init (у тебя CAN_Start и MCP2515_Init )
Это нужно чтобы разделить и мне потом не встраивать через ж свой код
смотри в can_struct.h - так настроена периодическая передача первого параметра (air_t) - широковещательно. Этим я проверял в это :
MaksVV пишет:
Можно ( и это в принципе не сложно) добавить в код, чтобы был выбор - чтобы на ещё один узел отправлять параметры. Т.е. в целом будут выбирается два адреса, на которые будут передаваться параметры периодически или по изменению (смотря что наступит раньше). А если нужно больше узлов, то проще уж широковещательное сообщение делать, из которого все кому надо возмут инфу. Так и шина меньше нагружаться будет.
Нашёл довольно серьезный косяк. При периодической отправке параметров , весь список перебирается в цикле for. В теле цикла нет delay. Поэтому сообщения из списка от ардуины долбят в MCP2515 с большой скоростью. Опытным путём установил, что не все сообщения из списка передаются. Поставил delay (5). Стало всё гуд. Возможно из - за этого шина глючила. Что слишком маленькое было время между отправками соседних сообщений.
15 версия, это исправлено. Также добавил выбор автоматической отправки параметров ещё на один узел. (т.е. в целом 2 )
мне по твоим последним логам не нравятся некорые узлы. В отладке пишется что статус от мастера принят, а отсылка своего статуса сразу за ним не пишется, т.е. может подрят несколько принять потом только свой отсылает. Такого быть никак не должно.
Или обратная проблема. Получения статусов от мастера в отладке нет, а свой статус отсылает . Причём в эти моменты узел мастером расценивается как ОК!. Вот с этим непонятки. Как будто тут сама дуня глючит и чё то с памятью.
А есть узлы (14 вроде) где вообще в отладке фразы на половину обрываются - явный признак нарушения памяти.
Вот эти косяки как раз указавают, что проблема софтовая.
Я только 15 залил. И проблема то не в сбое сети, которая блуждающая! То сутки стоит без проблем то опять повылазило сразу.
Проблема в рестарте по SPI как я почитал на буржуинских форумах, народ с этой проблемой сталкивался. Нужно ничего не передавать на MSP по SPI после ресета 128 тактов или 50-100мс (кто что пишет)
рестарт вообще не должен происходить, ну может совсем редко. А судя по логам, у тебя едва едва fail не выскакивало. Некоторые узлы с ума сходили. И кстати у нас delay (100) есть. Ну сделай 200.
рестарт вообще не должен происходить, ну может совсем редко. А судя по логам, у тебя едва едва fail не выскакивало. Некоторые узлы с ума сходили. И кстати у нас delay (100) есть. Ну сделай 200.
Ну выходные то после перепайки исправили ситуацию, и вчера стояли норм (правда на 125)
мне по твоим последним логам не нравятся некорые узлы. В отладке пишется что статус от мастера принят, а отсылка своего статуса сразу за ним не пишется, т.е. может подрят несколько принять потом только свой отсылает. Такого быть никак не должно.
Или обратная проблема. Получения статусов от мастера в отладке нет, а свой статус отсылает . Причём в эти моменты узел мастером расценивается как ОК!. Вот с этим непонятки. Как будто тут сама дуня глючит и чё то с памятью.
А есть узлы (14 вроде) где вообще в отладке фразы на половину обрываются - явный признак нарушения памяти.
Вот эти косяки как раз указавают, что проблема софтовая.
Поэтому и надо залить простой скетч и проверить.
Это проблема Wi-Fi вывода лога, я заметил что через Wi-Fi/IP/Serial лог идет с потерями. Через Web все нормально но там буфер маленький. Я лог снимаю через esp-link это проброс serial через wi-fi esp8266
да уж, вифи с одной стороны облегчил жись, а с другой... Как бы ещё не было проблем с корявой заливкой hex файла по воздуху. Хотя там верификация какаянибудь должна быть .
да уж, вифи с одной стороны облегчил жись, а с другой... Как бы ещё не было проблем с корявой заливкой hex файла по воздуху. Хотя там верификация какаянибудь должна быть .
таймаут я тоже у себя 100 поставил.
Я проблемы не вижу, он нужен для прошивки и MQTT а вот такие ОЖИДАЕМЫЕ потери и задержки как раз и покажывают место радио в системе автоматизации ;-) (А потери пулеметной ленты лога да еще через эмулятор Win telnet serial это не проблема, это норма. Кстати я прошиваю все только c linux машины, из под Win вообще не пошло)
кстати у меня тут возникла очень здравая идея. адрес узла сохранить каждому в еепром . И при старте скетча адрес будет читаться. Таким образом на этапе тестирования (пока у всех узлов скетч одинаковый) - тебе не нужно будет создавать кучу папок скетчей с разными узлами. Один скетч льешь во все узлы и всё. Естественно предварительно нужно один раз забить в еепром адрес на каждый узел.
Так у тебя уменьшится время на заливку ПО всех узлов.
Вот это сделано в версии 16. Почитаешь, всё поймешь в первой вкладке, там минимум изменений.
Кстати, обнаружил что нет блокировки отправки самому себе и приема своего же броадкаста
По простому в RX отсечь, а по хорошему фильтр придумать для своего бордкаста, а на передачу самому себе внутри TX если rem_adr==dev_adr то return ;)
Постоянно шлют
21->21
19->19
Честно, я вообще перестал понимать логику программы. По какому алгоритму идет рассылка я смотрю в канхаекр и просто диву даюсь что происходит в сети.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
если отправка самому себе реально произошла с нашего MCP2515 то на приёмник она не попадёт. (по стандарту CAN шины сообщения из передатчика не попадают на приёмник).
Отправки самому себе и свои же бродкасты быть не должны, ну допустим что будут (какой то другой узел глюкнул и от нашего имени нам отправил), но не часто, поэтому проще программно В RX() сделать блокировку.
Ты спрашивал про алгоритм. Он очень простой :
У мастера: каждую секунду шлём бродкаст.
У узла: получил от мастера бродкаст - отправил свой статус мастеру.
Также периодически (в секунду равную адресу) отправляем на настроенный узел параметры.
кстати у меня тут возникла очень здравая идея. адрес узла сохранить каждому в еепром . И при старте скетча адрес будет читаться. Таким образом на этапе тестирования (пока у всех узлов скетч одинаковый) - тебе не нужно будет создавать кучу папок скетчей с разными узлами. Один скетч льешь во все узлы и всё. Естественно предварительно нужно один раз забить в еепром адрес на каждый узел.
Так у тебя уменьшится время на заливку ПО всех узлов.
Вот это сделано в версии 16. Почитаешь, всё поймешь в первой вкладке, там минимум изменений.
Честно, я вообще перестал понимать логику программы. По какому алгоритму идет рассылка я смотрю в канхаекр и просто диву даюсь что происходит в сети.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
Ты спрашивал про алгоритм. Он очень простой :
У мастера: каждую секунду шлём бродкаст.
У узла: получил от мастера бродкаст - отправил свой статус мастеру.
Также периодически (в секунду равную адресу) отправляем на настроенный узел параметры.
Про запрос и ответ статуса узла на бродкаст от мастера понятно мастрер шлет на 0, узлы отвечают на 4
Вопрос в другом кому и где это прописано узел шлет параметры. Я не понимаю как залитый один и тот же код с отличием в имени узла начинает слать почему то разным узлам.
Я бы понял что все бы слали мастеру, на 00, и например 10, но ведь не так 0,4,19,21 Где это прописано?
Ограничение циклов 100 000 операций записи это даже если делать 10 записей в день хватит на 10 000 дней т.е примерно на 27 лет.
А нам нужно раз записать и потом при отладке перезаписывать иногда.
ты про параметры говорил. Я думал ты про массив parameter[][] - он то часто обновляется. А ты про другие настройки типа скорости шины и т.д. Их то да конечно в еепром тоже можно записывать.
// НИЖЕ УКАЗЫВАЕМ АДРЕС первого УЗЛА, КУДА ПЕРИОДИЧЕСКИ ИЛИ ПО ИЗМЕНЕНИЮ БУДЕТ ПОСЫЛАТЬСЯ КОНКРЕТНЫЙ ПАРАМЕТР, если 0xFF, то никому данный параметр не отсылается
для каждого параметра в отдельности выбирается узел, на который будет посылаться этот параметр периодически или по изменению. Начиная с 15 версии, можно для каждого параметра выбирать два узла, на которые он будет отсылаться
адрес, скорость шины, IP адреса, мастер/слейв/узел, debug и его ключи и пр. даже пока не придумывается.
с адресом , скоростью шины, IP адреса это да, но вот мастер/слейв/узел, debug и его ключи у нас же делаются с помощью директив условной компиляции и этот выбор происходит ещё когда скетч не в узле, а при компиляции, т.е. твой НЕХ файл когда создаётся. Сделать то можно будет, но всё через флаги только, а это память расходует.
и какой смысл эти данные держать в еепром, когда их как раз и нужно изменять при необходимости. А так они всё время из еепром одни и теже будут грузиться, без возможности выбора.
debug и его ключи у нас же делаются с помощью директив условной компиляции и этот выбор происходит ещё когда скетч не в узле, а при компиляции, т.е. твой НЕХ файл когда создаётся. Сделать то можно будет, но всё через флаги только, а это память расходует.
и какой смысл эти данные держать в еепром, когда их как раз и нужно изменять при необходимости. А так они всё время из еепром одни и теже будут грузиться, без возможности выбора.
Согласен. Тогда и мастер/слейв/узел тоже нет смысла (или в прошивке держать оба кода и узла и мастера ).
Ну в общем я про смысл прошивки.
Тем более что с таким набором и возможностью хранить произвольные типы. И вот в серьез подумать именно про твои настройки на епром byte parameter [6][parameters_quantity]
Тогда и мастер/слейв/узел тоже нет смысла (или в прошивке держать оба кода и узла и мастера ).
смысл в том чтобы, всё не подгружать в ОЗУ. В последствии на мастере можно сделать хранилище параметров от всех узлов. И тогда для остального места уже не остаётся. Поэтому для мастера нужен отдельный код. Тем более узлы можно не меги делать, а наны например, а у них памяти мало, поэтому нужны компактные скетчи для узлов.
Не вижу смысла грузить настройки parameter[][] в еепром
Не вижу смысла грузить настройки parameter[][] в еепром
Жаль, я в любом случае уникальные параметры каждого контроллера не зависящие от кода, в смысле перечень устройств, их адреса, куда направлять сообщения, у кого запрашивать и брать параметы положу в епром.
Просто это было бы красиво код одинаковый и отлаженый. Прошил епром подключил на универсальный разъем расширитель к которому подключил нужные датчики и ИУ. И вперед.
ну как ты тестировал стабильность v15 или v16 или может простой скетч #965 заливал?
Не я прежде чем "превращать в кирпич" ;-) т.е. писать в энергонезависимую память изучал вопрос, завтра соберу, прошью везде епром и залью 16 версию на 125к, я просто хочу сделать возможность через консоль дать команду на изменение скорости шины путем записи в епром и ресета. На подобе твоей test
путаться будешь, тут вот оно в скетче, правишь когда надо. А там в еепроме как посмотреть, что залито? И где он одинаковый код. На одном узле, например, используется 3 параметра, а на другом - 23. В основном скетче проще всё менять, чем еепром прошивать отдельным скетчем. Еепром считаю нужен как энергонезависимая память.
смысл в том чтобы, всё не подгружать в ОЗУ. В последствии на мастере можно сделать хранилище параметров от всех узлов. И тогда для остального места уже не остаётся. Поэтому для мастера нужен отдельный код. Тем более узлы можно не меги делать, а наны например, а у них памяти мало, поэтому нужны компактные скетчи для узлов.
Смотри, сеть стационарная, все на кабелях, какова Вероятность что ды доподключишь в последствии что то помимо уже установленного. Правильно, никакая. Тогда зачем делать централизованное хранилище конфига? Прошил в епром все типы подключенных датчиков, ИУ и все. В зависимости от этого инициируешь переменные.
А работать с наной я честно не готов, тогда уж при этом формфакторе есть 32 разрадные с памятью. А лучше тогда сразу ESP32.
путаться будешь, тут вот оно в скетче, правишь когда надо. А там в еепроме как посмотреть, что залито? И где он одинаковый код. На одном узле, например, используется 3 параметра, а на другом - 23. В основном скетче проще всё менять, чем еепром прошивать отдельным скетчем. Еепром считаю нужен как энергонезависимая память.
Тогда будет, по крайней мере в моем случае минимум 15 скетчей для узлов на меге, 2 мастер слейв на DUE.
Для всех нужно иметь свой разный конфиг и нигде не ошибиться. Я не просто так помнишь начинал с очень простых и читаемых типов у-в и ИУ.
Узлы у меня практически типовые с небольшими отличиями.
Ну на самом деле нужно подумать еще. Это не окончательное решение. Но уж больно идея заманчивая. Кстати чтобы не писать все время в процессе отладки можно эмулятор простой сделать читать не из памати а из файла ну типо ф-ю EEPROM1 с теми же вызовани сделать на время отладки.
Прошил в епром все типы подключенных датчиков, ИУ и все. В зависимости от этого инициируешь переменные.
блин ну не пойму я смысла. Это всё и так лежит в энергонезависимой памяти, которая называется флеш. В ней залит скетч. В скетче есть эта информация. Дак нафига её в еепром то пихать? В том то и дело, если ты ничего подключать дополнительно не собираешься вообще не имеет смысла в еепром пихать. Т.к. туда пихается обычно изменяемая инфа. А постоянная она из флеша (скетча) спокойно также грузится.
1. Код для обработки датчиков кидаю в файл Update_Parameters
int bme_temp() {}
int bme_hum() {}
int bme_pres() {}
2.
parameter [PARAMETER][param_addr (air_t)] = bme_temp();
parameter [PARAMETER][param_addr (air_h)] = bme_hum();
parameter [PARAMETER][param_addr (air_p )] = bme_pres();
С этим вроде понятно
а вот дальше типы параметров в byte parameter [5][parameters_quantity] нигде не описаны.
И как соотносится
#define air_t 1 //датчик температуры
BYTE_1_SIGNED, //1 //датчик температуры
1, //1 //датчик температуры
и как сделать чтоб ы температура отсылалась не только node_4_Net_center_Due1, //1 //датчик температуры
но и например
node_1_Net_center_PC, //1
node_2_Net_center_oraPi1, //2
И как понять отправка будет периодическая или по изменению параметра (где это указать)
1. Функции лучше делать чтобы тип данных был однобайтовый, например byte (для беззнаковых) или int8_t для знаковых. Примерно так
1
int8_t bme_temp() {}
2
3
byte
bme_hum() {}
4
5
byte
bme_pres() {}
2. Надо так
1
parameter [PARAMETER][param_addr (air_t)] = (
byte
) bme_temp();
2
3
parameter [PARAMETER][param_addr (air_h)] = (
byte
) bme_hum();
4
5
parameter [PARAMETER][param_addr (air_p )] = (
byte
) bme_pres();
тип данных параметров в массиве содержится в нулевом элементе первого измерения массива
т.е. #define TYPE_VAR 0
правильно ты показал для air_t это BYTE_1_SIGNED. При отправке по CAN эта инфа (тип данных) будет содержаться в фрейме и приёмник соответствующим образом интерпретирует этот параметр.
Параметр отсылается на один выбранный узел по изменению или периодически, в зависимости от того, что наступит раньше. На ещё один узел я не сделал возможности так отправлять параметры. НО, если какому то узлу нужен параметр - он может запросить у нашего узла и наш узел ему ответит этим параметром. (Сообщение - запрос параметра).
Можно ( и это в принципе не сложно) добавить в код, чтобы был выбор - чтобы на ещё один узел отправлять параметры. Т.е. в целом будут выбирается два адреса, на которые будут передаваться параметры периодически или по изменению (смотря что наступит раньше).
А если нужно больше узлов, то проще уж широковещательное сообщение делать, из которого все кому надо возмут инфу. Так и шина меньше нагружаться будет.
версия 14.
- Добавил в отладку версию скетча, скорость шины, инфу что именно было рестарт mcp2515 и/или ардуино.
- исправил небольшой косяк с запросом параметра от другого узла.
версия 14.
- Добавил в отладку версию скетча, скорость шины, инфу что именно было рестарт mcp2515 и/или ардуино.
- исправил небольшой косяк с запросом параметра от другого узла.
Есть вопрос, я канхакером увидел что узлы произвольно обмениваются параметрами, хотя код одинаковый и везде стоит отправлять к 4. Как это поправить.
001
ID DLC Data Period Count Comment
002
11090A01 5 77 00 00 0C 2D 410 65 9->10
003
11090A02 5 76 00 00 0B 14 171 45 9->10
004
110A0A01 5 35 00 00 00 00 50 140 10->10
005
110A0A02 5 33 00 00 0B 14 178 115 10>10
006
110B0A01 5 C5 00 00 0C 2D 140 364 11>10
007
110B0A02 5 C4 00 00 0B 14 424 426 11->10
008
11130A01 5 30 00 00 00 00 81 209 19->10
009
11130A02 5 31 00 00 0B 14 400 202 19->10
010
12085509 0 0 1
011
120A0901 5 77 00 01 0C 2D 177 51 10->9
012
120A0902 5 76 00 01 0B 14 174 39 10->9
013
120A0B01 5 C5 00 01 0C 2D 161 300 10->11
014
120A0B02 5 C4 00 01 0B 14 415 359 10->11
015
120A1301 5 30 00 06 00 00 80 169 10->19
016
120A1302 5 31 00 01 0B 14 363 164 10->19
017
120B0101 5 C0 00 01 01 01 0 1 11->1
018
120B0121 5 04 00 08 00 01 0 1
019
120B0303 5 C0 00 01 01 01 0 1 11->3
020
120BB8B8 5 B8 00 01 01 01 0 1 11>??
021
14050401 5 09 00 09 08 00 124 773 5->4
022
14050402 5 0A 00 09 01 00 124 735 5->4
023
14050403 5 F3 00 09 01 00 64 725 5->4
024
14050405 5 0C 00 09 01 00 125 735 5->4
025
14050406 5 0D 00 09 01 00 125 741 5->4
026
1405040E 5 0E 00 09 08 00 125 750 5->4
027
14050434 8 0F 00 09 04 00 00 00 00 125 740 5->4
028
14051538 8 10 00 09 09 00 00 00 00 125 724 5->21
029
14060401 5 F9 00 09 08 00 127 763 6->4
030
14060402 5 FA 00 09 01 00 127 763 6->4
031
14060403 5 FB 00 09 01 00 127 763 6->4
032
14060405 5 FC 00 09 01 00 126 763 6->4
033
14060406 5 FD 00 09 01 00 126 763 6->4
034
1406040E 5 FE 00 09 08 00 126 754 6->4
035
14060434 8 FF 00 09 04 00 00 00 00 126 750 6->4
036
14061538 8 00 00 09 09 00 00 00 00 127 758 6->21
037
14070401 5 D1 00 09 08 00 125 759 7->4
038
14070402 5 D2 00 09 01 00 125 758 7->4
039
14070403 5 D3 00 09 01 00 125 758 7->4
040
14070405 5 D4 00 09 01 00 124 758 7->4
041
14070406 5 D5 00 09 01 00 124 758 7->4
042
1407040E 5 D6 00 09 08 00 124 755 7->4
043
14070434 8 D7 00 09 04 00 00 00 00 124 755 7->4
044
14071538 8 D8 00 09 09 00 00 00 00 125 750 7->21
045
14080401 5 01 00 09 08 00 126 758 8->4
046
14080402 5 02 00 09 01 00 126 758 8->4
047
14080403 5 03 00 09 01 00 126 758 8->4
048
14080405 5 04 00 09 01 00 126 758 8->4
049
14080406 5 05 00 09 01 00 126 758 8->4
050
1408040E 5 06 00 09 08 00 126 756 8->4
051
14080434 8 07 00 09 04 00 00 00 00 126 747 8->4
052
14081538 8 08 00 09 09 00 00 00 00 127 750 8->21
053
14090401 5 E9 00 09 08 00 122 762 9->4
054
14090402 5 EA 00 09 01 00 124 762 9->4
055
14090403 5 EB 00 09 01 00 123 761 9->4
056
14090405 5 EC 00 09 01 00 124 759 9->4
057
14090406 5 ED 00 09 01 00 124 761 9->4
058
1409040E 5 EE 00 09 08 00 62 753 9->4
059
14090434 8 EF 00 09 04 00 00 00 00 62 744 9->4
060
14091538 8 F0 00 09 09 00 00 00 00 60 742 9->21
061
140A0401 5 51 00 09 08 00 70 768 10->4
062
140A0402 5 52 00 09 01 00 65 762 10->4
063
140A0403 5 53 00 09 01 00 63 762 10->4
064
140A0405 5 54 00 09 01 00 64 754 10->4
065
140A0406 5 55 00 09 01 00 64 751 10->4
066
140A040E 5 56 00 09 08 00 65 750 10->4
067
140A0434 8 57 00 09 04 00 00 00 00 59 745 10->4
068
140A1538 8 58 00 09 09 00 00 00 00 63 736 10->21
069
140B0401 5 01 00 09 08 00 60 762 11->4
070
140B0402 5 02 00 09 01 00 60 762 11->4
071
140B0403 5 03 00 09 01 00 60 762 11->4
072
140B0405 5 04 00 09 01 00 61 759 11->4
073
140B0406 5 05 00 09 01 00 60 761 11->4
074
140B040E 5 06 00 09 08 00 62 754 11->4
075
140B0434 8 07 00 09 04 00 00 00 00 61 694 11->4
076
140B1538 8 08 00 09 09 00 00 00 00 61 704 11->21
077
140C0401 5 F9 00 09 08 00 62 765 12->4
078
140C0402 5 FA 00 09 01 00 62 764 12->4
079
140C0403 5 FB 00 09 01 00 62 764 12->4
080
140C0405 5 FC 00 09 01 00 62 764 12->4
081
140C0406 5 FD 00 09 01 00 62 765 12->4
082
140C040E 5 FE 00 09 08 00 62 761 12->4
083
140C0434 8 FF 00 09 04 00 00 00 00 62 750 12->4
084
140C1538 8 00 00 09 09 00 00 00 00 63 758 12->21
085
140D0401 5 11 00 09 08 00 64 767 13->4
086
140D0402 5 12 00 09 01 00 64 768 13->4
087
140D0403 5 13 00 09 01 00 64 767 13->4
088
140D0405 5 14 00 09 01 00 64 767 13->4
089
140D0406 5 15 00 09 01 00 63 767 13->4
090
140D040E 5 16 00 09 08 00 63 766 13->4
091
140D0434 8 17 00 09 04 00 00 00 00 63 754 13->4
092
140D1538 8 18 00 09 09 00 00 00 00 64 764 13->21
093
140E0401 5 F1 00 09 08 00 62 763 14->4
094
140E0402 5 F2 00 09 01 00 62 763 14->4
095
140E0403 5 F3 00 09 01 00 62 763 14->4
096
140E0405 5 F4 00 09 01 00 62 763 14->4
097
140E0406 5 F5 00 09 01 00 62 763 14->4
098
140E040E 5 F6 00 09 08 00 63 763 14->4
099
140E0434 8 F7 00 09 04 00 00 00 00 62 750 14->4
100
140E1538 8 F8 00 09 09 00 00 00 00 62 755 14->21
101
140F0401 5 F9 00 09 08 00 67 764 15->4
102
140F0402 5 FA 00 09 01 00 67 764 15->4
103
140F0403 5 FB 00 09 01 00 67 765 15->4
104
140F0405 5 FC 00 09 01 00 67 764 15->4
105
140F0406 5 FD 00 09 01 00 67 764 15->4
106
140F040E 5 FE 00 09 08 00 67 760 15->4
107
140F0434 8 FF 00 09 04 00 00 00 00 67 761 15->4
108
140F1538 8 00 00 09 09 00 00 00 00 67 760 15->21
109
14120401 5 F9 00 09 08 00 63 763 18->4
110
14120402 5 FA 00 09 01 00 63 760 18->4
111
14120403 5 FB 00 09 01 00 63 765 18->4
112
14120405 5 FC 00 09 01 00 63 763 18->4
113
14120406 5 FD 00 09 01 00 63 764 18->4
114
1412040E 5 FE 00 09 08 00 62 762 18->4
115
14120434 8 FF 00 09 04 00 00 00 00 63 752 18->4
116
14121538 8 00 00 09 09 00 00 00 00 62 760 18->21
117
14130401 5 09 00 09 08 00 70 766 19->4
118
14130402 5 0A 00 09 01 00 70 766 19->4
119
14130403 5 0B 00 09 01 00 70 766 19->4
120
14130405 5 0C 00 09 01 00 70 767 19->4
121
14130406 5 0D 00 09 01 00 70 767 19->4
122
1413040E 5 0E 00 09 08 00 70 762 19->4
123
14130434 8 0F 00 09 04 00 00 00 00 70 758 19->4
124
14131538 8 10 00 09 09 00 00 00 00 70 760 19->21
125
14140401 5 E9 00 09 08 00 57 762 20->4
126
14140402 5 EA 00 09 01 00 57 762 20->4
127
14140403 5 EB 00 09 01 00 57 762 20->4
128
14140405 5 EC 00 09 01 00 58 762 20->4
129
14140406 5 ED 00 09 01 00 56 762 20->4
130
1414040E 5 EE 00 09 08 00 56 759 20->4
131
14140434 8 EF 00 09 04 00 00 00 00 56 753 20->4
132
14141538 8 F0 00 09 09 00 00 00 00 56 757 20->21
133
14150401 5 09 00 09 08 00 62 766 21->4
134
14150402 5 0A 00 09 01 00 62 766 21->4
135
14150403 5 0B 00 09 01 00 63 766 21->4
136
14150405 5 0C 00 09 01 00 63 766 21->4
137
14150406 5 0D 00 09 01 00 64 766 21->4
138
1415040E 5 0E 00 09 08 00 64 764 21->4
139
14150434 8 0F 00 09 04 00 00 00 00 64 757 21->4
140
14151538 8 10 00 09 09 00 00 00 00 63 765 21->21
судя о канхакингу , ты сначала видимо отправлял команды id 11xxxxxx,соответственно потом приходили отчеты о командах - id 12xxxxxx. а все что ниже (id начинается c 14xxxxxx) это периодически узлы отправляют свои параметры на мастер и узел 21 (15h). Смотри там в can_struct.h я специально отправку одного параметра поставил не на мастер, а на узел 21.
Так что всё гуд.
судя о канхакингу , ты сначала видимо отправлял команды id 11xxxxxx,соответственно потом приходили отчеты о командах - id 12xxxxxx. а все что ниже (id начинается c 14xxxxxx) это периодически узлы отправляют свои параметры на мастер и узел 21 (15h). Смотри там в can_struct.h я специально отправку одного параметра поставил не на мастер, а на узел 21.
Так что всё гуд.
Я про это говорю, команды не отправлял. Все само. (Либо как вариант сыпется мусор из web потра 8266) К этому и спрашивал. Надо думаю test везде кроме мастера отключить.
001
ID DLC Data Period Count Comment
002
11090A01 5 77 00 00 0C 2D 410 65 9->10
003
11090A02 5 76 00 00 0B 14 171 45 9->10
004
110A0A01 5 35 00 00 00 00 50 140 10->10
005
110A0A02 5 33 00 00 0B 14 178 115 10>10
006
110B0A01 5 C5 00 00 0C 2D 140 364 11>10
007
110B0A02 5 C4 00 00 0B 14 424 426 11->10
008
11130A01 5 30 00 00 00 00 81 209 19->10
009
11130A02 5 31 00 00 0B 14 400 202 19->10
010
12085509 0 0 1
011
120A0901 5 77 00 01 0C 2D 177 51 10->9
012
120A0902 5 76 00 01 0B 14 174 39 10->9
013
120A0B01 5 C5 00 01 0C 2D 161 300 10->11
014
120A0B02 5 C4 00 01 0B 14 415 359 10->11
015
120A1301 5 30 00 06 00 00 80 169 10->19
016
120A1302 5 31 00 01 0B 14 363 164 10->19
017
120B0101 5 C0 00 01 01 01 0 1 11->1
018
120B0121 5 04 00 08 00 01 0 1
019
120B0303 5 C0 00 01 01 01 0 1 11->3
Скажи плиз какая комбинация ключей дебага отключает это (за 2 секунды налетело)
1
Разобрался. Просто ты каждый раз меняешь имена переменных.
И еще глобальная просба, на тему структуризации кодо и его наследования. Просьба переделать немного основной файл и System_Functions следующим образом:
Выделить отдельно
main_init в него настройка сериала, версий и пр. общего
can_init (у тебя CAN_Start и MCP2515_Init )
Это нужно чтобы разделить и мне потом не встраивать через ж свой код
Хотелось бы в основном файле получить
в setup
main_init can_init ethernet_init web_init wi-fi_init mqtt_init device_init
в loop (это например)
main_loop can_loop ethernet_loop web_loop wi-fi_loop mqtt_loop device_loop
И на выходе я сделаю
файлы - Ethernet.ino, Web.ini, Wi-Fi.ino, Mqtt.ino
Device.ino (у тебя это Update_Parametrs.ino) если хочешь можно оставить и так но вроде логичнее
Чтобы у нас получилось что я в основной файл вложу только выховы фиксированных функций и их #define
да, скороее всего это происходит из-за функции test. отключай её.
Так и еще начали в канхакере в последней версии лететь вот такие фреймы
14060001 14070001 .... 14150001 Зачем узел шлет что то на 00?
Увы опять сбой, ресет не сработал
001
00:02:37:00
002
NODES CAN COMMUNICATION:
003
node_5_Net_center_Due2 OK!!!
004
node_6_Hallway_net_center OK!!!
005
node_7_Hallway_main OK!!!
006
node_8_Hallway_light OK!!!
007
node_9_Kitchen_net_center OK!!!
008
node_10_Kitchen_main OK!!!
009
node_11_Kitchen_light OK!!!
010
node_12_WC_main OK!!!
011
node_13_WC_waterleak OK!!!
012
node_14_Bathroom_main OK!!!
013
node_15_Boxroom_main OK!!!
014
node_18_Loggia_recuperator OK!!!
015
node_19_Livingroom_main OK!!!
016
node_20_Bedroom_main OK!!!
017
node_21_Cabinet_main OK!!!
018
019
00:02:37:30
020
NODES CAN COMMUNICATION:
021
node_5_Net_center_Due2 OK!!!
022
node_6_Hallway_net_center OK!!!
023
node_7_Hallway_main OK!!!
024
node_8_Hallway_light OK!!!
025
node_9_Kitchen_net_center OK!!!
026
node_10_Kitchen_main OK!!!
027
node_11_Kitchen_light OK!!!
028
node_12_WC_main OK!!!
029
node_13_WC_waterleak OK!!!
030
node_14_Bathroom_main OK!!!
031
node_15_Boxroom_main OK!!!
032
node_18_Loggia_recuperator OK!!!
033
node_19_Livingroom_main OK!!!
034
node_20_Bedroom_main OK!!!
035
node_21_Cabinet_main OK!!!
036
037
00:02:37:33 Принято из CAN: NULL_C От Кого: Неизвестный адрес - ID 801B0C07
038
039
00:02:37:33 Принято из CAN: NULL_C От Кого: Неизвестный адрес - ID 801B0C07
040
041
00:02:37:33 Принято из CAN: NULL_C От Кого: ШИРОКОВЕЩАТЕЛЬНО - ID 0
042
Error Initializing MCP2515...
043
044
РЕСТАРТ MCP2515
045
046
00:02:37:33 Принято из CAN: NULL_C От Кого: ШИРОКОВЕЩАТЕЛЬНО - ID 0
047
Error Initializing MCP2515...
048
049
РЕСТАРТ MCP2515
050
051
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A04010A 20
052
053
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A04010B 21
054
055
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A04010C 22
056
057
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A04010D 23
058
059
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A04010E 24
060
061
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A04010F 25
062
063
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040112 26
064
065
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040113 27
066
067
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040114 28
068
069
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040115 29
070
071
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040105 2A
072
073
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040106 2B
074
075
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040107 2C
076
077
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040108 2D
078
079
Отправлено в CAN: АВАРИЯ Кому: node_1_Net_center_PC - ID 9A040109 2E
080
081
00:02:38:00
082
NODES CAN COMMUNICATION:
083
node_5_Net_center_Due2 FAIL!!!
084
node_6_Hallway_net_center FAIL!!!
085
node_7_Hallway_main FAIL!!!
086
node_8_Hallway_light FAIL!!!
087
node_9_Kitchen_net_center FAIL!!!
088
node_10_Kitchen_main FAIL!!!
089
node_11_Kitchen_light FAIL!!!
090
node_12_WC_main FAIL!!!
091
node_13_WC_waterleak FAIL!!!
092
node_14_Bathroom_main FAIL!!!
093
node_15_Boxroom_main FAIL!!!
094
node_18_Loggia_recuperator FAIL!!!
095
node_19_Livingroom_main FAIL!!!
096
node_20_Bedroom_main FAIL!!!
097
node_21_Cabinet_main FAIL!!!
098
099
00:02:38:30
100
NODES CAN COMMUNICATION:
101
node_5_Net_center_Due2 FAIL!!!
102
node_6_Hallway_net_center FAIL!!!
103
node_7_Hallway_main FAIL!!!
104
node_8_Hallway_light FAIL!!!
105
node_9_Kitchen_net_center FAIL!!!
106
node_10_Kitchen_main FAIL!!!
107
node_11_Kitchen_light FAIL!!!
108
node_12_WC_main FAIL!!!
109
node_13_WC_waterleak FAIL!!!
110
node_14_Bathroom_main FAIL!!!
111
node_15_Boxroom_main FAIL!!!
112
node_18_Loggia_recuperator FAIL!!!
113
node_19_Livingroom_main FAIL!!!
114
node_20_Bedroom_main FAIL!!!
115
node_21_Cabinet_main FAIL!!!
Нашёл довольно серьезный косяк. При периодической отправке параметров , весь список перебирается в цикле for. В теле цикла нет delay. Поэтому сообщения из списка от ардуины долбят в MCP2515 с большой скоростью. Опытным путём установил, что не все сообщения из списка передаются. Поставил delay (5). Стало всё гуд. Возможно из - за этого шина глючила. Что слишком маленькое было время между отправками соседних сообщений.
15 версия, это исправлено. Также добавил выбор автоматической отправки параметров ещё на один узел. (т.е. в целом 2 )
Вот интересно node_8_Hallway_light.ino.hex всегда немного отличается от всех остальных бинарников, все одинаковые а вот 8 немного меньше.
короче заливай этот короткий скетч. Если на нём тоже будет глючить - проблема все таки железячная , а не софтовая.
001
#include <mcp_can.h>
002
#include <SPI.h>
003
#include <EEPROM.h>
004
005
// выберем как будет устанавливаться адрес данного узла вручную или из еепром
006
007
#define EEProm_my_ADDRES
008
//#define Manual_my_ADDRES
009
010
011
012
// Выбираем аппаратную часть узла
013
014
#define ARD_UNO
015
//#define ARD_MEGA
016
//#define ARD_DUE
017
018
019
020
#ifdef EEProm_my_ADDRES
021
const
byte
node_address = EEPROM.read(50);
022
#endif
023
#ifdef ARD_UNO
024
#define can CAN0
025
MCP_CAN can(10);
026
#endif
027
#ifdef ARD_MEGA
028
#define can CAN0
029
MCP_CAN can(53);
030
#endif
031
#ifdef ARD_DUE
032
#define can CAN3
033
MCP_CAN can(52);
034
#endif
035
036
typedef
enum
Node_addr_enum
037
{
038
broadcast,
//0
039
node_1_Net_center_PC,
//1
040
node_2_Net_center_oraPi1,
//2
041
node_3_Net_center_oraPi2,
//3
042
node_4_Net_center_Due1,
//4
043
node_5_Net_center_Due2,
//5
044
node_6_Hallway_net_center,
//6
045
node_7_Hallway_main,
//7
046
node_8_Hallway_light,
//8
047
node_9_Kitchen_net_center,
//9
048
node_10_Kitchen_main,
//10
049
node_11_Kitchen_light,
//11
050
node_12_WC_main,
//12
051
node_13_WC_waterleak,
//13
052
node_14_Bathroom_main,
//14
053
node_15_Boxroom_main,
//15
054
node_16_Balcony_meteo,
//16
055
node_17_Loggia_main,
//17
056
node_18_Loggia_recuperator,
//18
057
node_19_Livingroom_main,
//19
058
node_20_Bedroom_main,
//20
059
node_21_Cabinet_main,
//21
060
SIZE_Node_addr_ENUM
//22 size
061
}Node_addr_enum;
062
063
const
byte
NODS_NUMBER = SIZE_Node_addr_ENUM;
064
065
066
067
// ниже вручную забьём адрес узла, если выше выбран дефайн #define Manual_my_ADDRES
068
069
#ifdef Manual_my_ADDRES
070
//const byte node_address = node_1_Net_center_PC; //1
071
//const byte node_address = node_2_Net_center_oraPi1; //2
072
//const byte node_address = node_3_Net_center_oraPi2; //3
073
//const byte node_address = node_4_Net_center_Due1; //4
074
//const byte node_address = node_5_Net_center_Due2; //5
075
//const byte node_address = node_6_Hallway_net_center; //6
076
//const byte node_address = node_7_Hallway_main; //7
077
//const byte node_address = node_8_Hallway_light; //8
078
//const byte node_address = node_9_Kitchen_net_center //9
079
//const byte node_address = node_10_Kitchen_main; //10
080
//const byte node_address = node_11_Kitchen_light; //11
081
//const byte node_address = node_12_WC_main; //12
082
//const byte node_address = node_13_WC_waterleak; //13
083
//const byte node_address = node_14_Bathroom_main; //14
084
const
byte
node_address = node_15_Boxroom_main;
//15
085
//const byte node_address = node_16_Balcony_meteo; //16
086
//const byte node_address = node_17_Loggia_main; //17
087
//const byte node_address = node_18_Loggia_recuperator; //18
088
//const byte node_address = node_19_Livingroom_main; //19
089
//const byte node_address = node_20_Bedroom_main; //20
090
//const byte node_address = node_21_Cabinet_main; //21
091
#endif
092
093
094
095
// Выбираем узлы подключенные к CAN шине
096
097
const
bool
NodeCANpresence[22] =
098
{
099
0,
// broadcast, //0
100
0,
// node_1_Net_center_PC, //1
101
0,
// node_2_Net_center_oraPi1, //2
102
0,
// node_3_Net_center_oraPi2, //3
103
1,
// node_4_Net_center_Due1, //4
104
0,
// node_5_Net_center_Due2, //5
105
0,
// node_6_Hallway_net_center, //6
106
1,
// node_7_Hallway_main, //7
107
1,
// node_8_Hallway_light, //8
108
0,
// node_9_Kitchen_net_center, //9
109
1,
// node_10_Kitchen_main, //10
110
0,
// node_11_Kitchen_light, //11
111
0,
// node_12_WC_main, //12
112
0,
// node_13_WC_waterleak, //13
113
0,
// node_14_Bathroom_main, //14
114
0,
// node_15_Boxroom_main, //15
115
0,
// node_16_Balcony_meteo, //16
116
0,
// node_17_Loggia_main, //17
117
0,
// node_18_Loggia_recuperator, //18
118
0,
// node_19_Livingroom_main, //19
119
0,
// node_20_Bedroom_main, //20
120
0,
// node_21_Cabinet_main, //21
121
};
122
123
124
// Выбираем смысловую нагрузку узла
125
126
127
#define type_node_master
128
//#define type_node_slave
129
//#define type_node_mk
130
131
132
133
long
unsigned
int
rxId;
134
unsigned
char
len = 0;
135
unsigned
char
rxBuf[8];
136
137
138
#define CAN0_INT 2 // Set INT to pin 2
139
140
byte
StatusMK[22] = {0};
141
142
143
unsigned
long
prevtimeStatus = 0;
144
bool
TimerStatus = 0;
145
unsigned
long
prevPrintStatus = 0;
146
147
void
setup
()
148
{
149
byte
CAN_spEEd = CAN_250KBPS;
150
Serial
.begin(115200);
151
152
153
if
(can.begin(MCP_STDEXT, CAN_spEEd, MCP_8MHZ) == CAN_OK)
154
Serial
.println(
"MCP2515 Initialized Successfully!"
);
155
else
156
Serial
.println(
"Error Initializing MCP2515..."
);
157
#ifdef type_node_master
158
can.init_Mask(0,0,0x07000000);
//маска на самый левый разряд ID - для мастера
159
can.init_Filt(0,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
160
can.init_Filt(1,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
161
can.init_Mask(1,0,0x07000000);
//маска на самый левый разряд ID - для мастера
162
can.init_Filt(2,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
163
can.init_Filt(3,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
164
can.init_Filt(4,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
165
can.init_Filt(5,0,0x00000000);
// фильтр чтобы левый разряд ID был 0 - для мастера
166
#else
167
can.init_Mask(0,0,0x07FF0000);
//маска на все разряды id - для узлов
168
can.init_Filt(0,0,0x06660000);
// фильтр только 666
169
can.init_Filt(1,0,0x06660000);
// фильтр только 666
170
can.init_Mask(1,0,0x07FF0000);
//маска на все разряды id - для узлов
171
can.init_Filt(2,0,0x06660000);
// фильтр только 666
172
can.init_Filt(3,0,0x06660000);
// фильтр только 666
173
can.init_Filt(4,0,0x06660000);
// фильтр только 666
174
can.init_Filt(5,0,0x06660000);
// фильтр только 666
175
#endif
176
can.setMode(MCP_NORMAL);
177
178
pinMode(CAN0_INT, INPUT);
179
180
Serial
.println(
"MCP2515 Library Receive Example..."
);
181
}
182
183
void
loop
()
184
{
185
if
(!digitalRead(CAN0_INT))
186
{
187
can.readMsgBuf(&rxId, &len, rxBuf);
188
189
#if defined (type_node_slave) or defined (type_node_mk)
190
Serial
.print (rxId, HEX);
Serial
.print (F(
" "
));
for
(
int
i = 0; i < len; i++) {
Serial
.print (rxBuf[i] );
Serial
.print (F(
" "
)); }
191
if
(rxId == 0x666) {prevtimeStatus = millis(); TimerStatus = 1;
Serial
.println (F(
" Receive StatusMaster "
)); }
192
else
Serial
.println();
193
#endif
194
195
#ifdef type_node_master
196
if
(rxId >0 && rxId<22) StatusMK[rxId] = 0;
197
198
#endif
199
}
200
201
#if defined (type_node_slave) or defined (type_node_mk)
202
if
(TimerStatus && millis() - prevtimeStatus > node_address*50) {
203
byte
data[8]= {255,255,255,255,255,255,255,255};
204
byte
sndStat = can.sendMsgBuf(node_address, 0, 8, data);
205
if
(sndStat == CAN_OK){
Serial
.println(F(
"Send my Status successfully!"
));}
206
else
{
Serial
.print(F(
"Error Send my Status!!! Error "
));
Serial
.println (sndStat);}
207
TimerStatus = 0;}
208
#endif
209
210
211
212
213
214
215
#ifdef type_node_master
216
if
(millis() -prevtimeStatus > 2000) {
217
for
(
int
i = 0; i<22; i++) StatusMK[i]++;
218
219
byte
data[8]= {0,0,0,0,0,0,0,0};
220
can.sendMsgBuf(0x666, 0, 8, data);
221
prevtimeStatus = millis();}
222
223
224
225
if
(millis() - prevPrintStatus > 15000) {
226
227
Serial
.println();
Serial
.println(F(
"NODE STATUS"
));
228
for
(
int
i = 1; i<22; i++) {
if
(i!=4 && NodeCANpresence[i]) {
Serial
.print (i);
if
(StatusMK[i]<=4)
Serial
.println (F(
" OK"
));
else
Serial
.println (F(
" FAIL"
)); }}
229
Serial
.println();
230
prevPrintStatus = millis();
231
}
232
233
#endif
234
}
мне по твоим последним логам не нравятся некорые узлы. В отладке пишется что статус от мастера принят, а отсылка своего статуса сразу за ним не пишется, т.е. может подрят несколько принять потом только свой отсылает. Такого быть никак не должно.
Или обратная проблема. Получения статусов от мастера в отладке нет, а свой статус отсылает . Причём в эти моменты узел мастером расценивается как ОК!. Вот с этим непонятки. Как будто тут сама дуня глючит и чё то с памятью.
А есть узлы (14 вроде) где вообще в отладке фразы на половину обрываются - явный признак нарушения памяти.
Вот эти косяки как раз указавают, что проблема софтовая.
Поэтому и надо залить простой скетч и проверить.
Я только 15 залил. И проблема то не в сбое сети, которая блуждающая! То сутки стоит без проблем то опять повылазило сразу.
Проблема в рестарте по SPI как я почитал на буржуинских форумах, народ с этой проблемой сталкивался. Нужно ничего не передавать на MSP по SPI после ресета 128 тактов или 50-100мс (кто что пишет)
рестарт вообще не должен происходить, ну может совсем редко. А судя по логам, у тебя едва едва fail не выскакивало. Некоторые узлы с ума сходили. И кстати у нас delay (100) есть. Ну сделай 200.
подключи канхакер на ночь, будет интересно словит ли он глюкавые сообщения или это они уже чисто на узлах возникают.
рестарт вообще не должен происходить, ну может совсем редко. А судя по логам, у тебя едва едва fail не выскакивало. Некоторые узлы с ума сходили. И кстати у нас delay (100) есть. Ну сделай 200.
Ну выходные то после перепайки исправили ситуацию, и вчера стояли норм (правда на 125)
Сегодня 250 и уже с глюками
Да кстати у меня #define TIMEOUTVALUE 100
мне по твоим последним логам не нравятся некорые узлы. В отладке пишется что статус от мастера принят, а отсылка своего статуса сразу за ним не пишется, т.е. может подрят несколько принять потом только свой отсылает. Такого быть никак не должно.
Или обратная проблема. Получения статусов от мастера в отладке нет, а свой статус отсылает . Причём в эти моменты узел мастером расценивается как ОК!. Вот с этим непонятки. Как будто тут сама дуня глючит и чё то с памятью.
А есть узлы (14 вроде) где вообще в отладке фразы на половину обрываются - явный признак нарушения памяти.
Вот эти косяки как раз указавают, что проблема софтовая.
Поэтому и надо залить простой скетч и проверить.
Это проблема Wi-Fi вывода лога, я заметил что через Wi-Fi/IP/Serial лог идет с потерями. Через Web все нормально но там буфер маленький. Я лог снимаю через esp-link это проброс serial через wi-fi esp8266
да уж, вифи с одной стороны облегчил жись, а с другой... Как бы ещё не было проблем с корявой заливкой hex файла по воздуху. Хотя там верификация какаянибудь должна быть .
таймаут я тоже у себя 100 поставил.
сделай скорость 125 и таймаут 125 ))
Кстати, обнаружил что нет блокировки отправки самому себе и приема своего же броадкаста
По простому в RX отсечь, а по хорошему фильтр придумать для своего бордкаста, а на передачу самому себе внутри TX если rem_adr==dev_adr то return ;)
Постоянно шлют
21->21
19->19
Честно, я вообще перестал понимать логику программы. По какому алгоритму идет рассылка я смотрю в канхаекр и просто диву даюсь что происходит в сети.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
да уж, вифи с одной стороны облегчил жись, а с другой... Как бы ещё не было проблем с корявой заливкой hex файла по воздуху. Хотя там верификация какаянибудь должна быть .
таймаут я тоже у себя 100 поставил.
Я проблемы не вижу, он нужен для прошивки и MQTT а вот такие ОЖИДАЕМЫЕ потери и задержки как раз и покажывают место радио в системе автоматизации ;-) (А потери пулеметной ленты лога да еще через эмулятор Win telnet serial это не проблема, это норма. Кстати я прошиваю все только c linux машины, из под Win вообще не пошло)
Провода наше все.
кстати у меня тут возникла очень здравая идея. адрес узла сохранить каждому в еепром . И при старте скетча адрес будет читаться. Таким образом на этапе тестирования (пока у всех узлов скетч одинаковый) - тебе не нужно будет создавать кучу папок скетчей с разными узлами. Один скетч льешь во все узлы и всё. Естественно предварительно нужно один раз забить в еепром адрес на каждый узел.
Так у тебя уменьшится время на заливку ПО всех узлов.
Вот это сделано в версии 16. Почитаешь, всё поймешь в первой вкладке, там минимум изменений.
Вот скетч для забивки в еепром адреса узла
01
typedef
enum
Node_addr_enum
02
{
03
broadcast,
//0
04
node_1_Net_center_PC,
//1
05
node_2_Net_center_oraPi1,
//2
06
node_3_Net_center_oraPi2,
//3
07
node_4_Net_center_Due1,
//4
08
node_5_Net_center_Due2,
//5
09
node_6_Hallway_net_center,
//6
10
node_7_Hallway_main,
//7
11
node_8_Hallway_light,
//8
12
node_9_Kitchen_net_center,
//9
13
node_10_Kitchen_main,
//10
14
node_11_Kitchen_light,
//11
15
node_12_WC_main,
//12
16
node_13_WC_waterleak,
//13
17
node_14_Bathroom_main,
//14
18
node_15_Boxroom_main,
//15
19
node_16_Balcony_meteo,
//16
20
node_17_Loggia_main,
//17
21
node_18_Loggia_recuperator,
//18
22
node_19_Livingroom_main,
//19
23
node_20_Bedroom_main,
//20
24
node_21_Cabinet_main,
//21
25
SIZE_Node_addr_ENUM
//22 size
26
}Node_addr_enum;
27
28
29
#include <EEPROM.h>
30
31
// ниже выберем адрес узла
32
33
//const byte node_address = node_1_Net_center_PC; //1
34
//const byte node_address = node_2_Net_center_oraPi1; //2
35
//const byte node_address = node_3_Net_center_oraPi2; //3
36
//const byte node_address = node_4_Net_center_Due1; //4
37
//const byte node_address = node_5_Net_center_Due2; //5
38
//const byte node_address = node_6_Hallway_net_center; //6
39
//const byte node_address = node_7_Hallway_main; //7
40
//const byte node_address = node_8_Hallway_light; //8
41
//const byte node_address = node_9_Kitchen_net_center //9
42
//const byte node_address = node_10_Kitchen_main; //10
43
const
byte
node_address = node_11_Kitchen_light;
//11
44
//const byte node_address = node_12_WC_main; //12
45
//const byte node_address = node_13_WC_waterleak; //13
46
//const byte node_address = node_14_Bathroom_main; //14
47
//const byte node_address = node_15_Boxroom_main; //15
48
//const byte node_address = node_16_Balcony_meteo; //16
49
//const byte node_address = node_17_Loggia_main; //17
50
//const byte node_address = node_18_Loggia_recuperator; //18
51
//const byte node_address = node_19_Livingroom_main; //19
52
//const byte node_address = node_20_Bedroom_main; //20
53
//const byte node_address = node_21_Cabinet_main; //21
54
55
56
57
void
setup
() {
58
Serial
.begin (115200);
59
60
EEPROM.write(50, node_address);
61
62
Serial
.print (
"В еепром зашит адрес узла № "
);
Serial
.print (EEPROM.read(50));
63
64
}
65
66
void
loop
() {
67
// put your main code here, to run repeatedly:
68
69
}
Кстати, обнаружил что нет блокировки отправки самому себе и приема своего же броадкаста
По простому в RX отсечь, а по хорошему фильтр придумать для своего бордкаста, а на передачу самому себе внутри TX если rem_adr==dev_adr то return ;)
Постоянно шлют
21->21
19->19
Честно, я вообще перестал понимать логику программы. По какому алгоритму идет рассылка я смотрю в канхаекр и просто диву даюсь что происходит в сети.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
если отправка самому себе реально произошла с нашего MCP2515 то на приёмник она не попадёт. (по стандарту CAN шины сообщения из передатчика не попадают на приёмник).
Отправки самому себе и свои же бродкасты быть не должны, ну допустим что будут (какой то другой узел глюкнул и от нашего имени нам отправил), но не часто, поэтому проще программно В RX() сделать блокировку.
Ты спрашивал про алгоритм. Он очень простой :
У мастера: каждую секунду шлём бродкаст.
У узла: получил от мастера бродкаст - отправил свой статус мастеру.
Также периодически (в секунду равную адресу) отправляем на настроенный узел параметры.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
не понял про что именно ты говоришь. С чего вдруг они должны самы себе слать, и кто такие оставльные?
И какие типы сообщений и где не совпадают?
кстати у меня тут возникла очень здравая идея. адрес узла сохранить каждому в еепром . И при старте скетча адрес будет читаться. Таким образом на этапе тестирования (пока у всех узлов скетч одинаковый) - тебе не нужно будет создавать кучу папок скетчей с разными узлами. Один скетч льешь во все узлы и всё. Естественно предварительно нужно один раз забить в еепром адрес на каждый узел.
Так у тебя уменьшится время на заливку ПО всех узлов.
Вот это сделано в версии 16. Почитаешь, всё поймешь в первой вкладке, там минимум изменений.
Вот скетч для забивки в еепром адреса узла
01
typedef
enum
Node_addr_enum
02
{
03
broadcast,
//0
04
node_1_Net_center_PC,
//1
05
node_2_Net_center_oraPi1,
//2
06
node_3_Net_center_oraPi2,
//3
07
node_4_Net_center_Due1,
//4
08
node_5_Net_center_Due2,
//5
09
node_6_Hallway_net_center,
//6
10
node_7_Hallway_main,
//7
11
node_8_Hallway_light,
//8
12
node_9_Kitchen_net_center,
//9
13
node_10_Kitchen_main,
//10
14
node_11_Kitchen_light,
//11
15
node_12_WC_main,
//12
16
node_13_WC_waterleak,
//13
17
node_14_Bathroom_main,
//14
18
node_15_Boxroom_main,
//15
19
node_16_Balcony_meteo,
//16
20
node_17_Loggia_main,
//17
21
node_18_Loggia_recuperator,
//18
22
node_19_Livingroom_main,
//19
23
node_20_Bedroom_main,
//20
24
node_21_Cabinet_main,
//21
25
SIZE_Node_addr_ENUM
//22 size
26
}Node_addr_enum;
27
28
29
#include <EEPROM.h>
30
31
// ниже выберем адрес узла
32
33
//const byte node_address = node_1_Net_center_PC; //1
34
//const byte node_address = node_2_Net_center_oraPi1; //2
35
//const byte node_address = node_3_Net_center_oraPi2; //3
36
//const byte node_address = node_4_Net_center_Due1; //4
37
//const byte node_address = node_5_Net_center_Due2; //5
38
//const byte node_address = node_6_Hallway_net_center; //6
39
//const byte node_address = node_7_Hallway_main; //7
40
//const byte node_address = node_8_Hallway_light; //8
41
//const byte node_address = node_9_Kitchen_net_center //9
42
//const byte node_address = node_10_Kitchen_main; //10
43
const
byte
node_address = node_11_Kitchen_light;
//11
44
//const byte node_address = node_12_WC_main; //12
45
//const byte node_address = node_13_WC_waterleak; //13
46
//const byte node_address = node_14_Bathroom_main; //14
47
//const byte node_address = node_15_Boxroom_main; //15
48
//const byte node_address = node_16_Balcony_meteo; //16
49
//const byte node_address = node_17_Loggia_main; //17
50
//const byte node_address = node_18_Loggia_recuperator; //18
51
//const byte node_address = node_19_Livingroom_main; //19
52
//const byte node_address = node_20_Bedroom_main; //20
53
//const byte node_address = node_21_Cabinet_main; //21
54
55
56
57
void
setup
() {
58
Serial
.begin (115200);
59
60
EEPROM.write(50, node_address);
61
62
Serial
.print (
"В еепром зашит адрес узла № "
);
Serial
.print (EEPROM.read(50));
63
64
}
65
66
void
loop
() {
67
// put your main code here, to run repeatedly:
68
69
}
Если это заработает, то будет совсем круто, а то перепрошивка 2-3 часа. Может все параметры в Eprom шить? Сколько туда лезет?
куда оно денется, заработает, я проверил. Лезет 512 кб помоему. Так еепром сдуется быстро если параметры туда лить постоянно .
куда оно денется, заработает, я проверил. Лезет 512 кб помоему. Так еепром сдуется быстро если параметры туда лить постоянно .
Нет всего 4096 байт
EEPROM:
1024 байта в ATmega328,
512 байт в ATmega168 и ATmega8,
4096 байт в ATmega1280 и ATmega2560
http://radioprog.ru/post/117
Конечно байт а не килобайт, перепутал слегка
В общем EEPROM - "это просто праздник какой то" ©
Предлагаю Все настройки узла туда загрузить
адрес, скорость шины, IP адреса, мастер/слейв/узел, debug и его ключи и пр. даже пока не придумывается.
Ограничение циклов 100 000 операций записи это даже если делать 10 записей в день хватит на 10 000 дней т.е примерно на 27 лет.
А нам нужно раз записать и потом при отладке перезаписывать иногда.
Честно, я вообще перестал понимать логику программы. По какому алгоритму идет рассылка я смотрю в канхаекр и просто диву даюсь что происходит в сети.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
Ты спрашивал про алгоритм. Он очень простой :
У мастера: каждую секунду шлём бродкаст.
У узла: получил от мастера бродкаст - отправил свой статус мастеру.
Также периодически (в секунду равную адресу) отправляем на настроенный узел параметры.
Про запрос и ответ статуса узла на бродкаст от мастера понятно мастрер шлет на 0, узлы отвечают на 4
Вопрос в другом кому и где это прописано узел шлет параметры. Я не понимаю как залитый один и тот же код с отличием в имени узла начинает слать почему то разным узлам.
Я бы понял что все бы слали мастеру, на 00, и например 10, но ведь не так 0,4,19,21 Где это прописано?
01
14050001 5 49 00 09 08 00 65 101 5->0
02
14050402 5 4A 00 09 01 00 65 96 5->4
03
14050403 5 4B 00 09 01 00 65 101 5->4
04
14050405 5 4C 00 09 01 00 64 100 5->4
05
14050406 5 4D 00 09 01 00 64 101 5->4
06
1405040E 5 4E 00 09 08 00 65 101 5->4
07
14050434 8 4F 00 09 04 00 00 00 00 64 101 5->4
08
14051301 5 51 00 09 08 00 65 101 5->19
09
14051302 5 52 00 09 01 00 65 101 5->19
10
14051303 5 53 00 09 01 00 65 100 5->19
11
14051305 5 54 00 09 01 00 65 101 5->19
12
14051538 8 50 00 09 09 00 00 00 00 64 101 5->21
Ограничение циклов 100 000 операций записи это даже если делать 10 записей в день хватит на 10 000 дней т.е примерно на 27 лет.
А нам нужно раз записать и потом при отладке перезаписывать иногда.
ты про параметры говорил. Я думал ты про массив parameter[][] - он то часто обновляется. А ты про другие настройки типа скорости шины и т.д. Их то да конечно в еепром тоже можно записывать.
Я бы понял что все бы слали мастеру, на 00, и например 10, но ведь не так 0,4,19,21 Где это прописано?
01
14050001 5 49 00 09 08 00 65 101 5->0
02
14050402 5 4A 00 09 01 00 65 96 5->4
03
14050403 5 4B 00 09 01 00 65 101 5->4
04
14050405 5 4C 00 09 01 00 64 100 5->4
05
14050406 5 4D 00 09 01 00 64 101 5->4
06
1405040E 5 4E 00 09 08 00 65 101 5->4
07
14050434 8 4F 00 09 04 00 00 00 00 64 101 5->4
08
14051301 5 51 00 09 08 00 65 101 5->19
09
14051302 5 52 00 09 01 00 65 101 5->19
10
14051303 5 53 00 09 01 00 65 100 5->19
11
14051305 5 54 00 09 01 00 65 101 5->19
12
14051538 8 50 00 09 09 00 00 00 00 64 101 5->21
в файле can_struct.h
01
{
02
03
// НИЖЕ УКАЗЫВАЕМ АДРЕС первого УЗЛА, КУДА ПЕРИОДИЧЕСКИ ИЛИ ПО ИЗМЕНЕНИЮ БУДЕТ ПОСЫЛАТЬСЯ КОНКРЕТНЫЙ ПАРАМЕТР, если 0xFF, то никому данный параметр не отсылается
04
05
broadcast,
//1 //датчик температуры
06
node_4_Net_center_Due1,
//2 //датчик влажности
07
node_4_Net_center_Due1,
//3 //датчик давления
08
node_4_Net_center_Due1,
//5 //датчик движения
09
node_4_Net_center_Due1,
//6 //датчик вибрации
10
0xFF,
//7 //датчик шума
11
0xFF,
//8 //датчик освещенности
12
node_4_Net_center_Due1,
//14 //Температура тела
13
0xFF,
//40 //Температура батареи
14
0xFF,
//46 //Счетчик газа
15
0xFF,
//47 сервисный байт
16
node_4_Net_center_Due1,
//52 //Счетчик электричества
17
0xFF,
//53 сервисный байт
18
0xFF,
//54 сервисный байт
19
0xFF,
//55 сервисный байт
20
node_21_Cabinet_main,
//56 //напряжение АКБ бесперебойника
21
0xFF,
//57 сервисный байт
22
0xFF,
//58 сервисный байт
23
0xFF
//59 сервисный байт
24
25
26
27
28
29
},
для каждого параметра в отдельности выбирается узел, на который будет посылаться этот параметр периодически или по изменению. Начиная с 15 версии, можно для каждого параметра выбирать два узла, на которые он будет отсылаться
А 0xFF соответственно никому?
В общем EEPROM - "это просто праздник какой то" ©
Предлагаю Все настройки узла туда загрузить
адрес, скорость шины, IP адреса, мастер/слейв/узел, debug и его ключи и пр. даже пока не придумывается.
с адресом , скоростью шины, IP адреса это да, но вот мастер/слейв/узел, debug и его ключи у нас же делаются с помощью директив условной компиляции и этот выбор происходит ещё когда скетч не в узле, а при компиляции, т.е. твой НЕХ файл когда создаётся. Сделать то можно будет, но всё через флаги только, а это память расходует.
и какой смысл эти данные держать в еепром, когда их как раз и нужно изменять при необходимости. А так они всё время из еепром одни и теже будут грузиться, без возможности выбора.
А 0xFF соответственно никому?
да всё верно
Кликабельно
#define NOT_INCLUDED 0x06 // если параметр отсутствует на узле
типы данных :
1
#define BYTE_1 01
2
#define BYTE_2 02
3
#define BYTE_4 04
4
#define SERVICE_BYTE 05
5
#define BYTE_4_SIGNED 06
6
#define BYTE_2_SIGNED 07
7
#define BYTE_1_SIGNED 08
8
#define BYTE_4_FLOAT 09
debug и его ключи у нас же делаются с помощью директив условной компиляции и этот выбор происходит ещё когда скетч не в узле, а при компиляции, т.е. твой НЕХ файл когда создаётся. Сделать то можно будет, но всё через флаги только, а это память расходует.
и какой смысл эти данные держать в еепром, когда их как раз и нужно изменять при необходимости. А так они всё время из еепром одни и теже будут грузиться, без возможности выбора.
Согласен. Тогда и мастер/слейв/узел тоже нет смысла (или в прошивке держать оба кода и узла и мастера ).
Ну в общем я про смысл прошивки.
Тем более что с таким набором и возможностью хранить произвольные типы. И вот в серьез подумать именно про твои настройки на епром byte parameter [6][parameters_quantity]
смысл в том чтобы, всё не подгружать в ОЗУ. В последствии на мастере можно сделать хранилище параметров от всех узлов. И тогда для остального места уже не остаётся. Поэтому для мастера нужен отдельный код. Тем более узлы можно не меги делать, а наны например, а у них памяти мало, поэтому нужны компактные скетчи для узлов.
Не вижу смысла грузить настройки parameter[][] в еепром
ну как ты тестировал стабильность v15 или v16 или может простой скетч #965 заливал?
Не вижу смысла грузить настройки parameter[][] в еепром
Жаль, я в любом случае уникальные параметры каждого контроллера не зависящие от кода, в смысле перечень устройств, их адреса, куда направлять сообщения, у кого запрашивать и брать параметы положу в епром.
Просто это было бы красиво код одинаковый и отлаженый. Прошил епром подключил на универсальный разъем расширитель к которому подключил нужные датчики и ИУ. И вперед.
ну как ты тестировал стабильность v15 или v16 или может простой скетч #965 заливал?
Не я прежде чем "превращать в кирпич" ;-) т.е. писать в энергонезависимую память изучал вопрос, завтра соберу, прошью везде епром и залью 16 версию на 125к, я просто хочу сделать возможность через консоль дать команду на изменение скорости шины путем записи в епром и ресета. На подобе твоей test
путаться будешь, тут вот оно в скетче, правишь когда надо. А там в еепроме как посмотреть, что залито? И где он одинаковый код. На одном узле, например, используется 3 параметра, а на другом - 23. В основном скетче проще всё менять, чем еепром прошивать отдельным скетчем. Еепром считаю нужен как энергонезависимая память.
смысл в том чтобы, всё не подгружать в ОЗУ. В последствии на мастере можно сделать хранилище параметров от всех узлов. И тогда для остального места уже не остаётся. Поэтому для мастера нужен отдельный код. Тем более узлы можно не меги делать, а наны например, а у них памяти мало, поэтому нужны компактные скетчи для узлов.
Смотри, сеть стационарная, все на кабелях, какова Вероятность что ды доподключишь в последствии что то помимо уже установленного. Правильно, никакая. Тогда зачем делать централизованное хранилище конфига? Прошил в епром все типы подключенных датчиков, ИУ и все. В зависимости от этого инициируешь переменные.
А работать с наной я честно не готов, тогда уж при этом формфакторе есть 32 разрадные с памятью. А лучше тогда сразу ESP32.
путаться будешь, тут вот оно в скетче, правишь когда надо. А там в еепроме как посмотреть, что залито? И где он одинаковый код. На одном узле, например, используется 3 параметра, а на другом - 23. В основном скетче проще всё менять, чем еепром прошивать отдельным скетчем. Еепром считаю нужен как энергонезависимая память.
Тогда будет, по крайней мере в моем случае минимум 15 скетчей для узлов на меге, 2 мастер слейв на DUE.
Для всех нужно иметь свой разный конфиг и нигде не ошибиться. Я не просто так помнишь начинал с очень простых и читаемых типов у-в и ИУ.
Узлы у меня практически типовые с небольшими отличиями.
Ну на самом деле нужно подумать еще. Это не окончательное решение. Но уж больно идея заманчивая. Кстати чтобы не писать все время в процессе отладки можно эмулятор простой сделать читать не из памати а из файла ну типо ф-ю EEPROM1 с теми же вызовани сделать на время отладки.
блин ну не пойму я смысла. Это всё и так лежит в энергонезависимой памяти, которая называется флеш. В ней залит скетч. В скетче есть эта информация. Дак нафига её в еепром то пихать? В том то и дело, если ты ничего подключать дополнительно не собираешься вообще не имеет смысла в еепром пихать. Т.к. туда пихается обычно изменяемая инфа. А постоянная она из флеша (скетча) спокойно также грузится.