Intermediate
11 rungs
10 I/O

นับสัญญาณ 8 อินพุต แล้วรวมยอด (Totalizer)

8-Input Counter & Totalizer

นับพัลส์ขอบขาขึ้นที่ X0–X7 ด้วยตัวนับขึ้น 32-bit (CTU) 8 ตัว แล้วรวมยอดทั้งหมดเป็นเลข 32-bit ค่าเดียว (ADDD) ส่งขึ้น HMI/SCADA — ใช้ Counter ไม่ใช่ INC จึงไม่นับซ้ำทุก scan และไม่พลาดพัลส์

โจทย์

มีสัญญาณดิจิทัล 8 เส้นเข้าที่ X0–X7 (เช่น proximity 8 ตัวจาก 8 ช่องทาง, พัลส์จากเครื่องนับชิ้นงาน 8 หัว, หรือ flow switch 8 จุด) ต้อง

  1. นับจำนวนครั้ง ที่แต่ละอินพุตเปลี่ยนสถานะ OFF→ON
  2. รวมยอดทั้ง 8 ช่อง เป็นตัวเลขเดียว เพื่อแสดงบน HMI / ส่งขึ้น SCADA

X0–X7 คือกลุ่มอินพุตชุดแรกเต็มกลุ่มพอดี (PLC Samkoon ใช้เลขฐานแปด — หลัง X7 คือ X10) จึงเหลือ X10 ไว้เป็นปุ่ม Reset

Counter หรือ Increment ?

โจทย์นี้ตอบชัดว่า ใช้ Counter (CTU) ไม่ใช่ INC เหตุผล

ประเด็นCTU (Counter)INC (Increment)
ตรวจขอบขาขึ้นเองใช่LD X0 / CTU นับครั้งเดียวต่อพัลส์ไม่ — ต้องใส่ LDP เองทุกเส้น มิฉะนั้นบวกทุก scan
ความหมายของโค้ด"นับจำนวนครั้งที่ X0 ติด" ตรงตัว"บวกรีจิสเตอร์ +1" ต้องตีความเอง
ResetRST C200 เคลียร์ทั้งค่าและบิตในคำสั่งเดียวต้อง MOV K0 เอง
ค้างค่า (retentive)ค้างข้าม STOP/RUN — totalizer ไม่รีเซ็ตเองตอนไฟดับขึ้นกับชนิด D register
พิสัย32-bit (C200–C234) ถึง 2,147,483,647 ฟรี16-bit ต้องใช้ INCD เองถ้าต้องการ 32-bit

จุดพลาดคลาสสิกของ INC: เขียน LD X0 / INC D0 D0 ตรงๆ ถ้าชิ้นงานค้างใต้เซ็นเซอร์ ค่าจะเด้งขึ้น 100+ ใน 1 วินาที เพราะบวกทุกรอบสแกน — CTU ไม่มีปัญหานี้ เพราะตรวจ "ขอบขาขึ้น" ให้ในตัว

เมื่อไหร่จึงใช้ INC/DEC แทน — เมื่อต้องนับขึ้นและลง (accumulator) เช่น นับกล่องเข้า-ออกใน buffer (ดูตัวอย่าง conveyor-accumulator) หรือเมื่อต้องบวกทีละค่าที่ไม่ใช่ 1 สำหรับโจทย์ "นับขึ้นอย่างเดียวแล้วรวมยอด" Counter เหมาะกว่า

ทำไมต้อง 32-bit

ถ้าตัวนับแต่ละตัวเป็น 16-bit (สูงสุด 32,767) การ รวม 8 ตัว อาจเกิน 32,767 ได้ง่าย → overflow ทันที จึงเลือก ตัวนับ 32-bit (C200–C207) และรวมด้วย ADDD (บวกแบบ 32-bit) ลงยอดรวม D100 ซึ่งกินคู่รีจิสเตอร์ D100:D101 หมดห่วงเรื่องล้น (สูงสุด ~2.1 พันล้าน)

หมายเหตุการออกแบบ

  • Preset ตั้งสูงสุด (K2147483647) → บิตตัวนับ Cxxx ไม่ถูกใช้ อ่านยอดจาก CV โดยตรง ใช้ CTU เป็น totalizer ล้วน
  • คำนวณยอดใหม่ทุก scan — รัง ADDD เขียนทับ D100 ตั้งแต่ CV200 + CV201 จึงไม่มีค่าค้างสะสมผิด ไม่ต้องเคลียร์ D100 ก่อน
  • คอนแทค M8151 ตัวเดียวแตกขนาน (MPS/MRD/MPP) ป้อน ADDD ทั้ง 7 บล็อก แทนการ เขียน LD M8151 ซ้ำทุกรัง — อ่านง่ายกว่าและตรงกับวิธีวาดแลดเดอร์จริง
  • Reset แบบ level — กดค้าง X10 ก็ล้างตัวนับค้างไว้ ปล่อยแล้วนับต่อ (Network Reset รันหลัง CTU ในรอบสแกนเดียวกัน ค่าจึงถูกเคลียร์)

ขยายเพิ่ม

  • นับเร็ว (high-speed) ถ้าพัลส์ > ~หลายสิบ Hz ตัวนับซอฟต์แวร์จะพลาด ให้ใช้ตัวนับความเร็วสูง C235–C255 ที่ผูกกับฮาร์ดแวร์อินพุต (HSC)
  • ยอดต่อกะ เพิ่มปุ่ม/เวลา รีเซ็ตอัตโนมัติต้นกะ แล้ว MOV ยอดเก่าเก็บลง D อื่นก่อนล้าง
  • แจ้งครบเป้าแต่ละช่อง ตั้ง preset แต่ละ CTU ให้เป็นเป้าจริง แล้วใช้บิต C200..C207 จุดไฟ

ลำดับการทำงาน

  1. อินพุต
    X0–X7
    พัลส์ขอบขาขึ้น 8 อินพุต (proximity / นับชิ้นงาน / flow switch)
    CTU ตรวจขอบขาขึ้นให้เอง — ไม่ต้องใส่ LDP
  2. ประมวลผล
    CV200–CV207
    ตัวนับขึ้น 32-bit 8 ตัว — นับครั้งเดียวต่อพัลส์ ไม่นับซ้ำทุก scan
    รวมยอดทุก scan ผ่านคอนแทค M8151 (always ON)
  3. ประมวลผล
    D100 = CV200 + CV201 + … + CV207
    ยอดรวม 32-bit เขียนทับทุก scan (กินคู่รีจิสเตอร์ D100:D101)
  4. เอาต์พุต
    D100 ≥ K1000 → Y0 ติด
    ไฟแจ้งยอดรวมครบเป้า (ปรับค่า K1000 ได้ตามงานจริง)
  5. รีเซ็ต
    ปุ่ม Reset (X10) → RST C200–C207
    ตัวนับทุกตัวกลับเป็น 0
    ยอดรวม D100 กลับเป็น 0 ในรอบสแกนถัดไปเอง เพราะ ADDD คำนวณใหม่ทุก scan

โปรแกรม PLC

นับสัญญาณ 8 อินพุต แล้วรวมยอด (Totalizer) — 8-Input Counter & Totalizer
นับพัลส์ขอบขาขึ้นที่ X0–X7 ด้วยตัวนับขึ้น 32-bit (CTU) 8 ตัว แล้วรวมยอดทั้งหมดเป็นเลข 32-bit ค่าเดียว (ADDD) ส่งขึ้น HMI/SCADA — ใช้ Counter ไม่ใช่ INC จึงไม่นับซ้ำทุก scan และไม่พลาดพัลส์
N0Count Inputs (CTU 32-bit)
X0 — CTU ตรวจขอบขาขึ้นให้เอง นับเข้าตัวนับ C200 (32-bit) preset ตั้งสูงสุดเพื่อไม่ใช้บิต
X0CTUCV200, K2147483647
X1 → ตัวนับ C201
X1CTUCV201, K2147483647
X2 → ตัวนับ C202
X2CTUCV202, K2147483647
X3 → ตัวนับ C203
X3CTUCV203, K2147483647
X4 → ตัวนับ C204
X4CTUCV204, K2147483647
X5 → ตัวนับ C205
X5CTUCV205, K2147483647
X6 → ตัวนับ C206
X6CTUCV206, K2147483647
X7 → ตัวนับ C207
X7CTUCV207, K2147483647
N1Sum All Counts (ADDD → D100)
M8151 (always ON) ตัวเดียวแตกขนานป้อน ADDD ทุกบล็อก — รวมยอดทุก scan: D100 = CV200 + CV201 + ... + CV207 (32-bit, กินคู่ D100:D101)
M8151ADDDCV200, CV201, D100ADDDD100, CV202, D100ADDDD100, CV203, D100ADDDD100, CV204, D100ADDDD100, CV205, D100ADDDD100, CV206, D100ADDDD100, CV207, D100
N2Grand Total Reached Setpoint
ยอดรวมทั้งหมด (D100, เทียบแบบ 32-bit) ≥ ค่าตั้ง K1000 → ไฟแจ้งครบเป้า (Y0)
D100 >= K1000Y0
N3Reset All Counters
ปุ่ม Reset (X10) ตัวเดียวแตกขนาน RST เคลียร์ตัวนับ C200–C207 ทั้ง 8 ช่องพร้อมกัน (ทั้งค่าและบิต ยอดรวมกลับเป็น 0 รอบสแกนถัดไป)
X10RSTC200RSTC201RSTC202RSTC203RSTC204RSTC205RSTC206RSTC207
Network count: 4, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0อินพุตนับช่องที่ 1 (NO)พัลส์ขอบขาขึ้น = นับ 1
X1อินพุตนับช่องที่ 2 (NO)
X2อินพุตนับช่องที่ 3 (NO)
X3อินพุตนับช่องที่ 4 (NO)
X4อินพุตนับช่องที่ 5 (NO)
X5อินพุตนับช่องที่ 6 (NO)
X6อินพุตนับช่องที่ 7 (NO)
X7อินพุตนับช่องที่ 8 (NO)
X10ปุ่ม Reset (NO)เลขฐานแปด — อินพุตถัดจาก X7
Y0ไฟแจ้งยอดรวมครบเป้าติดเมื่อ D100 ≥ K1000

Parameters ที่ปรับได้

CV200–CV207default: 0

ค่าตัวนับแต่ละช่อง (32-bit) — อ่านขึ้น HMI เพื่อโชว์ยอดต่อช่อง

D100 (คู่ D100:D101)default: 0

ยอดรวมทั้ง 8 ช่อง (32-bit) — bind เข้า object ตัวเลข 32-bit บน HMI/SCADA

K2147483647 (preset CTU)default: 2147483647

ตั้งสูงสุดเพื่อให้บิตตัวนับไม่ทำงาน ใช้ CTU เป็น totalizer อ่านค่า CV ตรงๆ

K1000 (ใน LDD>=)default: 1000

ยอดรวมที่ทำให้ไฟ Y0 ติด — ปรับตามเป้างานจริง หรือเปลี่ยนเป็น D เพื่อตั้งจาก HMI

อุปกรณ์ที่แนะนำ

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

ใช้ Counter (CTU) หรือ Increment (INC) ดี?

สำหรับ 'นับสัญญาณอินพุตขึ้นอย่างเดียวแล้วรวมยอด' ใช้ CTU ดีกว่า เพราะ CTU ตรวจขอบขาขึ้นให้ในตัว (เขียน LD X0 / CTU ก็นับครั้งเดียวต่อพัลส์) ไม่เสี่ยงบั๊ก 'บวกทุก scan' แบบ INC ที่ต้องใส่ LDP เอง อีกทั้ง RST เคลียร์ทั้งค่าและบิตในคำสั่งเดียว และค่าค้างข้าม STOP/RUN เหมาะกับ totalizer ส่วน INC/DEC เก็บไว้ใช้ตอนต้องนับขึ้น-ลง (accumulator) หรือบวกทีละค่าที่ไม่ใช่ 1

ทำไมตัวนับและยอดรวมต้องเป็น 32-bit?

ตัวนับ 16-bit สูงสุด 32,767 เมื่อรวม 8 ช่องผลลัพธ์เกิน 32,767 ได้ง่าย → overflow จึงใช้ตัวนับ 32-bit (C200–C207) และบวกด้วย ADDD ลงยอดรวม D100 ที่กินคู่ D100:D101 รองรับได้ถึง ~2.1 พันล้าน

ต้องใส่ LDP หน้า CTU ไหม?

ไม่ต้อง คู่มือ SamSoar ระบุว่า CTU นับทุกครั้งที่กระแสเปลี่ยนเป็นขอบขาขึ้นอยู่แล้ว (ตัวอย่างในคู่มือใช้ LD X000 / CTU CV0 D0) ถ้าใส่ LDP เพิ่มกลายเป็นตรวจขอบซ้อนขอบโดยไม่จำเป็น

พัลส์เร็วมากแล้วนับพลาด ทำอย่างไร?

ตัวนับซอฟต์แวร์ (C0–C234) sample แค่รอบละครั้งต่อ scan ถ้าพัลส์เร็วกว่าเวลาสแกน (ราว > หลายสิบ Hz) จะพลาด ให้ย้ายไปใช้ตัวนับความเร็วสูง C235–C255 ที่ผูกกับฮาร์ดแวร์อินพุต (HSC) ซึ่งนับด้วยวงจรฮาร์ดแวร์ไม่ขึ้นกับเวลาสแกน

ยอดรวม D100 ไม่กลับเป็น 0 ทันทีหลังกด Reset?

Network รวมยอด (ADDD) รันก่อน Network Reset ในรอบสแกนเดียวกัน รอบที่กดจึงยังคำนวณจากค่าก่อนล้าง พอรอบถัดไปตัวนับเป็น 0 หมด ADDD จะได้ D100 = 0 เอง — ช้าแค่ 1 scan (มองไม่เห็นด้วยตา)

วิธีนำเข้าไฟล์ใน SamSoar2022

  1. ดาวน์โหลดไฟล์ multi-input-counter-totalizer.csv จากแท็บ CSV ด้านบน
  2. เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
  3. เมนู File → Import → เลือกไฟล์ .csv ที่เพิ่งดาวน์โหลด
  4. กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
  5. ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC