Site icon Hasan Basri

Membaca 32 bit Float Dari MODBUS Menggunakan NodeRed

Membaca 32 bit Float Dari MODBUS Menggunakan NodeRed

Membaca 32 bit Float Dari MODBUS Menggunakan NodeRed

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

Membaca 32 bit Float Dari MODBUS Menggunakan NodeRed

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"]]}]
two Holding 16bits Modbus register to 32 bits float.

sumber https://stackoverflow.com/questions/56257673/reading-32-bit-float-from-modbus-tcp-using-node-red

Exit mobile version