วันอาทิตย์ที่ 5 มีนาคม พ.ศ. 2560

Print อักษรใหญ่,Barcode ด้วย ESC-Code

Print  อักษรใหญ่,Barcode ด้วย ESC-Code

เครดิต : หัวข้อนี้เป็นความสำเร็จของ รุ่นพี่ที่ทำงานคนหนึ่งครับ (พี่บูลย์)
        เกิดจาก IBM Printer มีราคาแพงมากกว่า Printer ทั่วไป 2-3 เท่า
        ในขณะที่ บางงาน ดูไม่คุ้มที่ต้องทำตามขั้นตอนของ IBM

        IBM ได้เตรียม Printer File ไว้สำหรับการทำ อักษร(Font)ใหญ่ หรือ Barcode
แต่เท่าที่ทราบ   จนถึงปัจจุบัน (ปี 2016) ต้องใช้ Printer เฉพาะรุ่นที่  รองรับ *IPDS ได้
(ปี 2015 ได้ทราบว่า  Laser Printer หลายรุ่นทำได้แล้ว - แค่ลง PTF เพิ่ม)

        ทางเลือกอื่น  ในการพิมพ์  อักษร(Font)ใหญ่ หรือ Barcode
บน Dot Metric Printer ที่ไม่รองรับ *IPDS
คือ  การพิมพ์โดยผ่าน Mode = ESC-Code  ของ Printer

Q: ทำไมต้องใช้ Dot Metric Printer 
A: ใช้กับ  งานที่ต้องมี Copy หรือ   ความเร็วสูง, ปริมาณมาก, ทนทาน (ราคาถูกกว่า)
     ก่อนเลือกใช้ ขอให้คำนวนต้นทุนก่อนน๊ะครับ! (ปี 2017 Laser Printer ราคาถูกลงมามาก)

Q: ข้อเสียของ Dot Metric Printer มีอะไร ?
A: อักษร/Barcode "ไม่ชัด"  -  ไม่เหมาะกับส่งให้ลูกค้า 
     ถ้าใช้กันเอง (ต้องมี Barcode ที่ผ่านการทดสอบ ว่าอ่านได้)

ตย. ใช้ Printer รุ่น   Fujitsu DL-6400   เมื่อต่อกับ Window
(ยุ่ง-1) Config Window/Printer
           1.1 ต้องติดตั้ง Driver = EPSON LQ 2xxx
                ผมเคยทดลองใช้ Driver ของ Fujistu ตรงๆ   สั่งพิมพ์ ESC ไม่ได้!
           1.2 Config ให้ Printer ให้ทำงาน กับ ESC ได้  (ผมเข้าใจว่ามันตั้งค่าไว้แล้ว)
                  EUMULATE =ESC/P2
(ยุ่ง-2) เขียนโปรแกรม
           2.1 ก่อนที่ RPG จะเริ่ม  เปิด/สร้าง Spool File
                    OVRPRTF  QPRINT   RPLUNPRT(*NO)   
                    หมายถึง   ไม่ต้อง auto clear ค่าถ้าพบ  อักษรพิเศษ (กลุ่ม "คำสั่ง" ESC)
                    ทำที่ CL หรือ ทำใน RPG (เรียกใช้ ก่อน OPEN)
           2.2 แทรก  ESC-Command
                   - เปิดใช้
                   - (ต่อไปนี้) ให้พิมพ์  อักษรใหญ่/Barcode
                   - ข้อความที่จะพิมพ์
                   - ยกเลิก การพิมพ์ อักษรใหญ่/Barcode

ESC-Command

      ใครสนใจไปลองอ่านดูน๊ะครับ มีรายละเอียด น่าสนใจมาก
      แบบย่อๆ คือ EPSON ได้ฝังชุดคำสั่ง  ให้เราสามารถสั่งพิมพ์ได้โดยตรง เป็นชุดคำสั่งไม่มาก
เช่น อักษรใหญ่ขึ้น 1,2 เท่า  อักษรกว้างขึ้น 1,2 เท่า  เป็นต้น
      ต้องไปอ่านคู่มือ  ว่า  ESC-Code ทำอะไรได้บ้าง  ตรงกับที่เราต้องการหรือไม่ ?

      สังเกต - ตัวเลือกจะน้อย  เมื่อเทียบกับ สิ่งที่เราคุ้นเคย เช่น ตั้งค่า  Font=Arial ,Size=8,12,72

Q: ทำงานยาก และ มีข้อจำกัดเพียบ  แล้วทำไมยังใช้อยู่ ?
A: เพราะ  ตัวเลือกอื่นๆ  เสียเงินมากครับ
                 Printer กลุ่ม POS หลายรุ่น ยังรองรับ  งานในลักษณะนี้อยู่
     (แปลกเหมือนกัน ผ่านมา 20 ปีแล้ว ผมยังต้องใช้เทคนิคนี้อยู่)

Q: แล้วมีตัวเลือก อื่นๆมั๊ย ?
A: ผมเสนอให้     ย้ายไปเขียน Report บน Web แล้วครับ! 
     ใครที่ ถูกกดดันให้ทำในแบบที่คุ้นเคย     บทความนี้คงช่วยได้บ้าง (ผมว่ามันยากกว่า)

วิธีใช้

      โดยการส่งรหัส  แทรกลงไปในตัวรายงาน ด้วย Format ตามนี้
      "เปิดใช้ ESC" + "จำนวนคำสั่งที่เรียกใช้" + คำสั่ง  +  ข้อความที่จะพิมพ์
   
ตย. ต้องการพิมพ์  ความกว้าง 2 เท่า, ความสูง 2 เท่า  ใน O-spec เดิม
                เดิม
O        E 10             DTL010        
O                         O#TXT    40

1. เลือก ESC Command ให้ตรง + จัดให้มี Format
        "คำสั่งเปิดใช้ ESC" + จำนวนคำสั่ง + คำสั่ง ESC + "คำสั่งปิด ESC"

  1.1 คำสั่ง "เปิด" ใช้ ESC = 03    คำสั่ง "ปิด" ด้วย 40
       จำนวนคำสั่ง = (นับจากด้านล่าง)

           เครื่องที่ผมใช้เป็น  DBCS (double byte) จะนับแบบนี้
           ตาราง ESC-Command   (รหัสเลขฐาน 16)
           ESC (1B)  v (76)        Double Width  เปิด = 01     รหัสรวม 1B7601 (3 Byte)
           ESC (1B)  w(77)        Double Height เปิด = 01     รหัสรวม 1B7701 (3 Byte)
            ... จำนวนคำสั่ง ที่จะใช้= 6 คำสั่ง

       สรุป เขียนต่อเนื่องคือ    03061B76011B770140

   1.2 คล้ายกัน  เพื่อพิมพ์ ข้อความเสร็จ   ให้  "ยกเลิก" ESC ข้างต้น
       เปลี่ยนจาก   เปิด (01)  เป็น  ปิด (00)
           ตาราง ESC-Command   (รหัสเลขฐาน 16)
           ESC (1B)  v (76)        Double Width  ปิด = 00     รหัสรวม 1B7600 (3 Byte)
           ESC (1B)  w(77)        Double Height ปิด = 00     รหัสรวม 1B7700 (3 Byte)

ใน RPG เขียนแบบนี้
I             X'03061B7601-        C          HEXON

I             '1B770140'                                    
            I             X'03061B7600-        C          HEXOF
I             '1B770040'                                    

แทรกคำสั่งใน  O-Spec
                เดิม
O        E 10             DTL010        
O                         O#TXT    40
            ใหม่ (แทรก)
O        E 10             DTL010        
O                         HEXON     1
O                         O#TXT    40

O                         HEXOF    60