确认 PLC型号与条码打印机型号。常见PLC品牌如西门子、三菱、欧姆龙等,打印机品牌如斑马、TSC、博思得等。本指南以西门子S7-1200 PLC与斑马ZT230打印机为例,RS-232串口通信。
准备 硬件清单:PLC主机、RS-232通信模块(CM1241)、条码打印机、DB9串口线、24V电源。
第一步:硬件接线与参数配置
检查 打印机背面接口类型,确认支持RS-232。ZT230标配DB9母口,需使用直通线(PLC端公头接打印机端母头)。
连接 串口线各引脚:PLC TXD(引脚3)接打印机 RXD(引脚2),PLC RXD(引脚2)接打印机 TXD(引脚3),GND(引脚5)互连。形成全双工通信基础。
设置 打印机通信参数。按住打印机"进纸"键开机,进入配置模式:
| 参数项 | 设定值 | 说明 |
|---|---|---|
| 波特率 | 9600 |
双方必须一致 |
| 数据位 | 8 |
标准配置 |
| 停止位 | 1 |
标准配置 |
| 校验 | 无 |
可选奇/偶/无 |
| 流控 | 无 |
硬件流控关闭 |
记录 上述参数,PLC端需完全匹配。
第二步:PLC通信模块组态
打开 TIA Portal V16,创建新项目。设备组态中添加CPU 1214C,拖拽CM1241(RS232)模块至机架101槽位。
双击 CM1241模块,属性栏配置:
波特率: 9600
奇偶校验: 无
数据位: 8
停止位: 1
流控制: 无
注意 "接收消息的条件"设置。条码打印机为被动设备,PLC主动发送。配置结束分隔符为 LF(换行符,16#0A),对应ZPL指令默认以回车换行结尾。
第三步:理解ZPL指令集
掌握 斑马打印机原生语言ZPL(Zebra Programming Language)。无需安装驱动,直接发送ASCII文本即可控制打印。
学习 核心指令格式:以 ^ 开头表示命令,以 ~ 开头表示控制指令。每条指令以回车换行 CRLF(16#0D0A)结束。
编写 基础标签模板:
^XA
^FO50,50
^A0N,30,30
^FD产品编号: 20240001^FS
^FO50,100
^B3N,N,100,Y,N
^FD123456789012^FS
^XZ
解析 上述指令:
| 指令 | 功能说明 |
|---|---|
^XA |
标签开始 |
^FOx,y |
字段原点定位(x,y坐标) |
^A0 |
字体A,标准字号 |
^FD...^FS |
字段数据开始与结束 |
^B3 |
Code 128条码,高度100点 |
^XZ |
标签结束,执行打印 |
第四步:PLC发送程序编写
创建 数据块 DB_PrintData,定义发送缓冲区:
TYPE "UDT_PrintBuffer"
STRUCT
Header : Array[0..3] of Char; // ^XA
TextField : Array[0..49] of Char; // 文本内容
BarcodeField : Array[0..59] of Char; // 条码内容
Footer : Array[0..3] of Char; // ^XZ
FullCommand : Array[0..199] of Byte; // 完整发送数据
END_STRUCT;
编写 主程序 OB1,调用 SEND_PTP 指令:
-
调用 指令
SEND_PTI(点对点发送),位于指令库"通信"→"点对点"→"SEND_PTP"。 -
配置 引脚参数:
| 引脚 | 变量名 | 说明 |
|---|---|---|
REQ |
M0.0 |
上升沿触发发送 |
PORT |
HW_ID |
CM1241硬件标识符 |
BUFFER |
DB_PrintData.FullCommand |
发送数据区 |
LENGTH |
MW20 |
发送字节长度 |
DONE |
M0.1 |
发送完成标志 |
ERROR |
M0.2 |
错误标志 |
STATUS |
MW22 |
状态字 |
- 构建 ZPL指令拼接程序。使用
S_MOVE和CONCAT指令组合字符串:
// 标签头
S_MOVE "^XA" TO DB_PrintData.Header;
// 动态文本:产品编号
CONCAT "产品编号: " AND "ProductID" TO DB_PrintData.TextField;
// 动态条码:从HMI输入
CONCAT "^FO50,100^B3N,N,100,Y,N^FD" AND "BarcodeData" AND "^FS"
TO DB_PrintData.BarcodeField;
// 标签尾
S_MOVE "^XZ" TO DB_PrintData.Footer;
// 合并完整指令
CONCAT DB_PrintData.Header AND DB_PrintData.TextField
AND DB_PrintData.BarcodeField AND DB_PrintData.Footer
TO DB_PrintData.FullCommand;
-
转换 ASCII字符串为Byte数组,计算实际长度写入
MW20。 -
置位
M0.0触发发送,上升沿检测后自动复位。
第五步:动态数据交互设计
实现 PLC与HMI的数据交换。创建变量表:
| 变量名 | 数据类型 | 说明 |
|---|---|---|
HMI_ProductName |
String[20] | 产品名称输入 |
HMI_BarcodeData |
String[25] | 条码内容输入 |
HMI_PrintTrigger |
Bool | 打印触发按钮 |
PLC_PrintDone |
Bool | 打印完成反馈 |
PLC_PrintError |
Bool | 打印错误标志 |
编写 打印流程状态机:
添加 接收校验(可选)。部分打印机支持回传状态,配置 RCV_PTP 指令捕获 ~HS 状态查询响应,解析是否缺纸、暂停等异常。
第六步:调试与故障排查
监控 发送数据。TIA Portal在线模式下,打开 数据块 DB_PrintData,查看 FullCommand 数组的十六进制值,确认:
^对应16#5EX对应16#58- 结尾包含
0D 0A(CRLF)
使用 串口监视工具。PC端运行SSCOM或串口调试助手,并联至通信线,捕获 PLC实际发出的数据流,与预期ZPL指令比对。
排查 常见故障:
| 现象 | 原因 | 解决 |
|---|---|---|
| 打印机无反应 | 波特率不匹配 | 双方确认 9600 |
| 打印乱码 | 校验位设置错误 | 统一 为无校验 |
| 内容截断 | 长度参数错误 | LENGTH计算 实际字节数 |
| 多打空白标签 | 缺少^XZ或CRLF | 检查 指令完整性 |
测试 单独发送。使用HMI手动输入 ^XA^FDTest^FS^XZ,绕过 复杂组包逻辑,验证基础通信正常。
第七步:高级功能扩展
实现 多模板切换。建立模板库 DB_TemplateLib,索引0-9对应不同产品型号:
CASE "TemplateIndex" OF
0: // 小标签 50x30mm
"ZPL_Base" := "^XA^PW400^LL300...";
1: // 大标签 100x80mm
"ZPL_Base" := "^XA^PW800^LL640...";
// ...
END_CASE;
集成 实时时钟。调用 READ_RTC 读取PLC系统时间,拼接 至ZPL的 ^FD 字段,实现打印时间戳。
添加 打印计数。使用 CTU 计数器累计产量,触发 每满100张自动发送 ~HS 查询打印机状态,实现预防性维护。
优化 发送效率。大批量打印时,启用 打印机缓存模式(^MC 指令),PLC连续发送多条标签数据,打印机队列处理,减少等待时间。
附录:完整ZPL模板参考
标准物料标签模板(含二维码+文字):
^XA
^PW800 // 打印宽度800点
^LL640 // 标签长度640点
^LS0 // 左偏移0
^FO50,30
^A0N,35,35
^FD物料名称: {ProductName}^FS
^FO50,80
^A0N,28,28
^FD规格型号: {Spec}^FS
^FO50,130
^A0N,28,28
^FD生产日期: {Date}^FS
^FO50,180
^A0N,28,28
^FD批次号: {Batch}^FS
^FO500,30
^BQN,2,10 // QR码,纠错等级M,放大系数10
^FDHA,{QRContent}^FS // 二维码数据
^FO50,550
^A0N,20,20
^FD检验: {Inspector} 审核: {Auditor}^FS
^XZ
替换 花括号 {} 内字段为实际PLC变量,注意 总长度不超过打印机缓存上限(通常4KB)。

暂无评论,快来抢沙发吧!