Menggunakan Harmony Edge Box / IoT Box sebagai Modbus Gateway (TCP to RTU)
Magelis Edge Box (sekarang berubah menjadi Harmony Edge Box) adalah sebuah Computer dengan ukuran mini dengan kebutuhan khusus dan di design dengan spesifikasi industrial. belakangan lebih sering disebut sebagai IoT Box karena kebanyakan digunakan sebagai bridge ke IoT. lebih lengkapnya dapat di cek diwebsite Schneider Electric:
Kali ini saya akan membahas bagaimana menggunakan IoT Box terutama untuk yang versi Linux, untuk digunakan sebagai gateway Modbus TCP ke Modbus Serial. menggunakan NodeRED
dengan menggunakan flow ini, otomatis IoT Box langsung berfungsi sebagai gateway. kita bisa connect ke IP IoT Box untuk membaca modbus rtu/ serial nya. Jangan lupa untuk mengkonfigur COM PORT nya di node-red disesuaikan dengan kebutuhan.
flow nya dapat di download disini: [su_button url=”https://www.rifqion.com/web/wp-content/uploads/ModbusTCP2RTU.txt” target=”blank” background=”#2def2d” center=”yes” icon=”icon: arrow-down”]Download Flow ModbusTCP2RTU[/su_button]
atau bisa copy dan import ke nodeRED text berikut:
[{“id”:”de082ac2.4b8bf8″,”type”:”tab”,”label”:”Flow 1″,”disabled”:false,”info”:””},{“id”:”31fa4a86.128056″,”type”:”tcp in”,”z”:”de082ac2.4b8bf8″,”name”:”tcp.modbusmsg”,”server”:”server”,”host”:””,”port”:”502″,”datamode”:”stream”,”datatype”:”buffer”,”newline”:””,”topic”:””,”base64″:false,”x”:140,”y”:60,”wires”:[[“22ff3060.54da6″,”24b6fd87.ada872″,”2945260c.aa942a”]]},{“id”:”22ff3060.54da6″,”type”:”function”,”z”:”de082ac2.4b8bf8″,”name”:”TCP_TO_RTU”,”func”:”var A = [8];\nA[0]= msg.payload[6];\nA[1]= msg.payload[7];\nA[2]= msg.payload[8];\nA[3]= msg.payload[9];\nA[4]= msg.payload[10];\nA[5]= msg.payload[11];\n\n\n// Compute the MODBUS RTU CRC\n var crc = 0xFFFF;\n \n for (var pos = 0; pos < 6; pos++) \n {\n crc ^= A[pos]; // XOR byte into least sig. byte of crc\n \n for (var i = 8; i !== 0; i--) { // Loop over each bit\n if ((crc & 0x0001) !== 0) { // If the LSB is set\n crc >>= 1; // Shift right and XOR 0xA001\n crc ^= 0xA001;\n }\n else // Else LSB is not set\n crc >>= 1; // Just shift right\n }\n }\n var TempS = crc.toString(16);\n\n A[7] = parseInt(TempS.substring(0,2),16);\n A[6] = parseInt(TempS.substring(2,4),16);\nvar buf = new Buffer(A);\nmsg.payload = buf;\nreturn msg;”,”outputs”:1,”noerr”:0,”x”:360,”y”:60,”wires”:[[“7e62bbbc.bd8ea4″]],”outputLabels”:[“XO”,”YO”]},{“id”:”afc3df8f.e537a”,”type”:”tcp out”,”z”:”de082ac2.4b8bf8″,”host”:”127.0.0.1″,”port”:”502″,”beserver”:”reply”,”base64″:false,”end”:false,”name”:””,”x”:970,”y”:60,”wires”:[]},{“id”:”7e62bbbc.bd8ea4″,”type”:”serial request”,”z”:”de082ac2.4b8bf8″,”name”:””,”serial”:”1c326b00.95f945″,”x”:530,”y”:60,”wires”:[[“db79ee80.1d792”]]},{“id”:”24b6fd87.ada872″,”type”:”function”,”z”:”de082ac2.4b8bf8″,”name”:”Transc_ID”,”func”:”var Transc = [2];\nTransc[0]= msg.payload[0];\nTransc[1]= msg.payload[1];\nmsg.payload = Transc;\nglobal.set(‘Transc_ID’, Transc);\nreturn msg;”,”outputs”:0,”noerr”:0,”x”:350,”y”:100,”wires”:[],”icon”:”node-red/batch.svg”},{“id”:”2945260c.aa942a”,”type”:”function”,”z”:”de082ac2.4b8bf8″,”name”:”Protocol_ID”,”func”:”var temp = [2];\ntemp[0]= msg.payload[2];\ntemp[1]= msg.payload[3];\nmsg.payload = temp;\nglobal.set(‘Protocol_ID’, temp);\nreturn msg;”,”outputs”:0,”noerr”:0,”x”:350,”y”:140,”wires”:[],”icon”:”node-red/batch.svg”},{“id”:”db79ee80.1d792″,”type”:”function”,”z”:”de082ac2.4b8bf8″,”name”:”ReComposeTCP”,”func”:”var tempLength = msg.payload.length – 2;\nvar A = [];\nA[0] = global.get(‘Transc_ID’)[0];\nA[1] = global.get(‘Transc_ID’)[1];\nA[2] = global.get(‘Protocol_ID’)[0];\nA[3] = global.get(‘Protocol_ID’)[1];\nA[4] = 0;\nA[5] = tempLength;\n for (var pos = 6; pos < tempLength+6; pos++) \n {\n A[pos]= msg.payload[pos-6];\n }\nmsg.payload = new Buffer(A);\nreturn msg;","outputs":1,"noerr":0,"x":730,"y":60,"wires":[["afc3df8f.e537a"]]},{"id":"1c326b00.95f945","type":"serial-port","z":"","serialport":"COM4","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","waitfor":"","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"1000","bin":"bin","out":"time","addchar":"","responsetimeout":"1000"}]