สวัสดีครับทุกคน วันนี้ขอมานำเสนอตัวอย่างวิธีการเชื่อมต่อ ROBOT ARM กับ NODE RED โดยใช้การสื่อสารผ่าน Modbus กันครับ ตัวอย่างโปรเจ็กจะเป็นอย่างไรนั้น ไปดูกันเล้ยย…
อธิบายภาพรวม
ตัวอย่างของระบบนี้จะขอเล่าภาพรวมของระบบก่อนครับ โดยระบบเริ่มต้นจากการมีกล่องที่มีการติดแถบแม่เหล็ก RFID ซึ่งเป็นตัวอย่างทั่วไปของการติดที่กล่องสินค้าต่างๆ จากนั้นเมื่อกล่องนี้วิ่งมาถึงจุดที่มีการติดตั้งเครื่องอ่านรหัสใน RFID เครื่องก็จะอ่านสัญญาณ และส่งข้อมูลให้กับ PLC ซึ่งเป็นตัวกลางในการติดต่อสื่อสาร
PLC จะหาช่องการวางในพื้นที่ที่ว่าง และทำการสั่งให้ ROBOT ARM ย้ายกล่องไปที่ที่ว่างอยู่ ในเวลาเดียวกัน PLC จะติดต่อสื่อสารกับโปรแกรม Node-red ที่เขียนขึ้น เพื่อให้ Node-red บันทึกค่าและแสดงผลของรหัส RFID ผ่านทาง Node-red Dashboard ในทางกลับกันหากต้องการให้ ROBOT ARM หยิบของออกจากพื้นที่ เราจะสั่งการผ่าน Node-red dashboard และสั่งให้ ROBOT ARM ยกกล่องกลับมา
อุปกรณ์ที่ใช้
- แถบแม่เหล็ก RFID ติดกล่อง Balluff
- ตัวอ่าน RFID
- PLC PLC : FX5U-32M
- ROBOT ARM
- Program Node-red
ขั้นตอนการทำ
การโปรแกรม PLC
ก่อนอื่นในการรับค่า RFID เราจะใช้คำสั่ง Serial RS ซึ่งฟังชั่นนี้จะต้องติดตั้ง Module RS port เพิ่มเติมในโปรแกรม ซึ่งจะต้องตั้งค่า Baud rate เดียวกับเครื่องอ่าน RFID นั่นเอง
โค้ดของ PLC จริงๆ แต่ที่จะเน้นยำ คือ การ Set Module information ADP1:FX5-232ADP เพราะการอ่าน RFID จะใช้การสื่อสารผ่าน RS-232
การเขียนโปรแกรม Node-red
โปรแกรม Node-red เขียนได้ดังรูป โดยแบ่งเป็น 2 ส่วนงานด้วยกันตามกรอปสีแดงสองกล่อง
กล่องด้านซ้าย เป็นส่วนของการรับข้อมูล RFID ที่อ่านมาได้จาก PLC ยกตัวอย่าง node : box2 ตามรูปด้านล่าง ค่าที่ต้องตั้งค่า คือ
FC – เลือก FC-3
Address – 20 หมายถึงดึงค่า D20 จาก PLC
Quantity – เลือก 1 คือ จะเฉพาะ D20 เท่านั้น
สำหรับ node function เป็นการสร้างโค้ด เงื่อนไขแบบง่าย เพื่อส่งข้อมูลไปยัง Dashboard โดยถ้ารับสัญญาณ Modbus ที่มีค่า ให้ส่งค่าออกไปที่ msg.payload ถ้าไม่ใช่ ให้แสดงเป็นขีดว่าง จากนั้นส่งไปให้ node ที่เป็นการแสดงค่าไปยัง Dashboard
กล่องสีแดงทางขวา
สำหรับกล่องสีแดงด้านขวา Node true และ false เป็น node สำหรับเลือกหยิบ เช่น ถ้ากด true ก็จะส่งค่าให้ Robot Arm หยิบที่ตำแหน่งนั้น และเราทำในรูปแบบเดียวกันผ่าน Node-red Dashboard ที่ชื่อ PICK BOX ที่จะทำหน้าที่เหมือน Node true ทุกประการ
สมาชิกผู้จัดทำ
Node-red Code
[
{
"id": "7e83472a76578da5",
"type": "tab",
"label": "Flow 2",
"disabled": false,
"info": "",
"env": []
},
{
"id": "657e30603ed3d743",
"type": "group",
"z": "7e83472a76578da5",
"name": "Serial Read",
"style": {
"label": true,
"stroke": "#ffcf3f",
"fill": "#ffffbf",
"fill-opacity": "0.52",
"color": "#ffC000"
},
"nodes": [
"34eaba6a5f16cc6b",
"5e80c9bb2b8748f5",
"f4cf91a30554a971",
"8c7dda1cc9f6d4c0",
"7491e3c60e6b364d",
"dbd60f4e3bd55654",
"42a24b13e122c632",
"7d6f01fa9bdde592",
"2c747e708e25d4e8",
"6e513a392017010e",
"11812068a5007052",
"5fe424593c2c42f8",
"848ab8be02298368",
"fcbe6785dabede66",
"90cdc3b69b41378b",
"eb53033de41b67b6",
"cae6205473411045",
"fd67eda9ab8b2be9",
"ca1128e76d3a8e81",
"1020561e9839d4a2",
"a6d68c989c61b1f2",
"cb38084bf237fa03",
"ec71c5e91ded3512"
],
"x": 214,
"y": 139,
"w": 752,
"h": 662
},
{
"id": "6c0c8e61bc9db8c5",
"type": "group",
"z": "7e83472a76578da5",
"name": "Serial Write",
"style": {
"label": true,
"stroke": "#3f93cf",
"fill": "#bfdbef",
"fill-opacity": "0.63",
"color": "#0070c0"
},
"nodes": [
"8dfe69484071f9d9",
"cbf3b24bd15646f2",
"f718cab47c4b1dea",
"6887ecf6bbb88202",
"01fa8d73402713a5",
"be02ea752b03f752",
"1e3bfcdfde8fb30a",
"0d0b2529e2aebe15",
"dbd87b5bed29d181",
"3a69e9903eccea63",
"6ca7466b1df30cfa",
"bfea10731d6d2a8a",
"5641bc27b4e0aa83",
"92134b200d55bc6b",
"7bc55621c563e9de",
"0ef1988937d1f05b",
"9804881e808ccf1c",
"9e352d2f80412f16",
"4f2a133ebf5dc7f5",
"d69fe5dbaa83cbc1",
"cb4d6039fb2f7735",
"bdda40c95af12998",
"11922ae0583ddd05",
"11a7dd0d46d53a29"
],
"x": 1014,
"y": 139,
"w": 632,
"h": 642
},
{
"id": "34eaba6a5f16cc6b",
"type": "modbus-read",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "box1",
"topic": "",
"showStatusActivities": false,
"logIOActivities": false,
"showErrors": false,
"unitid": "",
"dataType": "HoldingRegister",
"adr": "10",
"quantity": "1",
"rate": "1",
"rateUnit": "ms",
"delayOnStart": false,
"startDelayTime": "",
"server": "24dfc24540f0ed42",
"useIOFile": false,
"ioFile": "",
"useIOForPayload": false,
"emptyMsgOnFail": false,
"x": 310,
"y": 220,
"wires": [
[
"cae6205473411045",
"eb53033de41b67b6"
],
[]
]
},
{
"id": "5e80c9bb2b8748f5",
"type": "debug",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 830,
"y": 260,
"wires": []
},
{
"id": "f4cf91a30554a971",
"type": "modbus-read",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "box2",
"topic": "",
"showStatusActivities": false,
"logIOActivities": false,
"showErrors": false,
"unitid": "",
"dataType": "HoldingRegister",
"adr": "20",
"quantity": "1",
"rate": "1",
"rateUnit": "ms",
"delayOnStart": false,
"startDelayTime": "",
"server": "24dfc24540f0ed42",
"useIOFile": false,
"ioFile": "",
"useIOForPayload": false,
"emptyMsgOnFail": false,
"x": 310,
"y": 360,
"wires": [
[
"fd67eda9ab8b2be9",
"8c7dda1cc9f6d4c0"
],
[]
]
},
{
"id": "8c7dda1cc9f6d4c0",
"type": "modbus-response",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"registerShowMax": "8",
"x": 570,
"y": 320,
"wires": []
},
{
"id": "7491e3c60e6b364d",
"type": "debug",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "msg",
"x": 830,
"y": 400,
"wires": []
},
{
"id": "dbd60f4e3bd55654",
"type": "modbus-read",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "box3",
"topic": "",
"showStatusActivities": false,
"logIOActivities": false,
"showErrors": false,
"unitid": "",
"dataType": "HoldingRegister",
"adr": "30",
"quantity": "1",
"rate": "1",
"rateUnit": "ms",
"delayOnStart": false,
"startDelayTime": "",
"server": "24dfc24540f0ed42",
"useIOFile": false,
"ioFile": "",
"useIOForPayload": false,
"emptyMsgOnFail": false,
"x": 310,
"y": 500,
"wires": [
[
"42a24b13e122c632",
"ca1128e76d3a8e81"
],
[]
]
},
{
"id": "42a24b13e122c632",
"type": "modbus-response",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"registerShowMax": "8",
"x": 570,
"y": 460,
"wires": []
},
{
"id": "7d6f01fa9bdde592",
"type": "debug",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "msg",
"x": 830,
"y": 540,
"wires": []
},
{
"id": "2c747e708e25d4e8",
"type": "modbus-read",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "box4",
"topic": "",
"showStatusActivities": false,
"logIOActivities": false,
"showErrors": false,
"unitid": "",
"dataType": "HoldingRegister",
"adr": "40",
"quantity": "1",
"rate": "1",
"rateUnit": "ms",
"delayOnStart": false,
"startDelayTime": "",
"server": "24dfc24540f0ed42",
"useIOFile": false,
"ioFile": "",
"useIOForPayload": false,
"emptyMsgOnFail": false,
"x": 310,
"y": 640,
"wires": [
[
"6e513a392017010e",
"1020561e9839d4a2"
],
[]
]
},
{
"id": "6e513a392017010e",
"type": "modbus-response",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"registerShowMax": "8",
"x": 570,
"y": 600,
"wires": []
},
{
"id": "11812068a5007052",
"type": "debug",
"z": "7e83472a76578da5",
"g": "657e30603ed3d743",
"name": "",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "msg",
"x": 830,
"y": 680,
"wires": []
},
{
"id": "8dfe69484071f9d9",
"type": "modbus-write",
"z": "7e83472a76578da5",
"g": "6c0c8e61bc9db8c5",
"name": "Pick Block1",
"showStatusActivities": false,
"showErrors": false,
"unitid": "2",
"dataType": "Coil",
"adr": "8217",
"quantity": "1",
"server": "24dfc24540f0ed42",
"emptyMsgOnFail": false,
"keepMsgProperties": false,
"x": 1310,
"y": 220,
"wires": [
[
"cbf3b24bd15646f2",
"11a7dd0d46d53a29"
],
[]
]
},
{
"id": "cbf3b24bd15646f2",
"type": "debug",
"z": "7e83472a76578da5",
"g": "6c0c8e61bc9db8c5",
"name": "",
"active": true,
"tosidebar": false,
"console": false,
"tostatus": true,
"complete": "payload",
"targetType": "msg",
"statusVal": "payload",
"statusType": "auto",
"x": 1510,
"y": 200,
"wires": []
},
{
"id": "f718cab47c4b1dea",
"type": "inject",
"z": "7e83472a76578da5",
"g": "6c0c8e61bc9db8c5",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "true",
"payloadType": "bool",
"x": 1110,
"y": 540,