Ich habe einen ESP32 laufen, welcher den Modbus Master aus dem ESP IDF
betreibt.
Aus irgendeinem Grund kommt es nach einiger Zeit (5-15 Minuten) im
Betrieb zu folgender Meldung und der ESP startet neu.
assert failed: xMBMasterRTUReceiveFSM mbrtu_m.c:235 (( eSndState ==
STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR ))
Bis dahin verläuft die Auslesung soweit ohne Probleme.
Hier noch ein längere Auszug aus dem seriellen Log:
1
I (1914922) count_task: RAM left 123640; mb_master_hwm: 1508, count_task_hwm: 20, mqtt_ssl_main_hwm: 6276
2
I (1915262) MASTER_TEST: Characteristic #0 Data_channel_0 (kW) value = 4531.000000 (0x458d9800) read successful. Restarted: 0
3
I (1915762) MASTER_TEST: Characteristic #0 Data_channel_0 (kW) value = 4531.000000 (0x458d9800) read successful. Restarted: 0
4
I (1916262) MASTER_TEST: Characteristic #0 Data_channel_0 (kW) value = 4531.000000 (0x458d9800) read successful. Restarted: 0
5
I (1916762) MASTER_TEST: Characteristic #0 Data_channel_0 (kW) value = 4531.000000 (0x458d9800) read successful. Restarted: 0
0x40081c02: panic_abort at C:/Users/Michael.Uray/esp/esp-idf/components/esp_system/panic.c:402
11
12
0x40089559: esp_system_abort at C:/Users/Michael.Uray/esp/esp-idf/components/esp_system/esp_system.c:128
13
14
0x400909b5: __assert_func at C:/Users/Michael.Uray/esp/esp-idf/components/newlib/assert.c:85
15
16
0x400e0751: xMBMasterRTUReceiveFSM at C:/Users/Michael.Uray/esp/esp-idf/components/freemodbus/modbus/rtu/mbrtu_m.c:235 (discriminator 2)
17
18
0x400e1545: usMBMasterPortSerialRxPoll at C:/Users/Michael.Uray/esp/esp-idf/components/freemodbus/port/portserial_m.c:94
19
20
0x400e15b4: vUartTask at C:/Users/Michael.Uray/esp/esp-idf/components/freemodbus/port/portserial_m.c:142
21
22
0x4008cdad: vPortTaskWrapper at C:/Users/Michael.Uray/esp/esp-idf/components/freertos/port/xtensa/port.c:131
23
24
ELF file SHA256: 375376b08aba9e70
25
26
Rebooting...
Die Modbus Master Funktion entspricht in etwa dem Beispiel vom ESP IDF
mit einigen kleineren Änderungen.
Es laufen darauf auch noch ein Websocket-/Webserver, Modbus Client und
MQTT in eigenen Tasks, falls dies eine Rolle spielen sollte, deren
Aufrufe sehen so aus:
Die interessante Stelle ist die hier:
freemodbus/modbus/rtu/mbrtu_m.c:235
(( eSndState == STATE_M_TX_IDLE ) || ( eSndState == STATE_M_TX_XFWR ))
Das bedeutet, daß eSndState einen anderen als die beiden angegebenen
Werte hat.