IoT Project For Community : Robot arm connected with Node-red

IoT Project For Community : Robot arm connected with Node-red

สวัสดีครับทุกคน วันนี้ขอมานำเสนอตัวอย่างวิธีการเชื่อมต่อ ROBOT ARM กับ NODE RED โดยใช้การสื่อสารผ่าน Modbus กันครับ ตัวอย่างโปรเจ็กจะเป็นอย่างไรนั้น ไปดูกันเล้ยย…

ภาพที่ 1 ภาพรวมของระบบ

อธิบายภาพรวม

ตัวอย่างของระบบนี้จะขอเล่าภาพรวมของระบบก่อนครับ โดยระบบเริ่มต้นจากการมีกล่องที่มีการติดแถบแม่เหล็ก RFID ซึ่งเป็นตัวอย่างทั่วไปของการติดที่กล่องสินค้าต่างๆ จากนั้นเมื่อกล่องนี้วิ่งมาถึงจุดที่มีการติดตั้งเครื่องอ่านรหัสใน RFID เครื่องก็จะอ่านสัญญาณ และส่งข้อมูลให้กับ PLC ซึ่งเป็นตัวกลางในการติดต่อสื่อสาร

PLC จะหาช่องการวางในพื้นที่ที่ว่าง และทำการสั่งให้ ROBOT ARM ย้ายกล่องไปที่ที่ว่างอยู่ ในเวลาเดียวกัน PLC จะติดต่อสื่อสารกับโปรแกรม Node-red ที่เขียนขึ้น เพื่อให้ Node-red บันทึกค่าและแสดงผลของรหัส RFID ผ่านทาง Node-red Dashboard ในทางกลับกันหากต้องการให้ ROBOT ARM หยิบของออกจากพื้นที่ เราจะสั่งการผ่าน Node-red dashboard และสั่งให้ ROBOT ARM ยกกล่องกลับมา

อุปกรณ์ที่ใช้

  1. แถบแม่เหล็ก RFID ติดกล่อง Balluff
  2. ตัวอ่าน RFID
  3. PLC PLC : FX5U-32M
  4. ROBOT ARM
  5. Program Node-red

ขั้นตอนการทำ

การโปรแกรม PLC

การตั้งค่าในเครื่องอ่าน RFID
การตั้งค่า RS Port ในโปรแกรม PLC จะต้องตั้ง Baud rate เดียวกับเครื่องอ่าน RFID

ก่อนอื่นในการรับค่า RFID เราจะใช้คำสั่ง Serial RS ซึ่งฟังชั่นนี้จะต้องติดตั้ง Module RS port เพิ่มเติมในโปรแกรม ซึ่งจะต้องตั้งค่า Baud rate เดียวกับเครื่องอ่าน RFID นั่นเอง

ตัวอย่างโค้ด PLC

โค้ดของ 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 ทุกประการ

FC – 5 หมายถึง สั่ง relay ภายใน PLC M(8192-8217) = M25 และ ไป trigger ให้หยิบกล่องออก
จอ Dashboard

สมาชิกผู้จัดทำ

พิธา จิรภัทรศิลป Robot programmer
นวัตสรรค์ พลภัคชวนนท์ Node-red programmer
ณัฐวุฒิ หารสุโพธ์
PLC and Modbus connection

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,