บทที่ M02 · Programming

Ladder Logic & คำสั่งพื้นฐาน

Ladder Diagram (LD) คือภาษาที่นิยมที่สุดในการเขียน PLC — เพราะหน้าตาเหมือนวงจรรีเลย์ที่วิศวกรไฟฟ้าคุ้นเคยอยู่แล้ว บทนี้จะสอนตั้งแต่ Contact + Coil จนถึงคำสั่งสำคัญอย่าง MOV, TIMER, COUNTER, ZRST

หน้าตา Ladder Diagram

Ladder อ่านจาก ซ้ายไปขวา · บนลงล่าง — เปรียบเสมือนสายไฟที่จ่ายกระแสจาก Power Rail ฝั่งซ้าย ผ่าน Contact ต่าง ๆ ไปยัง Coil ทางขวา

L N X0 X1 Y0 X2 Y1 (self-hold) Y1 Power Rail Contact NO Contact NC Output Coil
ตัวอย่าง Ladder 2 Rung — เส้นสีส้ม = Power Rail · ตัว ┤ ├ = Contact NO · ┤/├ = Contact NC · = Output Coil

กฎพื้นฐานมีแค่ไม่กี่ข้อ:

SYMBOL
┤ ├   Contact NO
Normally Open — "ปกติเปิด" ปล่อยไฟผ่านเมื่อ Bit = ON
SYMBOL
┤/├   Contact NC
Normally Closed — "ปกติปิด" ปล่อยไฟผ่านเมื่อ Bit = OFF
SYMBOL
◯   Output Coil
Coil — เป็น Output ของ Rung · ถ้ามีไฟมาถึง Coil จะเป็น ON
PATTERN
↺   Self-Hold
ใช้ Contact ของ Y ตัวเองคู่กับปุ่ม Start เพื่อให้ Y ค้าง ON หลังปล่อยปุ่ม

⚙️ PLC ทำงานยังไง — Scan Cycle

ก่อนจะเขียน Ladder ต้องเข้าใจก่อนว่า PLC ไม่ได้ ทำงานแบบ Event-driven เหมือนภาษาคอมทั่วไป — มันวนซ้ำ Scan Cycle ทีละเฟส ตามนี้ตลอด · ลองดูแอนิเมชันด้านล่าง แล้วลองกดสวิตช์ X0 ในจังหวะต่าง ๆ ดูว่าทำไม Output ถึงไม่เปลี่ยนทันที

🧩 ลองสร้าง Rung — Self-Hold (Drag & Drop)

ก่อนจะดู Simulator ทำงาน — ลองประกอบ Rung ของตัวเองดู ลากบล็อกจากด้านล่างใส่ในช่องว่าง:

🎮 ลองเล่นเลย — Self-Hold Simulator

กดปุ่ม X0 (Start) ดูว่า Y0 ติดค้าง แม้ปล่อยปุ่มแล้วก็ยังติด — แล้วกด X1 (Stop) เพื่อตัด:

Device Memory — สัญลักษณ์ที่ต้องรู้

สัญลักษณ์ชื่อใช้ทำอะไรเลข Bit/Word
XInputอ่านสถานะจากขั้ว InputBit (Octal: X0–X17)
YOutputสั่งงานออกขั้ว OutputBit (Octal: Y0–Y17)
MInternal Relay"Bit ภายใน" ใช้เป็น flag ระหว่างขั้นBit (M0–M7679)
DData Registerเก็บค่าตัวเลข 16-bitWord (D0–D7999)
TTimerนับเวลาBit + Word (T0–T511)
CCounterนับจำนวนBit + Word (C0–C255)
K / HConstantK = Decimal, H = Hexเช่น K10, H1F
เลข Octal — ระวัง! X และ Y ของ Mitsubishi ใช้ฐาน 8 — ไม่มี X8/X9 จะข้ามไป X10, X11... เพราะฉะนั้น Input 16 ตัวคือ X0–X17 (ไม่ใช่ X0–X15)

คำสั่งกลุ่มที่ 1 — Logic พื้นฐาน

LD, OUT, AND, OR

LD    X0       ; โหลด Contact NO ของ X0
AND   X1       ; AND กับ X1
OUT   Y0       ; ถ้าทั้งคู่ ON → Y0 ON

SET / RST — Latch / Unlatch

ใช้แทน Self-hold ได้เมื่อโปรแกรมซับซ้อน — SET สั่งให้ Bit ค้าง ON, RST ทำให้ OFF

LD    X0       ; ปุ่ม Start
SET   Y0       ; Y0 = ON และค้าง

LD    X1       ; ปุ่ม Stop
RST   Y0       ; Y0 = OFF

คำสั่งกลุ่มที่ 2 — Data Move (MOV)

คำสั่ง MOV ใช้ "ก็อปปี้" ค่าจากที่หนึ่งไปอีกที่หนึ่ง — เป็นพื้นฐานของงานคำนวณทุกอย่าง

คำสั่งSyntaxทำอะไร
MOV MOV S D ก็อป S → D (ทำงานตราบเท่าที่ Input ON)
MOVP MOVP S D ก็อป S → D แค่ ครั้งเดียว ตอน Input เปลี่ยน OFF → ON (Pulse)
BMOV BMOV S D N ก็อป N ค่า จาก S → D (Block Move)
; ก็อปค่า 100 เข้า D10
LD    M0
MOV   K100  D10

; ก็อป D10..D12 (3 ค่า) ไปที่ D100..D102
LD    M1
BMOV  D10   D100   K3
MOV / BMOV ladder example in GX Works3
ตัวอย่างจริงใน GX Works3 — กด X0 → SET M0 → MOV H0FF→K2Y0 (เปิด Y0–Y7), MOV D10→D12, BMOV D20→D40 K5, กด X1 → RST M0 + เคลียร์ Y0–Y7
Device Watch Window monitor
หน้าต่าง Watch 1 ใช้ Monitor ค่า D-register หลายตัวพร้อมกัน — เห็น D10=11, D20=22, D40=22, D44=66 ตรงกับที่ BMOV คัดลอกมา

คำสั่งกลุ่มที่ 3 — Timer

Timer ใน FX5U มี 3 ความละเอียด:

คำสั่งหน่วยใช้ตอน
OUT T0 K200.1 วินาที × 20 = 2 sงานทั่วไป
OUTH T0 K200.01 วินาที × 20 = 0.2 sต้องการความละเอียดระดับ ms
OUTHS T0 K200.001 วินาที × 20 = 20 msงานความเร็วสูง
; รอ 2 วินาทีหลังกดปุ่ม X0 แล้วเปิด Y1
LD    X0
OUT   T0    K20      ; T0 หน่วงเวลา 20 × 0.1s = 2.0s

LD    T0             ; Contact ของ T0 จะ ON เมื่อนับครบ
OUT   Y1
Timer ladder example with OUT, OUTH, OUTHS
เปรียบเทียบ 3 ความละเอียดในรังเดียว — OUT T0 K50 = 5 s, OUTH T1 K500 = 5 s (0.01s × 500), OUTHS T2 K5000 = 5 s (0.001s × 5000)

🧩 Build the Rungs — Timer ON-Delay

ก่อนเล่น Sim ลองประกอบเองดู — Timer ใช้ 2 Rung แยกกัน — ลากบล็อกใส่ในช่อง:

🎮 ลองเล่น — Timer ON-Delay

กดปุ่ม X0 ค้างไว้ → ดู T0 นับขึ้นเรื่อย ๆ จนครบ 3.0 วินาที → Y0 ติด:

คำสั่งกลุ่มที่ 4 — Counter

; นับ pulse ที่ X0 ทุกครั้งที่เปลี่ยน OFF→ON
; ครบ 10 ครั้ง → C0 ON → เปิด Y2
LD    X0
OUT   C0    K10

LD    C0
OUT   Y2

; reset counter ด้วย X1
LD    X1
RST   C0
Counter ladder example in GX Works3
ตัวอย่างนับด้วย Counter — OUT C0 K3 นับด้วย M0 + M6 ครบ 3 ครั้ง → C0 ON, ส่วน OUT LC1 K5 = Long Counter (32-bit สำหรับนับเกิน 32,767)

🧩 Build the Rungs — Counter

ลองประกอบ 2 Rung สำหรับ Counter — Rung 1 ป้อน pulse · Rung 2 ใช้ Counter bit ขับ Coil:

🎮 ลองเล่น — Counter (นับ 5 ครั้ง)

กดปุ่ม X0 5 ครั้ง (รีลีสปุ่มทุกครั้ง — Counter นับ rising edge) → C0 → Y0 ติด · กด X1 = Reset

คำสั่งกลุ่มที่ 5 — ZRST (Zone Reset)

ZRST ใช้ เคลียร์หลาย Bit หรือหลาย Word พร้อมกัน — ประหยัด Rung มาก เวลา reset state ของระบบทั้งหมด

; เคลียร์ Y0..Y7 พร้อมกัน
LD    X10
ZRST  Y0    Y7

; เคลียร์ D0..D99 พร้อมกัน
LD    X11
ZRST  D0    D99

ตัวอย่างใช้งานจริง — Star–Delta Motor Starter

ตัวอย่างคลาสสิกที่ต้องใช้ ทุก คำสั่งที่เพิ่งเรียน — สตาร์ทมอเตอร์แบบ Star เป็นเวลา 5 วินาที แล้วสลับเป็น Delta อัตโนมัติ

Star-Delta motor power circuit
วงจรกำลังของระบบ Star–Delta — KM1 = Main, KM2 = Delta, KM3 = Star, Over Load Relay อนุกรมในวงจร
Star connection terminal
Star — ขั้ว W2/U2/V2 ของมอเตอร์ลัดวงจรร่วมกัน, V_phase = V_line/√3
Delta connection terminal
Delta — ขั้วจับคู่แบบ U1-W2, V1-U2, W1-V2 → กระแสเต็มที่
  1. กำหนด I/O Mapping
    • X0 = ปุ่ม Start · X1 = ปุ่ม Stop · X2 = Overload Relay (NC)
    • Y0 = K1 (Main Contactor) · Y1 = K2 (Star) · Y2 = K3 (Delta)
  2. Rung 1 — Start/Stop Latch ของ Main
    LD   X0      ; Start
    OR   Y0      ; Self-hold
    ANI  X1      ; Stop (NC)
    AND  X2      ; Overload OK (NC)
    OUT  Y0      ; Main Contactor
  3. Rung 2 — Star ON เป็นเวลา 5 วินาที
    LD   Y0      ; Main ON?
    ANI  T0      ; ยังไม่ครบ 5 วินาที
    OUT  Y1      ; Star Contactor
    
    LD   Y0
    OUT  T0  K50 ; 50 × 0.1s = 5.0s
  4. Rung 3 — Delta ON หลัง T0 ครบ + Interlock กับ Y1
    LD   T0      ; ครบเวลาแล้ว
    ANI  Y1      ; กัน Star/Delta ซ้อนกัน (Interlock)
    AND  Y0
    OUT  Y2      ; Delta Contactor
  5. ทดลองใน Simulator ก่อนต่อ Hardware จริง ลองรันใน GX Simulator ดู Sequence ว่าถูกต้อง — Star ติด 5 วิ → Star ดับ → Delta ติด
Full Star-Delta ladder in GX Works3
Ladder Star–Delta ครบทุก Rung ใน GX Works3 — Rung 1–3: Main + Star + T0 (5s), Rung 4–6: Delta + T1 interlock, Rung 7: ZRST T0 T1 เคลียร์ Timer ทั้งคู่ตอนหยุด
Star-Delta timing diagram
Timing diagram ของ Start-Delta — START_SW → T0 นับ 5 วินาที → K2 (Star) ON ก่อน → ครบเวลา K2 OFF → K3 (Delta) ON → จนกระทั่ง STOP หรือ Emergency

🧩 The Big One — Build the Star–Delta Rungs

โจทย์ใหญ่ที่สุดของบทนี้ — ประกอบ 4 Rung ของ Star–Delta ทั้งหมด ด้วย 13 บล็อก. เลื่อนข้อความโจทย์ขึ้นไปดูข้อกำหนดแต่ละ Rung:

🎮 ลองเล่น — Star–Delta แบบเต็มระบบ

กด X0 (Start) — สังเกตว่า Y0 (Main) + Y1 (Star) ติดพร้อมกัน → T0 นับขึ้น 5 วินาที → Y1 OFF + Y2 (Delta) ติด · ลอง force X2 (OL) ให้ OFF ระหว่างทาง = จำลอง overload trip:

Interlock สำคัญมาก! ระหว่าง Star (Y1) กับ Delta (Y2) ต้องมีจังหวะที่ ทั้งคู่ดับ สั้น ๆ ก่อนที่อีกตัวจะติด — ไม่งั้น Contactor จะลัดวงจรเสียหายหนัก ในงานจริงนิยมใส่ Off-Delay timer ~50–100 ms ระหว่างสลับ

สรุปสำหรับบทนี้