Node-Red ~ Modbus Floating Point Convert (Float32 / Real)
this function script is used to convert your 2 words into Float32bit
/* Converts from an number, string, buffer or array representing an IEEE-754 value
to a javascript float.
The following may be given in msg.payload:
A string representing a number, which may be hex or binary
examples, "1735" "0x02045789" 0b01000000010010010000111111011011
An integer value
A two element array or buffer of 16 bit values, less significant byte first.
A four element array or buffer of 8 bit values, most significant byte first.
Source: https://flows.nodered.org/flow/359ead34237b7ab6ec0465ee85a34b62
*/
// first make a number from the given payload if necessary
let intValue;
if (typeof msg.payload === "number")
{
intValue = msg.payload;
} else if (typeof msg.payload === "string") {
intValue = Number(msg.payload);
} else if (msg.payload.length == 2) {
// two int array or buffer
intValue = (msg.payload[1] << 16) + msg.payload[0];
} else if (msg.payload.length == 4) {
// four byte array or buffer
intValue = (((((msg.payload[0] << 8) + msg.payload[1]) << 8) + msg.payload[2]) <<
8) + msg.payload[3];
} else {
node.warn("Unrecognised payload type or length");
}
msg.payload = Int2Float32(intValue);
msg.payload = msg.payload.toFixed(1);
return msg;
function Int2Float32(bytes) {
var sign = (bytes & 0x80000000) ? -1 : 1;
var exponent = ((bytes >> 23) & 0xFF) - 127;
var significand = (bytes & ~(-1 << 23));
if (exponent == 128)
return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);
if (exponent == -127) {
if (significand === 0) return sign * 0.0;
exponent = -126;
significand /= (1 << 22);
} else significand = (significand | (1 << 23)) / (1 << 23);
return sign * significand * Math.pow(2, exponent);
}
The most used Fieldbus Protocol
current situation of fieldbus war, just let the picture say….
when every protocol just move to Ethernet Technology, Profibus DP still the most used protocol 14% in fieldbus