บทที่ M07 · Modbus RTU/TCP · PM2230

Modbus & Power Meter

Modbus คือ "ภาษาต่างชาติ" ที่อุปกรณ์อุตสาหกรรมทุกยี่ห้อพูดได้ — บทนี้พาเข้าใจ Function Code, Address Map, แล้วลองให้ FX5U คุย กับ Power Meter Schneider PM2230 เพื่ออ่านค่า kWh, V, A, PF

Modbus 101

Modbus คือ Protocol แบบ Master-Slave ที่เกิดจาก Modicon ตั้งแต่ปี 1979 และยังใช้กันถึงทุกวันนี้ เพราะมัน เรียบง่ายและเปิด

Modbus Master-Slave Query-Response flow
Master ส่ง Query (Device Address + Function Code + Data + Error Check) → Slave ตอบ Response กลับมาในรูปแบบเดียวกัน — ไม่มีการพูดคุยข้ามกันโดยตรงระหว่าง Slave
MODBUS RTU message frame structure
โครงสร้าง Frame ของ Modbus RTU — Start (≥3.5 char silent) · Address (8 bits) · Function (8 bits) · Data (N×8 bits) · CRC (16 bits) · End (≥3.5 char silent)

Master · FX5U

RS-485 RTU

  • ส่ง Request
  • รอ Response
  • Timeout → Error
  • Done → Read data

Slave #1 — DTK4848

Delta Temp Controller

Slave #2 — ATV320

Schneider VFD

Slave #3 — PM2230

Schneider Power Meter

RS-485 Daisy-chain · 1 Master, หลาย Slave · Request ⇒ Response ที่ละตัว

Modbus มี 2 ภาษา

Modbus RTUModbus TCP
PhysicalRS-485 / RS-232Ethernet
FrameBinary + CRC-16MBAP header + Binary (ไม่มี CRC)
Speed9.6–115.2 kbps100 Mbps+
ระยะ~1 กม. (RS-485)~100 ม. (Cat-5e)
เหมาะกับอุปกรณ์ภาคสนาม, sensor, driveระหว่าง PLC, HMI, SCADA

📡 ลองสร้าง Modbus Frame เอง

เลือก Slave, Function Code, Register Address, และค่า — เครื่องมือจะคำนวณ CRC-16 ให้อัตโนมัติและแสดง frame byte-by-byte ลองเปลี่ยน FC ดู — request frame เปลี่ยนหน้าตาทันที. Frame ที่เห็นนี่คือสิ่งที่จะออกสาย RS-485 จริง ๆ:

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

FCชื่อใช้กับ
0x01Read Coilsอ่าน Bit จาก Slave (สถานะ Output)
0x02Read Discrete Inputsอ่าน Bit Input
0x03Read Holding Registersอ่าน Word (ค่าที่อ่านได้ส่วนใหญ่อยู่นี่)
0x04Read Input Registersอ่าน Word (Read-only)
0x05Write Single Coilเขียน Bit 1 ตัว
0x06Write Single Registerเขียน Word 1 ตัว
0x10Write Multiple Registersเขียน Word หลายตัว
90% ของงานใช้แค่ FC 03 และ FC 06 อ่านค่าด้วย 0x03 และเขียนค่าด้วย 0x06 — ทำงานได้กับ Slave เกือบทุกตัวในตลาด
Modbus Function Codes table
ตารางสรุป Function Codes จากคู่มือ — ฝั่ง Discrete ใช้กับ Bit (Coil/Input), ฝั่ง Analog ใช้กับ Register (Holding/Input)

ตั้งค่า FX5U เป็น Modbus Master

GX Works3 Modbus Protocol Setting
หน้าตั้งค่า 485 Serial Port → Communication Protocol Type ใน GX Works3 — เลือก MODBUS_RTU Communication, Parity None, Stop 1bit, Baud 115,200 (หรือ 9600 ตามที่ Slave รองรับ)
  1. เปิดพอร์ต RS-485 ใน GX Works3 → Parameter → Module Parameter → 485 Serial Port → ตั้ง:
    • Communication Protocol: MODBUS RTU Communication
    • Baud rate: 9600 · Data length: 8 · Parity: None · Stop bit: 1
    • Sum check: None (Modbus CRC อยู่ใน Frame อยู่แล้ว)
    • Station No. ของ FX5U: ไม่สำคัญ — เป็น Master
  2. Download Parameter Online → Write to PLC → ติ๊ก Parameter → Execute
  3. ต่อสาย RS-485 เชื่อม SDA (FX5U) ↔ D+ (PM2230), SDBD−, SGGND
    ปลายสาย Daisy-chain ต้องใส่ Terminating Resistor 120Ω

คำสั่ง ADPRW — ที่ใช้กับ Modbus RTU บน FX5U

คำสั่งหลักของ FX5U สำหรับ Modbus RTU ชื่อ ADPRW (Adapter Read/Write)

ADPRW  s1  s2  s3  s4  s5/d

  s1 = Slave Station No. (1–247)
  s2 = Function Code (H03, H06, ฯลฯ)
  s3 = Slave Register Start Address
  s4 = Number of Registers to read/write
  s5/d = Local D-register start (where data goes / comes from)
ADPRW instruction in GX Works3 Ladder
ตัวอย่างจริงใน GX Works3 — Rung ใช้ ADPRW H1 H3 K4096 H1 D10 อ่านค่าจาก Slave 1 (FC=03) เข้า D10

ตัวอย่าง — อ่าน 6 register จาก Slave 3 (PM2230)

ก่อนเขียน Ladder ดูคู่มือว่า Slave สนับสนุนอะไรบ้าง — ตัวอย่าง register map ของ Delta DTK:

DTK RS-485 communication specs
Spec RS-485 ของ Delta DTK — Baud 2400–38400 bps, Modbus ASCII/RTU, FC 03H อ่าน max 8 word, FC 06H เขียน 1 word
DTK Modbus register addresses
Register map — 1000H = PV, 1001H = SP, 1002H/1003H = ช่วง T, 1004H = Sensor type, 1005H/1006H = control method
; Trigger ทุก 1 วินาทีด้วย M8013 (special internal — 1 Hz clock)
LD    M8013
ADPRW  K3   H03   K2999  K6   D100

; ความหมาย:
; - Slave 3 (PM2230 ตั้ง station ID = 3)
; - Function Code 03 = Read Holding Registers
; - Start address = 2999 (offset อยู่ใน datasheet ของ PM2230 — ดู Module 7)
; - Read 6 registers
; - เก็บที่ D100..D105

Schneider PM2230 — Power Meter

PM2230 อ่าน Volt / Amp / Power Factor / kWh ของระบบไฟ 3 phase ได้ทั้งหมด และส่งผ่าน Modbus RTU ไปยัง PLC ได้โดยตรง

Address Map ที่ใช้บ่อย

Registerค่าData Typeหน่วย
2999Current — Phase AFloat32 (2 regs)A
3001Current — Phase BFloat32A
3003Current — Phase CFloat32A
3019Voltage L1-NFloat32V
3021Voltage L2-NFloat32V
3023Voltage L3-NFloat32V
3053Active Power — TotalFloat32kW
3083Power Factor — TotalFloat32
3203Energy Active DeliveredInt64 (4 regs)Wh

หมายเหตุ: address ของ PM2230 ใช้แบบ 0-indexed ตามมาตรฐาน Modbus แต่บางคู่มือเขียน address แบบ "1-indexed" ทำให้สับสน — ดู Register List ฉบับสมบูรณ์ที่ หน้าเอกสารอ้างอิง

Float32 = 2 register ติดกัน! PM2230 ส่งค่าเป็น IEEE-754 32-bit float — ใช้ 2 register (เช่น 2999+3000) ใน FX5U ใช้ EBIN (Extended BIN) หรือ EMOV เพื่อแปลงเป็น Real ใน PLC

การแปลง Float32 จาก 2 Word

; D100, D101 = 2 word ที่อ่านมาจาก PM2230
; ต้องการเก็บเป็น Real (32-bit Float) ที่ D200

LD    M8000          ; Always ON
EMOV  D100  D200     ; ก็อป 2 word เป็น 1 ค่า Real

; ตอนนี้ D200 = Voltage จริง (เช่น 220.5 V)
; แสดงผลผ่าน HMI: link Numeric Display ของ HMI ไปที่ D200 (Data Type = Float)

🔢 Float32 ↔ Register — Interactive Converter

ลองดูว่า 220.5 V หน้าตาเป็น register อย่างไร, หรือเอา register hex ที่อ่านได้จาก Modbus มาลองแปลงกลับเป็นค่าจริง — ปัญหาคือ Word Order ของแต่ละยี่ห้อไม่เหมือนกัน (PM2230 ใช้ AB CD · Schneider VFD ใช้ CD AB)

ตั้งค่า PM2230

  1. กดปุ่ม Menu ค้างที่ตัว PM2230 — เข้า Configuration Menu
  2. ตั้ง Communication เข้า Communications → ตั้ง:
    • Protocol: Modbus
    • Address: 3
    • Baud rate: 9600
    • Parity: None
  3. บันทึก + Restart กด Save → ดับ PM2230 → เปิดใหม่ → ตอนนี้เป็น Modbus Slave #3 พร้อมตอบสนอง

📟 ลองเดินเมนู PM2230 ก่อนของจริง

เพราะ PM2230 มี Sub-menu ซ้อนกันหลายชั้น คนเริ่มต้นมักหลงทาง — ลองเล่นกับเครื่องจำลองด้านล่างก่อน เพื่อจำเส้นทาง · เป้าหมาย: เข้าหา CoM แล้วเซ็ต Adr=3, bAUd=9600, Par=NonE

เคล็ดลับการเดินเมนูจริง
  • จากหน้า Normal (V/A/kW อ่านได้) → กด OK ค้างจะเข้า Setup
  • เครื่องจริงจะถาม Password (default = 0000 — ถ้ายังไม่เคยตั้ง)
  • หลังเปลี่ยน Adr/bAUd/Par ต้อง ดับไฟแล้วเปิดใหม่ ค่าใหม่ถึงจะมีผล
  • ถ้ากด Menu โดยไม่บันทึก — ค่ายังอยู่ในหน่วยความจำชั่วคราว · กลับเข้า Setup ดูได้ว่าค่าใหม่หรือเก่า

ตัวอย่างใช้งานจริง — สร้าง Energy Dashboard

โปรเจกต์ปิดท้ายคู่มือ — สร้างระบบที่ HMI แสดง V, A, kW, kWh real-time จาก PM2230 และส่งสัญญาณ Alarm ถ้ากำลังเกิน 5 kW

  1. FX5U poll PM2230 ทุก 1 วินาที ใช้ ADPRW K3 H03 ... อ่าน V, I, P ทีละ block เก็บที่ D100–D120
  2. แปลง Float32 → Real ใช้ EMOV สำหรับแต่ละค่า → เก็บ Real ที่ D200, D202, D204...
  3. ส่งให้ HMI Samkoon ใน HMI link Numeric Display ไปที่ D200 (V), D202 (I), D204 (kW), D206 (PF) Data Type = Float 32-bit ทุกตัว
  4. Set Alarm ที่ FX5U
    ; ถ้า kW > 5.0 → Bit M20 = ON → HMI ขึ้น Popup
    LD    M8000
    EMOVR D204  D210         ; เปรียบเทียบ Real
    ECMP  K5000 D204  M20    ; M20+0,+1,+2 = <,=,> result
    ; M22 = ON เมื่อ D204 > 5.0
  5. วาด Trend Graph บน HMI ใช้ Element "Trend Curve" → link ไปที่ D204 → สุ่มสีและช่วงเวลาตามต้องการ
เคล็ดลับ Production ในโรงงานจริง อย่า poll ทุก register ทุก 100ms — มันจะกินทรัพยากรพอร์ต RS-485 แบ่ง ค่าสำคัญ (kW, alarm) → 500ms · ค่ารอง (kWh, PF) → 5s · ค่าสถิติ → 30s

Modbus TCP — ถ้าใช้ Ethernet

FX5U ทำ Modbus TCP ได้เช่นกันผ่านพอร์ต Ethernet ในตัว — ใช้ SLMP หรือ Function Block MBM_ จาก Library

ข้อดี: ความเร็วสูงกว่า · ระยะใกล้แต่เร็ว · ใช้สาย LAN ที่หาง่ายและถูกกว่า RS-485

GX Works3 Add Protocol dialog with MODBUS/TCP
การเพิ่ม MODBUS/TCP ใน GX Works3 — Add Protocol → Predefined Protocol Library → General-purpose protocol → MODBUS/TCP
Modbus TCP network architecture
สถาปัตยกรรมเครือข่ายแบบ Modbus TCP — PLC (CP1L-EL/EM) + HMI + PC + อุปกรณ์ภาคสนาม (SMC Valve) ผ่าน Switch Ethernet ตัวเดียว

การ Map PLC Device → Modbus Address (FX5U เป็น Slave)

ถ้าจะให้ FX5U เป็น Slave (ไม่ใช่ Master) — กำหนดได้ว่า Modbus Address ไหนแมพไปกับ Device PLC ไหน:

GX Works3 MODBUS Device Allocation Parameter
หน้า MODBUS Device Allocation Parameter — Allocation 1 mapping Y0..Y1023 = Modbus Coil 0–1023, X0..X1023 = Discrete Input, D0..D7999 = Holding Register

Bonus — Analog Input ของ FX5U เอง

FX5U มี Analog Input 2 ช่อง built-in — อ่านค่าได้โดยไม่ต้องใช้ Modbus เลย ค่าจะอยู่ใน Special Data register (SD):

FX5U analog Special Data registers CH1
Special Data Register ของ Analog CH1 — SD6020 = Digital output, SD6022 = Analog input voltage monitor, SD6026/SD6027 = Max/Min
Analog input read ladder
Ladder อ่าน Analog — MOV SD6020 → D100 ก็อปค่า Digital, MOV SD6022 → D101 ก็อปแรงดัน, ใช้ X1/X2 เลือกค่าสเกล (K0 หรือ K4000)

เอกสาร Modbus

🎉 จบคู่มือ

ถ้าทำมาถึงตรงนี้ได้ คุณมี ทักษะ PLC Automation ครบเซต:

ทักษะเหล่านี้คือ พื้นฐาน Industrial Automation ที่ใช้ได้กับทุกโรงงานในประเทศไทย — ลองหาโจทย์จริงในเครื่องจักรรอบตัว แล้วนำสิ่งที่เรียนมาประยุกต์ดู

ก้าวต่อไป Industrial IoT (MQTT), SCADA (Ignition / Wonderware), Vision System, Robot Integration — ทั้งหมดต่อยอดจาก PLC ทั้งสิ้น ลองสำรวจดู