PLCปานกลาง · Intermediate22 นาที

คำสั่ง Modbus RTU/RS485

ให้ Samkoon PLC 2 ตัวคุยกันผ่าน Modbus RS485 ตั้ง Master/Slave ใน SamSoar2022 สร้าง Modbus Table (เขียน/อ่าน Coil และ Register) เรียกด้วยคำสั่ง MBUS แล้วเขียน Error Handling จาก Error Code 16 และ 24

ให้ Samkoon PLC 2 ตัวคุยกันผ่าน Modbus RS485 โดยต่อสาย A–A, B–B ที่ Terminal (COM1) ตั้ง COM1 ของตัวหนึ่งเป็น Modbus Master อีกตัวเป็น Modbus Slave (Station Number 1) สร้าง Modbus Table ในตัว Master แล้วเรียกด้วย MBUS K1 commands D700 D701 — Error Code 16 คือ Communication Timeout และ 24 คือ Received Information Frame Error

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

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

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

฿3,690

โจทย์ของตอนนี้

ทำให้ PLC 2 ตัวคุยกันได้ (แลกเปลี่ยนข้อมูลกัน) ผ่าน Modbus RS485 โดยใช้ Samkoon PLC ทั้งสองฝั่ง ตัวหนึ่งเป็น Modbus Master อีกตัวเป็น Modbus Slave 1 ขั้นตอนมี 4 ส่วน

  1. ตั้งค่า Config และ Parameter ให้สองตัวคุยกันรู้เรื่อง ใครเป็น Master ใครเป็น Slave
  2. สร้างคำสั่งในตัว Master ว่าจะอ่านหรือเขียนอะไร (Slave มีหน้าที่ตอบกลับ)
  3. เรียกคำสั่ง MBUS ใน Ladder ของ Master เพื่อส่งคำสั่งเหล่านั้นออกไป
  4. เขียน Error Handling เผื่อเกิด Communication Error ตอนใช้งานจริง

พอร์ต RS485 ของ PLC

PLC ที่ใช้ในคลิปมีพอร์ต RS485 อยู่ 2 พอร์ต ใช้แยกกันได้อิสระ

  • COM0: หัวกลมด้านหน้า ส่วนมากใช้ต่อหน้าจอ HMI
  • COM1: ขั้ว Terminal (485A / 485B) ตอนนี้ใช้พอร์ตนี้ทำ Modbus

ใน SamSoar2022 ดูได้ที่ Config → Project Setting → Communication ซึ่งมีแท็บ COM 0(485) และ COM 1(485)

RS485 Parameter ต้องตรงกันทุกอุปกรณ์

การสื่อสาร RS485 ต้องตั้ง Baudrate, Databits, Stopbits และ Checkcode ให้ตรงกันทุกอุปกรณ์บนสาย ค่าเริ่มต้นที่เห็นในคลิปคือ 9600, 8, 1, NONE ทั้งฝั่ง Master และ Slave ถ้าวันหนึ่งต้องคุยกับอุปกรณ์ที่ไม่ใช่ Samkoon PLC เช่น Sensor หรือ Drive ต้องตั้งค่าเหล่านี้ให้ตรงกับอุปกรณ์นั้น ไม่อย่างนั้นจะสื่อสารกันไม่ได้

ตั้งค่าฝั่ง Master

  1. เปิดโปรเจกต์ของตัว Master ใน SamSoar2022

  2. ไปที่ Config → Project Setting → Communication แล้วเลือกแท็บ COM 1(485)

  3. COM1 ตั้งเป็น Modbus slave มาเป็นค่าเริ่มต้น ให้เปลี่ยน Protocol เป็น Modbus master

  4. เมื่อเลือก Master จะมีช่องเพิ่มขึ้นมา

    • Frame interval (หน่วย ms): ส่งข้อมูลไป 1 ชุดแล้วให้รอนานแค่ไหนก่อนส่งชุดถัดไป
    • Retransmission: ถ้าส่งแล้วผิดพลาด (สัญญาณรบกวน สายยาวจนแรงดันตก สายขาด ฯลฯ) ให้ลองส่งซ้ำกี่ครั้งก่อนถือว่าการสื่อสารล้มเหลว

    ในคลิปปล่อยเป็นค่าเริ่มต้นทั้งคู่ (Frame interval 20 ms, Retransmission 3)

ตั้งค่าฝั่ง Slave

  1. เปิด SamSoar2022 อีกหน้าต่าง สร้างโปรเจกต์ใหม่ชื่อ slave-1 และเลือกรุ่น PLC ให้ตรงกับตัวจริง
  2. ไปที่ Config → Project Setting → Communication แท็บ COM 1(485) จะเป็น Modbus slave อยู่แล้ว
  3. Station number คือ Slave ID ค่าเริ่มต้นเป็น 1 ถ้าต่อหลายอุปกรณ์ให้ตั้งไม่ซ้ำกัน
  4. Download โปรเจกต์นี้เข้าตัว Slave (ในคลิปใช้สาย USB-C) เพื่อส่ง Config ของ Modbus Slave เข้าไป

สร้าง Modbus Table ในตัว Master

  1. ที่ Project Tree ทางซ้าย คลิกขวาที่ Modbus table แล้วกด Add Modbus Table
  2. ตั้งชื่อ Table (ในคลิปใช้ commands)
  3. แต่ละแถวคือ 1 คำสั่ง มีคอลัมน์ดังนี้
    • Port: ส่งคำสั่งไปที่ Slave ID ไหน Slave ของเราคือ ID 1 จึงใส่ K1
    • Handle code: Function Code ที่จะใช้
    • Slave register: ตำแหน่งข้อมูลในตัว Slave ใส่เป็นเลขฐาน 10 (K) หรือฐาน 16 (H) ก็ได้ เผื่อคู่มืออุปกรณ์ให้มาเป็นเลขฐาน 16
    • Slave count: จำนวนข้อมูลที่อ่าน/เขียน (ใส่เป็นค่าคงที่หรือ D register ก็ได้)
    • Master register: ตำแหน่งข้อมูลในตัว Master ที่ใช้อ้างอิงหรือเก็บค่าที่อ่านมา
    • TriggerMode: ให้คำสั่งแถวนี้ทำงานวนซ้ำ (ModbusMode_Loop) หรือทำครั้งเดียว ถ้าเลือกแบบครั้งเดียวต้องระบุ TriggerBit ด้วย ส่วนมากใช้แบบ Loop เพราะ Modbus RS485 โดยธรรมชาติเป็นรอบ Request–Response อยู่แล้ว
    • Comment: คำอธิบายคำสั่ง

Function Code ที่ใช้บ่อย

01 (0x01): Read Coil
02 (0x02): Read Input
03 (0x03): Read Holding Register
04 (0x04): Read Input Register
05 (0x05): Write Single Coil      — เปิด/ปิด Coil ตัวเดียว
06 (0x06): Write Single Register  — เขียนค่า 16 บิตตัวเดียว
15 (0x0F): Write Multiple Coils
16 (0x10): Write Multiple Registers

ตาราง Address ของ Samkoon PLC

ตำแหน่งที่ต้องใส่ใน Slave register ดูจากตาราง Modbus Address ของผู้ผลิต ส่วนที่ใช้ในคลิป:

ข้อมูลช่วงฟังก์ชันอ่านฟังก์ชันเขียนตำแหน่งข้อมูล (นับจาก 0)
Y (Output)0~1270x010x05 / 0x0FY0 = 10000
M (Auxiliary Relay)0~81910x010x05 / 0x0FM0 = 30000
D (Data Register)0~81910x03 / 0x040x06 / 0x10D0 = 40000

Address นับจาก 0 — ตัวเลขในตารางเป็น Protocol Address นับจาก 0 ใส่ใน Slave register ของ SamSoar2022 ได้ตรงๆ (D0 = 40000 ไม่ใช่ 40001) ถ้า Master เป็นโปรแกรมที่นับจาก 1 (Base 1) ให้บวก 1 เช่น D0 = 40001 ส่วนเลข X/Y ของ Samkoon เป็นฐาน 8 (Y10 = 10008) ตารางครบทุกประเภท (X, S, T, C, TV, CV, AI, AO และโมดูลขยาย) อยู่ในรูปตาราง Modbus Address ของหน้าสินค้า PLC เช่น FAs-32MR-AC-E

คำสั่งที่สร้างในคลิป

เริ่มจากคำสั่งเขียนก่อนเพื่อให้เห็นผลทันที แล้วจึงเพิ่มคำสั่งอ่าน

ลำดับ (Index)PortHandle codeSlave registerSlave countMaster registerComment
0K10x05 Write single coilK10000K1M1000Write Y0
1K10x06 Write single registerK40000K1D1000Write D0
2K10x01 Read coilK10000K16M1100Read Y0~
3K10x03 Read holding registerK40000K10D1100Read D0~
4K10x01 Read coilK30000K1M1200Read M0
  • แถว 0: ถ้า M1000 ของ Master เป็น 1 ตัว Y0 ของ Slave ก็ติด ถ้า M1000 เป็น 0 Y0 ก็ดับ
  • แถว 1: ค่าใน D1000 ของ Master ถูกเขียนลง D0 ของ Slave
  • แถว 2: อ่าน Y0 ของ Slave 16 ตัว มาเก็บที่ M1100 เป็นต้นไปของ Master
  • แถว 3: อ่าน D0–D9 ของ Slave (10 ตัว) มาเก็บที่ D1100 เป็นต้นไป
  • แถว 4: อ่าน M0 ของ Slave 1 ตัว มาเก็บที่ M1200

เรียกคำสั่ง MBUS ใน Ladder

พิมพ์ MBUS จะเห็นว่ามี 2 แบบ คือ MBUS (RS485) กับ MBUSTCP ตอนนี้ใช้ MBUS ธรรมดาก่อน ส่วน TCP อยู่ในตอนถัดไป

MBUS K1 commands D700 D701
  1. Com: พอร์ตที่จะส่งคำสั่งออก ใช้ Terminal จึงเป็น COM1 ใส่ K1
  2. TBL: ชื่อ Modbus Table ที่สร้างไว้ (commands)
  3. Code: D register เก็บ Modbus Error Code ไว้ใช้ทำ Error Handling (ในคลิปใช้ D700)
  4. Index: D register เก็บลำดับคำสั่งที่กำลังทำงาน นับจาก 0 (คำสั่งแรกใน Table = 0) ในคลิปใช้ D701
MBUS — Modbus RS485 Communication
M700 ON → เรียก Modbus Table ชื่อ commands ผ่าน COM1
N0
M700 ON → MBUS ใช้ COM1, Error Code ที่ D700, Index ที่ D701
M700MBUSK1, commands, D700, D701
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

ต่อสาย RS485

  1. ใช้สายไฟ 2 เส้น ต่อ A ไป A และ B ไป B ระหว่างขั้ว Terminal ของสองตัว
  2. ถ้ามีหลายอุปกรณ์ต้องต่อแบบ Daisy Chain (Multi-Drop) คือต่อจากตัวที่ 1 ไปตัวที่ 2 จากตัวที่ 2 ไปตัวที่ 3 ไปเรื่อยๆ ห้ามต่อข้ามจากตัวที่ 1 ไปตัวที่ 3
  3. ตอนทดลองที่สายไม่ยาวต่อสายธรรมดาได้ แต่ใช้งานจริงที่สายยาวขึ้น สายสองเส้นควรตีเกลียวกัน หรือใช้ Twisted Pair Shielded Cable ช่วยลดสัญญาณรบกวน
  4. ใส่ตัวต้านทาน 120 โอห์ม (Terminal Resistor) ไว้ที่ตัว Master และ Slave ตัวสุดท้าย
  5. Modbus RS485 ใช้สายยาวได้ประมาณ 1 กิโลเมตรกว่า และมี Slave ได้มากสุด 32 ตัว

ทดสอบด้วย Monitor

  1. Download โปรแกรมลงตัว Master แล้วกด Monitor
  2. สั่ง M700 ON ให้ MBUS ทำงาน ค่า Index (D701) จะวิ่ง 0–4 ครบ 5 คำสั่งไปเรื่อยๆ
  3. ใน Monitor List เซ็ต M1000 = ON ตัว Y0 ของ Slave ติด และ M1100 ที่อ่านกลับมาก็เป็น ON
  4. เซ็ต D1000 เป็นค่าใดก็ได้ (ในคลิปใช้ 123) ค่า D1100 ที่อ่านกลับมาจาก D0 ของ Slave ก็จะเป็นค่าเดียวกัน

Error ที่พบบ่อยและความหมาย

ความหมายของ Error Code ดูได้จากตาราง MBUS Error Code (ค่าใน D700 เป็นเลขฐาน 10 ตารางเขียนเป็นฐาน 16)

Error Code 16 (0x10): Communication timeout

  • Master ส่งคำสั่งไปแล้วแต่ไม่มีอะไรตอบกลับมาจนหมดเวลา
  • ในคลิปทดลองปิดไฟตัว Slave คำสั่ง MBUS ค้างและขึ้น 16 ทันที พอเปิดไฟกลับ คำสั่งก็ทำงานต่อเหมือนเดิม
  • ดึงสาย RS485 หลุดระหว่าง MBUS ทำงานก็ได้ Error 16 เหมือนกัน เสียบกลับก็ทำงานต่อได้

Error Code 24 (0x18): Received information frame error

  • เกิดเมื่อส่งคำสั่งที่อุปกรณ์ไม่รองรับ เช่นซื้อ Sensor มาแล้วอ่านตำแหน่งข้อมูลผิด
  • ในคลิปเพิ่มคำสั่ง Read coil (0x01) ที่ Slave register 20000 ซึ่งไม่มีอยู่ในตารางของฟังก์ชัน 0x01 (เก็บที่ M1250) ผลคือ D700 กะพริบเป็น 24 ขณะที่คำสั่งอื่นใน Table ยังทำงานต่อได้ตามปกติ

เขียน Error Handling

Error 16 เป็นปัญหาที่เจอบ่อยที่สุด ควรดึงออกมาเป็น Flag ไปแสดงบนหน้าจอหรือสั่ง Alarm / Buzzer แจ้งผู้ใช้งานว่าการสื่อสารผิดพลาด ใช้คำสั่ง Compare ตรวจค่า D700

ตรวจสอบ Error Code จาก Modbus
Flag M750-M752 สำหรับแสดงบน HMI หรือสั่ง Alarm
N0
Error 16 (0x10) = Communication timeout
D700 = K16M750
Error 24 (0x18) = Received information frame error (อ่านผิดตำแหน่ง)
D700 = K24M751
D700 ไม่เท่ากับ 0 = เกิด Error ใดก็ตาม
D700 <> K0M752
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

สรุป

Modbus RS485 ระหว่าง Samkoon PLC ต้องตั้ง Master/Slave และ RS485 Parameter ให้ตรงกัน สร้างคำสั่งใน Modbus Table ของ Master (Port, Function Code, Slave register, Slave count, Master register) แล้วเรียกด้วย MBUS พร้อมเก็บ Error Code ไว้เขียน Error Handling ตอนถัดไปจะใช้สาย LAN สื่อสารผ่าน Modbus TCP/IP

ตอนถัดไป

16. คำสั่ง Modbus TCP/IP

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

คำถามที่พบบ่อย

COM0 กับ COM1 ของ Samkoon PLC ต่างกันอย่างไร?
ทั้งสองเป็นพอร์ต RS485 ใช้แยกกันได้อิสระ COM0 คือหัวกลมด้านหน้า มักใช้ต่อหน้าจอ HMI ส่วน COM1 คือขั้ว Terminal ในคลิปใช้ COM1 ทำ Modbus และระบุในคำสั่ง MBUS ด้วย K1
ต้องใส่ตัวต้านทาน 120 โอห์มไหม?
คลิปแนะนำให้ใส่ตัวต้านทาน 120 โอห์มที่ตัว Master และ Slave ตัวสุดท้ายของสาย เมื่อใช้งานจริงที่สายยาวขึ้นควรใช้สายตีเกลียว (Twisted Pair Shielded) และต่อแบบ Daisy Chain ส่วนการทดลองบนโต๊ะที่สายสั้นต่อสายธรรมดาได้
Modbus Table ต้องกรอกอะไรบ้าง?
Port (Slave ID เช่น K1), Handle code (Function Code), Slave register (ตำแหน่งข้อมูลใน Slave นับจาก 0 เช่น K10000 = Y0, K40000 = D0), Slave count (จำนวนข้อมูล), Master register (ตำแหน่งใน Master เช่น M1000 หรือ D1000) และ Trigger Mode ซึ่งมักใช้ Loop
MBUS มีพารามิเตอร์อะไร?
MBUS K1 commands D700 D701 — K1 คือ COM1 ตามด้วยชื่อ Modbus Table, D700 เก็บ Error Code และ D701 เก็บลำดับคำสั่งที่กำลังทำงาน (นับจาก 0 คำสั่งแรกใน Table = 0) ตรวจ Error ด้วย LDW= D700 K16 (Timeout), LDW= D700 K24 (Frame Error) หรือ LDW<> D700 K0 (มี Error ใดๆ)
Modbus RS485 มีข้อจำกัดอะไร?
ตามคลิป สายยาวได้ประมาณ 1 กิโลเมตรกว่า และมี Slave ได้มากสุด 32 ตัวต่อสาย