---
title: "ภาษาโปรแกรม PLC ตาม IEC 61131-3: LD FBD ST SFC และ IL — โปรแกรมเดียวกันในหลายภาษา ชนิดข้อมูล และการเลือกใช้"
url: https://modsengineeringmath.com/learn/plc/iec-languages/
site: "Mod's Engineering Mathematics (อาจารย์มด)"
language: th
updated: 2026-10-14
---

> ภาษามาตรฐานของ PLC ทุกยี่ห้อตาม IEC 61131-3: Ladder Diagram (LD) Function Block Diagram (FBD) Structured Text (ST) Sequential Function Chart (SFC) และ Instruction List (IL) ที่ถูกยกเลิก โปรแกรมควบคุมมอเตอร์เดียวกันเขียนในทุกภาษา ชนิดข้อมูล BOOL INT DINT REAL TIME ค่าคงที่ T#5s ฟังก์ชันกับฟังก์ชันบล็อก การสร้าง FB มอเตอร์ใช้ซ้ำ และเมื่อไรควรใช้ภาษาไหน

ฉบับ Markdown ของ https://modsengineeringmath.com/learn/plc/iec-languages/ สำหรับผู้ช่วย AI และเครื่องมือค้นหา สูตรเขียนเป็น LaTeX ($…$ และ $$…$$) แล็บโต้ตอบและรูปมีเฉพาะในหน้าเว็บ

# ภาษาโปรแกรม PLC ตาม IEC 61131-3: LD FBD ST SFC และ IL — โปรแกรมเดียวกันในหลายภาษา ชนิดข้อมูล และการเลือกใช้

THภาษาไทยENEnglish

// บทที่ 22.5 · PLC · IEC 61131-3 Languages


IEC 61131-3 กำหนดห้าภาษาให้ PLC ทุกยี่ห้อ เพื่อให้คนที่เรียนจากยี่ห้อหนึ่งอ่านอีกยี่ห้อได้ หน้านี้เขียนงานเดียวกัน — มอเตอร์ล็อกตัวเองพร้อมแตรเตือน 5 วินาที — ในทุกภาษา ให้เห็นว่าแต่ละภาษาถนัดอะไร

สรุปใน 30 วินาที

- LD: ตรรกะบิต อ่านเหมือนวงจรรีเลย์ · FBD: บล็อกต่อสาย เหมาะงานกระบวนการ

- ST: ภาษาข้อความแบบ Pascal เหมาะคำนวณ ลูป ข้อมูล สเตตแมชชีน

- SFC: ขั้นและเงื่อนไข เหมาะงานลำดับ · IL: ถูกยกเลิกในฉบับ 2013

- FUNCTION ไม่มีหน่วยความจำ · FUNCTION_BLOCK มีหน่วยความจำ (ไทเมอร์ PID)

## โจทย์เดียว ห้าภาษา พื้นฐาน

อินพุต: STOP (NC) START · เอาต์พุต: แตร (Horn) สายพาน (Conveyor) · กด START แล้วแตรดัง 5 s จากนั้นสายพานเดิน กด STOP หยุดทั้งหมด

### Ladder Diagram (LD)

I0.0(STOP) I0.1(START) M0.0
──┤ ├────────┬──┤ ├──────┬───────────────────────( )── สั่งเดิน (ล็อกตัวเอง)
│ M0.0 │
└──┤ ├──────┘
M0.0 ┌─TON T1──┐
──┤ ├────────────────────────┤IN Q├─────────── นับ 5 s
T#5s ──┤PT ET├
M0.0 T1 Q0.1
──┤ ├────────┤/├────────────────────────────────( )── แตร
T1 Q0.0
──┤ ├───────────────────────────────────────────( )── สายพาน

### Function Block Diagram (FBD)

┌──────┐
START ───┤ ≥1 │ ┌──────┐
Run ─────┤ ├──────┤ & ├──── Run
└──────┘ STOP─┤ │
└──────┘
┌─TON───┐ ┌──────┐
Run ─────┤IN Q├──── T1.Q ───────┤ & │
T#5s ───┤PT ET├ Run ─────────┤ ├──── Horn
└───────┘ T1.Q ──o─────┤ │ (o = กลับค่า)
└──────┘
T1.Q ───────────────────────────────────────── Conveyor

### Structured Text (ST)

VAR
Run : BOOL;
T1 : TON;
END_VAR

Run := (PB_Start OR Run) AND PB_Stop_NC; // ล็อกตัวเอง
T1(IN := Run, PT := T#5S); // เรียกอินสแตนซ์ไทเมอร์ทุกสแกน
Horn := Run AND NOT T1.Q;
Conveyor := T1.Q;

### Sequential Function Chart (SFC)

╔══════╗
║ 0 รอ ║
╚══╤═══╝
──┼── START
┌──┴───┐ ┌────────────┐
│1 เตือน├───┤ N Horn │
└──┬───┘ └────────────┘
──┼── Step1.T >= T#5s
┌──┴───┐ ┌────────────┐
│2 เดิน ├───┤ N Conveyor │
└──┬───┘ └────────────┘
──┼── NOT PB_Stop_NC
└──────► กลับขั้น 0

### Instruction List (IL) — ภาษาที่ถูกยกเลิก

LD PB_Start
OR Run
AND PB_Stop_NC
ST Run
IL คล้ายภาษาแอสเซมบลี ถูกตัดออกจาก IEC 61131-3 ฉบับที่ 3 (2013) แต่ยังพบในโปรแกรมเก่า (Siemens STL, Mitsubishi List)

## ชนิดข้อมูลและค่าคงที่ กลาง

| ชนิด | ขนาด | ช่วงค่า | ใช้กับ |

| BOOL | 1 บิต | FALSE / TRUE | I/O ดิจิทัล สถานะ |

| INT | 16 บิต | −32 768 … 32 767 | ค่าดิบแอนะล็อก ตัวนับ |

| DINT | 32 บิต | −2 147 483 648 … 2 147 483 647 | ตัวนับใหญ่ ตำแหน่งเอนโค้ดเดอร์ |

| REAL | 32 บิต IEEE 754 | ~7 หลักนัยสำคัญ | ค่าทางวิศวกรรม PID |

| TIME | 32 บิต (ms) | T#0ms … T#24d20h… | ค่าตั้งไทเมอร์ |

| WORD / DWORD | 16 / 32 บิต | บิตแพทเทิร์น | สถานะหลายบิต รีจิสเตอร์ Modbus |

L1 Signed integer range ช่วงค่าจำนวนเต็มแบบมีเครื่องหมาย

$$-2^{n-1} \le x \le 2^{n-1} - 1 \qquad n = 16 \Rightarrow -32768 \ldots 32767$$

L2 Integer pitfalls in scaling กับดักการคำนวณจำนวนเต็ม

$$\frac{27648 \times 10}{27648} \;\text{(ล้น INT ที่ขั้นคูณ)} \qquad \frac{13824}{27648}\times 10 = 0 \;\text{(หารปัดทิ้งก่อนคูณ)}$$

วิธีหลีกเลี่ยง: แปลงเป็น REAL ก่อนคำนวณ (INT_TO_REAL) หรือใช้ DINT และคูณก่อนหาร — ตัวอย่างการสเกลอยู่ใน อนาล็อก · PID

## สร้างฟังก์ชันบล็อกมอเตอร์ใช้ซ้ำ ขั้นสูง

โรงงานที่มีมอเตอร์ 50 ตัว ไม่ควรเขียนวงจรล็อกตัวเอง ตรวจป้อนกลับ และนับชั่วโมงซ้ำ 50 ครั้ง สร้าง FB หนึ่งตัวแล้วเรียก 50 อินสแตนซ์

FUNCTION_BLOCK FB_Motor
VAR_INPUT Start, Stop_NC, OL_NC, Feedback : BOOL; FbTime : TIME := T#2S; END_VAR
VAR_OUTPUT Run, Fault : BOOL; Hours : REAL; END_VAR
VAR Cmd : BOOL; TFb : TON; THr : TON; END_VAR

Cmd := (Start OR Cmd) AND Stop_NC AND OL_NC AND NOT Fault;
TFb(IN := Cmd XOR Feedback, PT := FbTime); // สั่งแล้วไม่มีป้อนกลับ หรือไม่สั่งแต่มีป้อนกลับ
IF TFb.Q THEN Fault := TRUE; END_IF // รีเซ็ต Fault จาก HMI
Run := Cmd;
THr(IN := Feedback AND NOT THr.Q, PT := T#36S); // พัลส์ทุก 0.01 ชม.
IF THr.Q THEN Hours := Hours + 0.01; END_IF
END_FUNCTION_BLOCK

## เลือกภาษาให้เหมาะกับงาน

| งาน | ภาษาที่เหมาะ | เหตุผล |

| อินเตอร์ล็อก ล็อกตัวเอง ตรรกะความปลอดภัย | LD | ช่างหน้างานดูออนไลน์และวิเคราะห์ได้ทันที |

| ลูปควบคุมกระบวนการ บล็อก PID | FBD | เห็นทางไหลของสัญญาณ |

| คำนวณ สูตรผลิต อาร์เรย์ ข้อความ การสื่อสาร | ST | กระชับ ใช้ลูปและเงื่อนไขได้ |

| เครื่องจักรทำงานเป็นขั้น แบตช์ | SFC (หรือ ST แบบ CASE) | เห็นขั้นปัจจุบัน วินิจฉัยว่าค้างขั้นไหนได้ทันที |

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

ควรเขียน PLC ด้วยแลดเดอร์หรือ Structured Text?
ใช้ตามงาน: ตรรกะเปิด-ปิดและอินเตอร์ล็อกที่ช่างต้องอ่านวิเคราะห์หน้างาน แลดเดอร์เหมาะที่สุด การคำนวณ การจัดการข้อมูล สูตรผลิต ลูป สเตตแมชชีนที่ซับซ้อน ST สั้นและชัดกว่า ลำดับขั้นใช้ SFC โปรเจกต์จริงมักผสมหลายภาษา โดยห่อส่วนที่ซับซ้อนเป็นฟังก์ชันบล็อกแล้วเรียกจากแลดเดอร์

ฟังก์ชัน (FUNCTION) ต่างจากฟังก์ชันบล็อก (FUNCTION_BLOCK) อย่างไร?
ฟังก์ชันไม่มีหน่วยความจำ ให้ผลเดียวกันทุกครั้งเมื่ออินพุตเดียวกัน เช่น การสเกลค่า ฟังก์ชันบล็อกมีตัวแปรภายในที่คงค่าข้ามสแกน ต้องสร้างอินสแตนซ์ เช่น ไทเมอร์ เคาน์เตอร์ PID หรือบล็อกควบคุมมอเตอร์

มด

อาจารย์มด · ธีรวุฒิ แสวงบุญ
อาจารย์สาขาวิชาวิศวกรรมไฟฟ้า มหาวิทยาลัยราชภัฏธนบุรี สมุทรปราการ · ดูโปรไฟล์

## คำถามที่พบบ่อย (FAQ)

**ควรเขียน PLC ด้วยแลดเดอร์หรือ Structured Text?**
ใช้ตามงาน: ตรรกะเปิด-ปิดและอินเตอร์ล็อกที่ช่างต้องอ่านวิเคราะห์หน้างาน แลดเดอร์เหมาะที่สุด การคำนวณ การจัดการข้อมูล สูตรผลิต ลูป สเตตแมชชีนที่ซับซ้อน ST สั้นและชัดกว่า ลำดับขั้นใช้ SFC โปรเจกต์จริงมักผสมหลายภาษา โดยห่อส่วนที่ซับซ้อนเป็นฟังก์ชันบล็อกแล้วเรียกจากแลดเดอร์

**ฟังก์ชัน (FUNCTION) ต่างจากฟังก์ชันบล็อก (FUNCTION_BLOCK) อย่างไร?**
ฟังก์ชันไม่มีหน่วยความจำ ให้ผลเดียวกันทุกครั้งเมื่ออินพุตเดียวกัน เช่น การสเกลค่า ฟังก์ชันบล็อกมีตัวแปรภายในที่คงค่าข้ามสแกน ต้องสร้างอินสแตนซ์ เช่น ไทเมอร์ เคาน์เตอร์ PID หรือบล็อกควบคุมมอเตอร์
