หน้าแรกคู่มือIoTรับส่งข้อมูล PLC HMI Dashboard ด้วย Node-RED MQTT IoT
IOTเริ่มต้น · Beginner19 นาที

รับส่งข้อมูล PLC HMI Dashboard ด้วย Node-RED MQTT IoT

สอนส่งข้อมูลจาก PLC และ HMI Samkoon ขึ้น Dashboard บน Node-RED ผ่าน MQTT (HiveMQ Public Broker) พร้อมอ่าน Sensor อุณหภูมิ ความชื้นแบบ Modbus RTU และสั่งงานกลับจาก Dashboard มาที่หน้าจอ

หน้าจอ Samkoon SK-070QS-G อ่านค่าจาก PLC และ Sensor อุณหภูมิ ความชื้นแบบ Modbus RTU แล้ว Publish เป็น JSON ไปที่ HiveMQ ทุก 3 วินาที ส่วน Node-RED Subscribe มาแสดงบน Dashboard และส่งค่า Toggle Switch กับ Slider กลับมาที่หน้าจอผ่านอีก Topic หนึ่ง

อัพเดทล่าสุด: 26 ตุลาคม 2569

ชุดอุปกรณ์สำหรับบทความนี้

ราคาชุดอุปกรณ์

฿10,680

ผลลัพธ์ที่จะได้

คลิปนี้ทำระบบรับส่งข้อมูลสองทางระหว่างอุปกรณ์จริงกับ Dashboard บนคอมพิวเตอร์

  • กดปุ่มปั๊มน้ำบนหน้าจอ HMI แล้วหลอดไฟที่ PLC ติด/ดับ และสถานะ Motor บน Dashboard ของ Node-RED เปลี่ยนเป็น ON/OFF ตาม
  • อุณหภูมิและความชื้นจาก Sensor ขึ้นบน Gauge และ Chart ของ Dashboard
  • กด Toggle Switch บน Dashboard แล้วไฟ Bit Lamp บนหน้าจอติด เลื่อน Slider แล้วค่าบนหน้าจอเปลี่ยนตาม

ภาพรวมของระบบ

  • PLC FAs-32MT-AC-E ต่อหลอดไฟที่ Digital Output Y0
  • HMI SK-070QS-G + WiFi Module คุยกับ PLC ผ่านสาย Com ทั่วไปที่ COM2
  • Sensor อุณหภูมิและความชื้นแบบ Modbus RTU ต่อเข้าพอร์ต RS485 แบบ Terminal ของหน้าจอ (ขา A กับ B) ซึ่งเป็น COM3
  • หน้าจอต่อ Internet ผ่าน Wi-Fi (ใช้สาย LAN ก็ได้) แล้วส่งและรับข้อมูลด้วย MQTT ผ่าน Public Broker ของ HiveMQ
  • คอมพิวเตอร์รัน Node-RED พร้อม Dashboard

ฝั่ง HMI (SKTool)

1. ปุ่มเข้าหน้าตั้งค่า Wi-Fi

สร้าง Function Button บนหน้าจอสำหรับเปิดหน้า Network Settings ของ HMI ใช้ต่อ Wi-Fi กำหนด IP และ Test Connection

  1. กดปุ่มบนหน้าจอจริง ต่อ Wi-Fi ให้เรียบร้อย
  2. ไปที่แท็บ State(Linked) แล้วเลือกว่าจะใช้ Ethernet หรือ WIFI ในคลิปเลือก WIFI
  3. กด Test ถ้าขึ้น Test was successful แปลว่าหน้าจอออก Internet ได้แล้ว
  4. IP ปล่อยเป็น Dynamic หรือกำหนด Static ก็ได้ แล้วกด OK

ข้อควรระวัง — ถ้าใช้ Wi-Fi ให้ถอดสาย USB-C ที่เสียบอยู่ที่หน้าจอออกก่อน

2. ปุ่มปั๊มน้ำ (สั่ง Y0 ของ PLC)

ใช้ Bit Button ตั้ง Write Address เป็น Y0 ของ PLC ผ่าน Link COM2 โดยตรง Function เป็น Invert และ Mode เป็น Press execute กดแต่ละครั้งไฟที่ Y0 จะสลับติด/ดับ

3. ดู Address ของ Sensor จากคู่มือ

Sensor แต่ละรุ่นเก็บค่าไว้คนละตำแหน่ง ต้องเปิดคู่มือดูก่อน รุ่นในคลิประบุว่า

Register TypeRegister Addressข้อมูลใน SKTool
Input Register0x0001Temperature3x1
Input Register0x0002Humidity3x2

Input Register คือพื้นที่ 3x ของ Modbus อ่านด้วย Function Code 4 อยากได้อุณหภูมิจึงอ่านที่ 3x1 และความชื้นที่ 3x2

Address นับจาก 0 — ส่วนนี้ไม่ได้อยู่ในคลิป แต่ช่วยเวลาใช้ Sensor รุ่นอื่น: Address 3x ใน SKTool นับจาก 0 เหมือนเลข Register ฐาน 16 ในคู่มือ จึงใส่ 0x0001 เป็น 3x1 ได้ตรงๆ ถ้าคู่มือเขียนแบบ 3xxxx (นับจาก 1) ให้ลบ 30001 เช่น 30002 = 3x1

4. สร้างตัวแปรและ Script ย้ายค่า Sensor ไปที่ Local Word

ที่แท็บ Variable settings ด้านล่างของ Script Editor ดับเบิลคลิกเพื่อสร้างตัวแปรใหม่ 2 ตัว

NameData typeAddress
temp16-Bit Unsigned IntCOM3 · Modbus RTU Master · 3x · Station 1 · Address 1
humi16-Bit Unsigned IntCOM3 · Modbus RTU Master · 3x · Station 1 · Address 2

เลือก COM3 เพราะเป็นพอร์ตที่หน้าจอคุยกับ Sensor หน้าจอเป็น Master ส่วน Sensor เป็น Slave ID 1 จึงใส่ Station เป็น 1

จากนั้นที่ Script Editor สร้าง Script ใหม่ (ในคลิปชื่อ PrepareData) แล้วเขียน

void Macro_main(IN *p)
{
 MarcoInit
 //ToDo
  LocalWord[10] = temp;
  LocalWord[11] = humi;
}

กด Compile ให้ผ่าน แล้วไปที่ Global Script กด New เลือก Script PrepareData ตั้ง Frequency เป็น 500 ms แล้วกด OK

ที่ไม่ผูก COM3 เข้ากับ Numeric Display ตรงๆ เพราะค่าเหล่านี้ถูกใช้ซ้ำ 2 ที่ คือแสดงผลบนหน้าจอ และส่งออกไปทาง MQTT ย้ายมาไว้ที่ Local Word ก่อนจะใช้งานง่ายกว่า

5. ตั้งค่า COM3 เป็น Modbus RTU Master

ที่ Communication Port Properties ของ COM3

  • Connection Services: Modbus → Modbus RTU Master (หน้าจอเป็น Master)
  • Baud rate, Data bits, Check, Stop Bits ให้ตรงกับอุปกรณ์ของคุณ (ในคลิปเป็น 9600, 8, NONE, 1)
  • Address mode: Extended Mode เผื่ออนาคตมี Slave หลายตัวจะเขียนฝั่งหน้าจอได้ง่ายขึ้น

6. Control บนหน้าจอ

ControlAddressหมายเหตุ
Numeric Display อุณหภูมิLW1016-Bit Unsigned Int, Fractional Digits 1 (ทศนิยม 1 ตำแหน่ง)
Numeric Display ความชื้นLW11ทศนิยม 1 ตำแหน่งเหมือนกัน
Bit Lamp ปุ่ม DashboardLB0รับค่าจาก Toggle Switch บน Dashboard
Numeric Display Slider DashboardLW100ค่า 16 bit จาก Slider
SIGNALLW61250ความแรงสัญญาณ Wi-Fi
MQTT STATELW0สถานะการเชื่อมต่อ Broker
MQTT ERRORLW1รหัส Error

LW61250 ยิ่งค่าสูงสัญญาณ Wi-Fi ยิ่งแรง ถ้าต่ำกว่า 50 อาจเปลี่ยนไปใช้สาย LAN จะดีกว่า

7. ตั้งค่า MQTT

เปิด MQTT setting แล้วติ๊ก Use

แท็บ General

  • IP/Domain name: broker.hivemq.com (Public Broker ฟรีของ HiveMQ จะใช้ Private Broker ก็ได้)
  • Port: 1883 (ค่า Default)
  • Client ID: %0 คือ Serial Number ของหน้าจอ

แท็บ Address

  • State: LW0 (เปลี่ยนได้) Word ถัดไปคือ LW1 จะเป็นตัวบอก Error อัตโนมัติ
  • ค่าใน State: 0 = หยุดเชื่อมต่อ Server, 1 = หลุดจาก Server, 2 = เชื่อมต่อ Server สำเร็จ ถ้าเป็น 0 หรือ 1 แปลว่ายังเชื่อมต่อไม่ติดหรือกำลังเชื่อมต่ออยู่
  • ค่าใน Error: 0 = ทำงานสำเร็จ ค่าติดลบคือรหัส Error ตอนส่งหรือรับข้อมูล (ดูตาราง MQTT State Error Code ในคู่มือ SKTool)

8. Topic ฝั่ง Publish (หน้าจอ → Node-RED)

  • Name / Topic: factonation-nr/sensor ถ้าทำตามให้ตั้งชื่ออื่นที่ไม่ซ้ำใคร เพราะ Public Broker ใช้ร่วมกับคนอื่น ถ้า Topic ชนกันข้อมูลจะไปปนกับของคนอื่น
  • Format: Json (Advance)
  • Send mode: Automatic เลือก Period ทุก 3 second

แท็บ Address กำหนด Payload 3 คู่

KeyTypeAddress
motorboolY0
tempValue (16 bit)LW10
humiValue (16 bit)LW11

หน้าตา JSON ที่ส่งออกไปจะเป็นแบบนี้ (ค่าจาก Sensor ไม่มีจุดทศนิยม 290 คือ 29.0 °C)

{
  "motor": true,
  "temp": 290,
  "humi": 420
}

9. Topic ฝั่ง Subscribe (Node-RED → หน้าจอ)

  • Name / Topic: factonation-nr/dashboard
  • Format: Json (Advance)
  • Operator mode: Automatic (Immediate processing) ได้รับข้อมูลแล้วอัปเดตหน้าจอทันที
KeyTypeAddress
buttonboolLB0
value16-Bit Unsigned IntLW100
{
  "button": false,
  "value": 555
}

เลือก Address ที่ไม่ชนกับตำแหน่งที่ใช้ไปแล้ว ตรวจให้เรียบร้อย กด OK แล้ว Download โปรเจกต์ลงหน้าจอผ่านสาย USB-C

ฝั่ง Node-RED

ดาวน์โหลด Node-RED ได้ที่ nodered.org (คลิปนี้ไม่ได้สอนติดตั้ง Node-RED) แล้วลง Module เพิ่มที่เมนู Manage palette → แท็บ Install

node-red-dashboard
node-red-contrib-ui-led

Flow แบ่งเป็น 2 ส่วน ด้านบนคือ Subscribe (รับข้อมูลจากหน้าจอ) ด้านล่างคือ Publish (ส่งข้อมูลไปหน้าจอ)

รับข้อมูลจากหน้าจอ

  1. วาง Node mqtt in ตั้ง Server เป็น HiveMQ (URL broker.hivemq.com Port 1883) Action Subscribe to single topic Topic factonation-nr/sensor และ Output a parsed JSON object จะได้ JSON Object ตามที่หน้าจอส่งมา
  2. ต่อ Function Node แยกค่าออกมาทีละ Key
// extract motor: true → "ON", false → "OFF" (Ternary Operator)
msg.payload = msg.payload.motor ? "ON" : "OFF";
return msg;
// extract temp: ค่าจาก Sensor ไม่มีทศนิยม จึงหาร 10
msg.payload = msg.payload.temp / 10;
return msg;
// extract humi
msg.payload = msg.payload.humi / 10;
return msg;
  1. ส่งต่อให้ Node ของ Dashboard
    • สถานะ Motor: text และ led (กำหนดสีตาม msg.payload: OFF = red, ON = green)
    • Temperature: gauge (Units Celsius, Range 0–50)
    • ความชื้น: chart
  2. กด Deploy แล้วเปิด http://127.0.0.1:1880/ui จะเห็นหน้า Dashboard ฝั่งรับข้อมูล
  3. เช็คว่า Node mqtt ขึ้น connected แล้วลองเปลี่ยนค่าบิทและค่า 16 bit ที่หน้าจอ ดูว่า Dashboard แสดงตาม

ส่งข้อมูลไปหน้าจอ

  1. วาง switch (Toggle Switch) ตั้ง Topic เป็น button และ slider ตั้ง Topic เป็น slider
  2. ต่อเข้า Function Node create json ที่จำค่าล่าสุดของทั้งสองตัวแล้วสร้าง JSON
var buttonState = context.get('buttonState') || false;
var sliderValue = context.get('sliderValue') || 0;

if (msg.topic === 'button') {
    buttonState = msg.payload;
    context.set('buttonState', buttonState);
}

if (msg.topic === 'slider') {
    sliderValue = msg.payload;
    context.set('sliderValue', sliderValue);
}

var payload = {
    "button": buttonState,
    "value": sliderValue
};

msg.payload = payload;
return msg;

Key ใน JSON (button, value) ต้องตรงกับที่ตั้งไว้ใน Subscribe ของหน้าจอ ถ้าไม่ตรงหน้าจอจะดึงข้อมูลไม่ได้

  1. ต่อเข้า mqtt out (Out คือการ Publish) Server HiveMQ Topic factonation-nr/dashboard
  2. เมื่อ Node ขึ้น connected กด Toggle Switch หรือเลื่อน Slider ค่าจะไปขึ้นที่หน้าจอทันที

จุดที่ต้องเช็คเมื่อไม่ทำงาน

  • MQTT STATE (LW0) บนหน้าจอต้องเป็น 2 ถ้าเป็น 0 หรือ 1 แปลว่ายังเชื่อมต่อ Broker ไม่ได้
  • Topic ฝั่งหน้าจอกับฝั่ง Node-RED ต้องตรงกันทุกตัวอักษร และควรตั้งชื่อให้ไม่ซ้ำคนอื่นเมื่อใช้ Public Broker
  • Key ใน JSON ต้องตรงกันทั้งฝั่งส่งและฝั่งรับ
  • ถ้าใช้ Wi-Fi ให้ถอดสาย USB-C ออกจากหน้าจอ และดูความแรงสัญญาณที่ LW61250

สรุป

หน้าจอ HMI ทำหน้าที่เป็นตัวกลาง รวบรวมข้อมูลจาก PLC (COM2) และ Sensor (COM3) แล้วส่งขึ้น MQTT Broker เป็น JSON ส่วน Node-RED ทำ Dashboard แบบ Low-Code ได้เร็ว แม้จะปรับแต่งได้ไม่เท่าเขียนโค้ดเอง แต่เหมาะกับงาน IoT, Smart Home หรืองานในโรงงานแบบพื้นฐาน

บทถัดไป

สอนใช้ Telegram Notification กับ IoT HMI แทน Line Notify

20 นาทีขั้นสูง · Advanced