Intermediate
11 rungs
2 I/O

Barcode Scanner ส่งข้อมูลเข้า PLC ผ่าน RS232/RS485

Barcode Scanner → PLC (RS232/RS485 → ASCII to D)

รับ ASCII barcode จาก scanner ผ่าน RS232/RS485 — เก็บใน D buffer, แยก string เมื่อเจอ CR (carriage return), ส่งไป production logic

หลักการ

Barcode scanner industrial ส่วนใหญ่ส่งข้อมูลออกผ่าน:

  • RS232 (1-to-1 ตรงๆ ไป COM port)
  • RS485 (multi-drop)
  • USB-Serial (เห็นเป็น COM virtual)
  • TCP/IP (Cognex, Datalogic รุ่นใหม่)

ตัวอย่างนี้รับผ่าน RS232 / RS485 ASCII ที่ Samkoon PLC รองรับ ผ่านคำสั่ง RS (Receive Serial)

คำสั่ง RS

RS K1 D300 K20 D330
   │  │    │   │
   │  │    │   └─ Receive flag D-register
   │  │    └───── Max length (chars)
   │  └────────── Receive buffer start (D300, D301, ... D309)
   └───────────── COM port (K1 = COM1, K2 = COM2)

PLC จะ:

  1. รอ ASCII bytes จาก COM
  2. เก็บ 2 ตัวอักษรต่อ D (เช่น D300 บน byte = 'A', low byte = 'B')
  3. เพิ่ม D330 (received count) ทุก byte ที่ได้
  4. Trigger ขอบขาขึ้นของ M8160 (received completion flag) เมื่อหยุดรับ (timeout หรือเจอ terminator)

ขั้นตอนการทำงาน

Scanner ยิง barcode "1234567890"
  ↓
Scanner ส่ง "1234567890\r\n" (CR LF terminator)
  ↓
PLC RS เริ่ม buffer ใน D300
  D300 = '21' (low='1', high='2' — little-endian)
  D301 = '43' (low='3', high='4')
  D302 = '65'
  D303 = '87'
  D304 = '09' (low='0', high='9')
  D305 = (CR) … (LF) ในไบต์ถัดไป
  ↓
M8160 (RS done flag) ↑ rising edge
  ↓
Logic: D330 (length) = 12 (รวม CR LF)
  ↓
Decision:
  ✓ มี barcode ใหม่ → SET M0 (process)
  ✗ Length = 0 → noise / partial → ไม่ทำอะไร

ตัวอย่างนี้ทำอะไรเพิ่ม

หลังรับ barcode สำเร็จ:

  1. Match กับ recipe — ถ้า barcode = "PROD-A" → set recipe 1
  2. เพิ่ม count — D400 (production count) +1
  3. Reset buffer — เตรียมรับครั้งถัดไป

Logic Flow

First scan
  ↓
RS K1 D300 K20 D330 (start receiving)
  ↓
M8160↑ (RS complete flag)
  ↓
ถ้า D330 > 5 (length เกิน 5 = ของจริง ไม่ใช่ noise):
  ✓ INC D400 (production count)
  ✓ MOV D300 D500 (เก็บ barcode ล่าสุด)
  ✓ SET M0 (process trigger)
  ↓
Reset RS — เริ่มรอ frame ถัดไป (RST D330, RST M8160)

ตั้งค่า COM ใน IDE

ก่อนใช้คำสั่ง RS ต้องตั้งใน SamSoar2022:

  1. Project → Configuration → COM1 (or COM2)
  2. Mode: Free Protocol (ไม่ใช่ Modbus)
  3. Baud Rate: 9600 (ตรวจคู่มือ scanner — มาตรฐาน 9600 N 8 1)
  4. Parity: None, Data: 8, Stop: 1

Scanner Setup

ที่ scanner ต้องตั้ง:

  • Output mode: Continuous (ส่งทันทีหลัง scan)
  • Postfix / Suffix: \r\n หรือ \r อย่างใดอย่างหนึ่ง
  • Code type: ตามรหัสที่ใช้ (Code128, EAN-13, QR)

ขยายเพิ่ม

  • Lookup table — เก็บ recipe matching ใน D700-D799 (key) + D800-D899 (recipe)
  • Database — ส่ง barcode ผ่าน Modbus ไป PC → ดึงข้อมูลจาก SQL
  • Reject — ถ้า barcode ไม่อยู่ใน whitelist → push divert solenoid (Y3)
  • Print label — ใช้ MQTT label designer ทำ label จาก barcode → printer

โปรแกรม PLC

Barcode Scanner ส่งข้อมูลเข้า PLC ผ่าน RS232/RS485 — Barcode Scanner → PLC (RS232/RS485 → ASCII to D)
รับ ASCII barcode จาก scanner ผ่าน RS232/RS485 — เก็บใน D buffer, แยก string เมื่อเจอ CR (carriage return), ส่งไป production logic
N0ตั้งค่าเริ่มต้น + รับข้อมูลต่อเนื่อง
First scan — เคลียร์ความยาวที่รับ, เริ่ม buffer
M8150MOVK0, D330
RS แบบต่อเนื่อง — รับ ASCII ไปเก็บที่ D300, สูงสุด 20 ตัวอักษร, ความยาวอยู่ที่ D330
M8151RSK1, D300, K20, D330
N1ประมวลผลเมื่อได้ Barcode ถูกต้อง
เมื่อ RS ครบ (M8160 ขอบขาขึ้น) และความยาว > 5 → ทำเครื่องหมายว่ามี barcode ใหม่
M8160D330 > K5SETM0
เมื่อได้ barcode ถูกต้อง — เพิ่มเคาน์เตอร์การผลิต (D400)
M0INCD400, D400
Copy buffer ของ barcode ที่รับมาไปเก็บถาวรที่ D500-D509 (10 word = 20 ตัวอักษร)
M0FMOVD300, D500, K10
N2Pulse กระตุ้น Downstream + Reset
กระตุ้น logic ปลายน้ำผ่าน Y0 — pulse 100ms
M0TONTV0, K1
Output Y0 ติด 100ms แล้วดับเองด้วย T0 + RST M0
M0T0Y0
หลัง pulse 100ms — ล้าง M0 และ reset RS (M8160) เพื่อพร้อมรับ barcode ถัดไป
T0RSTM0
Reset flag RS done — เพื่อให้รับ barcode ถัดไปได้
T0RSTM8160
Reset ความยาวที่รับ
T0MOVK0, D330
N3Reset เคาน์เตอร์เอง
Reset เคาน์เตอร์ด้วยมือ — ปุ่ม operator (X1)
X1MOVK0, D400
Network count: 4, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X1ปุ่ม Reset เคาน์เตอร์ (NO)
Y0Trigger pulse (100ms) — ออกทุกครั้งที่ scan ถูกต้อง

Parameters ที่ปรับได้

D300-D309default: 0

Buffer รับข้อมูล (สูงสุด 20 ตัวอักษร) — แต่ละ D = 2 ASCII bytes (low=ตัวแรก, high=ตัวที่สอง)

D330default: 0

จำนวนไบต์ที่รับ (0 ถ้าไม่มีข้อมูล, > 0 หลัง RS เสร็จ)

D400default: 0

จำนวน scan ทั้งหมดในกะนี้

D500-D509default:

Barcode ล่าสุด (copy ผ่าน FMOV) — สำหรับโชว์บน HMI หรือประมวลผลต่อ

M0default: 0

Flag barcode ใหม่ — ติดเมื่อ scan ถูกต้อง, auto-clear หลัง 100ms

M8160default: 0

Special bit — Flag RS complete: PLC จะ SET; ladder ต้อง RST หลังใช้งาน

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

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

ทำไม buffer เป็น D ไม่ใช่ string?

PLC ไม่มี string type — เก็บข้อมูลใน 16-bit word ASCII 1 char = 8-bit, เก็บได้ 2 ตัวต่อ D D300 = 0x4131 (low=0x31='1', high=0x41='A') = 'A1' ใช้ FMOV / RD3A เพื่อ copy ไป HMI ที่รู้จัก ASCII

Scanner ใช้ Code128 ได้ไหม?

ได้ ทุก scanner รุ่นใหม่ — ใช้ ASCII output Free Protocol ของ PLC รับ ASCII ทั้งหมด (0x00-0xFF) ปัญหาเดียวอาจเป็น Code128 ที่มี non-printable chars (FNC1, etc.) — แก้โดยตั้ง scanner ให้ Strip Control Chars

ถ้า scanner ส่ง 30 chars แต่ buffer 20 จะเกิดอะไร?

RS limit = 20 — ส่วนเกินถูกตัดทิ้ง สามารถเพิ่มเป็น K30 ใน RS instruction และเพิ่ม buffer D300-D314 (15 word = 30 chars) ใน FMOV ก็แก้ไปตาม

ทำไมต้อง RST M8160?

M8160 = RS complete flag — PLC SET เมื่อรับเสร็จ, **ไม่ AUTO-RST** ถ้าไม่ RST → ครั้งถัดไป LDP M8160 ไม่เกิดขอบขาขึ้น (ค้างอยู่ที่ ON) → ladder ไม่เห็นว่ามี barcode ใหม่ ต้อง RST หลัง consume เพื่อ ready รับครั้งถัดไป

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

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