1

我正在尝试以编程方式配置 Zebra QLn220 打印机,以将其“media.sense_mode”设置为“bar”或“gap”(取决于用户选择的内容)。

但是,这些命令工作的可靠性似乎非常低(有时有效,有时无效)。

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

我从 util 发送了这个命令:

! U1 setvar "media.sense_mode" "gap"

有效; 我知道这一点,因为通过以下方式对其进行测试:

! U1 getvar "media.sense_mode"

...向我展示了“差距”的预期/希望(在发送上述命令之前它一直是“栏”)。

但是尝试在代码中完成相同的事情适用于“bar”(几乎总是),但几乎不会适用于“gap”

这是代码:

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”与“gap”之外,代码完全相同

附加的“\r\n”是否可能导致问题?似乎添加这些是必要的,或者使命令更可靠,但在这种沮丧的时候,我对任何事情都持开放态度。

我总是测试替代命令来完成同样的事情,看看它们是否更可靠,但其他两种替代方法都不起作用,即不是这个:

! U1 setvar "ezpl.media_type" "web"

-也不是这个:

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

...在将这些命令发送到打印机后,通过 getvar 检查 val 继续显示“bar”(设置回“bar”后,发送这两个命令后,“media.sense_mode”的值仍为“bar”)。

是否可能需要设置某些其他打印机设置才能使打印机对发送的命令更加敏感?不仅以编程方式设置命令不可靠,而且即使通过 Zebra 设置实用程序,它有时会在命令发送和返回之前“沙漏”很长时间 - 有时它比 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),或者这是否意味着由于我的“应用程序”更新,我需要将固件升级V68.19.7Z?如果我确实需要更新固件,我该怎么做?是找到最新固件并将其下载到我的电脑上,然后在电脑和打印机通过 USB 连接时运行其安装应用程序,还是......?

更新 2

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

更新 3

如果我在上面引用的页面上单击“自解压存档”链接,我只会得到一个包含一些通用但无法操作(看起来如此)方向的页面。

如果我点击那里的下载链接,我会得到一个页面,上面写着“这个网页有一个重定向循环”

更新 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 还是通过其他方式(蓝牙、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 回答
1

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

^XA
^PW832
^JUS
^XZ

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

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

~JC
于 2014-08-08T02:50:14.523 回答
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 回答