The node itself doesn't support it directly. But that doesn't matter because it's how you pull the data that matters. Here's how you would setup your flow.
[{"id":"5aa8e938caef0145","type":"tab","label":"Pool","disabled":false,"info":"","env":[]},{"id":"bfe67d7edd06ac3e","type":"inject","z":"5aa8e938caef0145","name":"1m Trigger","props":[{"p":"payload"}],"repeat":"60","crontab":"","once":true,"onceDelay":"0.5","topic":"","payload":"","payloadType":"date","x":170,"y":100,"wires":[["73732dbb88492cd4"]]},{"id":"73732dbb88492cd4","type":"modbus-flex-sequencer","z":"5aa8e938caef0145","name":"Pool Control","sequences":[{"name":"chlor","unitid":"1","fc":"FC3","address":"100","quantity":"2"},{"name":"ph","unitid":"1","fc":"FC3","address":"115","quantity":"2"},{"name":"redox","unitid":"1","fc":"FC3","address":"130","quantity":"2"}],"server":"dfe14343b607d506","showStatusActivities":false,"showErrors":false,"logIOActivities":false,"useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"x":330,"y":100,"wires":[[],["cdf20a5b85d365eb"]]},{"id":"cdf20a5b85d365eb","type":"function","z":"5aa8e938caef0145","name":"","func":"var temp = Buffer.from(msg.payload.buffer);\nmsg.payload = temp.readFloatBE();\nif(msg.modbusRequest.name == \"chlor\"){\n return([msg,null,null]);\n}\nif(msg.modbusRequest.name == \"ph\"){\n return([null,msg,null]);\n}\nif(msg.modbusRequest.name == \"redox\"){\n return([null,null,msg]);\n}","outputs":3,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":100,"wires":[[],[],[]]},{"id":"dfe14343b607d506","type":"modbus-client","name":"Test Server","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":true,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true}]
Now obviously, you'll need to correct your MODBUS server information in the Pool Control node to make it work as I don't have that info. But that should be the minimum to start getting data out.
How it works is you have an inject node working as a timer. You can adjust it to whatever update frequency you want. I just set it for one minute. That timer feeds a sequencer that's part of the node-red-contrib-modbus package. The sequencer's job is to go through a sequence (hence the name) of MODBUS registers and spit out the data as it goes. I'm assuming each register is a 32 bit float, which is why you're pulling a quantity of two (first and second halves of the float in MODBUS speak). The data from these pulls will be output on the bottom channel as a buffer, which is one of the easiest forms to work with when reconstructing your float.
Once you have your data from a pull, it's spit out to the function which will convert the data from the buffer into a float. There's something to pay attention to here. There's no specific order MODBUS specifies for the float to come back as. Your controller may pass it back big Endian or little Endian. If you look at the data and it doesn't look right, change the readFloatBE to readFloatLE in the function to make it convert the float as little Endian and see if that works. Once the float is converted, it's assigned to the payload. The requesting component in the sequencer is then checked to figure out what data was being requested. Based on that data, it's rerouted to one of the function outputs to be used as the data for what I assume would be a dashboard display.
Anyways, that's the minimum to get you started. It will take some tuning to match your setup, but it shouldn't be too difficult to accomplish.