หน้าแรกคู่มือHMIการเชื่อมต่อสอนใช้ HMI อ่านเขียนข้อมูลกับ Arduino ผ่าน Modbus RTU

บทที่ 10 จาก 22 ใน การเชื่อมต่อ

HMIปานกลาง · Intermediate14 นาที

สอนใช้ HMI อ่านเขียนข้อมูลกับ Arduino ผ่าน Modbus RTU

ให้หน้าจอ Samkoon SK-070QS-G เป็น Modbus RTU Master อ่านค่า Analog/Digital จาก Arduino UNO และเขียนค่า 16 bit / 1 bit กลับไป ผ่านบอร์ด RS485-TTL พร้อมโค้ด Arduino จากคลิปและการตั้งค่าใน SKTool

หน้าจอ Samkoon เป็น Modbus RTU Master ส่วน Arduino เป็น Slave ID 1 ที่เปิด Array data[16] เป็น Holding Register ผ่านไลบรารี Modbus-Master-Slave-for-Arduino ต่อกันด้วยบอร์ด RS485-TTL ที่ 9600, 8, None, 1 แล้วใน SKTool อ่าน/เขียน 4x0–4x3 (data[0]–data[3]) ด้วย Meter, Bit Lamp, Numeric Input และ Bit Switch

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

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

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

฿6,990

ภาพรวม

คลิปนี้ใช้หน้าจอ HMI อ่านและเขียนข้อมูลกับ Arduino UNO ผ่าน Modbus RTU บนโต๊ะมีปุ่มกด 1 ปุ่ม (สัญญาณ Digital) และตัวต้านทานปรับค่าได้ (สัญญาณ Analog) ต่อเข้า Arduino ผลที่ได้คือ

  • อ่านค่า Analog — หมุนตัวต้านทานแล้วเข็มของ Meter บนหน้าจอขยับตาม
  • อ่านค่า Digital — ไฟบนหน้าจอเป็นสีแดงเมื่อไม่กดปุ่ม และดับเมื่อกดปุ่ม
  • เขียนค่า 16 bit — ใส่ 555 บนหน้าจอ สักพัก Serial Monitor ของ Arduino IDE ก็แสดง 555
  • เขียนค่า 1 bit — กดปุ่ม Bit Switch บนหน้าจอให้เป็น On แล้วค่าใน Arduino ก็เปลี่ยนเป็น 1

หน้าจอทำหน้าที่ Modbus Master (ผู้ขอและเขียนข้อมูล) ส่วน Arduino เป็น Modbus Slave ถ้ามี Arduino หลายตัวก็ตั้ง Slave ID ให้ต่างกันเพื่อทำระบบ 1 หน้าจอหลาย Arduino ได้

อุปกรณ์ในคลิป

  • หน้าจอ Samkoon SK-070QS-G + WiFi Module (รองรับ SCADA, MQTT, HTTP) แต่หน้าจอรุ่นอื่นก็ใช้วิธีเดียวกันได้
  • Arduino UNO
  • บอร์ด RS485-TTL แปลง RS485 เป็นสัญญาณ TX/RX ของ Arduino
  • ปุ่มกด และตัวต้านทานปรับค่าได้บน Breadboard

การต่อสาย

Arduino กับบอร์ด RS485-TTL

บอร์ดรับไฟ 5V จาก Arduino และขา TX/RX ของบอร์ดต่อเข้าขา TX/RX ของ Arduino ตามไดอะแกรมในคลิป

Arduinoบอร์ด RS485-TTL
5VVCC
GNDGND
TXTXD
RXRXD

ไดอะแกรมในสไลด์ใช้ขา 0 (RX) และ 1 (TX) ของ Arduino แต่บนโต๊ะจริงต่อเข้า ขา 10 (RX) และขา 11 (TX) เพราะใช้ Software Serial ซึ่งกำหนดขาอื่นนอกจาก 0 กับ 1 ให้สื่อสารแบบ Serial ได้ ขา 0/1 (Serial ปกติ) จึงว่างไว้ Monitor ค่าผ่านพอร์ต USB ได้โดยไม่ชนกัน ถ้าใช้งานจริงและไม่ต้อง Debug จะย้ายไปใช้ขา 0 กับ 1 ก็ได้

หน้าจอกับบอร์ด RS485-TTL

ด้านหลัง SK-070QS-G มีพอร์ต COM1: 232, COM2: 485/422 (หัว DB9) และ COM3: +485− (ขั้วต่อสาย)

  • ใช้ COM3 — หน้าจอเขียนกำกับไว้แล้วว่าขาไหนเป็น A ขาไหนเป็น B ต่อเข้า A+ / B− ของบอร์ดได้เลย (บนโต๊ะในคลิปใช้แบบนี้)
  • ใช้ COM2 (DB9) — ใช้ขั้วต่อ DB9 แบบ Terminal Block ต่อ Pin 8 = B และ Pin 9 = A อ้างอิงจาก Wiring ของหน้าจอ

โค้ดฝั่ง Arduino

ใช้ไลบรารี Modbus-Master-Slave-for-Arduino (ModbusRtu.h) ดาวน์โหลดเป็น Zip แล้วเพิ่มเข้าโปรเจกต์ด้วย Include Library → Add .ZIP Library ใน Arduino IDE จะใช้ไลบรารี Modbus Slave ตัวอื่นก็ได้ แต่โค้ดด้านล่างคือโค้ดในคลิป

#include <ModbusRtu.h> // https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

uint16_t data[16] = {};

Modbus slave(1, mySerial, 0); // Slave Id 1

void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  mySerial.begin(9600);

  slave.start();

  pinMode(2, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  data[0] = analogRead(A0);

  data[2] = digitalRead(2);

  Serial.print("Analog A0 read value: ");
  Serial.println(data[0]);

  Serial.print("Holding register read value: ");
  Serial.println(data[1]);

  Serial.print("Digital Pin2 read value: ");
  Serial.println(data[2]);

  Serial.print("Digital data read value: ");
  Serial.println(data[3]);

  slave.poll(data, 16);

  delay(500);
}
  • SoftwareSerial mySerial(10, 11) — ขา 10 เป็น RX ขา 11 เป็น TX จึงต่อขา 10/11 เข้าบอร์ด RS485-TTL
  • data[16] — Array 16 ตัวที่หน้าจออ่าน/เขียนผ่าน Modbus
  • Modbus slave(1, mySerial, 0) — สร้าง Slave ID 1 ที่สื่อสารผ่าน mySerial
  • Serial.begin(9600) ใช้ Monitor ค่า ส่วน mySerial.begin(9600) ใช้สื่อสาร Modbus
  • slave.start() ให้ Arduino เริ่มทำงานเป็น Slave และ pinMode(2, INPUT_PULLUP) ใช้ขา 2 อ่านปุ่มกด

หน้าที่ของแต่ละช่องใน Array

ช่องทิศทางข้อมูล
data[0]Arduino → หน้าจอanalogRead(A0) จากตัวต้านทานปรับค่าได้
data[1]หน้าจอ → Arduinoค่า 16 bit ที่เขียนจากหน้าจอ
data[2]Arduino → หน้าจอdigitalRead(2) สถานะปุ่มกด
data[3]หน้าจอ → Arduinoค่า bit ที่เขียนจากหน้าจอ

slave.poll(data, 16) ตรวจว่าหน้าจอส่งคำขอมาหรือไม่ แล้วตอบด้วยข้อมูลใน data ทั้ง 16 ตัว ค่า delay ในคลิปพูดถึง 100 ms หรือ 500 ms (โค้ดใช้ 500) อย่าตั้งนานเกินไป ไม่อย่างนั้นหน้าจอจะถือว่า Time out แล้วแจ้ง Error

Compile แล้ว Upload ลง Arduino

ตั้งค่าฝั่งหน้าจอใน SKTool

ดาวน์โหลด SKTool V7.1 ได้จาก samkoon.com.cn (หน้า Download) เปิดโปรแกรมแล้วสร้าง Project ถ้ายังไม่มีพื้นฐานการเขียนหน้าจอ ดู Playlist สอน HMI ของ Factonation ได้ในคำอธิบายของคลิป

ใน Link เลือกพอร์ตที่ต่อสายจริง (ในคลิปคือ COM3) แล้วตั้ง Connection Services เป็น Modbus → Modbus RTU Master

แท็บ Parameter

Baud rate: 9600
Data bits: 8
Check: NONE
Stop Bits: 1
Plc station: 1
Address mode: Extended Mode

ค่าสื่อสารต้องตรงกับที่ตั้งไว้ในโค้ด Arduino ส่วน Extended Mode ทำให้เลือก Slave ID ได้ทุกครั้งที่กำหนด Address ของ Control ในคลิปมี Arduino ตัวเดียวจึงใช้ Slave ID 1

นับจาก 0 ทั้งสองฝั่ง — Index ของ Array ใน Arduino (data[0]) และ Address 4x ใน SKTool นับจาก 0 เหมือนกัน 4x 0 จึงตรงกับ data[0] และ 4x_Bit 2.00 คือ Bit 0 ของ data[2] ไม่ต้องบวกหรือลบ 1

2. Meter — อ่านค่า Analog

สร้าง Meter แล้วกดปุ่มรูปเครื่องคิดเลขที่ Monitor Address

COM3 / Modbus RTU Master / 4x
Station: 1   Address: 0

4x คือ Holding Register 16 bit ซึ่ง slave.poll() ฝั่ง Arduino เปิดให้อ่าน Address 0 คือ data[0] ค่าจากตัวต้านทาน จากนั้นตั้ง Min/Max ของ Meter แล้วกด OK

3. Bit Lamp — อ่านค่า Digital

สร้าง Bit Lamp ตั้ง Monitor Address เป็น 4x_Bit เพราะค่าใน 4x เป็น 16 bit แต่ต้องการอ่านแค่ bit เดียว (0 หรือ 1)

COM3 / Modbus RTU Master / 4x_Bit
Station: 1   Address: 2.00   (Register 2, Bit 0 = data[2])

4. Numeric Input — เขียนค่า 16 bit

สร้าง Numeric Input (ไอคอน 123) ตั้ง Address

COM3 / Modbus RTU Master / 4x
Station: 1   Address: 1   (data[1])

5. Bit Switch — เขียนค่า 1 bit

สร้าง Bit Switch ตั้ง Write Address

COM3 / Modbus RTU Master / 4x_Bit
Station: 1   Address: 3.00   (Register 3, Bit 0 = data[3])

6. ดาวน์โหลดลงหน้าจอ

เสียบสาย USB-C จากคอมพิวเตอร์เข้าหน้าจอ กด Download แล้วต่ออุปกรณ์ทั้งหมดตาม Wiring Diagram ด้านบน

ทดสอบ

  • หมุนตัวต้านทาน เข็ม Meter ขยับตามค่า Analog
  • กดปุ่มบน Breadboard ไฟ Bit Lamp เปลี่ยนสถานะ
  • ใส่ตัวเลขใน Numeric Input แล้วดูค่า Holding register read value ใน Serial Monitor
  • กด Bit Switch แล้วดูค่า Digital data read value ใน Serial Monitor

สรุป

เมื่อหน้าจอ HMI คุยกับ Arduino ได้ ก็ใช้หน้าจออุตสาหกรรมแสดงกราฟิกให้โปรเจกต์ Arduino แทนจอ LCD ธรรมดา หรือส่งข้อมูลต่อไป SCADA หรือ HTTP ได้ ซึ่ง Factonation มีคลิปสอนไว้ใน YouTube แล้ว

บทถัดไป

การอ่านค่าเซนเซอร์ผ่าน HMI ด้วย Modbus RTU/RS485

9 นาทีปานกลาง · Intermediate