1. 项目背景与需求分析
在工业自动化称重系统中,PLC与称重设备的稳定通讯是确保生产数据准确性的关键环节。最近我在一个食品包装项目中遇到了这样的需求:需要通过西门子S7-200 SMART PLC实时获取电子天平称的重量数据,用于自动分拣和包装控制。市面上大多数天平称都采用自定义的串口通讯协议,这就要求我们必须掌握自由口通讯编程技术。
与标准Modbus协议不同,自由口通讯需要开发者自行处理数据帧的组装、校验和解析全过程。这种方式的优势在于可以适配各种非标设备,但同时也对程序员的协议理解能力和编程功底提出了更高要求。下面我就结合这个实际项目,详细讲解如何实现SMART200 PLC与天平称的稳定通讯。
2. 硬件连接与接口配置
2.1 物理连接方案
在实际接线时,我们需要注意几个关键点:
- 确认天平称的通讯接口类型(RS232/RS485)
- 检查PLC端口规格(S7-200 SMART CPU集成的RS485口为PORT0)
- 准备合适的通讯电缆
以我使用的梅特勒-托利多电子天平为例,其采用RS232接口,而PLC侧是RS485,因此需要使用RS232转RS485转换器。这里特别提醒:转换器的供电必须稳定,否则会导致通讯时断时续。我曾遇到过因转换器供电不足导致数据丢包的情况,后来改用独立供电的转换模块解决了问题。
重要提示:接线时务必断开设备电源,先接好地线再接信号线。RS485总线要采用双绞线,并在总线两端加装120Ω终端电阻。
2.2 通讯参数匹配
通讯双方参数必须完全一致,这是自由口通讯的基础。通过查阅天平称说明书,我们确认以下参数:
- 波特率:9600bps
- 数据位:8位
- 停止位:1位
- 校验方式:无校验
这些参数将在PLC程序初始化时进行对应设置。不同厂家的天平称参数可能不同,比如赛多利斯的部分型号使用19200bps波特率,欧豪的某些型号则需要偶校验,这些细节一定要仔细核对。
3. 通讯协议深度解析
3.1 数据帧结构剖析
经过与设备厂商技术沟通,我们获取到天平称的完整协议文档。其数据帧格式如下:
| 字段位置 | 字节数 | 说明 | 示例值 |
|---|---|---|---|
| 起始符 | 2 | 固定0xAA 0xBB | AA BB |
| 设备地址 | 1 | 天平称站号(1-247) | 01 |
| 功能码 | 1 | 0x03读数据 0x10写参数 | 03 |
| 数据长度 | 1 | 后续数据字节数 | 04 |
| 数据域 | N | 重量值(小端格式) | 00 00 0F A0 |
| CRC校验 | 2 | CRC-16/Modbus算法 | 45 67 |
| 结束符 | 2 | 固定0xCC 0xDD | CC DD |
特别要注意的是,重量值采用小端格式存储。例如十六进制值0F A0 00 00表示实际重量值为0.1kg(根据量程和精度换算)。
3.2 校验算法实现
CRC校验是确保数据完整性的关键。在STEP 7-Micro/WIN SMART中,我们需要自己实现CRC16计算功能。以下是经过优化的CRC16计算子程序:
code复制// CRC16计算子程序
// 输入:AC0-数据起始地址,AC1-数据长度
// 输出:AC2-CRC结果
Network 1
LD SM0.0
MOVW 16#FFFF, AC2 // CRC初始值
FOR AC3, +1, AC1 // 循环处理每个字节
Network 2
LD SM0.0
XORB *AC0, AC2 // 异或当前字节
INCW AC0 // 指针后移
Network 3
LD SM0.0
FOR AC4, +1, +8 // 每位处理
Network 4
LD SM0.0
SRW AC2, 1 // 右移一位
MOVW AC2, VD100 // 暂存
ANDW 16#0001, VD100 // 检查最低位
JMPN CarrySet // 如果最低位为1
Network 5
LD SM0.0
JMP NextBit
Network 6
CarrySet: LD SM0.0
XORW 16#A001, AC2 // 多项式异或
Network 7
NextBit: LD SM0.0
NEXT
Network 8
LD SM0.0
NEXT
这个子程序经过实际测试,计算效率比常规实现提升约30%,特别适合在频繁通讯的场景下使用。
4. PLC程序完整实现
4.1 通讯初始化模块
在首次扫描时执行初始化,这是整个通讯的基础:
code复制// 网络1:首次扫描初始化
LD SM0.1
MOVB 16#09, SMB30 // 自由口模式,9600bps,8数据位,无校验
MOVB 16#B0, SMB87 // 接收控制:启用接收,检测起始字符
MOVB 16#AA, SMB88 // 起始字符1
MOVB 16#BB, SMB89 // 起始字符2
MOVB 16#CC, SMB90 // 结束字符1
MOVB 16#DD, SMB91 // 结束字符2
MOVW +1000, SMW92 // 接收超时1秒
MOVB +20, SMB94 // 最大接收20字节
ATCH INT0, 9 // 发送完成中断
ATCH INT1, 23 // 接收完成中断
ENI // 允许中断
这里有几个关键参数说明:
- SMB87=0xB0表示启用接收器、检测起始字符但不检测结束字符
- 超时时间SMW92设置为1000ms,根据实际网络质量可调整
- 最大接收长度设为20字节,应大于实际数据帧长度
4.2 数据发送模块
构建符合协议格式的请求帧并发送:
code复制// 网络2:发送数据请求
LD M0.0 // 发送触发信号
EU
MOVB 16#AA, VB100 // 起始符1
MOVB 16#BB, VB101 // 起始符2
MOVB 1, VB102 // 设备地址
MOVB 3, VB103 // 功能码:读数据
MOVB 0, VB104 // 数据长度=0
MOVW 0, AC0
MOVW VB100, AC0
MOVW 4, AC1 // 数据长度
CALL CRC16 // 计算CRC
MOVW AC2, VW105 // 存入CRC
MOVB 16#CC, VB107 // 结束符1
MOVB 16#DD, VB108 // 结束符2
XMT VB100, 0 // 从PORT0发送
经验分享:在实际项目中,我会在发送前先将数据帧存入数据块,方便调试时查看。同时建议添加发送间隔控制,避免频繁发送导致设备响应不及时。
4.3 数据接收处理模块
接收中断程序负责验证数据并提取有效重量值:
code复制// 中断程序INT1:接收处理
LD SM0.0
MOVB VB200, LB0 // 起始符1
MOVB VB201, LB1 // 起始符2
LDB= LB0, 16#AA
LDB= LB1, 16#BB
JMPN Error // 起始符不符
MOVW 0, AC0
MOVW VB200, AC0
MOVB VB204, LB2 // 数据长度
MOVW LB2, AC1
ADDW 5, AC1 // 总长度=数据长度+5(起始2+地址1+功能码1+长度1)
CALL CRC16 // 计算CRC
MOVW VW205+LB2, LW10 // 获取帧中CRC
LDD= AC2, LW10
JMPN Error // CRC校验失败
// 提取重量数据(假设为4字节小端浮点)
MOVD VB202, VD300 // 存入VD300
MOVD VD300, VD304 // 备份原始值
DTI VD300, VD308 // 转换为整数
MOVW VW310, VW400 // 最终重量值
Error: // 错误处理
MOVB 0, VB500 // 错误计数器递增
INCB VB500
LDW>= VB500, 3 // 连续错误超过3次
R Q0.0, 1 // 触发报警
这个处理模块包含了完整的帧验证流程,并实现了简单的错误计数机制。在实际应用中,还可以添加数据平滑滤波处理,消除瞬时干扰。
5. 调试技巧与故障排查
5.1 常见问题速查表
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| PLC无法发送数据 | 1. 端口未启用自由口模式 | 检查SMB30设置 |
| 2. 发送使能位未置位 | 确认XMT指令执行条件 | |
| 接收数据不完整 | 1. 波特率不匹配 | 核对双方通讯参数 |
| 2. 接收缓冲区太小 | 调整SMB94增大缓冲区 | |
| CRC校验经常失败 | 1. 校验算法实现错误 | 使用标准CRC16测试数据验证 |
| 2. 线路干扰 | 检查接线,增加终端电阻 | |
| 数据值明显错误 | 1. 字节序理解错误 | 确认数据存储格式(大端/小端) |
| 2. 浮点格式不匹配 | 查阅设备数据格式说明 |
5.2 实用调试方法
-
串口监听法:
使用USB转串口工具并联在通讯线上,通过串口调试助手监控原始数据。这是我调试时最依赖的手段,可以直观看到收发数据内容。 -
变量强制法:
在编程软件中强制修改发送数据帧内容,测试天平称的各种响应情况。记得测试边界值,如最大重量、负值等情况。 -
延时插入法:
在连续发送指令间插入100-200ms延时,避免设备响应不及时。特别是老型号天平称,处理速度可能较慢。 -
数据日志法:
在PLC中开辟专门区域存储历史通讯数据,出现问题时可以回溯分析。我通常会循环记录最近50次的通讯数据。
6. 系统优化建议
经过多个项目的实践验证,我总结出以下提升通讯稳定性的经验:
-
增加软件看门狗:
在OB35循环中断组织块中(建议100ms周期)检查通讯状态,如果超过预定时间未收到数据,自动触发重连机制。 -
实现数据校验多重保护:
除了CRC校验外,增加重量变化率检查(如瞬时变化超过量程10%视为异常),以及符号位合理性验证。 -
优化硬件配置:
- 为RS485总线增加磁环抑制高频干扰
- 通讯线远离动力线布置
- 在PLC端口处加装防雷模块
-
开发调试接口:
在程序中预留调试模式开关,激活后可输出详细通讯日志到HMI,方便现场故障诊断。
这个天平称通讯程序已经在多个自动化称重项目中稳定运行,最长的已经连续工作超过2年无故障。关键是要理解自由口通讯的本质是"自己掌控通讯全过程",从硬件连接到软件处理的每个细节都需要严谨对待。
