Membaca 32 bit Float Dari MODBUS Menggunakan NodeRed

  • Post author:
  • Post category:Blog
  • Post comments:1 Comment
You are currently viewing 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
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

This Post Has One Comment

  1. aris

    klo nampilin data int64 ke node red gmn ya

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.