PLC เป็น Modbus RTU Slave — ให้ SCADA / HMI อ่าน/เขียนข้อมูล
ตั้ง 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 Address | PLC 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:
- Project → Configuration → COM1
- Mode: Modbus Slave
- Slave ID: 1 (หรือเลขที่ต้องการ, ห้ามชนกับ slave อื่น)
- Baud Rate: 9600 (ปกติ) / 19200 / 38400 / 57600
- 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
I/O Assignment
| Address | Role | Note |
|---|---|---|
| X0 | เซ็นเซอร์นับชิ้นผลิต (NO) | ตรวจชิ้นที่ผ่าน — ขอบขาขึ้น = นับ +1 |
| X1 | ปุ่ม Local Start (NO) | |
| X2 | ปุ่ม Local Stop (NC) |
Parameters ที่ปรับได้
D100default: 0จำนวนชิ้นผลิต — Master อ่านได้ที่ HR 0x0064
D101default: 0Run state — 0=Idle, 1=Running. HR 0x0065
D102default: 0Error code (0=OK, 1=overload, 2=jam, ฯลฯ). HR 0x0066
M100default: 0Run status bit — Coil 0x0064
M101default: 0Fault 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
- ดาวน์โหลดไฟล์
modbus-rtu-slave.csvจากแท็บ CSV ด้านบน - เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
- เมนู File → Import → เลือกไฟล์
.csvที่เพิ่งดาวน์โหลด - กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
- ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC
