Beginner
11 rungs
3 I/O

PLC เป็น Modbus RTU Slave — ให้ SCADA / HMI อ่าน/เขียนข้อมูล

Modbus RTU Slave (PLC as Slave)

ตั้ง PLC เป็น Modbus RTU Slave ให้ SCADA/HMI/Master อื่นๆ อ่าน/เขียน register ของ PLC (M, D, X, Y) ผ่าน RS485 — ไม่ต้องใช้ MBUS

หลักการ

ส่วนใหญ่คนคิดว่า PLC ต้องเขียน MBUS code เพื่อตอบ Modbus request — แต่จริงๆ แล้ว Samkoon PLC สามารถเป็น Modbus RTU Slave โดยอัตโนมัติ ไม่ต้องเขียน ladder อะไรเลย เพียงแค่ enable ใน IDE

PLC จะ map register ภายในไปที่ Modbus address โดยอัตโนมัติ:

Modbus AddressPLC Register
0x0000-0x0FFF (Coil)M0-M4095
0x1000-0x10FF (Coil)X0-X255
0x1100-0x11FF (Coil)Y0-Y255
0x0000-0x0FFF (Holding Register)D0-D4095

Setup ใน IDE (ไม่ต้องเขียน code)

ใน SamSoar2022:

  1. Project → Configuration → COM1
  2. Mode: Modbus Slave
  3. Slave ID: 1 (หรือเลขที่ต้องการ, ห้ามชนกับ slave อื่น)
  4. Baud Rate: 9600 (ปกติ) / 19200 / 38400 / 57600
  5. Parity: None, Data: 8, Stop: 1

แค่นั้น — PLC จะตอบ Modbus request อัตโนมัติทุกรอบ scan

โปรแกรมในไฟล์นี้ทำอะไร

ไฟล์นี้เป็น example logic ที่จะทำให้ PLC slave มีข้อมูลให้ master อ่าน:

D100 = production count (counter)
D101 = current run state
D102 = error code
M100 = "machine running" status bit
M101 = "fault active" status bit

Master (เช่น SCADA) จะอ่าน:

  • FC03 / Holding Register 0x0064 (D100) → production count
  • FC01 / Coil 0x0064 (M100) → run status
  • FC05 / Write Coil 0x00C8 (M200) → reset request from SCADA

ลำดับการทำงาน

PLC Boot
  ↓
Slave engine ทำงานอัตโนมัติ (config from IDE)
  ↓
Ladder: ทำงาน normal logic
  - นับชิ้นใน D100 (production count)
  - SET M100 เมื่อมอเตอร์วิ่ง
  - SET M101 เมื่อมี fault
  - ตรวจ M200 (write coil from SCADA) → reset count

ระหว่างนี้ Master โพล PLC ทุก ~100ms:
  Master → "Read Holding Register 0x64-0x66" → PLC ตอบ D100-D102
  Master → "Read Coil 0x64-0x65" → PLC ตอบ M100-M101 status
  Master → "Write Coil 0x00C8" (M200) → PLC SET M200

ทำไมไม่ต้อง MBUS

MBUS = PLC เป็น Master ส่ง request ออก Modbus Slave = PLC รอ request เข้า แล้วตอบ

เมื่อตั้ง COM1 เป็น Slave mode → firmware ของ PLC จัดการ protocol ทั้งหมดเอง

  • Parse request (slave ID, FC, address, count)
  • Look up internal register
  • Respond with values + CRC
  • Handle errors (illegal address → exception code)

Programmer แค่เขียน logic update ค่าใน register ตามปกติ

เทียบกับ HMI (Samkoon)

ถ้าใช้ Samkoon HMI ตรงๆ → ไม่ต้องตั้ง Modbus Slave HMI คุยกับ PLC ผ่าน proprietary protocol (เร็วกว่า) ที่ตั้ง project link

Modbus Slave ใช้กรณี:

  • HMI / SCADA ของผู้ผลิตอื่น (Weintek, GP-Pro, AVEVA Wonderware)
  • DCS, IoT gateway, OEE software
  • Custom Python / C++ application

ขยายเพิ่ม

  • Modbus TCP Slave — เปิดผ่าน Ethernet (รุ่น -E) → ไม่ต้องสาย RS485
  • Multiple slave IDs — Samkoon บางรุ่นรองรับ 2 COM port → 2 slave ID พร้อมกัน
  • Address remapping — ใน IDE สามารถ map D100 → custom Modbus address (e.g. 0x1000)
  • Read-only mode — disable write FC (FC05, FC06, FC15, FC16) สำหรับ security

โปรแกรม PLC

PLC เป็น Modbus RTU Slave — ให้ SCADA / HMI อ่าน/เขียนข้อมูล — Modbus RTU Slave (PLC as Slave)
ตั้ง PLC เป็น Modbus RTU Slave ให้ SCADA/HMI/Master อื่นๆ อ่าน/เขียน register ของ PLC (M, D, X, Y) ผ่าน RS485 — ไม่ต้องใช้ MBUS
N0ตั้งค่าเริ่มต้นตอนเปิดเครื่อง
First scan — ตั้งค่าจำนวนชิ้น, Error code เริ่มต้น
M8150MOVK0, D100
First scan — เคลียร์ Error code
M8150MOVK0, D102
N1เคาน์เตอร์ผลิต + สถานะ Run
เคาน์เตอร์ผลิต — นับขอบขาขึ้นของ X0 (sensor)
X0INCD100, D100
Run state: D101 = 1 ถ้ากำลังรัน, 0 ถ้า idle
M0MOVK1, D101
Run state = idle เมื่อ M0 OFF
M0MOVK0, D101
N2Status bit สำหรับ SCADA
Status bit M100 mirror จาก M0 (machine running) ให้ SCADA อ่านได้
M0M100
Fault bit M101 mirror จาก M99 (มี fault) ให้ SCADA
M99M101
N3คำสั่ง Reset จาก SCADA
Reset จาก SCADA (เขียน M200) — เคลียร์เคาน์เตอร์ + fault บนขอบขาขึ้น
M200MOVK0, D100
Reset — เคลียร์ Fault flag ด้วย
M200RSTM99
Reset — auto-clear M200 หลังจาก 1 scan (กัน latch)
M200RSTM200
N4ปุ่ม Start/Stop ในเครื่อง
Local Start/Stop (เพื่อให้ M0 มีสัญญาณกระตุ้นในตัวอย่างนี้)
X1M0X2M0
Network count: 5, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0เซ็นเซอร์นับชิ้นผลิต (NO)ตรวจชิ้นที่ผ่าน — ขอบขาขึ้น = นับ +1
X1ปุ่ม Local Start (NO)
X2ปุ่ม Local Stop (NC)

Parameters ที่ปรับได้

D100default: 0

จำนวนชิ้นผลิต — Master อ่านได้ที่ HR 0x0064

D101default: 0

Run state — 0=Idle, 1=Running. HR 0x0065

D102default: 0

Error code (0=OK, 1=overload, 2=jam, ฯลฯ). HR 0x0066

M100default: 0

Run status bit — Coil 0x0064

M101default: 0

Fault status bit — Coil 0x0065

M200default: 0

คำสั่ง Reset จาก Master — Coil 0x00C8 (กระตุ้นด้วยการเขียน)

อุปกรณ์ที่แนะนำ

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

ทำไมไม่ต้องเขียน MBUS instruction?

MBUS = PLC เป็น Master (ส่ง request) Modbus Slave = PLC รอตอบ — ทำงานใน firmware ของ PLC โดยอัตโนมัติเมื่อ COM1 ถูกตั้งเป็น Slave mode ใน IDE — programmer ไม่ต้องเขียน code อะไรเลย

Slave ID เลขไหนเลือกอย่างไร?

1-247 ห้ามชนกับ slave อื่นใน RS485 bus เดียวกัน Convention: 1 = master / SCADA-facing PLC, 2-10 = remote sensors / VFDs / drives เลือก 1 ถ้า PLC ตัวเดียว, 2 ถ้ามี PLC อีกตัวเป็น 1 อยู่แล้ว

Modbus address มาจากไหน — ทำไม D100 = 0x0064?

Samkoon FAs PLC ใช้ default mapping: D0 = 0x0000, D1 = 0x0001, ... D100 = 0x64 (เลข hex ของ 100) M0 = 0x0000 (Coil), M100 = 0x64 (Coil) สามารถ override mapping ใน IDE ถ้าต้องการ

ถ้า Master เขียน Coil 0x00C8 (M200) ทำไม PLC ต้อง RST M200 หลัง?

Master ที่ใช้ FC05 (Write Single Coil) จะค้าง M200 = 1 ถ้า PLC ไม่รีเซ็ต → ครั้งถัดไป Master เขียน 1 ซ้ำ rising edge ไม่เกิด → reset ไม่ทำงาน Pattern นี้คือ 'consume the trigger' — รับสัญญาณจาก SCADA แล้ว clear ทันทีเพื่อให้ trigger ครั้งถัดไปทำงานได้

วิธีนำเข้าไฟล์ใน SamSoar2022

  1. ดาวน์โหลดไฟล์ modbus-rtu-slave.csv จากแท็บ CSV ด้านบน
  2. เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
  3. เมนู File → Import → เลือกไฟล์ .csv ที่เพิ่งดาวน์โหลด
  4. กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
  5. ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC