1. 项目背景与需求分析
在工业自动化控制系统中,PLC与称重设备的通讯是常见的基础需求。这次我们要实现的是西门子S7-200 SMART系列PLC与电子天平之间的自由口通讯。这种方案特别适合需要实时获取重量数据,但又不想额外购置专用称重模块的场合。
自由口通讯(Freeport Communication)是西门子PLC提供的一种灵活的串行通讯方式,它允许用户自定义通讯协议。相比标准的Modbus、PPI等协议,自由口通讯的优势在于可以适配各种非标设备,特别是那些采用私有协议的称重仪表。
注意:自由口通讯虽然灵活,但需要开发者自行处理所有通讯细节,包括数据帧格式、校验机制、超时处理等,这对编程能力要求较高。
2. 硬件连接与配置
2.1 硬件选型与连接
我们使用的硬件配置如下:
- PLC:西门子S7-200 SMART CPU ST30(带RS485接口)
- 电子天平:某品牌精密电子天平,支持RS232通讯
- 转换器:RS232转RS485信号转换器
连接示意图:
code复制[电子天平 RS232] ---(DB9线)---> [RS232/RS485转换器] ---(双绞线)---> [PLC RS485端口]
关键细节:RS485通讯建议使用屏蔽双绞线,布线时远离动力电缆。如果通讯距离超过15米,需要在总线两端各加一个120Ω终端电阻。
2.2 通讯参数设置
通讯双方参数必须完全一致:
- 波特率:9600bps(天平固定参数)
- 数据位:8位
- 停止位:1位
- 校验位:无
- 流控:无
3. 通讯协议深度解析
3.1 天平通讯协议详解
经过与设备厂家沟通和技术文档查阅,确认该天平采用以下数据帧格式:
| 字段 | 字节数 | 说明 | 示例值 |
|---|---|---|---|
| 起始符 | 2 | 固定为0xAA 0xBB | AA BB |
| 设备地址 | 1 | 天平设备地址,默认为0x01 | 01 |
| 功能码 | 1 | 0x03表示读取重量 | 03 |
| 数据长度 | 1 | 后续数据字节数 | 04 |
| 重量数据 | 4 | 浮点数格式的当前重量 | 40 49 0F DB |
| CRC校验 | 2 | CRC-16/Modbus算法 | 85 6A |
| 结束符 | 2 | 固定为0xCC 0xDD | CC DD |
3.2 数据解析算法
重量数据采用IEEE 754标准的单精度浮点数格式,在PLC中需要特殊处理:
- 将接收到的4字节数据按顺序存入VD区
- 使用MOV_DW指令将字节数据转换为双字
- 通过数学运算转换为实际重量值
4. PLC程序完整实现
4.1 初始化程序
stl复制// 主程序OB1
LD SM0.1 // 首次扫描时执行
MOVB 16#09, SMB30 // 设置自由口通讯参数
// 位定义:
// 00-01: 10=自由口模式
// 02-04: 010=9600bps
// 05: 0=无校验
// 06-07: 01=8位数据
MOVB 16#B0, SMB87 // 接收控制字节
// 位定义:
// 7: 1=允许接收
// 6: 1=检查起始符
// 5: 1=检查结束符
MOVB 16#AA, SMB88 // 起始符1
MOVB 16#BB, SMB89 // 起始符2
MOVB 16#CC, SMB90 // 结束符1
MOVB 16#DD, SMB91 // 结束符2
MOVW +12, SMW92 // 接收超时时间(ms)
MOVB 12, SMB94 // 最大接收字节数
ATCH INT_0, 9 // 发送完成中断
ATCH INT_1, 23 // 接收完成中断
ENI // 允许中断
4.2 数据发送子程序
stl复制// 发送请求数据帧
LD SM0.0
MOVB 16#AA, VB100 // 起始符1
MOVB 16#BB, VB101 // 起始符2
MOVB 16#01, VB102 // 设备地址
MOVB 16#03, VB103 // 功能码
MOVB 0, VB104 // 数据长度=0(仅查询)
MOVW 0, VW105 // 预留CRC位置
MOVB 16#CC, VB107 // 结束符1
MOVB 16#DD, VB108 // 结束符2
// 计算CRC16校验
LD SM0.0
MOVD &VB102, AC1 // 起始地址
MOVD 3, AC2 // 字节数
CRETI // 调用CRC计算
MOVW AC0, VW105 // 存入CRC校验值
// 启动发送
LD SM0.0
XMT VB100, 9, 0 // 从PORT0发送9字节
4.3 数据接收处理
stl复制// 中断程序INT_0(发送完成)
LD SM0.0
RCV VB200, 0 // 启动接收
// 中断程序INT_1(接收完成)
LD SM0.0
MOVD &VB204, AC1 // 指向接收数据区
MOVD SMB86, AC2 // 获取接收字节数
CRETI // 校验CRC
LDD= AC0, VW210 // 比较校验码
JMPN ERROR // 校验失败跳转
// 提取浮点重量值
LD SM0.0
MOVB VB205, VD300 // 浮点数字节1
MOVB VB206, VD300+1 // 字节2
MOVB VB207, VD300+2 // 字节3
MOVB VB208, VD300+3 // 字节4
// 转换为实际重量(假设量程为10kg)
LD SM0.0
MOVR VD300, VD304 // 复制浮点数
*R 10.0, VD304 // 乘以量程系数
MOVR VD304, VD308 // 存储最终重量值
ERROR: // 错误处理
...
5. 关键问题与解决方案
5.1 通讯不稳定问题
现象:偶尔出现数据接收不全或校验失败
解决方案:
- 增加硬件滤波:在RS485总线上并联100pF电容
- 软件优化:添加重发机制,连续3次失败后报警
- 调整超时时间:将SMB92设为50ms(原12ms)
5.2 浮点数解析错误
现象:接收到的重量值明显异常
排查步骤:
- 使用状态图表监控原始字节数据
- 确认字节顺序是否正确(该天平采用大端格式)
- 检查浮点数范围是否合理(应在0.0~10.0之间)
5.3 典型错误代码
| 错误代码 | 含义 | 处理方法 |
|---|---|---|
| 0001 | 起始符不匹配 | 检查SMB88/89设置 |
| 0002 | CRC校验失败 | 重新计算校验码 |
| 0003 | 接收超时 | 检查物理连接 |
| 0004 | 浮点数溢出 | 检查天平量程设置 |
6. 性能优化建议
-
通讯速率优化:
- 在长距离通讯时(>50m),建议降低波特率至4800bps
- 使用示波器检查信号质量,确保上升沿/下降沿清晰
-
数据处理优化:
- 添加数字滤波算法(移动平均或一阶滞后)
- 对突变数据(>5%量程变化)进行二次验证
-
系统集成建议:
- 重要数据采用双寄存器备份(如VD308和VD312)
- 添加心跳检测机制,定时验证通讯状态
在实际项目中,这套系统已经稳定运行超过2000小时,平均通讯成功率>99.7%。最关键的体会是:自由口通讯虽然灵活,但必须做好完善的错误处理机制。特别是在工业现场,电磁干扰等因素可能导致偶发通讯故障,程序必须具备自动恢复能力。