Hmmm, 0.5 deg C might be a bit much for the mechanical setup of the tank etc, but with careful tuning, it might be doable (its very doable from an Opto / PID point of view - it’s more just a question of the valves, heat/cool exchanger setup, temperature probe location, thermal mass, tank volume etc).
So here is how I would go about it.
Set up your analog input (the temp probe) and the two analog outputs (the proportional valves).
I have set the valves up for 0 to 10vDC, but yours might be 4-20mA.
I set up the scaling for 0 to 100% as that’s pretty typical I suspect.
The temperature input is just an ICTD, you will probably have something else, but the range and input details will be much the same.
The PID configuration is also very standard (to start).
The cooling one is the same, just with a P-term of 10 and a Set point of 80.
I chose not to do anything with the output over range options.
You can set that up if you like, it will just give you options to try and protect the tank temperature if the input goes out of range.
Carefully pick some set points to get started, or don’t start the PID loops in auto and only start them once you have applied the desired set point. The reason for this that the PID set point is zero by default, which is probably not what you want. So either set it at a starting range, or add strategy code to start the PID loops after you have set up the set point values.
As for the strategy code, here is what I imagine you would start with.
By keeping a dead band around your desired set point your PID loops (once they are tuned) will never fight each other and your tank will hover around the desired set point.
When it comes to tuning, I would be doing a step function response tune of the heating and cooling.
Both will be different due to different valves and pumps etc.
Here is a guide I wrote to help with that.
https://www.opto22.com/support/resources-tools/demos/pid-reaction-curve-tuning-for-interactive-pid-alg
Hope that helps you get started.