Modbus adalah sebuah open protocol yang menggunakan Layer Application atau Layer ke tujuh pada OSI Model (OSI: Open Systems Interconnection).
Modbus adalah protokol komunikasi serial yang dipublikasikan oleh Modicon pada tahun 1979
Node-RED adalah sebuah tool berbasis browser untuk membuat aplikasi Internet of Things (IoT) yang mana lingkungan pemrograman visualnya mempermudah penggunanya untuk membuat aplikasi sebagai “flow”. Ketahui lebih lanjut tentang Node-RED dan pelajari bagaimana kamu dapat membuat aplikasi IoT menggunakan flow. Dan dsini akan mencoba berkomunikasi dengan PLC melalui protokol Modbus
Pertama Anda dapat menyimpan dua integer ke buffer (menukar kata-kata seperti yang Anda sebutkan di OP) yang di ambil dari MODBUS. Setelah itu, baca buffer sebagai float. Beginilah tampilan node fungsi (baris pertama ditambahkan untuk tujuan pengujian).
Kode dibawah ini
msg.payload = [0, 16833]; // hapus ini untuk melihat menkorvensi dari modbus
let pay = msg.payload; // mengambil data dari modbus
const buf = Buffer.allocUnsafe(4);
buf.writeInt16BE(pay[0],2);
buf.writeInt16BE(pay[1],0);
msg.payload = buf.readFloatBE(0);
return msg;
Saat menguji dengan data sampel [0,16833], Anda akan mendapatkan msg.payload = 24,125
update: 08 Januari 2021
Atau bisa coba dibawah ini bila cara di atas tidak berjalan
Conversion for two Holding 16bits Modbus register to 32 bits float. https://flows.nodered.org/flow/b9efdce94038df1bd742ddecde96a288
[{"id":"50c06583.5345bc","type":"function","z":"42f2cefc.1b542","name":"Convert_32bits_Foat","func":"var lowBytes = msg.payload.data[0];\nvar highBytes = msg.payload.data[1];\nvar array = [];\nfor ( i = 0 ; i < 32; i++)\n{\n if ( i < 16)\n {\n if ( highBytes % 2 == 0)\n {\n array[i] = 0;\n } else {\n array[i] = 1;\n }\n highBytes = Math.floor(highBytes / 2);\n } else {\n if ( lowBytes % 2 == 0)\n {\n array[i] = 0;\n } else {\n array[i] = 1;\n }\n lowBytes = Math.floor(lowBytes / 2);\n }\n}\nvar sign = Math.pow((-1),array[31]);\nvar e = 1 * array[23] + 2 * array[24] + 4 * array[25] + 8 * array[26] + 16 * array[27] + 32 * array[28] + 64 * array[29] + 128 * array[30];\nvar matissa = 1 + array[22] * Math.pow(2,-1) + array[21] * Math.pow(2,-2) + array[20] * Math.pow(2,-3) + array[19] * Math.pow(2,-4) + array[18] * Math.pow(2,-5) + array[17] * Math.pow(2,-6) + array[16] * Math.pow(2,-7) + array[15] * Math.pow(2,-8) + array[14] * Math.pow(2,-9) + array[13] * Math.pow(2,-10) + array[12] * Math.pow(2,-11) + array[11] * Math.pow(2,-12) + array[10] * Math.pow(2,-13) + array[9] * Math.pow(2,-14) + array[8] * Math.pow(2,-15) + array[7] * Math.pow(2,-16) + array[6] * Math.pow(2,-17) + array[5] * Math.pow(2,-18) + array[4] * Math.pow(2,-19) + array[3] * Math.pow(2,-20) + array[2] * Math.pow(2,-21) + array[1] * Math.pow(2,-22) + array[0] * Math.pow(2,-23);\nvar value = sign * Math.pow(2,(e-127)) * matissa;\nmsg.payload = value;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":500,"y":900,"wires":[["7041f45d.e3d39c"]]}]
sumber https://stackoverflow.com/questions/56257673/reading-32-bit-float-from-modbus-tcp-using-node-red