изменился IP
- Войдите на сайт для отправки комментариев
Пнд, 01/04/2019 - 17:00
Посоветуйте, куда смотреть...
Есть проект Мега2560, W5500 (библиотека ethernet2), библиотека MODBUS TCP (https://github.com/siamect/mudbus). IP задается статический 192.168.1.25. Вообщем modbus TCP slave устройство. Все работает, но пару раз проявился такой момент: через некоторое время (дней 7-10, примерно) беспрерывной работы устройство перестало отвечать на запросы. Адрес 192.168.1.25 не пингуется. НО, устройство стало пинговаться по адресу 192.168.1.15.
Как такое возможно? Как обойти эти грабли и куда смотреть?
Спасибо.
Само по себе у меня такое ни разу не происходило, но допускать вероятность того, что в чип полетела наводке, которая была распознана как команда переконфигурирования со случайным адресом, совпавшим до некоторой степени с оригинальным, - могу.
Что скрывается под словом"обойти" - не понимаю пока, но могу предложить раз в N секунд сличать хотя бы localIP() с заданным. Разняться - переконфигурировать.
Видимо роутер всё таки присваивает динамический IP. В роутере можно зарезервировать динамический IP адрес для конкретного устройства по MAC-адресу.
Неее, роутера нет. Сеть - это само устройство, ПЛК и ноутбук. У всех статические адреса. Что поменялся IP адрес случайно обнаружил - запустил Advanced IP scaner.
Что скрывается под словом"обойти" - не понимаю пока, но могу предложить раз в N секунд сличать хотя бы localIP() с заданным. Разняться - переконфигурировать.
В идеале найти причину
Само по себе у меня такое ни разу не происходило, но допускать вероятность того, что в чип полетела наводке, которая была распознана как команда переконфигурирования со случайным адресом, совпавшим до некоторой степени с оригинальным, - могу.
я запущу на тест устройство, понаблюдаю. Если будет тот же адрес - значит другая причина ....
Это очень вряд ли. Чтобы получить адрес от dhcp, нужно четыре чётко структурированных пакета, по два в обе стороны, это очень уж умная наводка должна быть :)
Это очень вряд ли. Чтобы получить адрес от dhcp, нужно четыре чётко структурированных пакета, по два в обе стороны, это очень уж умная наводка должна быть :)
У него нет DHCP, так что не умная, но достаточно сообразительная. А вероятность - она всегда ненулевая.
IP же в W5500 прописывается только раз, по SPI. Может всё таки была перезагрузка?
IP же в W5500 прописывается только раз, по SPI. Может всё таки была перезагрузка?
я логировал modbus, вот что в логах
Между началом ошибок по связи и моментом когда устройство полностью перестало отвечать на запросы, прошло (с 18.00 до 18.39) 39 минут.
Если была просто перезагрузка, почему адрес прописался другой ?
Устанавливается адрес сколько угодно раз... Никаких ограничений на многократную запись в регистр SIPR нет.
Устанавливается адрес сколько угодно раз... Никаких ограничений на многократную запись в регистр SIPR нет.
Я про то, что в данном случае он статический и прописывается один раз после подачи питания. Вот тут, помеха по SPI в момент записи вполне себе может быть.
ТС, я бы добавил задержку перед настройкой микрухи по SPI, пусть питание устаканится.
Да, так может, да :)
[/quote]
ТС, я бы добавил задержку перед настройкой микрухи по SPI, пусть питание устаканится.
[/quote]
Да, согласен, резонно... Реализую
вытащил на морду еще и Ethernet.localIP(), тестирую
и все таки IP меняется... причину понять не могу. задержку поставил перед настройкой по SPI в случае перезагрузки... пока хочу обработать сам факт изменения и принудительно переконфигурить IP адрес. Вопрос такой: как правильно обрабатывать значение Ethernet.localIP(). В конструкции display.println (Ethernet.localIP ( )) оно правильно отображается на экране в виде 192.168.1.25. А что с чем сравнивать, ведь это не строка?
В конструкции display.println (Ethernet.localIP ( )) оно правильно отображается на экране в виде 192.168.1.25. А что с чем сравнивать, ведь это не строка?
так чего проще - откройте библиотеку Ethernet и посмотрите, в каком виде отдает адрес эта самая функция localIP( ). Подозреваю, что она выводит как раз таки строку.
Сравнивать IP в виде строки не слишком эффективно - я бы покопался в библиотеке, наверняка из нее можно получить адрес и в виде 4х байт. что было бы удобнее для сравнения.
Ethernet.localIP() возвращает объект IPAddress. Его можно сравнивать с таким же IPAddress или, например, с uint32_t. С первым более наглядно, наверно - ведь он задаётся в начале скетча. Типа IPAddress hostIp(192, 168, 1, 25);
Ethernet.localIP() возвращает объект IPAddress.
а как же оно печатается функцией print() ?
Ethernet.localIP() возвращает объект IPAddress.
а как же оно печатается функцией print() ?
вот ты не ленивый :) Спасибо, понятно
Спасибо большое
вот ты не ленивый :) Спасибо, понятно
он программист докапывающийся до сути )))