พื้นฐาน Modbus Protocol สำหรับ PLC
พื้นฐาน Modbus สำหรับ PLC: หลักการ Master-Slave แบบ Request-Response, Data Frame ของ RS485 กับ TCP/IP, ข้อมูล 4 ประเภทกับ Function Code และตารางตำแหน่งข้อมูล Modbus ของ Samkoon PLC
Modbus คือโปรโตคอลมาตรฐานเปิดที่อุปกรณ์ต่างยี่ห้อใช้คุยกันแบบ Master-Slave (Request-Response) ผ่านสาย RS485 หรือสาย LAN (TCP/IP) ข้อมูลแบ่งเป็น 4 ประเภทคือ Coil (0x), Input (1x), Input Register (3x) และ Holding Register (4x) จุดที่สับสนบ่อยคือ 4x อ่านด้วย FC03 ส่วน 3x อ่านด้วย FC04
อัพเดทล่าสุด: 26 ตุลาคม 2569
ทำไมต้องรู้เรื่อง Modbus
ถึงตอนนี้เราใช้ PLC ตัวเดียวทำงานของมันได้ดีแล้ว ทั้ง Input, Output และ Function ต่างๆ แต่ในโรงงานจริงยังมีอีกความท้าทายคือ การคุยกับอุปกรณ์อื่น
- ระบบที่ต้องใช้ PLC มากกว่า 1 ตัว เพราะเครื่องจักรใหญ่หรือมีหลายส่วน
- การคุยกับอุปกรณ์ต่างรุ่น ต่างแบรนด์ ต่างผู้ผลิต
ปัญหาเหล่านี้ส่วนใหญ่แก้ได้ด้วย Modbus เพราะ Modbus เป็นภาษากลาง
- เป็นภาษาที่เปิดเผยเป็น Open standard (สเปคอยู่ที่ modbus.org)
- ถูกนำไปอ้างอิงและใช้งานอย่างแพร่หลายโดยผู้ผลิต Controller และอุปกรณ์ต่างๆ
- ใช้แพร่หลายในอุตสาหกรรม Automation และเกือบทุก Device ยุคใหม่รองรับการสื่อสารผ่าน Modbus
หลักการ Master-Slave
ในเครือข่าย Modbus ต้องมีอุปกรณ์ 1 ตัวเป็นหัวหน้า เช่นต่อ PLC 2 ตัวผ่านสายไฟ 2 เส้นตามมาตรฐาน RS-485
- Master (บางทีเรียก Client) เป็นผู้ส่งคำขอหรือ Request
- Slave (บางทีเรียก Server) เป็นผู้ตอบกลับหรือ Response
การทำงานวนแบบ Request → Response → Request → Response ไปเรื่อยๆ
Master ทำได้ 2 อย่างหลักคือ อ่าน กับ เขียน เช่น Read Coil, Read Input Status, Read Holding Registers, Read Input Registers, Write Single Coil และ Write Single Register ถ้าพูดในภาษา PLC ก็คืออ่านค่า X, Y, M, S, D ได้เกือบหมด และเขียนค่า Bit หรือค่า 16 Bit ไปที่ลูกข่ายได้
ไม่จำเป็นต้องเป็น PLC เท่านั้นถึงจะเป็น Master ได้ หน้าจอ HMI หรือคอมพิวเตอร์ที่มีโปรแกรม Config เป็น Modbus Master ก็ได้ แต่ซีรีส์นี้จะใช้ PLC เป็น Master
ข้อมูลที่วิ่งในสาย: Byte
ข้อมูลที่ส่งในสายคือ 0 กับ 1 ชุดละ 8 ตัว
- 1 Byte = 8 Bits เช่น
0000 0000 - เขียนเป็นเลขฐาน 16 ได้ เพราะเลขฐาน 16 หนึ่งหลักใช้ 4 Bit จึงมักเขียนเป็น
0xตามด้วยเลข 2 หลัก เช่น0x00= 0 และ0xFF= 255
Byte เหล่านี้เรียงกันเป็น Modbus Data Frame
Modbus Data Frame
| แบบ | ส่วนประกอบของ Frame |
|---|---|
| Modbus RS485 Frame | Device Address · Function Code · Data · Error Check |
| Modbus TCP/IP Frame | Transaction Identifier · Protocol Identifier · Length · Unit ID · Function Code · Data |
- Device Address: สาย RS485 สองเส้นต่ออุปกรณ์ได้หลายตัว จึงต้องกำหนด Slave ID ให้แต่ละตัว แล้วใส่ ID ลงใน Frame
- Error Check: ข้อมูลในสายคือแรงดันไฟฟ้า อาจโดนสัญญาณรบกวน จึงมีส่วนตรวจความผิดพลาดใน Frame
- TCP/IP ใช้สาย LAN และระบุแต่ละ Node ด้วย IP Address จึงไม่มี Device Address แต่มีส่วนอื่นแทน
ไม่ว่าจะผ่าน RS485 หรือสาย LAN ส่วนที่มี เสมอ ทั้งใน Request และ Response คือ Function Code กับ Data
- Function Code บอกคำสั่งที่ต้องการให้ Slave ทำ (ยาว 1 Byte) เช่น "ช่วยส่งข้อมูล Coil ให้หน่อย 10 ชุด" หรือ "ช่วยเปิด Coil Y0 ให้หน่อย"
- Data บอกตำแหน่ง Address เริ่มต้นกับจำนวน Block (ยาว n Byte ปกติ 4 Byte) เช่น "อ่าน Coil ตั้งแต่ M0 จำนวน 10 ชุด" ก็คือ M0 ถึง M9
ตัวอย่างอ่าน Frame
สั่งให้อ่าน Coil ตำแหน่ง Modbus Address 0 จำนวน 10 ชุด
Request: ... [01] [00] [00] [00] [0A] ...
Response: ... [01] [02] [05] [00] ...
- Request:
01= Function Code 01 (อ่าน Coil),00 00= Address 0,00 0A= จำนวน 10 ชุด (A ในฐาน 16 = 10 ในฐาน 10) - Response:
01= Function Code เดิม,02= อ่านมาได้ 2 Bytes (16 Bit หรือ 1 Word), ข้อมูลคือ05 00หรือ0000 0101 0000 0000
ข้อมูล 4 ประเภทและ Function Code
อุปกรณ์ที่รองรับ Modbus จะมีหน่วยความจำส่วนหนึ่งเผื่อไว้สำหรับ Modbus แบ่งเป็น 4 ชนิด แต่ใช้งานจริงมองเป็น 2 กลุ่มคือ 1 Bit กับ 16 Bit
| ชนิด | Address | ขนาด | Function Code |
|---|---|---|---|
| Coil | 0x | 1 Bit | FC01 (อ่าน), FC05 |
| Input | 1x | 1 Bit | FC02 (อ่าน) |
| Input Register | 3x | 16 Bit | FC04 (อ่าน) |
| Holding Register | 4x | 16 Bit | FC03 (อ่าน), FC06, FC16 |
ระวังสับสน: Address 4x (Holding Register) อ่านด้วย FC03 ส่วน 3x (Input Register) อ่านด้วย FC04 เลข 3 กับ 4 จึงสลับกันระหว่าง Address กับ Function Code
คู่มือผู้ผลิตอุปกรณ์บางเจ้าให้มาแค่ Memory Address ไม่บอก Function Code เราต้องรู้เอง เช่นคู่มือบอกให้อ่านตำแหน่ง 4x0 แปลว่าต้องใช้ FC03 อ่านที่ตำแหน่ง 0
ดังนั้นก่อนใช้คำสั่ง Modbus ต้องรู้ 2 อย่าง
- ใช้ Function Code อะไร
- อ่านจากตำแหน่งไหน โดยอ้างอิงคู่มือผู้ผลิตว่า Coil, Input หรือ Register ที่ต้องการอยู่ที่ตำแหน่งใด
ตำแหน่งข้อมูล Modbus ของ Samkoon PLC
ตารางที่ใช้ในคลิปสำหรับ PLC Samkoon
| ข้อมูล | ช่วง | ชนิดข้อมูล | ฟังก์ชันอ่าน | ฟังก์ชันเขียน | ตำแหน่งข้อมูล |
|---|---|---|---|---|---|
| X | 0~127 | bit | 0x01/0x02 | 0x05 | 0 |
| EX | 0~511 | bit | 0x01/0x02 | 0x05 | 512 |
| Y | 0~127 | bit | 0x01 | 0x05/0x0f | 10000 |
| EY | 0~511 | bit | 0x01 | 0x05/0x0f | 10512 |
| M | 0~8191 | bit | 0x01 | 0x05/0x0f | 30000 |
| S | 0~999 | bit | 0x01 | 0x05/0x0f | 50000 |
| T | 0~255 | bit | 0x01 | 0x05/0x0f | 60768 |
| C | 0~255 | bit | 0x01 | 0x05/0x0f | 60512 |
| D | 0~8191 | word | 0x03/0x04 | 0x06/0x10 | 40000 |
| TV | 0~255 | word | 0x03 | 0x06/0x10 | 60256 |
| CV | 0~199 | word | 0x03 | 0x06/0x10 | 60000 |
| CV32 | 200~255 | dword | 0x03 | 0x06/0x10 | 61024 |
| AI | 0~31 | word | 0x03 | 0x06/0x10 | 20000 |
| EAI | 0~79 | word | 0x03 | 0x06/0x10 | 20100 |
| AO | 0~31 | word | 0x03 | 0x06/0x10 | 20512 |
| EAO | 0~79 | word | 0x03 | 0x06/0x10 | 20612 |
ตอนต่อไปจะลงมือปฏิบัติ อ่านค่า X, Y, M, D ผ่าน Modbus จริง
Address นับจาก 0 หรือ 1
ส่วนนี้ไม่ได้อยู่ในคลิป แต่เป็นสาเหตุที่อ่านค่าเลื่อนไป 1 ตำแหน่งบ่อยที่สุด Modbus เขียน Address ได้ 2 แบบ
| แบบ | Holding Register ตัวแรก | ใช้ที่ไหน |
|---|---|---|
| Protocol Address นับจาก 0 | 0 (ในเฟรมคือ 00 00) | ค่าที่ส่งจริงใน Data Frame, SamSoar2022, SKTool และตาราง Modbus Address ของ Samkoon |
| แบบ 4xxxx นับจาก 1 | 40001 | คู่มืออุปกรณ์หลายยี่ห้อ และโปรแกรม Master ที่ตั้งเป็น Base 1 |
Address ในบทเรียนชุดนี้ใช้แบบ นับจาก 0 ทั้งหมด ถ้าคู่มืออุปกรณ์เขียนแบบ 4xxxx ให้ลบ 40001 ก่อนใส่ เช่น 40010 → Address 9
ตัวเลข D0 = 40000 ในตาราง Samkoon ดูคล้ายแบบ 4xxxx แต่ไม่ใช่ เป็น Protocol Address นับจาก 0 ที่ส่งในเฟรมเป็น 9C 40 ตารางเต็มอยู่ในรูปตาราง Modbus Address ของหน้าสินค้า PLC เช่น FAs-32MR-AC-E
สรุป
- Modbus เป็นมาตรฐานเปิดที่ทำงานแบบ Master-Slave (Request-Response) ผ่าน RS485 หรือ TCP/IP
- ทุก Frame มี Function Code กับ Data เสมอ ส่วน RS485 มี Device Address และ Error Check เพิ่ม
- ข้อมูล 4 ประเภท: Coil (0x), Input (1x), Input Register (3x), Holding Register (4x) และ 4x อ่านด้วย FC03
- ก่อนสื่อสารต้องรู้ Function Code และตำแหน่งข้อมูลจากคู่มือผู้ผลิต
ตอนถัดไป
15. คำสั่ง Modbus RTU/RS485
คำถามที่พบบ่อย
- Modbus คืออะไร ใช้ทำอะไร?
- เป็น Communication Protocol มาตรฐานเปิด (Open standard) ที่ผู้ผลิต Controller และอุปกรณ์ต่างๆ นำไปใช้อย่างแพร่หลาย ทำให้ PLC หลายตัว หรือ PLC กับอุปกรณ์ต่างรุ่นต่างยี่ห้อ อ่านและเขียนข้อมูลกันได้
- Master กับ Slave ต่างกันอย่างไร?
- Master (บางทีเรียก Client) เป็นผู้ส่ง Request ไปที่ลูกข่าย ส่วน Slave (บางทีเรียก Server) เป็นผู้ตอบ Response กลับ การสื่อสารวนแบบ Request → Response ไปเรื่อยๆ นอกจาก PLC แล้ว HMI หรือคอมพิวเตอร์ที่มีโปรแกรมรองรับก็เป็น Master ได้
- Modbus RS485 กับ Modbus TCP/IP ต่างกันอย่างไร?
- RS485 ใช้สายไฟ 2 เส้น ใน Frame มี Device Address (Slave ID) และ Error Check ส่วน TCP/IP ใช้สาย LAN ระบุอุปกรณ์ด้วย IP Address จึงไม่มี Device Address แต่มี Transaction Identifier, Protocol Identifier, Length และ Unit ID แทน ทั้งสองแบบมี Function Code กับ Data เหมือนกันเสมอ
- ข้อมูล 4 ประเภทของ Modbus คืออะไร?
- Coil (0x) และ Input (1x) เป็นข้อมูล 1 Bit ส่วน Input Register (3x) และ Holding Register (4x) เป็นข้อมูล 16 Bit
- Function Code ไหนใช้อ่าน Holding Register?
- FC03 — จุดที่สับสนบ่อยคือ Address 4x อ่านด้วย Function Code 03 ไม่ใช่ 04 ส่วน FC04 ใช้อ่าน Input Register (3x) FC01 อ่าน Coil (0x) และ FC02 อ่าน Input (1x)
ควรอ่านก่อน:
มีคำถาม? ติดต่อทีมงาน
