1. 项目背景与核心价值
在工业自动化产线中,条码扫描是物料追踪、产品溯源的关键环节。威纶通(Weintek)HMI与三菱PLC的组合在电子制造、汽车零部件等行业应用广泛。但很多工程师在实际部署时会发现:当条码枪通过串口接入威纶通触摸屏后,原始数据往往包含冗余字符(如回车符、前缀码等),需要经过特定处理才能被PLC正确识别。
这个项目要解决的核心痛点就是:如何通过威纶通的宏指令编程,对条码枪原始数据进行清洗和格式转换,最终输出符合三菱PLC处理要求的纯净条码数据。我在三个不同行业的自动化项目中都遇到过这个问题,总结出一套稳定可靠的解决方案。
2. 硬件连接与通信配置
2.1 物理接线方案
常见的条码枪接口有USB和RS232两种。对于工业现场环境,建议优先选择RS232接口,抗干扰能力更强。接线方式如下:
code复制条码枪 威纶通HMI
TX ------> RX
GND ------> GND
注意:部分型号的条码枪需要额外供电,需根据设备手册确认是否需要连接+5V线
2.2 威纶通串口参数设置
在EasyBuilder Pro开发环境中进行配置:
- 新建"串口设备"驱动
- 选择COM口(通常为COM2)
- 参数与条码枪保持一致(典型配置):
- 波特率:9600
- 数据位:8
- 停止位:1
- 校验位:None
2.3 三菱PLC数据区规划
建议在D寄存器区划出连续空间用于存储条码:
- D100: 条码长度(字节数)
- D101-D120: 条码内容(ASCII码形式)
- D121: 条码接收完成标志位
3. 宏指令编程实现
3.1 原始数据问题分析
条码枪原始数据示例:
code复制]C101ABC123456789\r
其中:
- ]C1 是GS1-128条码的前缀码
- 01是应用标识符
- ABC123456789是实际条码
- \r是回车符
3.2 关键处理逻辑
lua复制function OnBarcodeReceived(data)
-- 步骤1:去除首尾不可见字符
local cleanData = string.gsub(data, "[\r\n]", "")
-- 步骤2:识别并去除GS1前缀
if string.sub(cleanData, 1, 1) == "]" then
cleanData = string.sub(cleanData, 5) -- 跳过"]C1"前缀
end
-- 步骤3:长度校验
if string.len(cleanData) > 20 then
SetData("D100", 0) -- 超长条码处理
return
end
-- 步骤4:存储到PLC
SetData("D100", string.len(cleanData))
for i = 1, string.len(cleanData) do
SetData("D"..(100+i), string.byte(cleanData, i))
end
SetData("D121", 1) -- 置位完成标志
end
3.3 性能优化技巧
- 缓冲区管理:在宏指令开头添加
ClearCommBuffer()防止数据堆积 - 超时处理:设置500ms定时器,超时后自动清除未完成的数据包
- 错误重试:连续3次接收失败后自动复位串口
4. 现场调试经验
4.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| PLC接收数据乱码 | 字节序设置错误 | 检查HMI与PLC的字/字节传输模式 |
| 条码截断 | 串口波特率不匹配 | 用示波器测量实际波特率 |
| 重复接收相同条码 | 条码枪设置为连续模式 | 修改条码枪配置为单次触发 |
| 偶尔丢失数据 | 接地不良引入干扰 | 检查屏蔽层接地,加磁环 |
4.2 抗干扰实践
在某汽车零部件项目中遇到的典型问题:每当附近变频器启动时,条码读取成功率下降30%。最终通过以下措施解决:
- 改用屏蔽双绞线(型号:Belden 8761)
- 在HMI端增加DC-DC隔离模块
- 在宏指令中添加软件滤波:
lua复制-- 丢弃包含非ASCII字符的数据包
if string.match(data, "[^\x20-\x7E]") then
return
end
5. 功能扩展方向
5.1 多枪协同方案
对于需要同时接入多个条码枪的场景,可通过以下方式实现:
- 使用威纶通多串口型号(如MT8102iE)
- 每个COM口独立运行处理宏
- 在PLC中划分不同存储区(如D100-D120对应1号枪,D200-D220对应2号枪)
5.2 与MES系统集成
进阶方案可通过威纶通的以太网端口,将解析后的条码直接上传至MES:
lua复制-- HTTP POST示例
function SendToMES(barcode)
local cmd = "POST /api/barcode HTTP/1.1\r\n"
cmd = cmd.."Host: 192.168.1.100\r\n"
cmd = cmd.."Content-Type: application/json\r\n"
cmd = cmd.."Content-Length: "..string.len(barcode)+2.."\r\n\r\n"
cmd = cmd..'"'..barcode..'"'
SendEthData(cmd)
end
6. 维护与升级建议
- 版本控制:为每个宏指令添加版本注释
lua复制-- [Version 1.2] 2023-05-20
-- Added timeout handling
- 日志记录:利用威纶通的SD卡存储功能记录异常事件
- 热切换设计:通过PLC的M寄存器控制宏指令的启停,便于在线调试
在实际项目中,这套方案已经稳定运行超过2年,单日处理条码超过5000次无故障。关键点在于对条码协议的充分解析和工业环境下的异常处理。不同品牌的条码枪可能需要调整前缀识别逻辑,建议先用串口调试工具捕获原始数据后再做针对性开发。