文章目录

PLC与条码打印机的串口通信程序编写

发布于 2026-03-23 08:05:28 · 浏览 7 次 · 评论 0 条

确认 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 指令:

  1. 调用 指令 SEND_PTI(点对点发送),位于指令库"通信"→"点对点"→"SEND_PTP"。

  2. 配置 引脚参数:

引脚 变量名 说明
REQ M0.0 上升沿触发发送
PORT HW_ID CM1241硬件标识符
BUFFER DB_PrintData.FullCommand 发送数据区
LENGTH MW20 发送字节长度
DONE M0.1 发送完成标志
ERROR M0.2 错误标志
STATUS MW22 状态字
  1. 构建 ZPL指令拼接程序。使用 S_MOVECONCAT 指令组合字符串:
// 标签头
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;
  1. 转换 ASCII字符串为Byte数组,计算实际长度写入 MW20

  2. 置位 M0.0 触发发送,上升沿检测后自动复位。


第五步:动态数据交互设计

实现 PLC与HMI的数据交换。创建变量表:

变量名 数据类型 说明
HMI_ProductName String[20] 产品名称输入
HMI_BarcodeData String[25] 条码内容输入
HMI_PrintTrigger Bool 打印触发按钮
PLC_PrintDone Bool 打印完成反馈
PLC_PrintError Bool 打印错误标志

编写 打印流程状态机:

graph LR A["Idle: 等待触发"] -- "HMI_PrintTrigger=1" --> B["Prepare: 组包ZPL"] B -- "组包完成" --> C["Send: 调用SEND_PTP"] C -- "DONE=1" --> D["Check: 校验回显"] D -- "正常" --> A D -- "超时/错误" --> E["Error: 报警提示"] E -- "复位" --> A

添加 接收校验(可选)。部分打印机支持回传状态,配置 RCV_PTP 指令捕获 ~HS 状态查询响应,解析是否缺纸、暂停等异常。


第六步:调试与故障排查

监控 发送数据。TIA Portal在线模式下,打开 数据块 DB_PrintData查看 FullCommand 数组的十六进制值,确认:

  • ^ 对应 16#5E
  • X 对应 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)。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文