Malcolm,

The heater outputs are interrupt driven, so if the main program locks up somewhere due to an unexpected condition, the heaters will continue pulsing at the last drive level given from the PID loops.

I can't imagine all four DS18B20's having a problem at the same time. The program is checking CRC's.
If 1 VIV got hot and the others were OK, I might suspect a DS.

You may need to use the WDT to monitor the main loop.
Then it'll reset the processor if it gets lost.

Using ...
DEFINE NO_CLRWDT 1
PBP will not add CLRWDT instructions throughout the code.
Then "strategically" placing CLRWDT statements in your program will clear it as long as the loop is running.

I say strategically, because if you place a CLRWDT in the area where it's locking up, it won't help.

Since the problem seems to be repeatable by fiddling with the lights, it should be fairly easy to locate good placements of the CLRWDT statements.

Blinking an LED in the main loop may help identify when or if it's locked.