【问题标题】:What Zebra QLn220 settings do I need to set (and to what value[s]) to get a setting to "stick"?我需要设置哪些 Zebra QLn220 设置(以及设置什么值[s])才能使设置“坚持”?
【发布时间】:2014-07-31 23:46:43
【问题描述】:

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

不过,这些命令工作的可靠性似乎很低(有时有效,有时无效)。

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

我从 util 发送了这个命令:

! U1 setvar "media.sense_mode" "gap"

成功了;我知道这一点,因为测试它:

! U1 getvar "media.sense_mode"

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

但是尝试在代码中完成相同的事情对于“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 设置实用程序中返回“V68.19.7Z”。

这是否意味着我的固件是最新的(V68.19.7Z > v68.18.0Z),或者这是否意味着因为我的“应用程序”更新,我需要升级固件到 V68.19.7Z?如果我确实需要更新固件,我该怎么做?是找到最新的固件并将其下载到我的电脑上,然后在电脑和打印机通过 USB 连接时运行其安装应用程序,还是...???

更新 2

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

更新 3

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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"
    

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

    【讨论】:

    • 以编程方式,使用 OpenNETCF 的 SerialPort 对象发送命令。手持设备通过插入打印机和手持设备卡入的连接器(不知道确切的术语)连接到 QLn220。所以有直接的物理连接,但我不知道它使用的是什么通信协议。我将在更新中发布代码。
    【解决方案2】:

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

    ^XA
    ^PW832
    ^JUS
    ^XZ
    

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

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

    ~JC
    

    【讨论】:

      【解决方案3】:

      添加一些调试字符串后它可以工作;在打印代码中:

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

      为什么它有效,我不知道,所以我仍然很警惕。但是,至少目前,它正在使用这个调整。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        相关资源
        最近更新 更多