资讯详情

资讯详情

西门子PLC通过TCP直连斑马/霍尼韦尔打印机实现标签打印

简介这份PDF教程面向工业自动化工程师与PLC编程人员聚焦西门子S7-1200 PLC通过以太网TCP通信控制霍尼韦尔或斑马打印机的完整实现方案解决产线标签打印中指令转换与通信组态的实操难题。资源包为单个PDF文档大小约721KB内容涵盖霍尼韦尔PX240S打印机IP与端口配置、ZSim语言切换以兼容斑马ZPL-II指令、Zebra Designer设计标签并导出指令码、博图TSEND_C通信组态及状态码7004判断、字符串变量与中间转存DB的打印程序设计以及编码位数修改与测试效果。教程以图文步骤展开重点提示打印机默认端口9000需改为5000以下、DB块去优化访问便于绝对寻址等易错细节并给出触摸屏切换格式代号适应不同标签需求的思路。已有1648人学习适合需要快速打通PLC与打印机通信链路的自动化从业者参考。1. 西门子PLC走TCP控制斑马/霍尼韦尔打印机一条指令打一张标签的落地路径产线上经常遇到这种需求PLC 采集完重量、批次、序列号操作工按一下按钮旁边那台标签打印机立刻吐出一张内容各异的标签。很多人第一反应是让上位机中转但工控现场最稳的做法其实是让西门子 PLC 直接通过 TCP 把打印指令发给斑马或霍尼韦尔的工业打印机。这个标题讲的就是这件事——用 PLC 的开放式通信指令把一段符合打印机指令集的字符串推到打印机的 9100 端口实现无人值守的即时打印。它适合做包装、仓储、追溯产线的电气和自动化工程师也适合手里有 S7-1200/1500 又不想多买一台工控机的朋友。核心难点不在网络通不通而在指令拼装和字符编码这两处下面一层层拆。2. 先搞懂打印机认什么ZPL 与 DPL 的指令差异2.1 斑马认 ZPL霍尼韦尔认 DPL 或 ZPL 仿真斑马打印机原生指令集是 ZPLZebra Programming Language霍尼韦尔原 Intermec 系主流是 DPLDirect Protocol Language部分型号如 PM 系列、PC 系列可以切到 ZPL 仿真模式。这意味着同一段字符串发给两家机器结果完全不同。我一般先确认打印机型号和固件里当前的语言模式再决定拼哪套指令。如果现场两种品牌混用最省事的做法是统一让霍尼韦尔跑 ZPL 仿真PLC 里只维护一套模板。ZPL 的典型结构是^XA开头、^XZ结尾中间用^FO定位、^A选字体、^FD填数据、^FS结束字段。DPL 则是用PRINT、FIELD这类命令风格更接近脚本。下面这段是最小可用的 ZPL 标签^XA ^FO50,50^A0N,40,40^FDHello PLC^FS ^FO50,120^BY3^BCN,100,Y,N,N^FD123456789^FS ^XZ逻辑说明^XA和^XZ是标签的起止标记缺一个打印机就不动作^FO后面跟 X,Y 坐标单位是点dot300dpi 机器上 1mm 约等于 12 点^A0N,40,40是字体 0、正常方向、高宽各 40 点^BCN是 Code128 条码^BY3设模块宽度。参数上最容易翻车的是坐标单位很多人按毫米填打出来全挤在左上角。2.2 端口 9100 与 515 的区别斑马和霍尼韦尔都支持 RAW 打印默认监听 9100 端口这是最常用的透传方式PLC 发什么打印机就收什么不做任何解释。515 是 LPD 协议需要额外的队列控制命令PLC 侧实现起来麻烦不推荐。所以选型结论很明确走 9100纯 TCP 客户端模式PLC 主动连打印机。提示部分打印机出厂时 9100 是关闭的需要在打印机的网络设置页里手动启用 RAW 端口这一步不做后面所有代码都白搭。3. 西门子侧怎么发TCON、TSEND 与连接参数3.1 用 TCON 建立连接TSEND 发数据S7-1200/1500 的开放式通信靠 TCON、TSEND、TURCV 这几个指令。做打印只需要主动连接加发送所以用 TCON TSEND 就够。TCON 的CONNECT参数指向一个TCON_IP_v4结构里面填打印机 IP、端口 9100、连接类型。下面是一个典型的连接参数定义以博途的数据块为例// 在全局DB里定义连接参数结构 ConnectionType : BYTE : 16#0B; // TCP ActiveEstablished : BOOL : TRUE; // PLC主动连接 RemoteAddress : ARRAY[1..4] OF BYTE : [192,168,1,50]; // 打印机IP RemotePort : UINT : 9100; LocalPort : UINT : 0; // 0表示自动分配逻辑说明ConnectionType填 16#0B 表示 TCP这是固定值不能改ActiveEstablished必须为 TRUE因为打印机是被动等待方RemoteAddress是打印机 IP 的四个字节注意这里不是字符串而是字节数组填错一位就连不上。参数上LocalPort给 0 让系统自动分配即可手动指定反而容易和别的连接冲突。3.2 TSEND 的数据区与长度控制TSEND 的DATA参数指向要发送的缓冲区LEN是实际字节数。这里有个血泪经验ZPL 字符串里如果有中文或特殊符号长度按字节算不是按字符算。我一般把标签内容拼进一个STRING或ARRAY OF BYTE然后用LEN或STR_LEN取长度。下面是一段拼装并发送的示例逻辑// 伪代码示意实际在博途里用SCL或梯形图实现 SendBuffer : ^XA^FO50,50^A0N,40,40^FD; SendBuffer : CONCAT(SendBuffer, ProductCode); SendBuffer : CONCAT(SendBuffer, ^FS^XZ); SendLen : STR_LEN(SendBuffer); TSEND(REQ : SendTrigger, DATA : SendBuffer, LEN : SendLen, DONE SendDone, ERROR SendError);逻辑说明先把固定头和变量拼在一起再补结尾最后取长度发送。REQ用上升沿触发不能一直给 TRUE否则会重复发送。DONE和ERROR要接出来做状态判断发送失败时看STATUS的值常见的是 16#8085 表示连接没建立16#80A4 表示对方拒绝。参数上LEN如果填大了打印机会收到多余的空字符可能打出乱码或空标签填小了则标签被截断。所以拼装完一定要用STR_LEN动态取长度不要写死。3.3 连接保持与断线重连TCON 建立的连接是长连接只要不断就一直有效。但打印机重启、网络抖动都会导致连接断开这时候 TSEND 会报错。我的做法是在程序里监控SendError一旦出错就断开重连先调 TDISCON 断开延时几百毫秒再重新 TCON。这个重连逻辑要放在循环里不能只做一次。注意TDISCON 和 TCON 不能在同一扫描周期里连续调用中间至少隔一个周期或加个定时器否则连接状态机会乱。4. 把变量塞进标签字符串拼装与编码处理4.1 用 CONCAT 拼装动态内容实际产线上标签内容几乎都是变的批次号、重量、时间戳都要从 PLC 变量里取。SCL 里用CONCAT指令拼接字符串最直接但要注意CONCAT一次只能拼两段多段要嵌套。下面是一个拼装含重量和批次的标签示例// 假设 Weight 是 REALBatchNo 是 STRING TempStr : REAL_TO_STRING(Weight); LabelStr : ^XA^FO50,50^A0N,40,40^FDBatch:; LabelStr : CONCAT(LabelStr, BatchNo); LabelStr : CONCAT(LabelStr, ^FS^FO50,120^A0N,40,40^FDWeight:); LabelStr : CONCAT(LabelStr, TempStr); LabelStr : CONCAT(LabelStr, kg^FS^XZ);逻辑说明REAL_TO_STRING把浮点数转成字符串默认会带很多小数位实际用的时候要用ROUND或格式化函数控制精度否则标签上会出现一长串小数。CONCAT嵌套层数多了可读性差我一般会拆成几个中间变量方便调试时在线监控。参数上要注意字符串长度博途里STRING默认最大 254 字节标签内容长的话要自定义STRING[500]之类的类型否则会被截断。4.2 中文和特殊字符的编码坑斑马打印机默认按单字节编码解析 ZPL如果标签里有中文必须用^CI指令切换编码或者把中文转成打印机支持的 GB18030 字节流。更稳的做法是标签上不放中文用英文加条码代替。如果非要打中文需要在 ZPL 里加^CI17或^CI28指定 UTF-8同时 PLC 侧发的字节流也要对应编码。我踩过的坑是博途里字符串是 Unicode直接发出去打印机收到的是双字节打出来全是乱码。解决办法是用ATH或字节操作把字符串转成单字节数组再发。这一步没有捷径只能对着打印机的编码表调。提示调试阶段先用串口助手或网络调试工具手动发一段 ZPL 给打印机确认标签能打出来再回头调 PLC 程序。这样能把打印机问题和 PLC 问题分开。5. 避坑与排查连不上、打不出、乱码怎么查5.1 连接建立失败STATUS 报 16#8085现象TCON 的 ERROR 置位STATUS 显示 16#8085。原因通常是 IP 不对、端口没开、或者打印机和 PLC 不在同一网段。解决先用电脑 ping 打印机 IP再用 telnet 或网络调试工具连 9100 端口确认端口通。如果电脑能连 PLC 不能连检查 PLC 的网口配置和路由S7-1200 两个网口是独立的别插错。5.2 发送成功但打印机不动作现象TSEND 的 DONE 置位但打印机没反应。原因一般是 ZPL 指令不完整缺^XA或^XZ或者打印机当前语言模式不是 ZPL。解决把 PLC 发的字符串原样抓出来用调试工具发给打印机验证。如果手动发能打说明是 PLC 拼装时多了空格或少了字符重点查CONCAT的边界。5.3 标签内容乱码或截断现象打出来的标签中文变问号或者内容只显示一半。原因编码不匹配或字符串长度超限。解决中文场景加^CI编码指令并确保 PLC 发单字节流长度问题检查STRING定义的最大长度和LEN参数是否一致。我一般会在拼装完后把LabelStr和SendLen一起在线监控肉眼核对。5.4 连续打印时丢标签现象快速连续触发时偶尔少打一张。原因TSEND 还没完成就触发了下一次或者打印机缓冲区满了。解决用DONE做互锁上一张打完才能触发下一张同时在打印机侧适当加大缓冲区或降低触发频率。这个坑在高速产线上特别常见别指望打印机无限快。5.5 打印机重启后 PLC 不知道现象打印机断电重启后PLC 这边连接其实已经断了但程序没检测到后续发送全部失败。原因TCP 连接是打印机主动断的PLC 侧没有心跳机制。解决定期发一个空标签或查询指令做心跳或者监控 TSEND 的 ERROR一旦出错就走重连逻辑。我习惯在 OB1 里放一个每秒一次的发送测试成本很低但能及时发现断线。6. 进阶技巧用变量模板和状态机把打印做成标准块把打印逻辑封装成一个 FB功能块是长期维护的关键。我的做法是定义一个FB_PrintLabel输入参数包括触发信号、标签模板号、变量数组输出包括完成、错误、状态码。内部用状态机管理连接、拼装、发送、重连四个状态这样每条产线只要调用一次改标签只改模板数据不动逻辑。模板管理上可以把不同产品的 ZPL 模板存在 DB 里用索引切换。下面是一个模板切换的示意// 模板DB结构示意 TYPE ZPL_Template : STRUCT Header : STRING[100]; Body : STRING[200]; Footer : STRING[20]; END_STRUCT END_TYPE // 调用时按产品号取模板 CurrentTemplate : TemplateDB[ ProductIndex ];逻辑说明把固定部分和可变部分分开存拼装时只替换变量占位符。这样新增产品只要加一条模板记录不用改程序。参数上模板长度要留余量别卡着 254 字节上限。验证方法很简单用一个网络调试工具监听 9100 端口把 PLC 发的原始字节抓下来和手动发的标准 ZPL 做对比逐字节核对。这个习惯帮我省了很多瞎猜的时间。最后说个我自己的教训别在产线运行的时候改打印程序一定要在停机或空跑状态下调曾经有一次在线改参数导致整批标签打错返工成本比调试时间高得多。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →