นับสัญญาณ 8 อินพุต แล้วรวมยอด (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 จุด) ต้อง
- นับจำนวนครั้ง ที่แต่ละอินพุตเปลี่ยนสถานะ OFF→ON
- รวมยอดทั้ง 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" ต้องตีความเอง |
| Reset | RST 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 จุดไฟ
ลำดับการทำงาน
- อินพุตX0–X7พัลส์ขอบขาขึ้น 8 อินพุต (proximity / นับชิ้นงาน / flow switch)CTU ตรวจขอบขาขึ้นให้เอง — ไม่ต้องใส่ LDP
- ประมวลผลCV200–CV207ตัวนับขึ้น 32-bit 8 ตัว — นับครั้งเดียวต่อพัลส์ ไม่นับซ้ำทุก scanรวมยอดทุก scan ผ่านคอนแทค M8151 (always ON)
- ประมวลผลD100 = CV200 + CV201 + … + CV207ยอดรวม 32-bit เขียนทับทุก scan (กินคู่รีจิสเตอร์ D100:D101)
- เอาต์พุตD100 ≥ K1000 → Y0 ติดไฟแจ้งยอดรวมครบเป้า (ปรับค่า K1000 ได้ตามงานจริง)
- รีเซ็ตปุ่ม Reset (X10) → RST C200–C207ตัวนับทุกตัวกลับเป็น 0ยอดรวม D100 กลับเป็น 0 ในรอบสแกนถัดไปเอง เพราะ ADDD คำนวณใหม่ทุก scan
โปรแกรม PLC
I/O Assignment
| Address | Role | Note |
|---|---|---|
| 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
- ดาวน์โหลดไฟล์
multi-input-counter-totalizer.csvจากแท็บ CSV ด้านบน - เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
- เมนู File → Import → เลือกไฟล์
.csvที่เพิ่งดาวน์โหลด - กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
- ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC
