我需要设置哪些Zebra QLn220设置(以及设置为什么值[s])以设置为"坚持"?

时间:2014-07-31 23:46:43

标签: c# printing zebra-printers printer-control-language zpl

我正在尝试以编程方式配置Zebra QLn220打印机以设置其" media.sense_mode"要么" bar"或"差距" (取决于用户选择的内容)。

但是,这些命令的可靠性似乎非常低(有时它可以工作,有时它不会)。

为了测试各种可能的命令,我使用了Zebra Setup Utilities,当然PC已插入打印机。

我从util发送了这个命令:

! U1 setvar "media.sense_mode" "gap"

有效;我知道这一点,因为测试它是:

! U1 getvar "media.sense_mode"

......向我展示了预期/希望的差距" (在发送上述命令之前,它已经是" bar")

但是试图在代码中完成同样的事情并且#34; bar" (几乎总是)但几乎没有#34;差距"

以下是代码:

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);
}

正如您所看到的,代码完全相同,除了" bar"与"差距"

是否可能附加" \ r \ n"造成问题?似乎补充那些是必要的或使命令更可靠,但我在这一点上感到沮丧。

我总是测试替代命令以完成相同的事情,看看它们是否更可靠,但其他两个替代方案都没有用,即不是这个:

! U1 setvar "ezpl.media_type" "web"

- 这个:

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

...通过getvar检查val继续显示" bar"在将这些命令发送到打印机之后(在设置回" bar&#34之后;" media.sense_mode"的值保留" bar"发送这两个命令后)

可能需要为打印机设置某些其他打印机设置才能更快地响应发送的命令吗?不仅以编程方式设置命令不可靠,而且即使通过Zebra Setup Utility,它有时也会使用沙漏和#34;在命令发送和返回之前的一段时间内 - 有时它比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" 

返回&#34; V68.19.7Z &#34;在Zebra Setup Utility中。

这是否意味着我的固件是最新的(V68.19.7Z&gt; v68.18.0Z),或者这是否意味着我的&#34; appl&#34;是新的,我需要将固件升级到 V68.19.7Z?如果我需要更新固件,我该怎么做?是将查找和下载最新固件到我的PC,然后在通过USB连接PC和打印​​机时运行其安装应用程序,或者...... ???

更新2

here搜索QLn220,我看到V68.18.0Z是唯一可供下载的固件版本。因为我的打印机似乎有更新的版本,我很困惑......为什么他们不提供看起来更新的版本(V68.19.7Z)?

更新3

如果我点击&#34; 自解压存档&#34;在上面引用的页面上链接,我只是得到a page一些通用但不可行(看起来像)的方向。

如果我点击那里的下载链接,我会看到一个页面,&#34;此网页有一个重定向循环&#34;

更新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);
}

可能是这个小小的&#34;在行动中打破&#34;某种程度上有益吗?

更新5

注意:没有&#34; SerialPort.Flush&#34;也许:

serialPort.Close();

...正在完成同样的事情?

3 个答案:

答案 0 :(得分:2)

SGD命令格式正确。您描述的间歇性行为使我认为问题源于打印机实际接收命令的一致性,而不是命令本身的语法。一般而言,不,您不必更改其他命令以使此命令有效。由于您可以通过Zebra Setup Utilities成功发送命令并获得所需的行为,因此您应该可以通过代码执行相同的操作。

  1. 您是否通过USB或其他方式(蓝牙,TCP等)以编程方式发送命令?您在使用Zebra Setup Utilities时提到了USB,但是在您的代码中呢?

  2. 您能提供PrintUtils.SendCommandToPrinter()的代码吗?我不熟悉这个API。它是哪种API?

  3. 在连接的最低级别,您经常会拨打电话&#39;写()&#39;或者&#39; writeData()&#39;或类似的东西。有时&#39;写&#39;命令返回写入的字节数。如果你可以稍微深入研究一下你的代码,也许会有一个“写入”的代码。返回该值的命令,您可以验证返回值是否等于预期消息的长度(包括换行符)。

  4. 根据较低级别的API,还可能存在一个flush()命令,强制将流中的所有数据推送到另一端。同样,这取决于您使用的API在“PrintUtils&#39;”的引擎盖下。

  5. 过去我发现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"
    

    在一天结束时,您可以在设置后立即查询打印机的间隙/条形模式。这将导致程序执行中的额外延迟,但这是确保您发送的任何内容实际生效的好方法。

答案 1 :(得分:1)

对于标签打印时间太长的人,我们必须通过zebra pc util正确设置所有打印机宽度..将这些命令发送到打印机.. PW表示打印机宽度,JUS表示保存设置..

^XA
^PW832
^JUS
^XZ

此命令也有助于双标签打印

传感器校准命令(来源:ZPL命令的功能列表)zpl_manual.pdf

~JC

答案 2 :(得分: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);
}

为什么它有效,我不知道,所以我仍然保持警惕。但是,至少现在,它正在进行这一调整。