1. 项目背景与需求解析
在工业自动化领域,PLC与扫码设备的协同工作已经成为现代生产线上的标准配置。最近我在一个食品包装产线升级项目中,遇到了需要将基恩士HR-X100扫码枪的条码数据实时传输到西门子Smart 200PLC的需求。这种组合在实际应用中非常典型——Smart 200以其高性价比著称,而基恩士扫码枪则以出色的读取率和稳定性闻名。
这个项目的核心挑战在于:如何通过串口通讯实现两种不同品牌设备间的可靠数据传输。不同于网络通讯,串口通讯需要处理物理层连接、协议配置、数据解析等一系列技术细节。经过两周的调试和优化,最终实现了99.9%的数据传输成功率,下面就把完整的实现方案和踩坑经验分享给大家。
2. 硬件准备与连接方案
2.1 设备选型与接口确认
西门子Smart 200PLC(具体型号为CPU ST30)自带一个RS485接口(端口号PORT0),而基恩士HR-X100扫码枪标配的是RS232接口。这里就出现了第一个关键点:接口类型不匹配问题。
解决方案有两种:
- 使用RS232转RS485转换器(推荐型号:MOXA UPort 1150)
- 更换扫码枪通讯模块(基恩士提供RS485选配模块)
考虑到现场布线便利性和成本,我们选择了第一种方案。这里有个重要提示:转换器的供电必须稳定,我们曾因使用劣质电源导致通讯断续,后来更换为工业级电源后问题解决。
2.2 物理连接示意图
code复制HR-X100扫码枪(RS232)
→
RS232/RS485转换器
→
Smart 200 PLC PORT0(RS485)
接线时需要特别注意:
- 扫码枪TX接转换器RX
- 扫码枪RX接转换器TX
- 转换器A+接PLC PORT0的A+
- 转换器B-接PLC PORT0的B-
- 所有设备必须共地
重要提示:基恩士扫码枪的串口引脚定义与常规设备不同,务必参考其手册的"RS232C接线图"章节。我们曾因接错线导致设备损坏,损失了三天调试时间。
3. 扫码枪参数配置
3.1 通讯基础参数设置
使用基恩士专用的KV-SOFT配置软件连接扫码枪后,需要设置以下关键参数:
| 参数项 | 设定值 | 备注 |
|---|---|---|
| 通讯协议 | 标准RS232 | 即使使用转换器也保持此设置 |
| 波特率 | 9600bps | 必须与PLC端保持一致 |
| 数据位 | 8位 | 行业通用标准 |
| 停止位 | 1位 | 与PLC匹配 |
| 校验 | 无 | 简化通讯配置 |
| 结束符 | CR+LF | 便于PLC识别数据结束 |
3.2 数据输出格式定制
基恩士扫码枪默认输出的是包含校验码的完整数据包,但PLC只需要核心条码信息。通过KV-SOFT的"输出格式"设置,可以精简数据:
- 进入"数据编辑"→"输出格式"
- 删除所有前缀字符(如STX)
- 仅保留"条码数据"字段
- 设置后缀为CR+LF(对应ASCII码0x0D 0x0A)
这样配置后,扫码枪输出的数据样例为:
code复制123456789012
(末尾自动添加不可见的回车换行符)
4. PLC端通讯程序开发
4.1 硬件组态配置
在STEP 7-Micro/WIN SMART中需要进行以下配置:
-
打开"系统块"→"通信端口"
-
设置PORT0参数:
- 波特率:9600
- 数据位:8
- 停止位:1
- 校验:无
- 协议:自由口通讯
-
特别要注意"消息结束条件"设置为"字符间定时器"(Timeout=10ms),这是识别结束符的关键。
4.2 自由口通讯程序编写
使用S7-200 SMART的RCV指令接收数据,核心程序结构如下:
stl复制// 主程序
LD SM0.1
CALL INIT_PORT0 // 端口初始化
LD I0.0 // 扫码触发信号
EU
CALL START_RCV // 启动接收
// 端口初始化子程序INIT_PORT0
LD SM0.0
MOVB 16#09, SMB30 // 自由口模式,9600波特率
MOVB 16#B0, SMB87 // 启用接收,检测结束符
MOVB 16#0D, SMB89 // 结束符1=CR
MOVB 16#0A, SMB90 // 结束符2=LF
MOVW +10, SMW92 // 字符间超时10ms
MOVB 50, SMB94 // 最大接收50字符
RET
// 接收启动子程序START_RCV
LD SM0.0
ATCH RCV_COMPLETE, 23 // 绑定接收完成中断
ENI // 启用中断
RCV VB100, 0 // 接收缓冲区从VB100开始
RET
// 接收完成中断程序RCV_COMPLETE
LD SM0.0
DTCH 23 // 解绑中断
MOVB VB100, VB200 // 处理接收数据
// ...(后续数据处理逻辑)
4.3 数据解析与存储
接收到的数据存储在VB100开始的缓冲区中,需要通过以下步骤处理:
-
检查接收状态字节SMB86:
- 16#20表示正常接收完成
- 16#40表示接收超时
- 其他值表示错误
-
提取有效数据长度(SMB94)
-
去除结束符后存储到DB块:
stl复制// 在RCV_COMPLETE中断程序中添加
LDW<> SMW90, +0 // 检查是否有接收数据
MOVB &VB100, AC1 // 源地址
MOVB &VB300, AC2 // 目标地址(DB区)
FOR VW10, +1, SMB94 // 循环处理每个字节
LD SM0.0
MOVB *AC1, *AC2 // 传输数据
INCB AC1 // 源地址+1
INCB AC2 // 目标地址+1
NEXT
5. 调试技巧与问题排查
5.1 常见故障速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| PLC无法接收任何数据 | 1. 接线错误 | 检查A+/B-是否反接 |
| 2. 波特率不匹配 | 确认双方波特率一致 | |
| 接收数据不完整 | 1. 结束符设置错误 | 检查SMB89/SMB90设置 |
| 2. 超时时间太短 | 增大SMW92值(建议10-20ms) | |
| 数据出现乱码 | 1. 接地不良 | 检查所有设备是否共地 |
| 2. 电磁干扰 | 使用屏蔽双绞线,远离动力线 |
5.2 实用调试工具
- 串口监听工具:在扫码枪与转换器之间接入USB转串口工具,使用串口助手(如AccessPort)监控原始数据
- PLC状态监控:
- 监控SMB86接收状态字节
- 在线查看VB100开始的接收缓冲区
- 基恩士调试模式:长按扫码枪触发键5秒进入调试模式,可输出测试图案
5.3 抗干扰优化措施
- 线缆选择:使用双层屏蔽双绞线(型号:Belden 3106A)
- 终端电阻:在RS485网络最远端加120Ω终端电阻
- 电源隔离:为扫码枪和转换器使用隔离电源模块
- 软件滤波:在PLC程序中添加以下逻辑:
stl复制// 数据校验子程序
LD SM0.0
MOVB VB100, LB0 // 首字节
MOVB VB101, LB1 // 次字节
XORB LB0, LB1 // 简单校验
BTI LB1, LW2 // 转换为整数
LDW> LW2, 16#FF // 校验值超过阈值
R 5.0, 1 // 置位错误标志
6. 系统优化与扩展
6.1 性能提升方案
-
批量处理模式:修改扫码枪设置为"连续读取模式",通过PLC程序控制:
stl复制// 触发连续读取 LD I0.0 EU MOVB 16#02, VB500 // 发送STX MOVB 16#43, VB501 // 'C'命令 MOVB 16#0D, VB502 // CR XMT VB500, 0, 3 -
数据压缩传输:对于固定格式条码,可设置扫码枪只输出有效部分:
- 在KV-SOFT中启用"数据截取"功能
- 设置起始位置和长度(如从第3字符开始取10位)
6.2 异常处理机制
-
超时重试逻辑:
stl复制// 在RCV_COMPLETE中 LD SM0.0 MOVB SMB86, LB0 LDB= LB0, 16#40 // 超时 CALL RETRY_RCV -
数据校验增强:
- 添加LRC校验(纵向冗余校验)
- 在DB块中记录错误次数(VB900错误计数器)
6.3 扩展应用场景
- 多枪协同:通过RS485总线连接多个扫码枪,通过地址区分设备
- 数据关联:将条码与PLC的定时器值关联,记录读取时间戳
- 远程监控:通过Smart 200的以太网口将数据上传至SCADA系统
经过实际产线验证,这套方案在每天20,000次扫描量下稳定运行超过6个月。最关键的经验是:RS485网络的终端电阻和接地处理直接影响通讯稳定性,建议在项目初期就用示波器检查信号质量。另外,基恩士扫码枪的光学参数(如曝光时间)需要根据条码类型精细调整,这往往比通讯本身更影响读取率。
