1. 项目背景与需求解析
在工业自动化领域,PLC与称重设备的通讯一直是产线数据采集的关键环节。最近我在一个食品包装项目中遇到了这样的需求:需要通过西门子S7-200 SMART PLC实时读取梅特勒-托利多电子天平称的重量数据,并将这些数据用于自动分拣控制。这个看似简单的需求背后,其实藏着不少技术门道。
市面上的电子天平称大多采用RS232或RS485接口,通讯协议却五花八门。有些厂家提供标准Modbus协议,有些则使用自定义的自由口协议。我们项目用的这台老款天平恰恰属于后者——它采用了一种基于ASCII码的简单文本协议,通过串口每秒发送一次当前重量数据,格式类似"WT,+0001.23kg\r\n"。
2. 硬件连接与端口配置
2.1 硬件接线方案
SMART200 PLC自带一个RS485端口(端口0),而我们的天平称提供的是RS232接口。这就需要用到一个RS232转RS485转换器。接线时特别注意:
- PLC侧的RS485接口接A+/B-线(对应转换器的T+/T-)
- 转换器的接地端必须与天平称的接地端可靠连接
- 如果通讯距离超过15米,建议在总线两端加装120Ω终端电阻
实际调试中发现,如果接地不良,通讯会出现随机乱码。后来我们用万用表测量确认了各设备间的电势差小于1V才解决问题。
2.2 端口参数配置
在STEP 7-Micro/WIN SMART中配置端口0参数:
pascal复制// 端口配置指令
LD SM0.1
MOVB 9, SMB30 // 9600波特率,8数据位,无校验
MOVB 16#09, SMB87 // 启用接收,检测结束字符
MOVB 16#0A, SMB89 // 设置结束字符为LF(\n)
MOVB 100, SMB94 // 最大接收100个字符
这里有几个关键点:
- 波特率必须与天平称严格一致(通过天平菜单设置)
- SMB89设置的结束符要匹配实际协议(我们的协议以\n结尾)
- SMB94的缓冲区大小要足够容纳一帧完整数据
3. 自由口通讯程序设计
3.1 接收中断处理
当PLC接收到完整帧(检测到结束符)时,会触发中断INT0。在中断程序中:
pascal复制// 中断程序0
LD SM0.0
MOVB VB100, VB200 // 将接收缓冲区复制到处理区
XMT VB200, 0 // 回传数据用于调试
调试技巧:先用XMT指令将接收到的原始数据发送回电脑,用串口助手查看是否完整。我们最初发现数据截断,最终发现是SMB94设置太小导致。
3.2 数据解析逻辑
收到的数据格式为"WT,+0123.45kg\r\n",需要提取数字部分。编写子程序处理:
pascal复制// 数据解析子程序
LD SM0.0
MOVD &VB201, AC1 // 指向数据区
MOVD 0, VD500 // 清零结果存储
// 查找小数点位置
FOR VW10, 1, 10 // 最多检查10个字符
LDB= *AC1, '.' // 检测到小数点
JMP 1
INCD AC1
NEXT
// 提取整数和小数部分
LABEL 1
MOVB *AC1-3, VB510 // 符号位
MOVB *AC1-2, VB511 // 千位
MOVB *AC1-1, VB512 // 百位
MOVB *AC1+1, VB513 // 十位
MOVB *AC1+2, VB514 // 个位
// ASCII转数值
ITOA VB511-VB512, VD520 // 整数部分
ITOA VB513-VB514, VD524 // 小数部分
实际测试发现,当天平过载时会返回"WT,----kg"。我们增加了异常处理分支,当检测到'-'字符时将VD500置为-1作为错误标志。
4. 抗干扰与稳定性优化
4.1 通讯超时处理
在OB1主循环中添加超时检测:
pascal复制LD SM0.0
TON T37, 1000 // 1秒定时器
LD T37
MOVB 16#09, SMB87 // 超时后重新启用接收
R T37, 1
4.2 数据校验机制
虽然协议本身没有校验,但我们增加了简单校验:
- 检查帧头"WT,"是否存在
- 检查帧尾"kg"是否存在
- 检查小数点位置是否合理
发现异常时丢弃当前帧,并通过QB0输出报警信号(Q0.0闪亮)。
5. 现场调试问题实录
5.1 问题1:数据偶尔跳变
现象:正常运行时突然收到错误数据如"WT,+9999kg"
排查:
- 检查接地电阻 >10Ω → 重新压接接地线
- 用示波器查看信号波形 → 发现转换器电源不稳
- 给转换器单独供电后问题解决
5.2 问题2:通讯完全中断
现象:上电一段时间后通讯停止
排查:
- 检查SMB87值变为0 → 程序被意外修改
- 查找发现其他程序段有MOVB 0, SMB87指令
- 增加程序保护锁解决
6. 最终程序架构
完整程序包含以下模块:
- OB1:主循环,处理超时和报警
- INT0:接收中断,原始数据转存
- SBR0:数据解析子程序
- SBR1:异常处理子程序
- SBR2:数据校验子程序
关键数据地址:
- VB100-VB199:接收缓冲区
- VD500:最终重量值(带1位小数)
- VW600:状态字(bit0=数据有效,bit1=过载)
这套方案经过72小时连续运行测试,累计处理了超过20万条重量数据,错误率低于0.001%。现在该产线已经稳定运行8个月,证明了自由口通讯在工业现场的可靠性。对于需要快速对接非标设备的场景,掌握自由口编程确实能解决很多实际问题。
