1. 项目背景与需求分析
在工业自动化领域,PLC与称重设备的通讯是常见需求。我最近完成的一个项目就涉及到西门子S7-200 SMART PLC与电子天平之间的数据交互。这个项目要求实时采集天平称重数据,用于后续的质量控制和报表生成。
电子天平通常采用串口通讯,而不同品牌的设备通讯协议各异。这次遇到的天平使用的是自定义自由口协议,而非标准的Modbus或Profibus协议。这就意味着我们需要从底层开始构建通讯链路,包括硬件连接、协议解析和程序编写。
2. 硬件配置与连接
2.1 硬件选型与接口确认
首先需要确认PLC和天平的接口类型。S7-200 SMART PLC通常配备一个RS485接口(端口0)和一个以太网接口。而电子天平这边提供的是RS232接口。由于接口类型不匹配,我们需要进行电平转换。
我选择了工业级RS232转RS485转换器,这种转换器具有以下优势:
- 支持双向数据传输
- 内置信号隔离电路,抗干扰能力强
- 工作温度范围宽(-40℃~85℃)
- 支持最高115200bps的波特率
2.2 接线注意事项
实际接线时需要特别注意:
- 确保PLC和转换器共地,避免电位差导致通讯异常
- RS485总线采用双绞线,A/B线不能接反
- 长距离传输时(超过15米),建议在总线两端加装120Ω终端电阻
- 避免与动力线平行走线,防止电磁干扰
重要提示:在通电前务必再三检查接线,错误的接线可能损坏设备接口!
3. 通讯协议解析
3.1 天平通讯协议分析
通过查阅天平的技术手册,我整理出通讯协议的关键信息:
数据帧格式:
code复制[起始符][设备地址][命令码][数据长度][数据内容][校验码][结束符]
具体字段说明:
- 起始符:2字节,固定为0xAA 0xBB
- 设备地址:1字节,范围0x01-0xFF
- 命令码:1字节,0x03表示读取重量
- 数据长度:1字节,后续数据内容的字节数
- 数据内容:变长,包含实际重量值
- 校验码:2字节,CRC16校验
- 结束符:2字节,固定为0xCC 0xDD
3.2 数据格式转换
天平返回的重量数据采用IEEE 754单精度浮点格式,需要PLC端进行解析。具体转换方法如下:
- 接收到的4字节数据按顺序存入VD区
- 使用MOVR指令将数据转移到浮点寄存器
- 根据需要进行单位换算(如mg转kg)
4. PLC程序设计
4.1 通讯初始化
首先需要配置PLC的通讯端口参数:
stl复制// 端口0初始化
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 +8, SMW92 // 接收超时时间(ms)
MOVB 100, SMB94 // 最大接收字符数
4.2 数据发送程序
构建并发送请求帧:
stl复制// 构建请求帧
MOVB 16#AA, VB100 // 起始符1
MOVB 16#BB, VB101 // 起始符2
MOVB 1, VB102 // 设备地址
MOVB 3, VB103 // 命令码(读取重量)
MOVB 0, VB104 // 数据长度(请求时为零)
// 计算CRC16校验
MOVD &VB100, AC1 // 数据起始地址
MOVD 4, AC2 // 数据长度
CALL CRC16_CALC // 调用CRC计算子程序
MOVW AC0, VW105 // 存储校验结果
// 发送数据
ATCH SEND_COMPLETE, 9 // 发送完成中断
XMT VB100, 8, 0 // 发送8字节数据
4.3 数据接收处理
接收完成中断程序:
stl复制// 接收完成中断
LD SM0.0
MOVB VB200, AC0 // 检查起始符
MOVB VB201, AC1
XORB 16#AA, AC0
XORB 16#BB, AC1
JMPN DATA_ERROR // 起始符错误跳转
// 校验数据完整性
MOVD &VB200, AC1 // 数据起始地址
MOVD 8, AC2 // 数据长度
CALL CRC16_CALC // 计算CRC
MOVW VW206, AC1 // 接收到的CRC
XORW AC0, AC1
JMPN CRC_ERROR // CRC校验失败跳转
// 提取重量数据
MOVD &VB203, AC1 // 浮点数据地址
MOVR [AC1], VD300 // 存储重量值
// 触发数据处理
S M0.1, 1 // 置位数据处理标志
5. CRC16校验算法实现
CRC校验是保证数据完整性的关键,以下是S7-200 SMART PLC上的实现:
stl复制// CRC16计算子程序
// 输入:AC1=数据地址,AC2=数据长度
// 输出:AC0=CRC结果
CRC16_CALC:
MOVW 16#FFFF, AC0 // 初始化CRC寄存器
CRC_LOOP:
MOVB [AC1], AC3 // 读取一个字节
XORB AC3, AC0 // 异或操作
FOR AC4, 1, 8 // 处理8位
SRW AC0, 1 // 右移一位
JMPN NO_XOR // 如果最低位为0则跳过
XORW 16#A001, AC0 // 多项式异或
NO_XOR: NOP
NEXT
INCD AC1 // 指针递增
DECD AC2 // 计数器递减
JMPN CRC_DONE // 处理完成则退出
JMP CRC_LOOP // 继续循环
CRC_DONE:
RET
6. 异常处理与优化
6.1 通讯超时处理
在实际应用中,必须考虑通讯超时的情况:
stl复制// 通讯超时监控
LD SM0.5 // 1Hz时钟脉冲
LD M0.0 // 通讯进行中标志
TON T37, 3000 // 3秒超时定时器
LD T37
R M0.0, 1 // 清除通讯标志
S M0.2, 1 // 置位超时错误标志
6.2 数据滤波处理
为防止数据跳动,可以加入简单的滤波算法:
stl复制// 移动平均滤波
LD SM0.0
MOVR VD300, VD310 // 新数据
-R VD304, VD310 // 减去最旧数据
MOVR VD310, VD304 // 更新总和
MOVR VD300, VD308 // 将新数据加入缓存区
// 计算平均值
MOVR VD304, VD312
/R 8.0, VD312 // 8点平均
MOVR VD312, VD316 // 存储滤波后数据
6.3 断线检测机制
通过定期发送测试指令检测连接状态:
stl复制// 每10秒发送一次测试指令
LD SM0.5
EU
MOVB 1, MB10
LD MB10
= 6
R MB10, 1
CALL SEND_TEST_CMD
7. 实际应用中的经验分享
经过项目实践,我总结了以下几点重要经验:
-
波特率选择:虽然天平支持最高115200bps,但在工业环境下建议使用9600bps,这个速率在抗干扰和传输距离间取得了良好平衡。
-
数据更新策略:不要过于频繁地读取数据(建议200-500ms间隔),这既能减轻系统负担,又能保证数据及时性。
-
错误重试机制:实现3次重试逻辑,在通讯失败时自动重试,但仍需设置最大重试次数避免死循环。
-
数据记录:建议在PLC中开辟一个数据缓冲区,存储最近几次的称重记录,便于故障排查。
-
接地处理:务必确保所有设备良好接地,我曾遇到因接地不良导致数据偶尔跳变的问题,排查了很久才发现是这个原因。
-
环境因素:温度变化可能影响通讯稳定性,在极端环境下需要考虑额外的防护措施。
这个项目最终成功实施,PLC能够稳定可靠地获取天平数据,误差控制在±0.1%以内,完全满足生产要求。整个开发过程中,协议解析和错误处理占据了大部分时间,这也提醒我在今后的项目中要更加重视通讯的健壮性设计。
