Something like this is what I use.
You’re lucky that it almost never happens. For me the modbus client freezes daily. But that might have to do with the very exotic modbus device I have
[{"id":"f24c40d4.fe09e","type":"modbus-flex-getter","z":"d9a498d5.de4378","name":"","showStatusActivities":false,"showErrors":false,"logIOActivities":false,"server":"","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"x":970,"y":740,"wires":[["774d1a88.f91274","bd5d8f68.4702e"],[]]},{"id":"cf058757.dc6638","type":"inject","z":"d9a498d5.de4378","name":"60s","props":[{"p":"payload"}],"repeat":"60","crontab":"","once":false,"onceDelay":"60","topic":"","payload":"","payloadType":"date","x":430,"y":740,"wires":[["852fe1c8.02d83"]]},{"id":"852fe1c8.02d83","type":"function","z":"d9a498d5.de4378","name":"Create request","func":"return {\n \"payload\": {\n \"value\":1,\n \"fc\":3,\n \"unitid\": 1,\n \"address\":0,\n \"quantity\":10\n }\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":680,"y":740,"wires":[["4d678d8f.f21f14","f24c40d4.fe09e"]]},{"id":"4d678d8f.f21f14","type":"delay","z":"d9a498d5.de4378","name":"Comm Timeout","pauseType":"delay","timeout":"120","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":1300,"y":840,"wires":[["7e12a16d.373f8"]]},{"id":"7e12a16d.373f8","type":"api-call-service","z":"d9a498d5.de4378","name":"Restart Node-RED","server":"","version":1,"debugenabled":false,"service_domain":"hassio","service":"addon_restart","entityId":"","data":"{\"addon\":\"a0d7b954_nodered\"}","dataType":"jsonata","mergecontext":"","output_location":"","output_location_type":"none","mustacheAltTags":false,"x":1550,"y":840,"wires":[[]]},{"id":"774d1a88.f91274","type":"change","z":"d9a498d5.de4378","name":"Reset timeout","rules":[{"t":"set","p":"reset","pt":"msg","to":"true","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":1000,"y":840,"wires":[["4d678d8f.f21f14"]]},{"id":"bd5d8f68.4702e","type":"debug","z":"d9a498d5.de4378","name":"Respons","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1280,"y":740,"wires":[]}]