พิมพ์คำที่ต้องการค้นหา ทั้งภาษาไทยและอังกฤษ

  1. หน้าแรก
  2. คลังความรู้
  3. PLC
  4. ภาษา IEC 61131-3

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

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

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)

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

ชนิดขนาดช่วงค่าใช้กับ
BOOL1 บิตFALSE / TRUEI/O ดิจิทัล สถานะ
INT16 บิต−32 768 … 32 767ค่าดิบแอนะล็อก ตัวนับ
DINT32 บิต−2 147 483 648 … 2 147 483 647ตัวนับใหญ่ ตำแหน่งเอนโค้ดเดอร์
REAL32 บิต IEEE 754~7 หลักนัยสำคัญค่าทางวิศวกรรม PID
TIME32 บิต (ms)T#0ms … T#24d20h…ค่าตั้งไทเมอร์
WORD / DWORD16 / 32 บิตบิตแพทเทิร์นสถานะหลายบิต รีจิสเตอร์ Modbus

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

−2n−1≤x≤2n−1−1n=16⇒−32768…32767-2^{n-1} \le x \le 2^{n-1} - 1 \qquad n = 16 \Rightarrow -32768 \ldots 32767

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

27648×1027648  (ล้น INT ที่ขั้นคูณ)1382427648×10=0  (หารปัดทิ้งก่อนคูณ)\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ช่างหน้างานดูออนไลน์และวิเคราะห์ได้ทันที
ลูปควบคุมกระบวนการ บล็อก PIDFBDเห็นทางไหลของสัญญาณ
คำนวณ สูตรผลิต อาร์เรย์ ข้อความ การสื่อสารSTกระชับ ใช้ลูปและเงื่อนไขได้
เครื่องจักรทำงานเป็นขั้น แบตช์SFC (หรือ ST แบบ CASE)เห็นขั้นปัจจุบัน วินิจฉัยว่าค้างขั้นไหนได้ทันที

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

ควรเขียน PLC ด้วยแลดเดอร์หรือ Structured Text?

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

ฟังก์ชัน (FUNCTION) ต่างจากฟังก์ชันบล็อก (FUNCTION_BLOCK) อย่างไร?

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

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