หน้าแรกคู่มือIoTMQTT Protocol กับ HMI: สร้างระบบ IoT สื่อสารไร้สาย
IOTเริ่มต้น · Beginner22 นาที

MQTT Protocol กับ HMI: สร้างระบบ IoT สื่อสารไร้สาย

พื้นฐาน MQTT (Broker, Publisher, Subscriber, Topic) และตัวอย่างจริงบน Samkoon HMI: หน้าจอตัวหนึ่ง Publish อุณหภูมิและความชื้นจากเซนเซอร์ RS485 ไปที่ HiveMQ อีกตัว Subscribe แล้วสั่งไฟ Y0 ของ PLC ผ่าน Wi-Fi

MQTT ให้หน้าจอ HMI หลายตัวคุยกันผ่าน Broker โดยไม่ต้องเดินสายถึงกัน ตัวส่ง (Publisher) ส่งข้อมูลเข้า Topic ส่วนตัวรับ (Subscriber) ที่ Subscribe Topic เดียวกันจะได้ข้อมูลนั้น ในคลิปใช้ SK-070QS-G + WiFi Module สองตัวกับ Public Broker ของ HiveMQ

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

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

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

฿10,680

ตัวอย่างที่จะทำในคลิป

ระบบ Demo มีหน้าจอ HMI สองตัวที่ไม่มีสายเชื่อมถึงกันเลย คุยกันผ่าน Wi-Fi ด้วย MQTT

  • HMI ตัวที่ 1 (Publisher): อ่านอุณหภูมิและความชื้นจากเซนเซอร์ผ่าน RS485 แล้วส่งค่าออกไป
  • HMI ตัวที่ 2 (Subscriber): รับค่าอุณหภูมิมาแสดง และต่อกับ PLC ที่คุมหลอดไฟ

เมื่ออุณหภูมิเกิน 30 องศา หลอดไฟที่ PLC จะติด เมื่ออุณหภูมิลดต่ำกว่า 30 องศา ไฟจะดับ ความรู้นี้ต่อยอดได้ เช่น ให้หน้าจอหลายตัวคุยกันเรื่องข้อมูล PLC หรือเซนเซอร์ หรือส่งข้อมูลไปเก็บที่ Server และแสดงบน Dashboard

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

  • HMI: SK-070QS-G + WiFi Module (มีพอร์ต Ethernet, COM และพอร์ต RS485 ที่ใช้ต่อเซนเซอร์)
  • PLC: FAs-32MT-AC-E
  • เซนเซอร์: เซนเซอร์อุณหภูมิและความชื้นแบบ Modbus RS485

พื้นฐาน MQTT Protocol

MQTT ย่อมาจาก Message Queuing Telemetry Transport มีผู้เล่นสองแบบ

  1. MQTT Broker: ตัวกลางที่รับสาร แล้วส่งต่อให้ผู้ที่สนใจสารนั้น
  2. MQTT Client: ผู้ใช้งาน แบ่งเป็น
    • Publisher ผู้ประกาศสาร เช่น เซนเซอร์อุณหภูมิ
    • Subscriber ผู้รับสาร เช่น มือถือ หรือ Server / Backend System

ข้อมูลถูกส่งเป็น Topic (หัวข้อ) เช่น เซนเซอร์อ่านได้ 24 องศาเซลเซียส ก็ Publish ค่า 24 ไปที่ Topic ชื่อ Temperature ใครที่ต้องการข้อมูลอุณหภูมิต้อง Subscribe ไปที่ Topic Temperature

ทำไมต้อง MQTT

  • นิยมมากในอุปกรณ์ IoT เช่น หลอดไฟ เซนเซอร์ สวิตช์ Smart Home
  • สร้างบนพื้นฐานของ TCP
  • ใช้ทรัพยากรต่ำ ใช้งานง่าย
  • ออกแบบมาให้สื่อสารผ่านช่องทางที่ไม่เสถียร หรืออินเทอร์เน็ตที่ติดๆ ดับๆ ได้

ขั้นตอนใหญ่ 5 ขั้น

  1. ติดตั้งหรือเลือก MQTT Broker
  2. Config HMI ให้เป็น MQTT Client (ใช้ Broker ตัวไหน)
  3. สร้าง Topic และกำหนดข้อมูลที่จะรับส่ง
  4. กำหนดว่าตัวไหนเป็น Publisher ตัวไหนเป็น Subscriber (หน้าจอตัวเดียวเป็นทั้งสองอย่างก็ได้ แต่ในคลิปแยกให้ดูง่าย)
  5. ทดสอบส่งข้อมูล จะส่งตามช่วงเวลาหรือส่งเมื่อกดปุ่มก็ได้

1. เลือก MQTT Broker

มีสองทางเลือก

  • ติดตั้ง MQTT Server เอง บนคอมพิวเตอร์หรือบอร์ด Raspberry Pi ให้ทำหน้าที่ Broker ในเครือข่ายของเราเอง
  • ใช้ Public MQTT Broker ที่เป็น Cloud Service ทั้งแบบฟรีและแบบเสียเงิน ตัวที่นิยม เช่น HiveMQ, EMQX, Mosquitto

ในคลิปใช้ Public MQTT Broker ของ HiveMQ (เข้าที่ hivemq.com หาหัวข้อ Public MQTT Broker แล้วกด Connect เพื่อดู Host และ Port)

  • Host: broker.hivemq.com
  • Port: 1883 (Port มาตรฐานของ MQTT)

ตัวฟรีเหมาะกับงานทดลอง ถ้าเป็นงานจริงที่ต้องการ Reliability สูงหรือมีอุปกรณ์จำนวนมาก แนะนำให้เช่าเซิร์ฟเวอร์ และเพราะ Public Broker มีคนทั่วโลกใช้ร่วมกัน ให้ตั้งชื่อ Topic ให้แปลกพอที่จะไม่ชนกับคนอื่น

2. ฝั่ง Publisher: หน้าจอที่ต่อเซนเซอร์

การอ่านค่าเซนเซอร์ (ไม่เกี่ยวกับ MQTT)

  • ใน SKTool กำหนด COM3 (พอร์ต RS485 ที่ต่อสายสองเส้นเข้ากับเซนเซอร์) เป็น Modbus RTU Master
  • ตั้ง Baud Rate / Data Bit ให้ตรงกับ Config ของเซนเซอร์ที่ใช้ และใช้ Address Mode แบบ Extended (เผื่อมี Slave หลายตัว ในคลิปมีตัวเดียว)
  • สร้าง Numeric Display สองตัว ตามคู่มือเซนเซอร์ตัวนี้
    • อุณหภูมิ: COM3 → 3x, Slave ID 1, ตำแหน่ง 1
    • ความชื้น: 3x, Slave ID 1, ตำแหน่ง 2

ค่าช่วยดูสถานะบนหน้าจอ

  • SIGNAL — Numeric Display ที่ LW61250 แสดงความแรงสัญญาณ Wi-Fi (ในคลิปได้ 76 ถือว่าสัญญาณค่อนข้างดี)
  • MQTT STATE — Numeric Display ที่ LW0 (กำหนดในขั้นถัดไป)
  • ปุ่ม Function Button สำหรับเข้าหน้าเชื่อมต่อ Wi-Fi

ตั้งค่า MQTT (Server)

เปิด MQTT ใต้ System Setting ใน SKTool ติ๊ก Use แล้วตั้งค่าแท็บ General

IP/Domain name:  mqtt://broker.hivemq.com
Port:            1883
Client ID:       %0        (%0 = HMI serial number)
Test connection duration: 10 Second(s)   (ค่า Default)
  • Client ID ต้องไม่ซ้ำกับคนอื่นที่ต่อ Broker เดียวกัน ใช้ %0 จะดึง Serial Number ของหน้าจอซึ่งไม่ซ้ำกันทุกตัว
  • ถ้า Broker ต้องใส่ Username / Password ให้ติ๊ก Test and verify แล้วกรอก (Public Broker ไม่ต้องใช้)
  • แท็บ Address → State = LW0 เก็บสถานะการเชื่อมต่อ MQTT ในคลิปค่าเป็น 2 คือเชื่อมต่อปกติ

สร้าง Publish Topic

ไปที่ Topical → แท็บ Publish → New

Name / Topical:  factonation/hmi/data   (เปลี่ยนเป็นชื่อของท่านเอง ไม่ให้ชนกับคนอื่น)
Format:          Json (Commonly)
Send mode:       Automatic
Period:          10 second
QoS:             0 (at most once)

แท็บ Address กด New เพิ่มข้อมูลที่จะส่ง ชื่อ (Key) สำคัญมาก เพราะฝั่งรับต้องใช้ชื่อเดียวกัน

  • temp — ชนิด 16-bit Unsigned Integer, Address COM3 → 3x Slave ID 1 ตำแหน่ง 1
  • humi — ชนิด 16-bit Unsigned Integer, Address 3x Slave ID 1 ตำแหน่ง 2

ถ้าไม่ได้ใช้เซนเซอร์ เลือก Address ของ PLC ที่ต้องการและเลือกชนิดข้อมูลให้ถูกต้องก็พอ เมื่อดาวน์โหลดลงหน้าจอ หน้าจอจะ Publish Topic นี้ทุกๆ 10 วินาที และ Broker จะส่งต่อให้ผู้ที่ Subscribe ไว้

3. ฝั่ง Subscriber: หน้าจอที่ต่อ PLC

  • Numeric Display อุณหภูมิอ่านจาก LW1 (Fractional Digits 1) ความชื้นจาก LW2 ไม่เกี่ยวกับ Modbus หรือเซนเซอร์ เพราะค่ามาจาก MQTT
  • ตั้งค่า MQTT Server เหมือนฝั่ง Publisher (Broker และ Port เดียวกัน Client ID %0 ซึ่งจะเป็น Serial Number ของหน้าจอตัวนี้) และ State = LW0
  • แท็บ Publish ไม่ต้องสร้างอะไร ไปที่แท็บ Subscribe → New
Name / Topical:  factonation/hmi/data   (ชื่อเดียวกับฝั่ง Publish)
Format:          Json (Advance)          (เปลี่ยนจาก Json (Commonly))
Operation:       Automatic (Immediate processing)
QoS:             0 (at most once)

แท็บ Address คลิก Payload → Add Value ระบุ Name ให้ตรงกับ Key ที่ฝั่ง Publish ส่งมา

  • temp — 16-bit Unsigned, Data = Address → Internal storage area LW1
  • humi — 16-bit Unsigned, Data = Address → LW2

เมื่อหน้าจอต่อ Broker ได้ ทุกครั้งที่มีการ Publish ข้อมูลจะถูกส่งมาลง LW1 / LW2 เอง

4. Script คุมหลอดไฟ

เปิด Script Editor สร้าง Script ใหม่ แล้วเขียน

if (LocalWord[1] > 300)
{
    Y0 = 1;
}
else
{
    Y0 = 0;
}
  • เซนเซอร์ส่งค่ามาเป็นจำนวนเต็มไม่มีจุดทศนิยม (จุดทศนิยมใส่เองที่ตัวแสดงผล) ดังนั้น 300 คือ 30.0 องศา
  • ใช้ Y0 ใน Script ตรงๆ ไม่ได้ ต้องดับเบิลคลิก Variable Setting ด้านล่าง → New ตั้ง Name Y0, Data type bool, Address Y0, R/W
  • เช็ก semicolon และวงเล็บปีกกา แล้ว Compile จนขึ้น Compile Success
  • นำไปใช้แบบ Global Script (รันตลอด) กด New เลือก Script นี้ ตั้ง Frequency 50 ms

5. ทดสอบระบบ

  1. ดาวน์โหลดโปรแกรมลงหน้าจอทั้งสองตัว
  2. เชื่อมต่อ Wi-Fi ขององค์กรด้วยปุ่มที่สร้างไว้
  3. เช็กว่า SIGNAL ใช้ได้ และ MQTT STATE เป็น 2
  4. ข้อมูลจะถูกส่งมาทุกๆ 10 วินาที ลองเป่าลมใส่เซนเซอร์ให้อุณหภูมิเกิน 30 องศา ไฟที่ PLC ต้องติด และดับเมื่ออุณหภูมิลดลง

ข้อควรระวัง

  • Topic ฝั่ง Publish และ Subscribe ต้องชื่อตรงกัน และตั้งให้ไม่ซ้ำกับคนอื่นบน Public Broker
  • Name (Key) ของแต่ละค่าในฝั่ง Subscribe ต้องตรงกับฝั่ง Publish และชนิดข้อมูลต้องตรงกัน
  • ถ้าข้อมูลไม่มา ให้ดู MQTT STATE (LW0) และความแรงสัญญาณ (LW61250) ก่อน

บทถัดไป

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

19 นาทีเริ่มต้น · Beginner