1

「media.sense_mode」を「bar」または「gap」に設定するように Zebra QLn220 プリンターをプログラムで構成しようとしています (ユーザーの選択に応じて)。

ただし、これらのコマンドの動作の信頼性は非常に低いようです (動作する場合もあれば、動作しない場合もあります)。

考えられるさまざまなコマンドをテストするために、もちろん PC をプリンタに接続した状態で Zebra Setup Utilities を使用しました。

ユーティリティから次のコマンドを送信しました。

! U1 setvar "media.sense_mode" "gap"

出来た; 私はこれを知っています。

! U1 getvar "media.sense_mode"

...「ギャップ」の予想/希望を示しました(上記のコマンドを送信する前は「バー」でした)。

しかし、コードで同じことを達成しようとすると、「バー」に対しては (ほとんどの場合) 機能しますが、「ギャップ」に対してはほとんど機能しません。

コードは次のとおりです。

const string quote = "\"";
string advanceToBlackBar = string.Format("! U1 setvar {0}media.sense_mode{0} {0}bar{0}\r\n", quote);
string advanceToGap = string.Format("! U1 setvar {0}media.sense_mode{0} {0}gap{0}\r\n", quote);
. . .
if (radbtnBar.Checked)
{
    PrintUtils.SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
    PrintUtils.SendCommandToPrinter(advanceToGap);
}

ご覧のとおり、コードは「バー」と「ギャップ」を除いてまったく同じです。

追加された「\r\n」が問題を引き起こしている可能性はありますか? それらを追加することが必要だったか、コマンドの信頼性を高めたようですが、私はこのフラストレーションの時点で何でも受け入れます.

同じことを達成するための代替コマンドを常にテストして、それらがより信頼できるかどうかを確認しましたが、他の2つの代替コマンドのいずれも機能しませんでした。

! U1 setvar "ezpl.media_type" "web"

-これも:

{} {"media.sense_mode" "gap"}

... getvar を介して val をチェックすると、これらのコマンドをプリンターに送信した後も引き続き「bar」が表示されます (「bar」に戻した後、「media.sense_mode」の値は、これら 2 つのコマンドを送信した後も「bar」のままです)。

送信されたコマンドに対するプリンターの応答性を高めるために、他の特定のプリンター設定を設定する必要があるのではないでしょうか? プログラムでコマンドを設定するのは信頼できないだけでなく、Zebra Setup Utility を介しても、コマンドが送信されて返されるまでに長時間「砂時計」になることがあります。また、Johnny Quick と Flash を組み合わせたよりも速い場合もあります。

このコマンドの大量の出力を調べます。

! U1 getvar "allcv"

....以下は、最も興味深い/可能性の高い候補です。変更する必要がある場合、どの値をどの値に変更する必要がありますか?

wlan.ip.dhcp.request_timeout : 2 , Choices: 2-30
wlan.ip.dhcp.session_interval : 10 , Choices: 0-60
. . .
wlan.ip.timeout.enable : on , Choices: on,off
wlan.ip.timeout.value : 300 , Choices: 1-3600
. . .
wlan.keep_alive.enable : on , Choices: on,off
wlan.keep_alive.timeout : 15 , Choices: 5-300
. . .
netmanage.avalanche.interval : 60000 , Choices: 0-4294967295
netmanage.avalanche.startup_update : off , Choices: on,off
netmanage.avalanche.interval_update : off , Choices: on,off
. . .
netmanage.avalanche.udp_timeout : 3000 , Choices: 0-4294967295
netmanage.avalanche.tcp_connection_timeout : 3000 , Choices: 0-4294967295
. . .
netmanage.avalanche.realtime_update_int : 300 , Choices: 0-4294967295
. . .
zpl.zpl_mode : zpl II , Choices: zpl II,zpl
. . .
internal_wired.ip.arp_interval : 0 , Choices: 0-30
. . .
internal_wired.ip.dhcp.requests_per_session : 2 , Choices: 1-10
internal_wired.ip.dhcp.request_timeout : 2 , Choices: 2-30
internal_wired.ip.dhcp.session_interval : 10 , Choices: 0-60
. . .
internal_wired.ip.timeout.enable : on , Choices: on,off
internal_wired.ip.timeout.value : 300 , Choices: 1-3600
. . .
internal_wired.ip.wins.permanent_source : off , Choices: on,off
. . .
interface.network.active.arp_interval : 0 
. . .
interface.network.active.speed : 0 
. . .
weblink.printer_reset_required : no 
. . .
weblink.ip.conn1.retry_interval : 10 , Choices: 1-600
. . .
weblink.ip.conn1.maximum_simultaneous_connections : 10 , Choices: 1-100
. . .
weblink.ip.conn1.test.retry_interval : 900 , Choices: 1-1800
weblink.ip.conn1.num_connections : 0 
. . .
capture.channel1.port : off , Choices: serial,usb,bt,parallel,off
capture.channel1.count : 0 , Choices: 0-4294967295

手がかりを持っている人はいますか?

アップデート

コマンドを送信するコードは次のとおりです。

public static bool SendCommandToPrinter(string cmd)
{
    bool success; // init'd to false by default
    try
    {
        using (SerialPort serialPort = new SerialPort())
        {
            serialPort.BaudRate = 19200;
            serialPort.Handshake = Handshake.XOnXOff;
            serialPort.Open();
            serialPort.Write(cmd);
            serialPort.Close(); // <= should be redundant within a using statement, but still getting "File 55" err...
        }
        success = true;
    }
    catch // may not need a try/catch block, as success defaults to false
    {
        success = false;
    }
    MessageBox.Show(success.ToString()); //TODO: Remove after testing
    return success;
}

問題の SerialPort は OpenNETCF.IO.Ports.SerialPort からのものです

注: SerialPort.Write() は void を返します。

コマンド:

! U1 getvar "appl.name" 

Zebra Setup Utility で「 V68.19.7Z 」を返します。

これは、ファームウェアが最新 (V68.19.7Z > v68.18.0Z) であることを意味するのでしょうか?それとも、「appl」が新しいため、ファームウェアV68.19.7Z にアップグレードする必要があることを意味するのでしょうか? ファームウェアを更新する必要がある場合、どうすればよいですか? 最新のファームウェアを見つけて PC にダウンロードし、PC とプリンターが USB 経由で接続されている間にインストール アプリを実行するか、それとも...???

更新 2

ここからQLn220 を検索すると、V68.18.0Z がダウンロード可能な唯一のファームウェア バージョンとして表示されます。私のプリンターには新しいバージョンがあるように見えるので、私は混乱しています...なぜ彼らは新しいバージョン (V68.19.7Z) と思われるものを提供しないのですか?

更新 3

上記のページで「自己解凍型アーカイブ」リンクをクリックすると、一般的だが実行不可能な (そう思われる) 指示が記載されたページが表示されます。

そこにあるダウンロード リンクをクリックすると、「この Web ページにはリダイレクト ループがあります」というページが表示されます。

更新 4

いくつかのデバッグ文字列を追加すると機能します。印刷コードで:

MessageBox.Show(success.ToString()); //TODO: Remove after testing
return success;

...そして設定コードで:

if (radbtnBar.Checked)
{
    MessageBox.Show(advanceToBlackBar);
    PrintUtils.SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
    MessageBox.Show(advanceToGap);
    PrintUtils.SendCommandToPrinter(advanceToGap);
}

このちょっとした「行動の中断」は、何らかの形で有益なのでしょうか?

更新 5

注:「SerialPort.Flush」はありません

serialPort.Close();

...同じことを達成していますか?

4

3 に答える 3

2

SGD コマンドは整形式です。あなたが説明した断続的な動作は、コマンド自体の構文ではなく、プリンターが実際にコマンドをどのように一貫して受け取るかに問題があると私に思わせます。一般的に言えば、いいえ、このコマンドを機能させるために他のコマンドを変更する必要はありません。Zebra Setup Utilities を介してコマンドを正常に送信し、目的の動作を得ることができるため、コードを使用して同じことを実行できるはずです。

  1. プログラムでコマンドを USB 経由で送信していますか、それとも他のもの (Bluetooth、TCP など) 経由で送信していますか? Zebra Setup Utilities の使用中に USB について言及されましたが、コードではどうでしょうか?

  2. PrintUtils.SendCommandToPrinter() のフードの下にあるコードを提供できますか? 私はこの API に詳しくありません。どの API ですか?

  3. 接続の最下位レベルでは、'write()' や 'writeData()' などを呼び出すことがよくあります。「書き込み」コマンドは、書き込まれたバイト数を返すことがあります。コードを少し掘り下げることができれば、おそらくその値を返す「書き込み」コマンドがあり、戻り値が意図したメッセージの長さ (改行文字を含む) と等しいことを確認できます。

  4. 下位レベルの API によっては、ストリーム内のすべてのデータを強制的に反対側にプッシュする flush() コマンドが横たわっている場合もあります。繰り返しますが、これは「PrintUtils」の内部で使用している API によって異なります。

過去に、USB 通信で一貫性のない動作を見てきました。ファームウェアが可能な限り最新であることを確認する必要があります。QLn220 は現在 v68.18.0Z にあります: http://www.zebra.com/id/zebra/na/en/index/drivers_downloads/firmware/results.html?productType=6。以下を送信して、現在のバージョンを確認できます。

! U1 getvar "appl.name"

一日の終わりに、設定後すぐにプリンタにギャップ/バー モードを問い合わせることができます。これにより、プログラムの実行に追加の遅延が発生しますが、送信した内容が実際に有効になったことを確認する良い方法です。

于 2014-08-01T16:39:39.747 に答える
0

いくつかのデバッグ文字列を追加すると機能します。印刷コードで:

MessageBox.Show(success.ToString()); //TODO: Remove after testing
return success;

...そして設定コードで:

if (radbtnBar.Checked)
{
    MessageBox.Show(advanceToBlackBar);
    PrintUtils.SendCommandToPrinter(advanceToBlackBar);
}
else if (radbtnGap.Checked)
{
    MessageBox.Show(advanceToGap);
    PrintUtils.SendCommandToPrinter(advanceToGap);
}

なぜそれが機能するのか、私にはわからないので、まだ警戒しています。しかし、少なくとも今のところ、この調整で機能しています。

于 2014-08-01T23:07:37.910 に答える