1. 项目背景与需求分析
在工业自动化控制系统中,PLC与称重设备的通讯是常见需求。我最近完成的一个项目就涉及到西门子S7-200 SMART PLC与实验室精密天平的数据采集系统。这个系统的核心要求是:
- 实时获取天平称重数据(精度0.01g)
- 数据更新频率≥5Hz
- 通讯可靠性>99.9%
- 异常情况自动报警
经过评估,我们选择了自由口通讯方案而非标准Modbus协议,主要基于以下考虑:
- 天平设备厂商提供的通讯协议是自定义格式
- 自由口模式可以灵活适配各种非标协议
- S7-200 SMART的串口处理能力完全满足需求
- 项目对实时性要求较高,自由口通讯延迟更低
2. 硬件连接与配置
2.1 接口选型与连接
实际项目中我们使用的是RS485接口,相比RS232有以下优势:
- 传输距离更长(可达1200米)
- 抗干扰能力更强
- 支持多点连接(后续可扩展多台天平)
接线要点:
- PLC端:使用CPU集成的RS485接口(端口号PORT0)
- 天平端:连接专用通讯接口端子
- 使用双绞屏蔽线(型号BELDEN 9842)
- 终端电阻设置为120Ω(拨码开关设置)
重要提示:务必确认两端接口类型一致。我们曾遇到因误用RS232转接头导致通讯失败的情况。
2.2 电气参数配置
通过SMB30寄存器配置通讯参数:
bash复制SMB30 = 0x09 // 二进制00001001
具体含义:
- 位0-1:10(自由口模式)
- 位2-4:010(9600bps)
- 位5:0(无校验)
- 位6-7:01(8位数据)
实测参数组合:
| 波特率 | 数据位 | 校验位 | 稳定性 |
|---|---|---|---|
| 9600 | 8 | 无 | ★★★★★ |
| 19200 | 8 | 偶校验 | ★★★☆☆ |
| 38400 | 8 | 无 | ★★☆☆☆ |
3. 通讯协议深度解析
3.1 数据帧结构
经过与设备厂商确认,协议帧格式如下:
| 字段 | 字节数 | 示例值 | 说明 |
|---|---|---|---|
| 起始符 | 2 | 0xAA 0xBB | 固定值 |
| 设备地址 | 1 | 0x01 | 天平设备地址 |
| 功能码 | 1 | 0x03 | 0x03表示读取重量 |
| 数据长度 | 1 | 0x04 | 后续数据字节数 |
| 数据区 | N | - | 实际重量数据 |
| CRC16 | 2 | - | 从起始符到数据区末 |
| 结束符 | 2 | 0xCC 0xDD | 固定值 |
3.2 数据解析算法
重量数据采用IEEE 754浮点格式传输,PLC端需要特殊处理:
stl复制// 将接收到的4字节数据转换为实数
LDB= VB203, AC0
LDB= VB204, AC1
LDB= VB205, AC2
LDB= VB206, AC3
SLB AC1, 8
SLB AC2, 16
SLB AC3, 24
ORB AC0, AC1
ORB AC0, AC2
ORB AC0, AC3
MOVD AC0, VD300 // 最终重量值存储在VD300
4. PLC程序实现详解
4.1 初始化程序
stl复制// 主程序OB1
LD SM0.1 // 首次扫描
CALL SBR0 // 调用初始化子程序
// 子程序SBR0
LD SM0.0
MOVB 16#09, SMB30 // 设置通讯参数
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 +8, SMW92 // 接收超时时间(ms)
MOVB 100, SMB94 // 接收缓冲区大小
ATCH INT0, 9 // 发送完成中断
ATCH INT1, 23 // 接收完成中断
ENI // 启用中断
4.2 数据收发程序
发送请求帧构建:
stl复制// 在VB100-VB107构建请求帧
MOVB 16#AA, VB100
MOVB 16#BB, VB101
MOVB 1, VB102 // 设备地址
MOVB 3, VB103 // 功能码
MOVB 0, VB104 // 数据长度=0
MOVB 0, VB105 // (保留)
CALL CRC16 // 计算校验
MOVW AC0, VW106 // 存入CRC
MOVB 16#CC, VB108
MOVB 16#DD, VB109
XMT VB100, 0 // 发送请求
4.3 CRC16校验算法实现
stl复制// CRC16计算子程序
// 输入:AC0=数据起始地址,AC1=数据长度
// 输出:AC0=CRC结果
LD SM0.0
MOVW 16#FFFF, AC2 // 初始化CRC寄存器
FOR AC3, +1, AC1 // 循环处理每个字节
XORB *AC0, AC2 // 异或操作
INC AC0 // 指针递增
FOR AC4, +1, +8 // 每位处理
SRW AC2, 1 // 右移
LD SM1.1 // 检查溢出位
MOVW AC2, AC5
XORW 16#A001, AC5 // 多项式处理
MOVW AC5, AC2
NEXT
NEXT
MOVW AC2, AC0 // 返回结果
5. 系统优化与异常处理
5.1 通讯超时重试机制
stl复制// 在INT1中断中增加超时处理
LD SM0.0
TON T37, +100 // 100ms定时器
LD T37
MOVB 1, VB400 // 错误计数器
LDW>= VW400, +3 // 超过3次错误
MOVB 1, Q0.0 // 触发报警
JMP END
// 正常处理流程...
END: RETI
5.2 数据滤波算法
采用移动平均滤波:
stl复制// 在VB500-VB503存储最近4次采样
MOVD VD300, VD504 // 新值
MOVD VD504, VD500
MOVD VD500, VD501
MOVD VD501, VD502
MOVD VD502, VD503
// 计算平均值
MOVR VD500, VD510
+R VD501, VD510
+R VD502, VD510
+R VD503, VD510
/R 4.0, VD510 // 最终滤波值
6. 现场调试经验
-
接地问题:最初通讯不稳定,后发现天平与PLC未共地。增加接地线后解决。
-
数据错位:因起始符检测设置不当导致。修正SMB88/SMB89设置后正常。
-
CRC校验失败:发现是天平端CRC多项式与PLC端不一致。统一使用Modbus CRC16标准后解决。
-
抗干扰措施:
- 通讯线远离动力线
- 增加磁环
- 使用屏蔽线并单端接地
-
性能优化技巧:
- 将CRC计算改为查表法,速度提升5倍
- 使用S7-200 SMART的PORT1作为调试端口
- 在数据稳定后降低采样频率