หน้าแรกคู่มือPLCสอนใช้ CAN Bus และ CANopen กับ Samkoon PLC (SEND_CAN / REV_CAN)CAN Bus ต่างจาก Modbus ยังไง? คู่มือสำหรับวิศวกรที่รู้ Modbus
PLCปานกลาง · Intermediate25 นาที

CAN Bus ต่างจาก Modbus ยังไง? คู่มือสำหรับวิศวกรที่รู้ Modbus

เปรียบเทียบ CAN Bus กับ Modbus อย่างละเอียด สำหรับวิศวกร Automation ที่เข้าใจ Modbus แล้ว อธิบาย architecture การสื่อสาร arbitration frame format พร้อมภาพประกอบ

อัพเดทล่าสุด: 20 เมษายน 2569

ถ้าคุณใช้ Modbus เป็นอยู่แล้ว ทำไมต้องรู้ CAN?

ในงาน Factory Automation Modbus (RS-485 หรือ TCP) เป็นมาตรฐานที่เกือบทุกคนรู้จัก — ใช้อ่านค่า sensor, ควบคุม HMI, อ่าน-เขียน register ของ PLC ตัวอื่น

แต่เมื่อโจทย์เริ่มพาไปเจอกับงานแบบนี้:

  • ต้องควบคุม servo/stepper หลายตัวพร้อมกัน และเวลาต้อง deterministic
  • ต้องเชื่อมต่อกับ sensor real-time เช่น load cell, temperature ที่ update เร็วๆ
  • ระบบยานยนต์, battery management, CNC ที่ใช้ CANopen
  • ไม่อยากมี master คนเดียว เพราะ single point of failure

นี่คือจุดที่ CAN Bus เปล่งประกาย โปรโตคอลเดียวกับที่รถยนต์สมัยใหม่ใช้สื่อสารระหว่าง ECU กว่า 50 หน่วย ออกแบบมาเฉพาะเพื่องาน real-time deterministic multi-node control ที่ Modbus ทำไม่ได้ดี

บทความนี้จะเปรียบเทียบสองโปรโตคอลอย่างละเอียด เพื่อให้คุณเลือกใช้ได้ถูกงาน และเข้าใจว่าทำไมบางสถานการณ์ CAN ถึงเหนือกว่า Modbus อย่างชัดเจน

สรุปเปรียบเทียบแบบภาพรวม

คุณสมบัติModbus RTU (RS-485)Modbus TCPCAN 2.0
ArchitectureMaster-SlaveClient-ServerMulti-master
Max nodes247 slaves~unlimited (network)110 (practical)
Payload sizeสูงสุด 253 bytes~65K bytes8 bytes / frame
Max speed115.2 kbps100+ Mbps1 Mbps
Determinismไม่มี (polling delay)ไม่มี (TCP retries)มี (priority-based)
Error handlingต้องทำ retry ใน appTCP จัดการให้Hardware auto-retransmit
Physical layerRS-485 differentialEthernetCAN_H/CAN_L differential
CableShielded twisted pairCat5e+Shielded twisted pair
Termination120Ω ปลายทั้งสองด้านไม่มี (switch handle)120Ω ปลายทั้งสองด้าน
Typical useHMI, PLC-to-PLC, sensorSCADA, data loggingMotion control, CANopen, real-time

สังเกตว่า CAN payload เล็กมาก (8 bytes) แต่เด่นที่ determinism และ multi-master — นี่คือเหตุผลที่ออกแบบมาสำหรับ real-time control

ความต่างที่ 1: Architecture — ใครเป็นใหญ่?

Modbus: Master คนเดียวคุมทุกคน

Modbus: Master → Slave pollingMaster(PLC / SCADA)Slave 1Slave 2Slave 3QuerySlaves ตอบเฉพาะเมื่อถูกถามเท่านั้น
  • Master เป็นผู้ถาม (query) ทุกครั้ง
  • Slave ทุกตัวห้ามพูดก่อน ต้องรอให้ Master ถาม
  • ถ้า Master ตาย → ระบบหยุดหมด (single point of failure)
  • Slave 2 ต้องการส่งข้อมูลด่วน → รอไม่ได้ ต้องให้ Master poll ถึงตัวเอง

CAN: ทุก Node เท่ากัน ใครมีข้อมูลก็พูดได้

CAN: Multi-master broadcast bus120Ω120ΩPLCServo 1Servo 2SensorRemote I/OMCUทุก node พูดได้เมื่อ bus ว่าง — ID ต่ำ priority สูง ชนะ
  • ทุก node มีสิทธิ์เท่ากัน — ใครมีข้อมูลส่งก็ส่งเลย เมื่อ bus ว่าง
  • ถ้า 2 node ชนกัน → hardware arbitration ตัดสินโดยดูที่ ID (ต่ำกว่าชนะ)
  • Sensor เห็น overheat → สามารถ broadcast ทันที ไม่ต้องรอใครถาม
  • ไม่มี single point of failure — Node ตายตัวใดตัวหนึ่ง ระบบที่เหลือทำงานต่อได้

ความต่างที่ 2: Communication Pattern

Modbus = Polling (Request/Response)

ในทุก cycle Master จะวนสำรวจ (poll) slave ทีละตัว:

Modbus: Polling cycleMasterSlave 1Slave 2Read Reg (0x03)Responseรอ ~5-50 msRead Reg (0x03)Responseรอ ~5-50 msRead Reg (ถาม Slave 1 ใหม่)Response← Slave 1 รอ ~50msกว่าจะถูก poll อีกทีtime →

ผลกระทบ:

  • Latency ต่อ slave = (จำนวน slave × round-trip time) → ยิ่ง slave เยอะ ยิ่งช้า
  • ถ้า Slave ต้องการ update บ่อย ต้องเพิ่ม baud rate (แต่มี limit ของ RS-485)
  • Event-driven แทบทำไม่ได้ — Slave รอถูกถาม

CAN = Event-Driven Broadcast

ทุก node สามารถ broadcast ได้ทันทีเมื่อมีข้อมูลใหม่:

CAN: Event-driven broadcastPLCServo 1SensorI/OID 0x200: Move command (ถึงทุก node ในครั้งเดียว)ID 0x80: Emergency! (ไม่ต้องรอ poll)ID 0x201: Stop allID 0x180+1: Position reportID 0x180+5: Temperaturetime →

ผลกระทบ:

  • Sensor เจอปัญหา → broadcast Emergency (ID ต่ำ priority สูง) ถึงทุกคนใน < 1ms
  • ไม่เสียเวลา poll — Node พูดเฉพาะเมื่อมีของใหม่
  • 1 message → ทุก node ได้รับพร้อมกัน (ไม่ต้องส่งซ้ำ)

ความต่างที่ 3: การ Addressing

Modbus: Slave ID + Register Address

ต้องการอ่านค่าอุณหภูมิจาก Slave ID 5, register 40001:
┌────────────────────────────────────────────────┐
│ Slave ID │ FC   │ Reg Addr │ Count │ CRC16   │
│   0x05   │ 0x03 │ 0x0000   │ 0x01  │ xxxx    │
└────────────────────────────────────────────────┘
  ↑ "ใคร"   ↑"อะไร"  ↑ "ที่ไหน" ↑"เท่าไหร่" 

หลักการ: Master ต้องรู้ทั้ง "ใคร" (Slave ID), "ที่ไหน" (Register Address), "อะไร" (Function Code) ทุกครั้งที่ต้องการข้อมูล

CAN: Message ID = Meaning + Priority

Servo 1 ส่ง position report:
┌───────────────────────────────────────┐
│  ID: 0x181   │  DLC: 8  │ Data[8]     │
│  (TPDO1 ของ │           │ position... │
│  Servo#1)    │           │             │
└───────────────────────────────────────┘
  ↑ "เรื่องอะไร" + "ด่วนแค่ไหน"

หลักการ: ID ไม่ใช่ address ของใคร — แต่เป็น "ป้ายกำกับข้อมูลนี้คืออะไร" + "priority สูงแค่ไหน"

  • ใครก็ตามที่สนใจข้อมูลนี้ — subscribe (filter) รับได้เลย
  • ID ต่ำ = ด่วน (เช่น 0x000 = NMT, 0x080 = Emergency)
  • ID สูง = ไม่เร่ง (เช่น 0x600+ = SDO configuration)

เปรียบเทียบง่ายๆ:

ModbusCAN
Analogyโทรศัพท์ (กดเบอร์หาคน)วิทยุกระจายเสียง (ป้ายคลื่น)
"ID" หมายถึงตัวตนของ slaveหัวข้อของ message
การรับข้อมูลต้องถามตรงSubscribe ตาม topic

ความต่างที่ 4: Arbitration (จุดสำคัญที่สุด)

นี่คือหัวใจของ CAN — ทำไมถึงเป็น deterministic ได้

ปัญหา: ถ้า 2 node อยากส่งพร้อมกัน ทำยังไง?

Modbus: ไม่เกิด เพราะมี Master คนเดียว Slave ส่งเมื่อถูกถาม

CAN: เกิดได้ตลอด! แต่มีกลไก "non-destructive bitwise arbitration" แก้ได้โดยไม่ต้องย้อนส่งใหม่

กลไก: Dominant-0 / Recessive-1

บน CAN bus:

  • Bit 0 = Dominant (แรงกว่า ถ้าใครส่ง 0 ทุกคนเห็น 0)
  • Bit 1 = Recessive (อ่อนกว่า — เกิดเฉพาะเมื่อทุกคนส่ง 1 เท่านั้น)

ทุก node จะอ่าน bus ขณะกำลังส่ง — ถ้าส่ง 1 แต่เห็น 0 บน bus แสดงว่า "คนอื่น dominant อยู่" ต้องยอมถอย

CAN Arbitration: Node A (ID 0x123) vs Node B (ID 0x456)Bit #Node A(ID 0x123)Node B(ID 0x456)Bus(actual)100—090—081—070—060—051—040—030—020—011—101—0↑Node B แพ้ที่ bit นี้Node A ชนะส่งต่อ

เกิดอะไรขึ้น:

  1. Bit 10 (MSB): Node A ส่ง 0, Node B ส่ง 1 → bus เป็น 0
  2. Node B อ่าน bus เห็น 0 แต่ตัวเองส่ง 1 → รู้ว่าแพ้ arbitration ถอยทันที
  3. Node A ไม่รู้ว่ามีใครแข่ง — ส่งต่อไปจนจบเหมือนปกติ
  4. Node B รอ bus ว่าง แล้วค่อยส่งใหม่

ผลลัพธ์: ไม่เสียเวลา retransmit, ไม่มี collision, frame priority สูง (ID ต่ำ) จะได้ส่งก่อนเสมอ อย่าง deterministic

Modbus เมื่อเกิด collision (RS-485):

Modbus ไม่มี arbitration — ถ้ามี 2 master ส่งพร้อมกัน → สัญญาณชน → CRC พัง → ต้องทำ retry ใน application layer (ช้าและไม่ deterministic)

ความต่างที่ 5: Frame Format

Modbus RTU Frame

┌─────────┬─────┬──────────────────┬──────┐
│ Addr    │ FC  │ Data (0-252 B)   │ CRC  │
│ 1 byte  │ 1 B │ variable         │ 2 B  │
└─────────┴─────┴──────────────────┴──────┘

Total: 4-256 bytes @ 115.2 kbps = ~0.3-22 ms per frame

CAN Classic Frame (Standard 11-bit)

┌────┬────────┬─────┬─────┬───┬─────┬──────────┬─────┬─────┬───────┐
│SOF │ ID 11b │ RTR │ IDE │ R │ DLC │ Data 0-8 │ CRC │ ACK │ EOF   │
│ 1b │ 11 bit │ 1b  │ 1b  │1b │ 4b  │ 0-64 bit │ 15b │ 2b  │ 7b    │
└────┴────────┴─────┴─────┴───┴─────┴──────────┴─────┴─────┴───────┘

Total: 44-108 bits @ 500 kbps = ~0.1-0.2 ms per frame

ข้อสังเกต:

  • CAN frame สั้นกว่า Modbus frame มาก → ส่งเร็วกว่า
  • CAN payload limit 8 bytes → ถ้าจะส่งข้อมูลเยอะ ต้องใช้หลาย frame (แต่ละ frame มี priority แยกกัน)
  • CAN มี Hardware ACK bit — receiver ต้อง ACK ทุก frame ที่ถูกต้อง (ถ้าไม่มี ACK = error)

ความต่างที่ 6: Error Handling

ModbusCAN
Error detectionCRC ใน frameCRC + Frame check + ACK + Bit monitoring
RetryApplication ต้องทำเองHardware auto-retransmit
Isolationไม่มีมี — node ที่ error มากๆ จะถูก bus-off อัตโนมัติ
Latency ของ retry~100ms+ (polling)~0.2ms (immediate)

CAN มีระบบ error counter ในตัว — ถ้า node ใดส่ง frame ผิดพลาดบ่อยๆ จะถูก disconnect จาก bus โดย hardware (เพื่อปกป้อง network) — feature นี้ Modbus ไม่มี

เมื่อไหร่ควรใช้อะไร?

เลือก Modbus เมื่อ:

  • ต้องการอ่าน/เขียน register จำนวนมาก ต่อครั้ง (เช่น อ่าน D0-D100 ในคำขอเดียว)
  • การสื่อสารเป็น request-response แบบคลาสสิก (HMI อ่าน PLC, SCADA ถาม sensor)
  • Latency 10-100ms ยอมรับได้
  • อุปกรณ์ส่วนใหญ่ในระบบรู้จัก Modbus อยู่แล้ว
  • ต้องการใช้ RS-485 ระยะไกล (>500m) — Modbus RTU ทำได้ดี

เลือก CAN เมื่อ:

  • Motion control — control loop ต้องเร็ว deterministic (servo, stepper)
  • Multi-node event-driven — sensor หลายตัว broadcast พร้อมกัน
  • Safety-critical — ต้องการ hardware-level error detection
  • ใช้ CANopen device ที่ vendor จัดหามาให้ (servo drive, remote I/O)
  • ต้องการ fail-operational — node ตายตัวหนึ่ง ระบบยังรันต่อได้

ใช้ทั้งสอง (Hybrid) เมื่อ:

  • PLC ควบคุม servo ผ่าน CAN (real-time), HMI อ่านผ่าน Modbus (configuration)
  • Backbone เป็น Modbus TCP (SCADA), field-level เป็น CAN (sensor/actuator)

ตัวอย่างสถานการณ์จริง

สถานการณ์ 1: Pick-and-Place Robot (4 axis servo)

ถ้าใช้ Modbus RTU:

  • Master poll ตำแหน่ง servo 4 ตัว ทีละตัว = 4 round-trips
  • ที่ 115.2 kbps, round-trip ~10ms × 4 = 40ms cycle
  • ส่งคำสั่ง move ไป 4 ตัว = อีก 40ms
  • Cycle time ~80ms = update rate 12.5 Hz ช้าเกินไปสำหรับ smooth motion

ถ้าใช้ CAN (CANopen):

  • Servo ทั้ง 4 broadcast position (TPDO) ทุกๆ 10ms = 100Hz
  • PLC ส่งคำสั่ง move broadcast (RPDO) ใน 1 frame
  • Cycle time ~1-2ms = update rate 500-1000 Hz เหมาะกับ coordinated motion

ผู้ชนะ: CAN ชัดเจน

สถานการณ์ 2: โรงงานที่มี Temperature Sensor 50 ตัว อ่านทุก 10 วินาที

Modbus: poll sensor ทีละตัว, 50 ตัว × 20ms = 1 วินาที ต่อ cycle — เพียงพอ CAN: sensor broadcast ทุกตัว — overkill และ CANopen device แพงกว่า

ผู้ชนะ: Modbus RTU — ง่าย ถูก เพียงพอ

สถานการณ์ 3: Emergency Stop ทั่วทั้งระบบ

Modbus: ต้องรอ Master poll ถึงตัวแล้วค่อยสั่ง — latency 50-200ms CAN: Emergency frame (ID 0x080) priority สูงสุด, ทุก node รับพร้อมกัน < 1ms

ผู้ชนะ: CAN — safety-critical application

สรุป: Mental Model ที่ต้องจำ

ถ้าคุณคิดแบบนี้ให้สลับเป็น
"Master poll Slave""ทุก node broadcast"
"Slave ID 5, register 40001""Message ID 0x181 ที่บรรจุข้อมูล position ของ Servo#1"
"ส่ง request แล้วรอ response""ส่ง message แล้วไม่ต้องรอ — subscriber รับไปเอง"
"CRC ผิด → application retry""CRC ผิด → hardware retransmit อัตโนมัติ"
"Collision → CRC พัง → retry""Collision → priority-based arbitration → ไม่เสียเวลา"
"ID = address ของใคร""ID = ป้ายหัวข้อ + priority"

Samkoon PLC รุ่นที่รองรับ CAN จะเปิดโลกใหม่ให้วิศวกร automation — สามารถทำงานที่ Modbus ทำไม่ไหว เช่น multi-axis motion, real-time sensor fusion, event-driven control โดยไม่ต้องเปลี่ยน controller แค่ใช้คำสั่ง SEND_CAN / REV_CAN หรือ CANopen ที่มีในตัว

เริ่มต้นใช้งาน: อ่านคู่มือ สอนใช้ CAN Bus และ CANopen กับ Samkoon PLC เพื่อเริ่มเขียนโปรแกรมแรกของคุณ

สินค้าที่ใช้ในบทความนี้
3 รายการ
FAs-32MT-AC-E
FAs-32MT-AC-E

PLC 32 I/O 220V AC Transistor Output รองรับ Modbus RTU/RS485 TCP/IP

฿3,690
FAs-50MT-AC-E
FAs-50MT-AC-E

PLC 50 I/O 220V AC Transistor Output รองรับ Modbus RTU/RS485 TCP/IP

฿5,690
FAs-66MT-AC-E
FAs-66MT-AC-E

PLC 66 I/O 220V AC Transistor Output รองรับ Modbus RTU/RS485 TCP/IP

฿6,490

รวมทั้งหมด

฿15,870