始めの言葉

「プリンターから印刷できて当たり前」と、ユーザーからもSIerからも軽視されがちなプリンターの世界ですが、実際にはお困りだったり、思ったような印刷結果が得られないまま我慢してお使いの皆様のために、今までの経験が役立てばと、このブログを立ち上げました。印刷の基本から、応用情報、問題の解決方法を情報発信すると共に、PDF化など、これからどうするかについても、ご相談に乗れれば幸いです。ご質問はコメントでお寄せください。

2015年6月22日月曜日

繰り返し印刷とポートの設定

前回は、スプーラーに関わるお話でしたが、今回はスプーラーから印刷データが送信される先を指定する「ポート」のお話です。PC と LAN 接続したインパクト・プリンターを使って印刷していると、印刷が完了した後、あるいは途中のページから、先頭ページからの印刷を再開するという現象が発生することがあります。ページ数が多い、つまり量が大きいデータを印刷しようとする時に発生する可能性が高くなります。
プリンターを LAN 接続する場合、TCP/IP の機能の中の「LPR/LPD」という仕組みを使用して印刷します。Windows ではドライバーのプロパティの「ポート」に、通常は、「標準のTCP/IPポート」を使用します。「ポート」で指定された宛先に印刷データが送信されるのですが、その仕組みは次のようになっています。
  1. Windowsは初めに“Control File”をプリンターに送信します。Control File”には、PC側のホスト名やユーザー名、ファイル名を含みます。(下図
  2. 受信側のプリンター(実際にはネットワーク・カード)は、それを受信すると“Ackという受信確認を返信します。(下図 
  3. Control FileAckを受信すると、次にWindowsは“Data File”を送信します。(下図)“Data File”には、印刷データの他にデータ・サイズの情報が含まれます。 
  4. 受信側のネットワーク・カードは、データ・サイズと一致する印刷データを受信したら、“AckWindowsに返信します。(下図 
  5. Windowsは、このAckを受信して、印刷ジョブ送信終了とします。
問題は、Windows が最後の"Ack"を受信するまで待つ所定時間があって、それまでに受信されないと印刷失敗と認識して、先頭のページから印刷データを再送することです。その所定時間は公開されていないようですが、過去の実測値では約90秒でした。
プリンターから所定時間までに"Ack"を返信できない理由は、いくつか考えられます。
  1. 用紙ジャムや用紙切れが発生して、そこから回復するのに間に合わない。
  2. 印刷速度が遅いために間に合わない。
  3. ネットワークが混雑していて、データ通信に時間が掛かる。
インパクト・プリンターの場合、多くは「2」のケースですが、背景にはプリンターがどのタイミングで"Ack"を返信するように設計されているかが関係します。つまり、印刷までちゃんと完了してから"Ack"を返すものもありますが、データを受信を完了しただけで"Ack"を返すものもあります。(レーザー・プリンターの多くは、データ受信用のメモリー・サイズも大きく、後者の方式のようです。)
後者の方が、"Ack"の返信が早いので、繰り返し印刷の発生は防げますが、前者の考え方から見れば、「印刷完了しない内にプリンターの電源を切られたら、印刷中のデータは消えてしまう」という危険性もあるわけです。どちらの考え方が絶対に正しいということは無いと思いますが、5577や5400系のプリンターでは前者の考え方で設計されています。そうなると、インパクト・プリンターは、レーザー・プリンターに比較して印刷速度が遅いこともあって、その結果、印刷データのサイズが大きな印刷を行うと、繰り返し印刷を発生する可能性が高くなります。
また、先日もこの問題で、問い合わせをいただいたのは、カット紙を1枚ずつ手差し印刷しているケースでした。自動給紙に比べてどうしても1枚ずつ印刷する間隔が長くなってしまっていることも影響しているようでした。
この問題の解決方法は、長くなりますので、次回にまとめて。

2015年6月15日月曜日

Windowsスプーラーの役割

その後、パラレル・インターフェイスの規格も新しくなって、「セントロニクス」から「IEEE1284」という規格に移行したのですが、5577 系のプリンター側は、しばらくの間は大きな変化が無く、IEEE1284の中の「スタンダード」と呼ばれたレベルのままでした。
その結果、印刷すると文字化けや余計なページ送りといったお問い合わせが増え、その度にPC側のBIOS(バイオス)の設定で、パラレル・インターフェイスのモードを変更して、プリンターとモードを合わせてくださいという回答を繰り返していました。
IEEE1284規格の標準であるECPモードに対応したモデルが出たのは、2005年末の 5577-D02/C02 や 5579-N02 でした。ただこの頃になると、パラレル・インターフェイスでの接続よりも、LAN 接続の方が多くなってきていました。
さて、パラレル・インターフェイス接続であれ、LAN接続であれ、ドット・プリンターを Windows 上のプリンター・セッション経由でAS/400と接続する場合は、AS/400から見れば、あくまでもプリンター・セッションがプリンターになります。その先に接続され たプリンターで発生した用紙ジャムや用紙切れ等のエラー情報は、プリンターから PC までは通知されますが、AS/400までには届きません。

AS/400からの印刷データの流れを見ると、プリンター・セッションまでのデータ送信は非常に高速に行われますが、それと比較してプリンター、特にインパクト・プリンターのデータ処理速度、つまり印刷速度は非常に遅いものです。例えば、漢字を 150字/秒の一定速度で印刷できるとしても、(実際には、印字ヘッドの加速/減速や用紙送りの時間も掛かります。)24 x 24(ビット/1文字) x 150 = 86.4k bps(ビット/秒)にしかなりません。
その結果、プリンター・セッションから見ると、AS/400からはどんどんデータが送られてくるのに、プリンターへは少しずつしかデータを送れないということになります。この処理速度の差を調整しているのが、Windows の「スプーラー」になります。スプーラーは、ちょうどダムのような働きをしているわけです。プリンター・ドライバーのプロパティにおいて、「詳細設定」画面の「印刷ドキュメントをスプールし、プログラムの印刷処理を高速に行う」が、デフォルトで選択されているはずですが、これがその設定です。
プリンター・ドライバーのプロパティの詳細設定
ところが、Windows95の時に、この設定をその下にある「プリンターに直接印刷データを送る」に変更すると、プリンターで発生したエラーが、AS/400にまで通知され、ちょうど直結プリンターと同様に、OUTQの状態がMSGWTになるという情報が、お客様からのお問い合わせの中にありました。具体的には、Windows95 のPCではこの設定で使用していたが、WindowsXP のPCでも同じ設定を行うと、正しく印刷ができないという内容でした。
プリンターとの双方向通信が実質的にできて、お客様としては便利に使っていたということだと思いますが、私としては驚きました。
結局、その時は、WindowsXP対応のPCに変わることで、PC側の処理速度が高速になったが、プリンターの処理速度は変わらないので、Windows のスプーラーでその速度の差を調整しないと、印刷データが正しくプリンターに届きませんと回答したのですが、その結果、お客様は双方向通信では使えなくなったわけです。

2015年6月8日月曜日

プリンターへのデータの流れ - レベルE機能と双方向通信 -

5577系や5400系のインパクト・プリンターのパラレル・インターフェイスには、「コンバージド・モード」と「スタンダード・モード」の2種類があります。ただし、これは5577系のプリンターの場合の言い方で、5400系では前者を「PS/55モード」、後者を「PS/2モード」と呼んでいます。
「コンバージド・モード」とは、IBM 社内では全く日本独自の製品だった「5550シリーズ」から、ワールド・ワイド標準製品である「PS/2シリーズ」を元に日本語対応した「PS/55シリーズ」に切り替わる際に、両方のシステムの規格が異なるパラレル・インターフェイスどちらにも接続できるようにした、プリンターのインターフェイスの規格です。(「コンバージド」は、converged、即ち「統合した」という意味の単語です。)
コンバージド・インターフェイスと「レベルE機能」という言葉には密接な関係があります。
5550 時代や、その後の Windows のドライバー印刷では、インパクト・プリンターの場合、縦24 ドット(24 ビット = 3バイト)の幅の、横 1 行に相当するイメージ・データが送られてきて、プリンターは各ドットのオン/オフに応じて印刷するだけです。そのため、送信されたデータに問題があって、一部のビットのオン/オフが反転したとしても、そのドット(点)の白黒が逆転するだけですから、印刷結果全体には、大きな影響は与えないと判断されていました。しかし、PS/55時代のJ-DOSと呼ばれていたOSからの印刷では、文字データは、Shift-JIS形式の文字コードで送られるので、データ送信の問題によって、文字コードの一部の値に誤りが発生すると、全く他の文字コードになる、つまり全く違った文字を印刷することになり、これは避けなければならないことと考えられました。
そこで、ECC(Error Checking and Correction)、具体的には、プリンターにはデータを3回送信する、受信したプリンターは、3回のデータの内、少なくとも 2 回のデータが一致していれば、正しいデータと判断して印刷するという方式を組み込みました。これが「レベルE機能」と呼ばれるものです。データ量としては3倍になってしまいますが、印刷結果を保証するために考え出された方式です。
また、コンバージド・インターフェイスの機能を活用して、プリンターとシステム間の双方向通信も行っていました。3477等の、所謂「ダム端末(オンライン端末専用機)」や、PS/55上の5250PC(ホット・キーでDOS画面と5250端末画面を切り替えられました。)とパラレル・インターフェイスで接続したプリンターで、用紙切れや用紙ジャム等のプリンターのエラーが発生すると、それはプリンター側から端末を通じてAS/400まで伝わり、"MSGWT"となってユーザーにエラー通知されたものです。
同様に、初めてプリンターを接続した時には、直結型のプリンターを接続した場合と同様に、端末を通じてでも、デバイス(プリンター)として、AS/400上で「自動構成」されました。
5400エミュレーターを取り付けた様子

その後、コンバージド・インターフェイスが復活したのが、「5400エミュレーター」です。5400エミュレーターについては、いずれ詳しくお話しますが、5577系のドット・プリンターをAS/400とTelnet5250EでLAN直結するために作られたオプション製品です。これは、プリンターのパラレル・インターフェイスに取り付けるものですが、AS/400にプリンターの状態を通知するために、「コンバージド・インターフェイス」が活用されました。

これらのことは、AS/400直結型プリンターの場合と同様な、プリンターとAS/400間での双方向通信が実現していたということを表しています。
5400エミュレーター本体


2015年6月3日水曜日

プリンターへのデータの流れ - 電気的なインターフェイスについて

今の業務用のプリンターは、ほとんどがLAN(しかもイーサネット)接続となっていますが、それまでPCとの接続は、パラレル・インターフェイスが標準でした。(なお、プリンターの接続方法によっても、文字化けが起きることがあります。)
パラレル・インターフェイスと良く間違えられるのが、「シリアル・インターフェイス」です。
シリアル・インターフェイスは、プリンターではなく、主にモデムや測定器との接続に使用されました。シリアル・インターフェイスの規格として、「RS232C」や「RS422」という言葉を覚えていらっしゃる方もあるか思います。
「シリアル」という言葉には「順番に」という意味がありますが、正にデータを1ビットずつ順番に送信する方式です。「1車線」の道路を自動車が同じ方向に1台ずつ、順番に走って行くイメージです。RS232CやRS422の時代は、ケーブルを長くすることができるが、データ送信は遅いと認識されていましたが、今や、送信のタイミングが非常に速くなったため、HDDとの接続や、皆様お馴染みのUSBもシリアル・インターフェイスの仲間です。
「パラレル」には「並行に」という意味があります。8ビットのデータを並行して送信しますので、シリアル・インターフェイスよりも高速にデータ送信できます。そのため、プリンターの接続に標準的に使用されました。道路で言えば8車線の道路を8台の自動車が並んで走って行くイメージです。ただ、8ビットのデータを並べて送信できるようにタイミングを合わせる必要があること、またケーブルが長くなるとちょうどアンテナのようになってしまって、電気的なノイズを拾ってしまうことから、5577用等のケーブルは「5m」が最長で、これ以上長いケーブルは保証できませんと回答したものです。
パラレル・インターフェイスを使う機器として、PCとプリンターの間に「プリンター切り替え器」や「バーコード・ジェネレーター」というものが、市販されていました。前者は1台のプリンターを複数のPCで共有するためのもので、ダイヤルで切り替える手動式のものや、自動切換えのものがありました。後者は、専用のバーコード用コマンドを文字データとして印刷データに埋め込んでおくと、コマンドに応じたバーコードのイメージを作って、プリンターにバーコードをイメージとして送信するものです。

しかし、パラレル・インターフェイスの規格、初めは「セントロニクス」、その後は「IEEE1284 ECPモード」等は、どれも細かい部分まで厳密なものではなかったため、信号のタイミングやプラス・マイナスの規格がメーカー間で微妙に異なっていました。その結果、純正ケーブル以外のケーブルや、切り替え器を使用すると、「PCとプリンターの電源を入れる順序が決まっている」とか「連続用紙の印刷では途中で余計な改ページが発生する」とか「ゴミのような文字を初めに印刷する」といった不具合が発生しました。
比較的最近に多かったのは、USBパラレル変換ケーブルを使って接続すると、上記のような問題が発生するという報告です。5577や5400の現行モデルでは、LAN接続が標準で可能なのですが、それらの古いモデルや5573プリンターでは、PCとはパラレル・インターフェイスでしか接続できません。WindowsXPの時代はPCにもパラレル・インターフェイスが付属していたので問題にならなかったのですが、WindowsXPの保守が終了し、Windows7のPCへの置き換えが始めると、既存のプリンターと接続するために、USBパラレル変換ケーブルが使われるようになり、その結果、上記のような報告が増えたという訳です。
とは言うものの、Windows7以降でも、プリンター・ドライバーのプロパティの「ポート」に、シリアル・ポート用の「COM1」、パラレル・ポート用の「LPT1」が標準で用意されているのは、少し皮肉な感じがします。