Laci Uang, Auto Cutter, dan Status Epson TM-T82

Laci itu adalah solenoid yang dikabelkan ke port drawer kick printer, dan ia terbuka ketika printer mengirim pulsa tegangan lewat kabel tersebut. Perangkat lunak meminta pulsa itu dengan perintah ESC p, memilih pin serta durasi menyala dan mati dalam satuan dua milidetik. Tidak ada driver laci uang tersendiri.
Hampir selalu soal durasi pulsa atau pin. Pulsa yang terlalu pendek hanya membuat solenoid berbunyi klik tanpa melepas kait, dan laci yang lebih berat butuh durasi lebih panjang — sekitar lima puluh milidetik adalah titik awal yang aman. Penyebab umum lainnya adalah laci yang dikabelkan ke pin 5 sementara perangkat lunak memberi pulsa ke pin 2.
Pisau berada beberapa milimeter di atas kepala cetak, jadi perintah potong polos memotong kertas yang baris terakhirnya masih berada di atas pisau. Gunakan bentuk feed-lalu-potong dari GS V yang memajukan sejumlah titik terlebih dulu. Ukur jaraknya sekali dengan mencetak baris bernomor lalu menghitung berapa baris yang hilang.
Tanyakan status real-time dengan DLE EOT. Berbeda dari kebanyakan perintah ESC/POS, perintah ini dijawab firmware seketika bahkan saat pekerjaan sedang dicetak, dan mengembalikan satu byte flag yang mencakup status printer, penyebab offline, error, dan sensor gulungan kertas. Tanyakan sekali per transaksi, bukan terus-menerus.
Minimal antre, terkirim, terkonfirmasi, dan laci terpicu. Status eksplisit penting karena aksi-aksi ini bersifat fisik dan bisa berhasil sebagian: terkirim tapi belum terkonfirmasi berarti cetak ulang aman, terkonfirmasi tanpa pulsa laci menunjuk ke masalah kabel bukan perangkat lunak, dan pekerjaan antre yang sudah lama berarti printer offline tanpa disadari siapa pun.

Ringkasan Utama
Pada TM-T82, laci uang terbuka melalui printer memakai perintah pulsa ESC p di port drawer kick; auto cutter perlu feed sebelum memotong; dan DLE EOT mengembalikan status real-time bahkan saat pekerjaan sedang dicetak. Tiga perintah itu menutup hampir semua kegagalan operasional yang akan ditemui sebuah POS.
Printer struk adalah satu-satunya perangkat di toko kecil yang menyentuh uang secara fisik. Ia membuka laci, ia menghasilkan bukti pembayaran bagi pelanggan, dan ia pula yang disalahkan kasir ketika salah satunya gagal. Tiga fitur ESC/POS di bawah inilah yang mengubah printer dari sekadar perangkat keluaran teks menjadi bagian dari proses penanganan uang tunai — dan masing-masing punya satu detail yang tidak kelihatan sampai ia mempermalukan Anda di depan antrean.
Semua isi tulisan ini berasal dari command reference ESC/POS Epson dan dari memasang printer semacam ini di meja kasir sungguhan. Di bagian yang perilakunya berbeda antar firmware, saya menyebutkannya, bukan berpura-pura ada satu jawaban.
Tidak ada driver laci uang. Laci itu adalah solenoid dengan kumparan 24 volt, tersambung ke port drawer kick printer dengan kabel yang mirip kabel telepon, dan terbuka ketika printer mengirim pulsa tegangan lewat kabel tersebut. Satu-satunya tugas perangkat lunak Anda adalah meminta pulsa itu kepada printer, dan itulah fungsi ESC p.
ESC p m t1 t2 generate pulse on the drawer kick connector
m = 0 -> pin 2 m = 1 -> pin 5
t1 = ON time in 2 ms units
t2 = OFF time in 2 ms units
// 50 ms on, 50 ms off on pin 2 — the setting that opens every
// 24 V drawer I have wired to a TM-T82 so far.
const kickDrawer = Buffer.from([0x1b, 0x70, 0x00, 0x19, 0x19]);
// The pulse is a QUEUED command: it fires when the print buffer
// reaches it, not when your process writes it. Put it AFTER the
// receipt bytes if you want the drawer to open with the paper,
// BEFORE them if the cashier should reach for cash first.Parameternya lebih penting daripada penampakannya. Dua byte pewaktuan menentukan berapa lama pulsa menyala dan mati dalam satuan dua milidetik, dan pulsa yang terlalu pendek hanya akan membuat solenoid berbunyi klik tanpa melepas kaitnya — gejala klasik laci yang terbuka di sebagian mesin dan tidak di mesin lain meski perangkat lunaknya identik. Sekitar lima puluh milidetik adalah titik awal yang aman; sebagian laci yang lebih berat menuntut lebih.
Port drawer kick bukan port data. Ia membawa tegangan tersaklar pada konektor yang secara fisik identik dengan soket telepon, dan menancapkan kabel telepon, kabel jaringan, atau printer kedua ke sana bisa merusak perangkat keras. Beri label pada kabelnya saat pemasangan — setiap teknisi yang pernah menangani meja kasir sudah melihat kesalahan ini setidaknya sekali.

Auto cutter terletak beberapa milimeter di atas kepala cetak. Jarak itulah penyebab paling umum struk yang baris terakhirnya terpotong separuh, dan itu pula alasan perintah potong punya dua bentuk.
GS V m cut, no feed m = 0 full, 1 partial
GS V m n feed n dots, then cut m = 65 full, 66 partial
// Wrong: the last three lines are still under the print head,
// above the blade, so the cut lands in the middle of the total.
buffer.push(GS, 0x56, 0x01);
// Right: feed the gap between head and blade first. On TM-class
// printers that gap is why "GS V B n" exists at all.
const FEED_DOTS_TO_BLADE = 0x64; // ~100 dots, tune per model
buffer.push(GS, 0x56, 0x42, FEED_DOTS_TO_BLADE);Jarak feed yang tepat berbeda per model dan layak diukur sekali, bukan disalin dari forum. Cetak penggaris berisi baris bernomor, potong, lalu hitung berapa baris yang hilang — angka itu, dikonversi ke titik, adalah konstanta Anda, dan tempatnya adalah nilai konfigurasi bernama, bukan tersebar di dalam kode.
Sebagian besar perintah ESC/POS diantrekan: ia dieksekusi ketika buffer printer sampai padanya. Itu tidak berguna untuk menanyakan apakah kertas habis, karena pertanyaan Anda akan berbaris di belakang struk yang justru Anda khawatirkan. DLE EOT berbeda — ia permintaan real-time yang dijawab firmware seketika, bahkan di tengah pekerjaan, dan mengembalikan satu byte berisi flag.
DLE EOT n transmit real-time status (0x10 0x04 n)
n = 1 printer status n = 2 offline cause
n = 3 error cause n = 4 roll paper sensor status
// Real-time means the printer answers immediately, even while a
// long receipt is still printing — this is the only status query
// that is not stuck behind your own buffered job.
const askPaper = Buffer.from([0x10, 0x04, 0x04]);
// One reply byte. Bits 5 and 6 both set means the roll is out;
// bits 2 and 3 mean "near end" — the warning you want to surface
// to the cashier BEFORE the next customer, not during.
function paperState(reply: number): "ok" | "near-end" | "out" {
if ((reply & 0x60) === 0x60) return "out";
if ((reply & 0x0c) === 0x0c) return "near-end";
return "ok";
}Dalam praktik saya menanyakan dua hal. Status sensor gulungan kertas memberi tahu apakah kertas habis atau hampir habis, dan itulah beda antara peringatan dan meja kasir yang berhenti. Status printer memberi tahu apakah penutup terbuka atau printer offline, dan itulah yang mengubah kegagalan senyap yang misterius menjadi pesan yang bisa ditindaklanjuti kasir.
Tanyakan status sekali per transaksi, bukan sekali per detik. Bertanya terus-menerus menambah lalu lintas pada jalur serial yang juga membawa struk, dan satu-satunya momen ketika jawabannya mengubah perilaku Anda adalah tepat sebelum mencetak. Peringatan kertas hampir habis yang muncul di antara pelanggan itu berguna; peringatan yang sama di tengah transaksi hanya kebisingan.

Empat keluhan muncul berulang kali, dan di semua kasus itu kodenya tidak bersalah. Mengenali polanya menghemat satu kunjungan ke lokasi.
Pelajaran umumnya: kelas perangkat keras ini gagal secara fisik dan hampir tidak melaporkan apa pun sendiri. Aplikasi Andalah yang harus bertanya, dan harus mencatat jawabannya, kalau tidak setiap insiden menjadi cerita, bukan baris log.
Karena aksi-aksi ini bersifat fisik dan bisa berhasil sebagian, ia pantas punya status eksplisit alih-alih sekadar boolean. Transisi di bawah adalah himpunan terkecil yang mencakup semua sengketa nyata yang pernah harus saya telusuri.
SALE_CLOSED
-> PRINT_QUEUED row written to print_jobs, id = payment id
-> PRINT_SENT bytes handed to the transport
-> PRINT_CONFIRMED DLE EOT 1 says online, no error, after send
-> DRAWER_PULSED only reached for cash payments
// The states that matter operationally are the ones you can be
// stuck in. PRINT_SENT with no confirmation is the reprint case;
// PRINT_CONFIRMED with no DRAWER_PULSED is the "drawer never
// opened" complaint, and it is a wiring fault, not a POS bug.Nilai dari menuliskannya seperti ini adalah setiap status macet memetakan ke instruksi konkret bagi staf: tercetak tapi belum terkonfirmasi berarti cetak ulang aman, terkonfirmasi tapi tanpa pulsa laci berarti periksa kabel, mengantre dan sudah lama berarti printer offline dan shift butuh catatan manual.
Setiap meja kasir yang saya pasang kini melewati rutinitas pendek yang sama sebelum melayani satu pelanggan pun. Rutinitas ini pernah menangkap pin laci yang salah, baud rate yang tidak cocok, dan pisau yang macet — yang ketiganya pasti muncul saat jam sibuk pertama.
Pulsa laci, feed pemotong, dan byte status real-time adalah tiga potongan kecil ESC/POS yang memikul sebagian besar beban operasional sebuah sistem point-of-sale. Ketiganya murah untuk diimplementasikan dan mahal untuk dilewatkan: masing-masing adalah kegagalan yang akan dilihat kasir sebelum Anda melihatnya, di depan pelanggan, dengan antrean yang memanjang di belakangnya.