тип данных параметров в массиве содержится в нулевом элементе первого измерения массива
т.е. #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, то никому данный параметр не отсылается
broadcast, //1 //датчик температуры
node_4_Net_center_Due1, //2 //датчик влажности
node_4_Net_center_Due1, //3 //датчик давления
node_4_Net_center_Due1, //5 //датчик движения
node_4_Net_center_Due1, //6 //датчик вибрации
0xFF, //7 //датчик шума
0xFF, //8 //датчик освещенности
node_4_Net_center_Due1, //14 //Температура тела
0xFF, //40 //Температура батареи
0xFF, //46 //Счетчик газа
0xFF, //47 сервисный байт
node_4_Net_center_Due1, //52 //Счетчик электричества
0xFF, //53 сервисный байт
0xFF, //54 сервисный байт
0xFF, //55 сервисный байт
node_21_Cabinet_main, //56 //напряжение АКБ бесперебойника
0xFF, //57 сервисный байт
0xFF, //58 сервисный байт
0xFF //59 сервисный байт
},
для каждого параметра в отдельности выбирается узел, на который будет посылаться этот параметр периодически или по изменению. Начиная с 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 для знаковых. Примерно так
2. Надо так
тип данных параметров в массиве содержится в нулевом элементе первого измерения массива
т.е. #define TYPE_VAR 0
правильно ты показал для air_t это BYTE_1_SIGNED. При отправке по CAN эта инфа (тип данных) будет содержаться в фрейме и приёмник соответствующим образом интерпретирует этот параметр.
Параметр отсылается на один выбранный узел по изменению или периодически, в зависимости от того, что наступит раньше. На ещё один узел я не сделал возможности так отправлять параметры. НО, если какому то узлу нужен параметр - он может запросить у нашего узла и наш узел ему ответит этим параметром. (Сообщение - запрос параметра).
Можно ( и это в принципе не сложно) добавить в код, чтобы был выбор - чтобы на ещё один узел отправлять параметры. Т.е. в целом будут выбирается два адреса, на которые будут передаваться параметры периодически или по изменению (смотря что наступит раньше).
А если нужно больше узлов, то проще уж широковещательное сообщение делать, из которого все кому надо возмут инфу. Так и шина меньше нагружаться будет.
версия 14.
- Добавил в отладку версию скетча, скорость шины, инфу что именно было рестарт mcp2515 и/или ардуино.
- исправил небольшой косяк с запросом параметра от другого узла.
версия 14.
- Добавил в отладку версию скетча, скорость шины, инфу что именно было рестарт mcp2515 и/или ардуино.
- исправил небольшой косяк с запросом параметра от другого узла.
Есть вопрос, я канхакером увидел что узлы произвольно обмениваются параметрами, хотя код одинаковый и везде стоит отправлять к 4. Как это поправить.
судя о канхакингу , ты сначала видимо отправлял команды 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 секунды налетело)
И еще глобальная просба, на тему структуризации кодо и его наследования. Просьба переделать немного основной файл и 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?
Увы опять сбой, ресет не сработал
Нашёл довольно серьезный косяк. При периодической отправке параметров , весь список перебирается в цикле for. В теле цикла нет delay. Поэтому сообщения из списка от ардуины долбят в MCP2515 с большой скоростью. Опытным путём установил, что не все сообщения из списка передаются. Поставил delay (5). Стало всё гуд. Возможно из - за этого шина глючила. Что слишком маленькое было время между отправками соседних сообщений.
15 версия, это исправлено. Также добавил выбор автоматической отправки параметров ещё на один узел. (т.е. в целом 2 )
Вот интересно node_8_Hallway_light.ino.hex всегда немного отличается от всех остальных бинарников, все одинаковые а вот 8 немного меньше.
короче заливай этот короткий скетч. Если на нём тоже будет глючить - проблема все таки железячная , а не софтовая.
мне по твоим последним логам не нравятся некорые узлы. В отладке пишется что статус от мастера принят, а отсылка своего статуса сразу за ним не пишется, т.е. может подрят несколько принять потом только свой отсылает. Такого быть никак не должно.
Или обратная проблема. Получения статусов от мастера в отладке нет, а свой статус отсылает . Причём в эти моменты узел мастером расценивается как ОК!. Вот с этим непонятки. Как будто тут сама дуня глючит и чё то с памятью.
А есть узлы (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. Почитаешь, всё поймешь в первой вкладке, там минимум изменений.
Вот скетч для забивки в еепром адреса узла
Кстати, обнаружил что нет блокировки отправки самому себе и приема своего же броадкаста
По простому в RX отсечь, а по хорошему фильтр придумать для своего бордкаста, а на передачу самому себе внутри TX если rem_adr==dev_adr то return ;)
Постоянно шлют
21->21
19->19
Честно, я вообще перестал понимать логику программы. По какому алгоритму идет рассылка я смотрю в канхаекр и просто диву даюсь что происходит в сети.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
если отправка самому себе реально произошла с нашего MCP2515 то на приёмник она не попадёт. (по стандарту CAN шины сообщения из передатчика не попадают на приёмник).
Отправки самому себе и свои же бродкасты быть не должны, ну допустим что будут (какой то другой узел глюкнул и от нашего имени нам отправил), но не часто, поэтому проще программно В RX() сделать блокировку.
Ты спрашивал про алгоритм. Он очень простой :
У мастера: каждую секунду шлём бродкаст.
У узла: получил от мастера бродкаст - отправил свой статус мастеру.
Также периодически (в секунду равную адресу) отправляем на настроенный узел параметры.
Почему например остальные сами себе не шлют, почему типы сообщений не совпадают.
не понял про что именно ты говоришь. С чего вдруг они должны самы себе слать, и кто такие оставльные?
И какие типы сообщений и где не совпадают?
кстати у меня тут возникла очень здравая идея. адрес узла сохранить каждому в еепром . И при старте скетча адрес будет читаться. Таким образом на этапе тестирования (пока у всех узлов скетч одинаковый) - тебе не нужно будет создавать кучу папок скетчей с разными узлами. Один скетч льешь во все узлы и всё. Естественно предварительно нужно один раз забить в еепром адрес на каждый узел.
Так у тебя уменьшится время на заливку ПО всех узлов.
Вот это сделано в версии 16. Почитаешь, всё поймешь в первой вкладке, там минимум изменений.
Вот скетч для забивки в еепром адреса узла
Если это заработает, то будет совсем круто, а то перепрошивка 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 Где это прописано?
Ограничение циклов 100 000 операций записи это даже если делать 10 записей в день хватит на 10 000 дней т.е примерно на 27 лет.
А нам нужно раз записать и потом при отладке перезаписывать иногда.
ты про параметры говорил. Я думал ты про массив parameter[][] - он то часто обновляется. А ты про другие настройки типа скорости шины и т.д. Их то да конечно в еепром тоже можно записывать.
Я бы понял что все бы слали мастеру, на 00, и например 10, но ведь не так 0,4,19,21 Где это прописано?
в файле can_struct.h
для каждого параметра в отдельности выбирается узел, на который будет посылаться этот параметр периодически или по изменению. Начиная с 15 версии, можно для каждого параметра выбирать два узла, на которые он будет отсылаться
А 0xFF соответственно никому?
В общем EEPROM - "это просто праздник какой то" ©
Предлагаю Все настройки узла туда загрузить
адрес, скорость шины, IP адреса, мастер/слейв/узел, debug и его ключи и пр. даже пока не придумывается.
с адресом , скоростью шины, IP адреса это да, но вот мастер/слейв/узел, debug и его ключи у нас же делаются с помощью директив условной компиляции и этот выбор происходит ещё когда скетч не в узле, а при компиляции, т.е. твой НЕХ файл когда создаётся. Сделать то можно будет, но всё через флаги только, а это память расходует.
и какой смысл эти данные держать в еепром, когда их как раз и нужно изменять при необходимости. А так они всё время из еепром одни и теже будут грузиться, без возможности выбора.
А 0xFF соответственно никому?
да всё верно
Кликабельно
#define NOT_INCLUDED 0x06 // если параметр отсутствует на узле
типы данных :
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 с теми же вызовани сделать на время отладки.
блин ну не пойму я смысла. Это всё и так лежит в энергонезависимой памяти, которая называется флеш. В ней залит скетч. В скетче есть эта информация. Дак нафига её в еепром то пихать? В том то и дело, если ты ничего подключать дополнительно не собираешься вообще не имеет смысла в еепром пихать. Т.к. туда пихается обычно изменяемая инфа. А постоянная она из флеша (скетча) спокойно также грузится.