STM32F103 + ENC28J60 + MODBUS -TCP - тайм -ауты через x секунд

P2baron
Солнце 13 мая 2018 г., 10:31
Есть ли у кого -нибудь проблемы с стабильностью с библиотекой Uipethernet?

Я делаю проект, который включает в себя чтение раба Модбуса каждые несколько секунд.

Эта работа отлично в течение некоторого времени, но затем перестает работать. STM32, похоже, теряет связь с модулями ENC28J60. (TX Light перестает мигать)
Я использую библиотеки Modbustcp и Uipethernet.ENC28J60 питается извне.

Может быть, это что -то с таймером сторожевого пса? Пример ModBustCP был некоторый код, чтобы отключить таймер сторожевого пса, который не компилировался для STM32.

Любая помощь ценится.

Это мой код:
#define ENC28J60 = 1 #include unsigned int param_value_int[7]; #include //#include IPAddress ModbusDeviceIP(192, 168, 1, 181); IPAddress moduleIPAddress(192, 168, 1, 12); // Anything other than the device IP Address byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE2 }; #include #ifdef U8X8_HAVE_HW_SPI #include #endif #ifdef U8X8_HAVE_HW_I2C #include #endif ModbusTCP node(1); void setup(void) { Serial2.begin(9600); Serial2.println("banaan"); //u8g2.begin(); Ethernet.begin(mac); node.setServerIPAddress(ModbusDeviceIP); } void loop(void) { uint8_t result; result = node.readHoldingRegisters(2, 1); delay(100); Serial2.print("hola: "); Serial2.println(result, HEX); if(result != 0) { node.MBconnectionFlag = 0; Serial2.println("TimeOut"); if(result == 5) { //Ethernet.begin(mac, moduleIPAddress); //wdt_enable(WDTO_8S); //WDTCSR |= _BV(WDIE); } delay(6000); } int len = node.getResponseBufferLength(); Serial2.println("Response Length: " + String(len)); for (byte j = 0; j < len; j++) { Serial2.print(node.getResponseBuffer(j)); Serial2.print(" "); } Serial2.println(); node.clearResponseBuffer(); delay(100); }

P2baron
Солнце 13 мая 2018 г. 10:53
Повторная инициализация соединения ENC28J60 решает проблему. Я получаю тайм -аут время от времени, но соединение автоматически восстанавливается.
if(result == 5) { Ethernet.begin(mac, moduleIPAddress); }

Rogerclark
Солнце 13 мая 2018 г., 21:24
WDT не включен по умолчанию, но вы можете включить и настраивать его, если это необходимо, однако код будет отличаться от кода AVR, когда я дону’Не думаю, что WDT является частью основного API Arduino, и код в используемой вами библиотеке, вероятно, будет специфичным для AVR

Staticmem
Пн 14 мая 2018 г., 12:12
В начале 00 -х мне пришлось запрограммировать реализацию протокола Modbus для клиента RS232 для клиента. Я помню, что у него были строгие требования к срокам в обслуживании ответов (или в соответствии с этим), или это будет тайм-аут. Протокол Modbus должен покрывать требования к времени.

P2baron
Пн 14 мая 2018 г., 7:50 утра
Спасибо
[Rogerclark - Солнце 13 мая 2018 г., 21:24] - WDT не включен по умолчанию, но вы можете включить и настраивать его, если это необходимо, однако код будет отличаться от кода AVR, когда я дону’Не думаю, что WDT является частью основного API Arduino, и код в используемой вами библиотеке, вероятно, будет специфичным для AVR
Это имеет смысл. Он думает, что код в эскизе есть, чтобы предотвратить сброс MCU во время общения.
Также я прочитал, что сторожевой пейзаж STM32 не может быть отключен после включения.
[Staticmem - Пн 14 мая 2018 г. 12:12] - В начале 00 -х мне пришлось запрограммировать реализацию протокола Modbus для клиента RS232 для клиента. Я помню, что у него были строгие требования к срокам в обслуживании ответов (или в соответствии с этим), или это будет тайм-аут. Протокол Modbus должен покрывать требования к времени.
Это проигрышное соединение MCU с модулем ENC28J60. Я могу успешно читать регистры в течение некоторого времени, прежде чем подключения падают.
Я также пробовал разные модули. Также прочитайте, что мне нужно использовать (внешние) подтягивания на линии i2c. Думаю, мне придется сделать дальнейшую отладку. :(

Стивестронг
Пн 14 мая 2018 г., 9:24
Я использовал модули ENC28, но больше не. Они не очень надежны.
Вместо этого я в настоящее время использую модули W5500, они быстрее и совместимы с arduino.

P2baron
Пн 14 мая 2018 г., 13:30
[Стивестронг - Пн 14 мая 2018 г., 9:24 утра] - Я использовал модули ENC28, но больше не. Они не очень надежны.
Вместо этого я в настоящее время использую модули W5500, они быстрее и совместимы с arduino.
Спасибо за совет!

Жаль, что у меня есть куча ENC28.
К счастью, модули W5500 на eBay дешевы на eBay. Заказал два из них.

В то же время приветствуются любые рекомендации по повышению стабильности с модулями ENC28!

luca_stm32
Пн 21 мая 2018 г., 19:38
Привет, P2baron.
Извините за мой поздний ответ.
Я использовал эту библиотеку для ENC28J60, и она работает с Blu Pill: https: // github.com/uipethernet/uipethernet

Надеюсь, это может вам помочь.
Лука

P2baron
Вторник 22 мая 2018 12:32
[luca_stm32 - Пн 21 мая 2018 г., 19:38] - Я использовал эту библиотеку для ENC28J60, и она работает с Blu Pill: https: // github.com/uipethernet/uipethernet
Спасибо, Лука - я уже использую последнюю версию из этой библиотеки. У вас нет проблем с стабильностью? Вы делали что-нибудь специальный код или проводка?

luca_stm32
Ср 23 мая 2018 г., 5:13
Я не вижу проблемы с стабильностью, но у меня включен сторожевой пейзаж.
Я видел твой код, но я не могу найти, где ты называешь Ethernet.поддерживать(); Функция: в основном цикле вы должны назвать это так часто, как можете.
В вашем коде я также заметил, что у вас есть задержка (6000); Может быть, вы сможете повторно это: unit32_t delay_time; if ((millis() - delay_time) < 6000) Ethernet.maintain();

Асмаллри
Ср 23 мая 2018 г., 22:33
[Staticmem - Пн 14 мая 2018 г. 12:12] - В начале 00 -х мне пришлось запрограммировать реализацию протокола Modbus для клиента RS232 для клиента. Я помню, что у него были строгие требования к срокам в обслуживании ответов (или в соответствии с этим), или это будет тайм-аут. Протокол Modbus должен покрывать требования к времени.
Я проделал много работы Modbus RS232. Я подозреваю, что вы имели дело с конкретным устройством с этими ограничениями, потому что сам Modbus не обеспечивает строгого времени и вместо этого предлагает тайм -ауты в диапазоне от 1 секунды до нескольких секунд в зависимости от скорости бода. Из «что я наблюдал», я видел, как время отклика устройства варьируется от меньшего количества, чем 0 (один семейный продукт начал передавать ответ до того, как сериализация стоп -бита от отправителя была завершена) в диапазоне до 2 секунд.

Staticmem
Сб 26 мая 2018 г. 8:33 утра
[Асмаллри - Ср 23 мая 2018 г. 22:33] -
[Staticmem - Пн 14 мая 2018 г. 12:12] - В начале 00 -х мне пришлось запрограммировать реализацию протокола Modbus для клиента RS232 для клиента. Я помню, что у него были строгие требования к срокам в обслуживании ответов (или в соответствии с этим), или это будет тайм-аут. Протокол Modbus должен покрывать требования к времени.
Я проделал много работы Modbus RS232. Я подозреваю, что вы имели дело с конкретным устройством с этими ограничениями, потому что сам Modbus не обеспечивает строгого времени и вместо этого предлагает тайм -ауты в диапазоне от 1 секунды до нескольких секунд в зависимости от скорости бода. Из «что я наблюдал», я видел, как время отклика устройства варьируется от меньшего количества, чем 0 (один семейный продукт начал передавать ответ до того, как сериализация стоп -бита от отправителя была завершена) в диапазоне до 2 секунд.
Долгое время, но да, это были, вероятно, тайм-ауты, на которые я на самом деле ссылался, и не так много в течение нескольких критических уровней.