@@ -2501,7 +2501,10 @@ void ModbusRequestLoop() {
25012501
25022502 static uint8_t PollEVNode = NR_EVSES;
25032503 static uint16_t energytimer = 0 ;
2504+ static uint8_t NodeOfflineProbe = 1 ;
2505+ static bool probedThisCycle = false ;
25042506 uint8_t updated = 0 ;
2507+ uint8_t nodeNr;
25052508
25062509 // Every 2 seconds, request measurements from modbus meters
25072510 // Slaves all have ModbusRequest at 0 so they never enter here
@@ -2576,9 +2579,27 @@ void ModbusRequestLoop() {
25762579 case 10 :
25772580 case 11 :
25782581 case 12 :
2582+ // Request Node Status, skip offline nodes to save time in the loop.
2583+ // Probe One offline Node per cycle.
25792584 if (LoadBl == 1 ) {
2580- requestNodeStatus (ModbusRequest - 5u ); // Master, Request Node 1-8 status
2581- break ;
2585+ if (ModbusRequest == 6 ) probedThisCycle = false ;
2586+
2587+ while (ModbusRequest <= 12 ) {
2588+ nodeNr = ModbusRequest - 5u ;
2589+ if (Node[nodeNr].Online || (!probedThisCycle && nodeNr == NodeOfflineProbe)) {
2590+ if (!Node[nodeNr].Online ) {
2591+ probedThisCycle = true ;
2592+ do {
2593+ if (++NodeOfflineProbe >= NR_EVSES) NodeOfflineProbe = 1 ;
2594+ } while (Node[NodeOfflineProbe].Online && NodeOfflineProbe != nodeNr);
2595+ _LOG_D (" Probing offline Node %u\n " , nodeNr);
2596+ }
2597+ requestNodeStatus (nodeNr);
2598+ break ;
2599+ }
2600+ ModbusRequest++;
2601+ }
2602+ if (ModbusRequest <= 12 ) break ;
25822603 }
25832604 ModbusRequest = 13 ;
25842605 // fall through
0 commit comments