図7は、本発明の好適な実施形態に係るラインプリンタ1の概略の構成を示す構成図である。ラインプリンタ1は、下部筐体2と、ヒンジ3で結合された上部筐体4により構成され、上部筐体4を上方に持ち上げることで、ラインプリンタ内部にアクセスできるようになっている。下部筐体2内部には、長尺紙5が引き出せるようにセットされる。図7の例では、長尺紙5はロール紙であり、自由回転またはワンウェイクラッチ機構などにより、ロール紙の引き出し方向に回転可能に支持される。なお、長尺紙5はロール紙に限定されず、例えばストックフォーム紙等であってもよい。
引き出された長尺紙5は、下部筐体2に設けられたプラテンローラ6及び、上部筐体4に設けられたプリントヘッド7に挟まれるように配置される。プリントヘッド7は長尺紙5をプラテンローラ6に押し付けるように付勢されており、プリントヘッド7と長尺紙の印刷面とが接触する。プリントヘッド7はラインプリントヘッドであり、長尺紙5と接触している幅方向に所望の内容の印刷を行う。プラテンローラ6は図示しないモータ等の駆動機構により回転駆動可能であり、プラテンローラ6を回転させて長尺紙5を送りながらプリントヘッド7により印刷を順次行うことで、ラインプリンタ1は、長尺紙5の印刷面に所望の画像を形成する。したがって、この長尺紙5とプリンタヘッド7がプラテンローラ6上で接触している位置が、印刷位置である。
なお、プリントヘッド7の印刷方式には限定はない。本実施形態では、長尺紙5は感熱印刷紙であり、プリントヘッド7はサーマルプリントヘッドであるが、その他の印刷方式、例えば、インクジェット方式やインパクトドット方式等によるプリントヘッドであっても差し支えない。
長尺紙5は印刷位置を通過後、下部筐体2に設けられた可動刃8及び上部筐体9に設けられた固定刃9からなるカッタを通過し、下部筐体2と上部筐体4の間に設けられた隙間から外部に排出される。ラインプリンタ1は、カットコマンドが実行されるタイミングで、図示しない駆動機構により可動刃8を上方に稼動させて、長尺紙5を所望の位置で切断する。したがって、このカッタにより長尺紙5が切断される位置が、カット位置である。
なお、カッタの可動刃8及び固定刃9の位置関係は逆であってもよいし、カッタの機構は異なるもの、例えば幅方向に刃がスライドするスライドカッタであっても差し支えない。また、切断は、必ずしも長尺紙の幅全てを切り離すものでなくともよく、中間の1点又は複数点を切り離すことなく残すものであっても、あるいはミシン目を形成するものであってもよい。
そして、印刷位置とカット位置間の距離dは、ラインプリンタ1におけるプリントヘッド7及びカッタの配置により決まる。距離dはゼロが理想的だが、機構間の干渉を避けるため、距離dはある一定の長さ、例えば十~数十mm程度は必要である。
なお、以降本明細書では、長尺紙5の送り方向を示す語として、「上流」又は「上流側」、及び、「下流」又は「下流側」を使用する。ここで「上流」及び「下流」は印刷の際に長尺紙5が送られる方向について用いる。すなわち、長尺紙5のロール又はストックのある方向が「上流」、長尺紙5が巻き出され送られていく方向が「下流」であるから、印刷の順序でいうと、先に印刷がなされる方向が「下流」であり、後から印刷がなされる方向が「上流」である。したがって、図1等に示した長尺紙5に印刷された伝票100の例では、図中上側が下流、下側が上流となる。また、図7に示したカッタは、プリントヘッド7の下流側に設けられることになる。
なお、ラインプリンタ1全体の構造として図7で示したものは一例であり、この構造に限定されるわけではない。すなわち、図7では、ラインプリンタ1として、下部筐体2と上部筐体4をヒンジ3で接続した構造のものを示したが、これに替えて、単一の筐体の上面或いは側面など他の面に設けた開口(蓋を設けてもよい)から長尺紙5を挿入する構成として、長尺紙5をラインプリンタ1にセットする際には、長尺紙5の端をプラテンローラ6とプリントヘッド7、及び可動刃8及び固定刃9の間に差し込む形式としてもよい。あるいは、ラインプリンタ自体には長尺紙5を保持するための構造を設けず、外部に別途設置したロール紙あるいはストックフォーム紙である長尺紙5が送られてくる構造としてもよい。
図8は、ラインプリンタ1の構成図である。ラインプリンタ1は、制御ユニット10にプリントヘッド7、プラテンローラ6を駆動するプラテンローラ駆動モータ11、カッタを駆動するカッタ駆動モータ12と、I/O13が電気的に接続され、制御ユニット10により各機構が電気的に制御される。なお、同図にはラインプリンタ1に任意に設けられてよい各種ランプやスイッチ類、フラットパネルディスプレイなどの情報表示については図示を省略している。
制御ユニット10は、プロセッサ14とメモリ15、プラテンローラ駆動モータ11を駆動するモータドライバ16及び、カッタ駆動モータ12を駆動するモータドライバ17を有しており、メモリ15に記憶された動作プログラムをプロセッサが実行することにより、ラインプリンタ1全体の動作を制御している。
メモリ15は、プロセッサが実行する動作プログラムや各種パラメータの規定値等を記憶するROM(Read Only Memory)又はEEPROM(Electrically Erasable Programable Read Only Memory)などの不揮発性メモリと、ラインプリンタ1の動作時のワークメモリとなるDRAM(Dynamic Random Access Memory)を有していてよい。
I/O13は、ラインプリンタ1の用途に応じて外部の各種機器と接続される1又は複数の入出力端子であり、例えば、ラインプリンタ1がレシートプリンタとして用いられる場合には、POSレジスタやキャッシュドロワと通信を行うための接続端子が用意されていてよい。
モータドライバ16及び17は、プラテンローラ駆動モータ11及びカッタ駆動モータ12の形式に合わせたものが用意される。プラテンローラ6は、長尺紙の送り幅、すなわち、回転量が制御可能でなければならないので、プラテンローラ駆動モータ11は例えばステッピングモータであり、モータドライバ16はステッピングモータドライバである。カッタ駆動モータ12は、ステッピングモータや単なる直流モータであったり、ソレノイドであったりしてもよいので、モータドライバ17としても、それら機器の駆動に相応しいものが用意される。
図9~12及び16~18は、ラインプリンタ1の制御ユニット10が実行するラインプリンタ1の種々の動作のうち、特に本発明と関連するものについての制御フローを示す図である。制御ユニット10が常時実行する制御フローには、コマンド処理と印刷処理があり、図9には、それぞれのフローが示されている。
コマンド処理P1は、制御ユニット10がI/O13を通じて接続された外部機器、例えば、POSレジスタやPCから送信されたコマンドを逐次実行していくプロセスであり、印刷処理P2は、制御ユニット10が、後述する印刷メモリに蓄積された印刷データに基づいて、プリントヘッド7により長尺紙5に印刷を行うプロセスである。コマンド処理P1と印刷処理P2は、制御ユニット10において独立したプロセスとして実行されているため、処理ユニット10は、印刷処理P2により印刷を行っている間にも、コマンド処理P1により送信されてきたコマンドを実行することができ、またその逆も可能である。
コマンド処理P1においては、まずステップS11において外部機器からのコマンドを受信する。コマンドの受信がなければコマンドが受信されるまで待機する。ラインプリンタ1が受信するコマンドは、本明細書の説明においては、設定コマンド、編集コマンド、改行コマンド及びカットコマンドの4種であり、受信したコマンドが設定コマンドであれば、ステップS12においてその判断がなされてステップS13にすすみ、設定処理のためのルーチンが実行される。以下同様に、受信したコマンドが編集コマンドであれば、ステップS14においてその判断がなされてステップS15にすすみ、編集処理のためのルーチンが実行され、受信したコマンドが改行コマンドであれば、ステップS16においてその判断がなされてステップS17にすすみ、改行処理のためのルーチンが実行され、受信したコマンドがカットコマンドであれば、ステップS18においてその判断がなされてステップS19にすすみ、カット処理のためのルーチンが実行される。
設定コマンドは、ラインプリンタ1の動作条件やパラメータ等の機器の設定を要求するコマンドである。これらの設定の中には、長尺紙の送り幅を削減する機能の利用の有無や、その削減量を指定するものが含まれてよい。あるいは、テキストデータでない店舗のロゴのグラフィックデザインをラインプリンタ1に登録するものや、プリンタ制御言語の種類を指定するもの(例えば、上述のESC/POSを使用するのか、その他のものを使用するのか)、省電力モードを指定するものなど種々のものが含まれてよい。設定コマンドは、ラインプリンタ1とPCを一時的に接続して、PCから送信してもよいし、ラインプリンタ1に常時接続される機器、ここではPOSレジスタから送信される印刷データ中に含まれていてもよい。
図10は、設定処理P3の制御フローである。設定処理P3では、ステップS31において、制御ユニット10が受信した設定コマンドに基づいて、設定を設定メモリ、すなわち、メモリ15の各種設定用に割り当てられた領域に記憶すればよい。設定メモリに記憶された設定は必要に応じて参照され使用される。また、設定メモリとして割り当てられるメモリ15の領域は、好ましくは、不揮発性メモリ領域とすれば、ラインプリンタ1の電源のON/OFFのたびに再度設定コマンドを送信する必要がなく便利であるが、その一部または全部を揮発性メモリ領域としてもよい。
図11は、編集処理P4の制御フローである。編集処理P4では、ステップS41において、制御ユニット10が受信した編集コマンドに基づいて、印刷イメージ(空行の場合も含む)を編集メモリ、すなわち、メモリ15のイメージ編集用に割り当てられた領域に記憶すればよい。
ここで、編集コマンドとは、制御ユニット10が受信した印刷データのうち、ラインプリンタ1に印刷する内容を指示するデータを示しており、一般的な文字データや文字サイズや書体の指定、あるいはロゴなどのグラフィックスの指示(あらかじめ設定コマンドにより設定メモリに記憶されたものや、ラスタデータとして受信されたものであってもよい)が含まれる。
また、編集メモリは、編集コマンドにより指示された印刷イメージを編集するためのワーキングメモリである。編集メモリとして確保する量は任意であるが、本実施形態に係るラインプリンタ1では、1行分のイメージ編集に必要なメモリ量が確保されている。ステップS41における処理は、編集コマンドにより指示された印刷内容を編集メモリに書き込み蓄積していく処理であり、例えば、編集コマンドとして文字データが逐次受信されたなら、かかる文字データに対応するイメージを編集メモリに蓄積していく。
図12は、改行処理P5の制御フローである。改行処理P5は、改行コマンドが受信された際に実行される処理であり、その処理内容は、編集メモリに蓄積された1行分の印刷イメージと行間の幅とを確定させ、当該印刷イメージをプリントヘッド7により印刷するため、印刷メモリへと書き込む処理である。なお、行間の幅は、デフォルトまたはコマンドによって指定された幅である。
改行処理P5のステップS51では、印刷イメージの拡大・縮小及び行間の削減・増加を行う。この処理については、図13を参照して説明する。
図13の(a)は、編集メモリに蓄積された1行分の印刷イメージの例を示している。ここで、図中縦方向がプリントヘッド7による印刷方向、すなわち、長尺紙5の送り方向になる。そして、ラインプリンタ1に対し、長尺紙5の送り幅を削減し、又は増加する設定が何らなされていなければ、図13の(b)に示すように、編集メモリに蓄積された印刷イメージの印刷幅aには変更が加えられることなく、既定の行間幅bの余白である行間が付加される。これに対し、ラインプリンタ1に対し、長尺紙5の送り幅を削減する設定がなされている、すなわち、印刷幅a及び行間幅bのいずれか片方又は両方の幅を削減される設定がなされていた場合には、図13の(c)に示すように、印刷イメージの縦方向の幅が縮小され、幅の狭い印刷幅a’のイメージが作成され、また、行間の幅が縮小され、幅の狭い行間幅b’の行間が作成される。
印刷幅aに対する削減された印刷幅a’の比率及び、行間幅bに対する削減された行間幅b’の比率は、設定コマンドにより任意に設定できるようにしてよい。例えば、1/2,2/3,3/4といった比率から選択できるようにしてもよいし、60%、70%といった任意の比率を指定するようにしてもよい。また、印刷幅の削減量と、行間幅の削減量は互いに異なっていてよい。例えば、印刷幅は削減せず当初の幅を維持しつつ、行間幅のみを削減するようにしてもよい。
また、ラインプリンタ1に対し、長尺紙5の送り幅を増加する設定がなされている、すなわち、印刷幅a及び行間幅bのいずれか片方又は両方の幅を増大させる設定がなされていてもよい。この場合、図13の(d)に示すように、印刷イメージの縦方向の幅が拡大され、幅の広い印刷幅a’’のイメージが作成され、また、行間の幅が増加され、幅の広い行間幅b’’の行間が作成される。
さらに、空行、すなわち印刷イメージが改行コマンドのみの場合、図13の(e)に示すように、空行幅cの空行と、行間幅bの行間が作成される。通常、この空行幅cは、文字の大きさに変更のない、標準の文字を使用した場合の印刷幅aと一致するよう設定されるが、異なる空行幅cを設定コマンドなどにより設定できるようにしてもよい。また、この空行幅cに対しても、長尺紙5の送り幅を削減し、または増加する設定により、印刷幅a及び行間幅bと同様に、その幅を狭くし、あるいは広くする処理がなされる。
ステップS52では、印刷に際してステップS53で決定した長尺紙5の送り幅と、削減され、又は増加された送り幅を加減算情報記憶メモリに記憶する。加減算情報記憶メモリは、メモリ15の好ましくは揮発性メモリ領域に確保されたメモリ領域であり、図14に示す構成となっている。
加減算情報記憶メモリには、ラインプリンタ1による印刷において、長尺紙5を送る単位動作ごとについての、長尺紙5の送り幅を削減又は増加する機能が使用されなかった場合の長尺紙5の送り幅と、長尺紙5の送り幅を削減又は増加する機能が使用されたことによる長尺紙5の送り幅の変化量とを把握できる情報が含まれる。
本実施形態において、長尺紙5を送る単位動作とは、印刷行、すなわち、印刷イメージを持つ行の印刷、空行、すなわち、印刷イメージを持たない行の挿入、及び行間の挿入が該当する。そして、これら単位動作ごとに、長尺紙5を実際に送る幅、すなわち、印刷イメージの拡大・縮小及び行間の削減・増加がなされた後の送り幅である実送り幅と、印刷イメージの拡大・縮小及び行間の削減・増加によって生じた送り幅の変化量である、削減/増加幅を1レコードとして加減算情報記憶メモリに記憶している。
実送り幅と削減/増加幅の単位は任意であり、ミリメートル、インチ、ポイント等長さの単位であってもよいし、印刷の解像度により定まる単位であってもよい。本実施形態では印刷のドット数を実送り幅と削減/増加幅の単位としている。そして、本実施形態では、送り幅を示す値の符号として、長尺紙4の順送り方向、すなわち、上流側から下流側に向かう方向の幅を正の値で示し、その逆の方向の幅を負の値で示している。したがって、長尺紙5の送り幅を削減又は増加する機能が使用されることにより、長尺紙5の送り幅が増加され、順送り方向への送り量が増加した場合には、その増加した量が正の値として削減/増加幅に記録される。その逆に、長尺紙5の送り幅が削減され、順送り方向への送り量が減少した場合には、その減少した量が負の値として削減/増加幅に記録される。記録された削減/増加幅が0である場合には、長尺紙5の送り幅に変化がなかったことを示している。
これ以降、本明細書において、長尺紙5の送り幅を削減又は増加する機能が使用されなかった場合の長尺紙5の送り幅を、「基本送り幅」と称する。基本送り幅は、ユーザが印刷レイアウトを作成する際に想定されていた送り幅でもあるから、印刷レイアウトにおいて本来想定された送り幅である。これに対し、長尺紙5が現実に送られる長さとしての送り幅を「実送り幅」と称する。実送り幅は、長尺紙5の送り幅を削減又は増加する機能が使用されることにより、基本送り幅とは異なる値となる。長尺紙5の送り幅を削減又は増加する機能が使用されない場合には、実送り幅の値は基本送り幅と一致することになる。また、上述の通り、削減/増加幅は、長尺紙5の送り幅を削減又は増加する機能が使用されたことによる長尺紙5の送り幅の変化量である。
したがって、基本送り幅と、実送り幅と、削減/増加幅との関係は、符号を考慮して、次式の通りとなる。
[数1]
実送り幅=基本送り幅+削減/増加幅
これを基本送り幅について書き直せば、
[数2]
基本送り幅=実送り幅-削減/増加幅
となるから、基本送り幅は、実送り幅から削減/増加幅を減じることにより得られることがわかる。
さらに、この後詳細に説明するように、本実施形態に係るラインプリンタ1では、長尺紙5のカット位置を、例えば、図3に示したように、位置Bではなく、本来の印刷レイアウトにおいて意図されていたカット位置を反映したものとしてユーザに認識される位置C又はその近傍の位置とするために、その送り量を調整する。
この調整のために必要となる送り量を以降、調整量と称することとし、調整量の符号の向きについても、上に説明した送り幅を示す値の符号の向きと等しいものとすると、正の調整量は長尺紙5を順送り方向に余分に送る送り幅を意味し、負の調整量は長尺紙5を逆送り方向に巻き戻す送り幅を意味することになる。そして、図3に示した例では、送り方向の印刷イメージの縮小及び行間の削減がなされているため、カット位置を位置Cに合わせるためには、順送り方向の送り、すなわち、正の調整量が必要となる。これとは逆に、送り方向の印刷イメージの拡大及び行間の増加がなされた場合には、逆送り方向の送り、すなわち、負の調整量が必要となる。
従って、以下の明細書にて説明する調整量を求める演算では、送り方向の印刷イメージの拡大及び行間の増加に対する調整の動作は、長尺紙5を逆送り方向に巻き戻す動作であるから、単位動作ごとに記憶された正の削減/増加幅に応じた調整幅の値を減算していくことにより調整量を計算することになる。これに対し、送り方向の印刷イメージの縮小及び行間の削減に対する調整の動作は、長尺紙5を順送り方向に送る動作であるから、調整量は増加しなければならない。この時、単位動作ごとに記憶された削減/増加幅は負の値であり、数値自体の正負が異なるだけで調整量を求める演算は同じであるから、先の場合と同様に、単位動作ごとに記憶された負の削減/増加幅に応じた調整幅の値を減算していくことにより計算される。この計算では、負の削減/増加幅を減算するため、調整量は増加する。
加減算情報記憶メモリは、本実施形態に係るラインプリンタ1ではリングバッファ構成の記憶領域となっており、レコード単位で順次加減算情報記憶メモリに記憶していき、記憶される情報量が確保されたメモリ領域サイズを上回る場合、古い情報から新しい情報が上書きされる構成となっている。
図12に戻り、制御ユニット10は、ステップS53において、印刷メモリに、作成した拡大・縮小及び行間の削減・増加を行った印刷イメージを記憶するに足る空き領域があるか否かを判定する。空き領域がなければ、空き領域ができるまで処理を停止し、待機する。なお、後述するように、印刷メモリは、プリントヘッド7による印刷が実行されるにしたがって順次解放されるため、仮に印刷メモリが満杯であったとしても、印刷の進行につれて空き領域が生じる。
続くステップS54では、作成した拡大・縮小及び行間の削減・増加を行った印刷イメージを印刷メモリに転送し、印刷データとして追加する。その後ステップS55では編集メモリをクリアし、次の編集コマンドにより新たに編集メモリに印刷イメージが生成されるのを待つことになる。
図15は、編集メモリと印刷メモリとの関係を示す図である。編集メモリ上で構成された印刷イメージは、図12のステップS51により印刷イメージの拡大・縮小及び行間の削減・増加がなされて、印刷メモリに転送される。印刷メモリは、本実施形態ではリングバッファ構成の記憶領域となっており、すでに印刷メモリに別の印刷データが記憶されている場合には、転送される情報はその情報に追加される形式で記憶される。
印刷メモリに記憶された印刷データは、図9に示した印刷処理P2により印刷に用いられる。印刷処理P2では、ステップS20により、印刷メモリに印刷データが存在するか否かを判定し、印刷データが存在する場合には、ステップS21にて印刷を実行する。
図16は、印刷P6の制御フローである。印刷P6は、編集メモリから印刷メモリに転送され記憶された印刷データを長尺紙5に印刷する動作である。印刷P6においては、まず、ステップS61において、印刷メモリに記憶された印刷データのうち、参照ラインにあるものを読み込む。ここで、参照ラインとは、印刷動作において、今現在、ラインプリントヘッドであるプリントヘッド7により印刷をしようとしている印刷データの位置を示しており、本実施形態では、印刷メモリに記憶された印刷データのうち、プリントヘッド7により印刷しようとしている幅1ドットの線状のパターンが記憶されているアドレスを意味している。
なお、参照ラインの幅は、本実施形態では1ドットであるが、これはプリントヘッド7が同時に印刷できる幅方向のドット数が1ドットであることと対応しており、プリントヘッドの同時印刷幅が複数ドットであるならば、参照ラインの幅もそれに対応したものとしてよい。
ステップS62において、読み込んだ印刷データに従い、印刷を実行する。これは、プリントヘッド7に印刷データを出力すると同時に、プラテンローラ6を駆動させ、長尺紙5を送ることによりなされる。
続くステップS63では、長尺紙5への印刷、すなわち、参照ラインに該当する印刷データを開放する。これにより、印刷メモリから印刷済みの印刷データが消去され、印刷メモリの空き領域が再び確保される。
そして、ステップS64において、参照ラインを移動させる。具体的には、参照ラインの位置を示すアドレスに、印刷されたデータの情報量を加算する。これにより、参照ラインは、未印刷の印刷データの先頭、または、印刷メモリに記憶された印刷データの印刷が全て終了している場合には、次に印刷データが記憶される印刷メモリの領域の先頭位置を指し示すことになる。
最後に、ステップS65において、新たな参照ラインに印刷データが存在しているか否かを判定する。印刷データが存在しているならば、ステップS61へと戻り、印刷メモリ中の全ての印刷データについて印刷が実行されるまで繰り返し、印刷データが存在しない、すなわち、印刷メモリに記憶された印刷データの印刷が全て終了している場合には、処理を終える。
図17は、カット処理P7の制御フローである。カット処理P7は、カットコマンドの受信により実行され、長尺紙5をカットする処理である。この時、まずステップS701において、カット位置の計算を行う。この計算は、長尺紙5の送り幅を削減又は増加する機能が使用されたことによりずれたカット位置を、本来の印刷レイアウトの意図を反映したカット位置に補正するために必要な長尺紙5の送り幅、すなわち調整量を計算する処理である。
そして、カット処理P7において、ステップS702以降の処理は、ステップS701において計算されたカット位置に基づいて、適切な位置で長尺紙5をカットするための処理である。従って、ステップS701におけるカット位置計算において、長尺紙5をカットするための適切な位置を求める必要がある。
図18は、図17のステップS701で実行されるカット位置計算P8の制御フローである。ここで、カット位置計算P8の基本的な考え方と、その動作の大まかな流れを説明する。
まず、本来意図された印刷レイアウトとして、長尺紙5の送り幅を削減又は増加せず、変化させない場合のカット位置を図1に例示する伝票100を例示して説明すると、カットコマンドを受信した場合のプリントヘッド7の位置、すなわち、印刷位置Aから、プリントヘッド7とカッタ間の距離dだけ下流側に遡ったカット位置Bで長尺紙5が切断される。
従って、印刷位置Aを基準として、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された各単位動作における、送り幅の削減幅又は増加幅の合計値が、送り幅を削減又は増加した際のカット動作における送り幅の不足幅又は超過幅となる。したがって、カット位置計算P8は、この送り幅の不足幅又は超過幅を求める処理である。
さらに、送り幅を削減又は増加しなかったとした場合の、印刷位置Aから距離dだけ遡った本来意図されたカット位置Bは、隣接する単位動作の間の位置になるとは限らず、ある単位動作によって送られる長尺紙5の送り幅をm:nに分割する位置である場合が考えられる。例えば、ある1行の印刷行を、上側が5割、下側も5割の割合によって、ちょうど一行の中間の位置で分割して切断するなど、ユーザが意図的に印刷行を分割して切断するような位置に、印刷内容や改行などをあらかじめ調整して設定する場合などである。このような場合には、送り幅を削減又は増加した場合にも同じ単位動作をm:nに(前述の例では、m:n=5:5に)分割する位置が本来意図された印刷レイアウトを反映したカット位置となる。そのため、図18に示すカット位置計算P8の処理では、この調整量、すなわち、カット位置が含まれる単位動作をm:nに分割するための送り幅をも求めている。
以下、図18に示したフローに沿って本実施形態におけるカット位置計算P8の処理を説明する。
ここで、フローを簡明に示すため、図18では、演算子として、次の記号を使用する。すなわち、記号「←」は代入演算子として用いており、左辺のオペランドに右辺の値を代入する意味である。また、記号「-=」は減算代入演算子として用いており、左辺のオペランドから、右辺の値を減算した値を、左辺のオペランドに代入することを意味するものとする。
まず、ステップS81にて、カット位置計算P8の処理において用いる各変数を初期化する。
ここで、変数recnoは、図14に示した加減算情報記録メモリの参照すべきレコードの番号である。具体的なコンピュータコードでは、recnoは、加減算情報記録メモリのレコードのアドレスを示すポインタであってよい。以降のフローにおいては、加減算情報記録メモリに記憶された送り幅及び削減/増加幅という場合には、recnoで参照されたレコードに記録された送り幅及び削減/増加幅の値を指している。そして、カット位置計算P8の処理は、最後に実行された単位動作から遡って各単位動作を参照するため、recnoの初期値として、制御ユニット10が保持している現在のレコード値から1を減じた値を設定する。制御ユニット10が保持している現在のレコード値は、次に新たな単位動作が実行されたときに、加減算情報記録メモリに書き込むべき実行されていないレコードの番号を示している。したがって、recnoの初期値は、現在のレコードの一つ前である、最後に実行された単位動作について加減算情報記録メモリに書き込まれたレコードを示すことになる。
変数recsizは、加減算情報記録メモリに記録された情報を参照する目的のみに用いられるカウンタであり、加減算情報記録メモリに記録されたレコード数の累計値Dsizが初期値として設定される。Dsizは、ラインプリンタ1が単位動作を実行する度に加減算情報記録メモリの最大値まで1加算されるカウンタである。
dcountは、印刷位置Aを基準として、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された各単位動作を検出する(すなわち、最新の単位動作から遡り、どの単位動作までが距離dの範囲に含まれるのかを検出する)ための長尺紙5の基本送り幅についてのカウンタであり、距離dが初期値として設定される。以降のフローでは、dcountが順次減算されていくことにより、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された各単位動作が検出されるようになっている。dcountの単位は任意であるが、本実施形態では、距離dと同様にドット数である。
mcountは、最終的なカット動作における実送り幅の不足幅又は超過幅を求めるためのカウンタであり、その初期値は0である。カット位置計算P8のフローの実行に伴ってmcountは加減算されていき、最終的に得られたmcountの値が最終的なカット動作における実送り幅の不足幅又は超過幅、すなわち、調整量を示す。本実施形態では、mcount>0の場合を不足幅、mcount<0の場合を超過幅として扱う。mcountの単位は、本実施形態ではdcountと同様にドット数である。
初期化が終了すると、ステップS82と進み、加減算情報記録メモリに記録され、参照していない情報が存在するか否かを判定する。この判定は、recsizが0より大きいか否かで判定する。なぜなら、recsizは、加減算情報記録メモリに記録されたレコード数の累計値を初期値として、後ほど説明するステップS86において、加減算情報記録メモリに記録されたレコードを参照する度に1ずつ減算されるため、加減算情報記録メモリに記録されたすべてのレコードを参照すると0になるからである。
もし参照すべきレコードがない、すなわち、加減算情報記録メモリに記録され、参照していない情報が存在しなければ、これ以上計算の必要はないため、ステップS90へと進む。そうでなければ、ステップS83へと進む。
ステップS83では、recnoが負の値でないか否かを判定する。recnoは前述したとおり、加減算情報記録メモリの参照すべきレコードの番号を示すが、加減算情報記録メモリはリングバッファであるから、レコードの値を減算していき、0より小さくなると、最大のレコードの値へと戻りループする。したがって、ステップS83でrecnoの値が負の値となった場合には、ステップS84へと進みrecnoの値を最大のレコードの値に設定する。いずれの場合であっても、ステップS85へと進む。
ステップS85では、dcountの値が、実送り幅-削減/増加幅の値、すなわち、単位動作における基本送り幅より小さいか否かを判定する。後述するが、dcountの値は、長尺紙5の基本送り幅についてのカウンタであり、カット位置計算P8の処理で単位動作が考慮されるごとに各単位動作の基本送り幅だけ減算されていく。すなわち、ステップS85の処理では、参照した各単位動作の基本送り幅だけ減算されて値が小さくなったdcountが指し示す幅が、recnoにより参照されている単位動作の基本送り幅よりも小さくなったかどうかを調べている。
recnoにより参照されている単位動作の基本送り幅よりもdcountが指し示す幅が小さくなったということは、より分かりやすく言うと、送り幅を削減又は増加しなかったとしたときの本来意図されたカット位置Bが、recnoにより参照されている単位動作の送り幅をm:nに分割する位置であることを意味している。そこで、まず先に、ステップS85の判定がN、すなわち、dcountの値が、実送り幅-削減/増加幅の値以上であり、送り幅を削減又は増加しなかったとしたときの本来意図されたカット位置Bが、recnoにより指示されている単位動作を分割しない場合の処理を説明する。その場合には、処理はステップS86へと進む。
ステップS86では、各変数に対して必要な加減算を行う。ここで、ステップS86が実行されるのは、recnoにより参照される単位動作が、印刷位置Aを基準として、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行されたということを意味している。したがって、ステップS86では、recnoにより参照される単位動作についての削減/増加幅をmcountに累積し、次の、すなわち、1つ前の単位動作を適切に参照できるよう、dcount、recno、recsizを加減算すればよい。
mcountは、現在のmcountの値から、削減/増加幅の値を減算する。mcountの最終的な値は調整量を示しているため、その値は正負いずれの値を取ることもできる。本実施形態では、mcountの値が正の場合にはカット位置に不足があり、順送り方向の調整幅が必要であることを、また、負の場合にはカット位置に超過があり、逆戻し方向の調整幅が必要であることを示している。また、mcountの値が0である場合にはカット位置に過不足がなく、順送り方向及び逆戻し方向いずれの調整幅も必要ないことを示している。
dcountは、現在のdcountの値から、実送り幅-削減/増加幅の値、すなわち、単位動作の基本送り幅を減算する。dcountの初期値は距離dであるから、このdcountからの減算を繰り返していくことにより、続くステップS87で示すように、dcountの値が0となるか、ステップS85で示したとおり、dcountの値が実送り幅-削減/増加幅の値(これはrecnoにより参照されている単位動作の基本送り幅である)より小さくなったことを調べれば、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された単位動作を検出することができる。
recno、recsizからはそれぞれ1減算する。これにより、次に加減算情報記録メモリに記録された1つ前のレコードを参照するようにするとともに、記録されている以上のレコードをメモリ上で参照してしまわないようにしている。
続くステップS87では、dcountの値が0となったか否かを判定する。dcountの値が0となったならば、これは、ステップS86でrecnoにより参照される単位動作の基本送り幅と現在のdcountの値とが、等しかった場合を示している。すなわち、S86でrecnoにより参照される単位動作と、一つ遡った単位動作との間にカット位置Bがあることを示している。そして同時に、dcountの値が0になったため、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された単位動作を全て参照し考慮したということを意味しているから、ステップS90へと進む。そうでなければ、未だに考慮すべき、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された単位動作が残存していることを意味しているから、ステップS82へと処理を戻す。
以上説明したように、カット位置計算P8では、dcountの値を送り幅-削減/増加幅の値ずつ減算しながら、ステップS82~ステップS87の処理を繰り返すことにより、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された単位動作を最後に実行されたものから順次考慮していく。
一方、ステップS85でdcountの値が、送り幅-削減/増加幅の値より小さい場合は、recnoにより参照されている単位動作の中にカット位置Bがあることを示している。そして、recnoにより参照されている単位動作について、カット位置Bの調整が必要か否かを次のステップS88で判定する。
ステップS88では、recnoにより参照されている単位動作にかかる削減/増加幅が0でないか否かを判定する。削減/増加幅が0であるならば、recnoにより参照されている単位動作では、削減/増加が行われていないことを示している。すなわち、recnoにより参照されている単位動作の中でのカット位置Bの調整は必要ないため、ステップS90へと進む。
そうでなければ、現在recnoにより参照されている単位動作は、削減/増加が行われていることを示しており、recnoにより参照されている単位動作内のカット位置Bの調整が必要であるため、ステップS89へと進む。
ステップS89では、recnoにより参照されており、その中にカット位置Bが存在する単位動作(すなわち、その単位動作をm:nに分割するようなカットが予定されている単位動作。以降、「カット対象単位動作」という。)について、送り幅を削減/増加しなかったとした場合のカット位置Bと、送り幅を削減/増加した後のカット位置Bで、単位動作の幅を上流側と下流側とに分割する割合が、同じか、または、ほぼ同じになるように分割比を維持したまま、後者のカット位置Bを調整する。なお、「上流側」及び「下流側」については、すでに説明したとおり、プリントヘッド7側が上流側であり、カッタ側が下流側の方向を意味している。
この動作は、より具体的には、現在のmcountの値を調整することにより、送り幅を削減/増加しなかったとした場合における単位動作内のカット位置Bが、その基本送り幅を上流側m,下流側nの割合で切断する位置である場合に、送り幅の削減/増加が行われた後も、その単位動作の実送り幅を上流側m,下流側nの割合か、又は、これに近似した割合で分割するようにカット位置Bを調整するというものである。
なお、カット位置Bが正確に単位動作の実送り幅をm:nに分割する位置とならず、近似した割合で分割する位置となるのは、実送り幅をm:nに正確に分割する位置が、mcountによる送り幅の調整量の最小分解能に対して端数を生じる場合があるためである。本実施形態ではmcountの単位はドットであり、整数値を取る。そのため、実送り幅をm:nに正確に分割する位置にカット位置Bを調整するための送り量が、最小分解能である1ドットに対して端数を持つ、例えば、15.75ドットである場合には、端数となる0.75ドット分の送り量を正確に調整することはできない。本実施形態では、このような場合には、実送り幅をm:nに正確に分割する位置に最も近い調整可能な送り量をmcountの調整量としている。具体的には、実送り幅をm:nに正確に分割する位置にカット位置Bを調整するための送り量の値の端数を、調整量の最小分解能に丸める。端数の処理は、四捨五入であっても、切り上げ、切り下げであってもよい。以降本実施形態では、このように端数を丸め、実送り幅を上流側m,下流側nの割合に近似的に分割する場合も、実送り幅を上流側m,下流側nの割合に分割するものとして説明する。
まず、カット対象単位動作について、送り幅を削減/増加しなかったとした場合の、カット対象単位動作内でのカット位置Bは、現在のdcountの値から既知である。すなわち、この場合のカット位置Bは、カット対象単位動作の幅の上流側の端部から現在のdcountだけ下流側に遡った位置である。
そして、送り幅の削減/増加が行われた後は、送り幅を削減/増加しなかったとした場合に対して、削減/増加された幅の割合だけ、送り幅が縮小/拡大された(言い換えると、調整された)値になる。すなわち、現在のdcountの値に要する調整量(追加調整量)を、次のように求めることができる。
送り幅を削減又は増加しなかったとした場合に対して、送り幅が削減/増加後に、送り幅が調整される割合は、
[数3]
送り量調整の割合=(削減/増加幅)/(実送り幅-削減/増加幅)
である。
従って、現在のdcountの値に要する調整量は、
[数4]
追加調整量=現在のdcountの値×送り量調整の割合
=現在のdcountの値×((削減/増加幅)/(実送り幅-削減/増加幅))
である。
現在のdcountの値以外の調整量は、現在のmcountの値として既知であるから、全体の調整量は、
[数5]
全体の調整量=現在のmcountの値-((現在のdcountの値×((削減/増加幅)/(実送り幅-削減/増加幅))))
である。
また、現在のmcountの値から追加調整量を減算しているのは、図18のステップS86におけるmcountの演算と同様である。
なお、ステップS89の処理において、送り幅を削減/増加しなかったとした場合のカット位置Bが、カット対象単位動作の基本送り幅を上流側m、下流側nの割合で切断する位置である場合に、送り幅を削減/増加した後のカット位置Bを、カット対象単位動作の上流側、又は、下流側で隣接する単位動作との境界の位置に設定することも可能である。
この場合は、現在のmcountの値から現在のdcountの値を減算することにより、上流側の端部の位置に隣接する単位動作との境界位置が得られる。続けてmcountの値に、削減/増加後の単位動作の幅を加算すると、下流側に隣接する単位動作との境界位置が得られる。
この場合には、カット位置として、カット対象単位動作をm:nに分割する位置は得られないが、単位動作をその幅の途中で分割する位置ではなく、隣接する単位動作間の境界の位置が得られるため、印刷が途中でカットされることがなくなる。
最後に、ステップS90にて、カウンタDsizを0に設定する。これは、カットコマンドが連続して受信されて連続してカット位置計算Pの処理が実行された場合に、2回目以降のカットコマンドにより、ステップS82にて、recsizの初期値が0であってNと判定されることにより、ステップS83以降の処理が実行されず、不要なカット位置調整が行われないようにするための処理である。更に、カット位置調整が必要な場合は、mcountを、あらかじめ設定されたカット位置調整値で加減算する。この処理は、距離dと印刷イメージにおけるカット位置にズレが有る場合に必要である。このカット位置のズレは、例えば、同機種のラインプリンタ1の個体差による距離dのズレや、ラインプリンタ1をベースとした新機種(モデルチェンジ)によるプリントヘッド7やカッタの位置変更にともなう距離dのズレなどである。
以上のカット位置計算P8の処理により、最終的に得られたmcountの値がカット位置の過不足の調整量を示している。
図17に戻り、ステップS701によりカット位置の計算がなされ、mcountの値が得られると、ステップS702において、mcountの値により、カット位置の過不足を判定する。ここで、過不足無しとは、mcount=0、すなわち、現在のカット位置が本来の印刷レイアウトにおいて意図されたカット位置と一致していることを意味している。また不足とは、mcount>0、すなわち、現在のカット位置が本来の印刷レイアウトにおいて意図されたカット位置に達しておらず、長尺紙5をさらに追加で送る必要があることを意味している。同様に、超過とは、mcount<0、すなわち、現在のカット位置が本来の印刷レイアウトにおいて意図されたカット位置を超えており、長尺紙5を追加で巻き戻す(すなわち、逆方向に追加で送る)必要があることを意味している。
なお、ここで、追加で送るという語の意味は、送り幅を削減/増加した後の単位動作による長尺紙5の送りに対して、追加の順方向又は逆方向の送り量(すなわち、調整量)を加えることである。この調整量の付加は、単位動作による長尺紙5の送りに、この送りが停止したか否かに関わらず、続けて、調整量分の送りを行ってもよいし、単位動作による長尺紙5の送りを終えて、停止時間を挟んで調整量分の送りを行ってもよい。また、後述するように、例えば、カットコマンド直前の単位動作による長尺紙5の送りに調整量を加える、具体的には、印刷レイアウトに含まれる最後の単位動作に対して調整量を加えることに等により、最後の単位動作による長尺紙5の送りを調整された送り幅で行うことも可能である。本明細書では、長尺紙5の送りに不足のある場合は、単位動作による長尺紙5の送りに、この送りが停止したか否かに関わらず、続けて調整量分の送りを行い、長尺紙5の送りに超過のある場合は、単位動作による長尺紙5の送りを終えて、停止時間を挟んで調整量分の送りを行うものを例示して説明する。
ステップS702において、過不足がない場合にはステップS703へと進む。ここで過不足がない場合は、図18に示したカット位置計算P8のフローからも明らかなように、送り量を削減又は増加する機能が全く使用されていない場合のほか、送り幅を削減又は増加しなかったとした場合の距離dの範囲内で実行された単位動作についての削減された送り幅と増加された送り幅が相等しく、両者が相殺されて0となった場合が考えられる。
ステップS703では、印刷が停止しているか否かを判定する。印刷の停止は、本例では、具体的には、カットコマンドを受信する前までに受信した印刷データの印刷が全て終了し、長尺紙5を送る動作が停止していることにより判別される。印刷が停止していなければ、印刷の停止まで待機する。
続くステップS704では、印刷の停止を待って、現在のカット位置においてカットを行う。このケースでは、カット位置の過不足がないから、現在のカット位置において、本来の印刷レイアウトにて意図された位置に対応する位置でのカットが行えるためである。カット終了後はカット処理P7を終了する。
ステップS702にて、不足がある場合、ステップS705へと進み、不足分のmcountに相当する幅の行間を印刷メモリに追加する。これにより、制御ユニット10は、印刷P6によって、mcountに相当する幅だけ、長尺紙5を追加で送る動作をする。
不足分のmcountに相当する幅の行間を印刷メモリに追加する際には、その追加のタイミングによっては、ラインプリンタ1が、印刷メモリに蓄積された印刷データに基づく印刷動作や送りを終えている場合と、終えていない場合とがあり得る。いずれの場合も、印刷メモリへの不足分のmcountに相当する幅の行間の追加によって、これに基づく送りが行われることとなる。
その後、ステップS706にて、印刷の停止まで待機する。ステップS706の趣旨は、ステップS703と同様である。本実施形態のように、mcountに相当する幅の行間を印刷メモリに追加することにより長尺紙5を送ることにより、印刷動作を停止させることなく、連続して必要な長尺紙5の送りを実行することができるため、ステップS706にて、印刷の停止を待った後、改めて必要な長尺紙5の送りを行う場合に比較して、ラインプリンタ1の動作を高速にすることができる。
その後ステップS707にてカットを行う。これは、図3のケースに対して示す図19の伝票100のように、印刷位置Aから、さらに、長尺紙がmcountに相当する幅だけ送られて、印刷レイアウトにて本来意図されたカット位置に対応するカット位置Bでカットが行われることを示している。このカット位置Bは、本例では、図3にて示した位置Cと一致又はほぼ一致する。
このままカット処理P7を終えることもできるが、本実施形態では、さらに、ステップS708にて、カット種別の判定を行っている。ここでのカット種別は、フルカット、すなわち、長尺紙5を完全に切断してしまう形態でのカットであるか、または、部分カット、すなわち、長尺紙5の中間の1点又は複数点を切り離すことなく残したり、ミシン目を形成したりして、ユーザが容易に長尺紙5を切り離すことができる形態でのカットであるかを意味している。
ステップS708で判別を行っている理由は、次のステップS709における長尺紙5の巻き戻しを行うか否かを決定するためである。すなわち、部分カットが行われた場合、ラインプリンタ1の構造によっては、長尺紙5を巻き戻すことによって長尺紙5が機構の一部に引っかかるなど不具合を生じる可能性があるため、その場合はステップS709を実行しない趣旨である。したがって、部分カットの場合には処理を終了し、フルカットの場合はステップS709を実行する。なお、機構上の問題がなければ、そのままステップS709を実行するものとして差し支えない。
ステップS709では、長尺紙5をmcountに相当する幅だけ巻き戻す。これにより、次回の印刷時において、伝票100の冒頭の長尺紙5の無駄なスペースも削減される。なお、この巻き戻し動作は、図7より明らかなように、プリントヘッド7とカッタ間の距離dを超えて巻き戻すと、長尺紙5がプラテンローラ6から脱落してしまう恐れがある。したがって、この巻き戻し量の上限をdに規制するなど、長尺紙5の巻き戻し量は、ラインプリンタ1のハードウェアに依存した上限値を定めてよい。
また、図6のケースに対して示す図20のレイアウトの場合であっても、印刷位置Aから、さらに、長尺紙がmcountに相当する幅だけ送られることにより、印刷レイアウトにて本来意図されたカット位置に対応するカット位置Bでカットが行われる。このように、本実施形態では、制御ユニット10が、カット命令を受け付けた際に、カット命令前の空行、印刷及び行間であって、削減前の送り幅の合計が距離dに相当するものについての削減された送り幅に基づいて、カッタによるカットに先立って長尺紙5を順方向に送ることにより、長尺紙5の送り幅を削減する機能を利用している場合であっても、本来意図されたレイアウトを崩すことなく印刷ができる。
図17のステップS710~ステップS713は、カット位置の超過がある場合、すなわち、現在のカット位置が本来の印刷レイアウトにおいて意図されたカット位置を超えている場合の動作である。この場合、ステップS710において、ステップS703、S706同様に印刷の停止を待ち、続くステップS711において、超過分のmcountに相当する幅だけ長尺紙5を巻き戻し、ステップS712にてカットを行う。これによって、送り幅が増加される機能を利用した場合においても、本来印刷レイアウトにて意図されていたカット位置に対応する位置でのカットが行える。
その後、ステップS713にて、長尺紙5をmcountに相当する幅だけ送り出す。これにより、次回の印刷時における伝票100の冒頭の印刷位置を、本来意図されたレイアウトに相当する位置とすることができる。なお、このステップS713の動作は、ステップS705と同様に、送り幅に相当する行間を印刷メモリに追加することにより行ってもよい。すでに説明した通り、印刷処理P2は、コマンド処理P1とは独立したプロセスとして実行されるから、このようにすると、ラインプリンタ1は、ステップS713による長尺紙5の送りの間にも並行してさらにコマンド処理P1を実行することができるから、ラインプリンタ1の全体の動作が効率的になる。
なお、図17の調整量に超過のある場合のステップS710~ステップS713で例示した長尺紙5の追加の送り以外に、単位動作による長尺紙5の送り中に、この送りが停止したか否かに関わらず、続けて調整量分の送りを行うことも可能である。
例えば、レシート印刷の場合、印刷データに連続してカットコマンドを受信するため、図17のカット処理P7の実行時は、印刷メモリに蓄積された未印刷の印刷データが多数残っている。この蓄積された未印刷の印刷データに調整量を加える。
具体的には、印刷メモリに蓄積された未印刷の印刷データから超過分だけ印刷データを一時的に削減し、図17のS711の長尺紙5戻しに相当する制御を行えばよい。さらに、印字停止を待ち、カット後、一時的に削減した超過分の印刷データを印刷メモリへ戻すことにより、図17のS713の長尺紙5送りに対応する送り制御も行うことができる。
さらに、レシート印刷に限らず、カットコマンドの受信前に、カットコマンド直前の単位動作を示す印刷データであることがわかる用途の場合には、カットコマンド直前の単位動作による長尺紙5の送りに調整量を加える、具体的には、印刷レイアウトに含まれる最後の単位動作に対して調整量を加えることにより、最後の単位動作による長尺紙5の送りを調整された送り幅で行うことも可能である。