รับส่งข้อมูล 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
ผลลัพธ์ที่จะได้
คลิปนี้ทำระบบรับส่งข้อมูลสองทางระหว่างอุปกรณ์จริงกับ 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
- กดปุ่มบนหน้าจอจริง ต่อ Wi-Fi ให้เรียบร้อย
- ไปที่แท็บ State(Linked) แล้วเลือกว่าจะใช้ Ethernet หรือ WIFI ในคลิปเลือก WIFI
- กด Test ถ้าขึ้น Test was successful แปลว่าหน้าจอออก Internet ได้แล้ว
- 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 Type | Register Address | ข้อมูล | ใน SKTool |
|---|---|---|---|
| Input Register | 0x0001 | Temperature | 3x1 |
| Input Register | 0x0002 | Humidity | 3x2 |
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 ตัว
| Name | Data type | Address |
|---|---|---|
temp | 16-Bit Unsigned Int | COM3 · Modbus RTU Master · 3x · Station 1 · Address 1 |
humi | 16-Bit Unsigned Int | COM3 · 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 บนหน้าจอ
| Control | Address | หมายเหตุ |
|---|---|---|
| Numeric Display อุณหภูมิ | LW10 | 16-Bit Unsigned Int, Fractional Digits 1 (ทศนิยม 1 ตำแหน่ง) |
| Numeric Display ความชื้น | LW11 | ทศนิยม 1 ตำแหน่งเหมือนกัน |
| Bit Lamp ปุ่ม Dashboard | LB0 | รับค่าจาก Toggle Switch บน Dashboard |
| Numeric Display Slider Dashboard | LW100 | ค่า 16 bit จาก Slider |
| SIGNAL | LW61250 | ความแรงสัญญาณ Wi-Fi |
| MQTT STATE | LW0 | สถานะการเชื่อมต่อ Broker |
| MQTT ERROR | LW1 | รหัส 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 คู่
| Key | Type | Address |
|---|---|---|
motor | bool | Y0 |
temp | Value (16 bit) | LW10 |
humi | Value (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) ได้รับข้อมูลแล้วอัปเดตหน้าจอทันที
| Key | Type | Address |
|---|---|---|
button | bool | LB0 |
value | 16-Bit Unsigned Int | LW100 |
{
"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 (ส่งข้อมูลไปหน้าจอ)
รับข้อมูลจากหน้าจอ
- วาง Node mqtt in ตั้ง Server เป็น HiveMQ (URL
broker.hivemq.comPort 1883) Action Subscribe to single topic Topicfactonation-nr/sensorและ Output a parsed JSON object จะได้ JSON Object ตามที่หน้าจอส่งมา - ต่อ 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;
- ส่งต่อให้ Node ของ Dashboard
- สถานะ Motor: text และ led (กำหนดสีตาม msg.payload:
OFF= red,ON= green) - Temperature: gauge (Units Celsius, Range 0–50)
- ความชื้น: chart
- สถานะ Motor: text และ led (กำหนดสีตาม msg.payload:
- กด Deploy แล้วเปิด
http://127.0.0.1:1880/uiจะเห็นหน้า Dashboard ฝั่งรับข้อมูล - เช็คว่า Node mqtt ขึ้น connected แล้วลองเปลี่ยนค่าบิทและค่า 16 bit ที่หน้าจอ ดูว่า Dashboard แสดงตาม
ส่งข้อมูลไปหน้าจอ
- วาง switch (Toggle Switch) ตั้ง Topic เป็น
buttonและ slider ตั้ง Topic เป็นslider - ต่อเข้า 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 ของหน้าจอ ถ้าไม่ตรงหน้าจอจะดึงข้อมูลไม่ได้
- ต่อเข้า mqtt out (Out คือการ Publish) Server HiveMQ Topic
factonation-nr/dashboard - เมื่อ 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
มีคำถาม? ติดต่อทีมงาน

