在工业自动化控制系统中,PLC与外部设备的通讯是实现数据采集和控制的关键环节。这次我们要实现的是西门子S7-200 SMART系列PLC与实验室天平称重设备之间的自由口通讯。这种应用场景在制药、化工、食品等需要精确称重的行业非常常见。
假设我们有一个药品包装生产线,需要根据天平实时测量的药品重量来控制包装机的装填量。PLC需要每秒钟获取一次天平数据,并根据预设的包装规格进行判断和控制。这就要求PLC与天平之间建立稳定、可靠的通讯连接。
为什么选择自由口通讯而不是更常见的Modbus协议?主要有以下几个原因:
S7-200 SMART PLC通常提供两个通讯端口:
天平称一般会提供以下接口之一:
在实际连接时,必须注意接口类型的匹配:
RS232直连情况:
RS485连接情况:
电平转换情况:
code复制PLC RS485 ---- MAX485 ---- 天平TTL
A| |TXD
B| |RXD
| |GND
重要提示:在工业现场,RS485通讯建议使用屏蔽双绞线,并做好接地处理,避免电磁干扰。
根据项目描述,天平使用的是一种自定义的自由口协议,其帧结构大致如下:
| 字段 | 字节数 | 示例值 | 说明 |
|---|---|---|---|
| 起始位 | 2 | 0xAA 0xBB | 标识帧开始 |
| 地址码 | 1 | 0x01 | 设备地址 |
| 功能码 | 1 | 0x03 | 读数据命令 |
| 数据区 | N | - | 重量数据等 |
| CRC16 | 2 | - | 校验码 |
| 结束位 | 2 | 0xCC 0xDD | 标识帧结束 |
在PLC程序中需要实现CRC16校验算法,以下是完整的CRC16计算子程序:
code复制// CRC16计算子程序
// 输入:AC0 - 数据起始地址
// AC1 - 数据长度
// 输出:AC0 - 计算得到的CRC16值
CRC16:
MOVW 16#FFFF, AC2 // 初始化CRC寄存器为0xFFFF
FOR AC3, 1, AC1 // 循环处理每个字节
XORB *AC0, AC2_LOW // CRC低字节与数据异或
FOR AC4, 1, 8 // 每位处理
SRW AC2, 1 // CRC右移1位
LD SM1.1 // 检查移出的位
JMPN NO_XOR // 如果为0则跳过
XORW 16#A001, AC2 // 与多项式异或
NO_XOR:
NOP
NEXT
INCB AC0 // 指向下一个数据字节
NEXT
MOVW AC2, AC0 // 返回结果
RET
code复制// 通讯端口初始化
// SMB30用于配置PORT0,SMB130用于配置PORT1
// 本例使用PORT0
MOVB 16#09, SMB30 // 自由口模式,9600bps,8数据位,无校验
MOVB 16#B0, SMB87 // 接收控制:允许接收,检测起始字符
MOVB 0xAA, SMB88 // 起始字符1
MOVB 0xBB, SMB89 // 起始字符2
MOVB 8, SMB94 // 接收信息长度
MOVB 16#0A, SMB34 // 定时器间隔10ms
code复制// 构建发送数据帧
MOVB 0xAA, VB100 // 起始位1
MOVB 0xBB, VB101 // 起始位2
MOVB 0x01, VB102 // 设备地址
MOVB 0x03, VB103 // 功能码
// 数据区填充(根据实际需求)
MOVB 0x00, VB104
MOVB 0x00, VB105
// 计算CRC16
MOVD &VB100, AC0 // 数据起始地址
MOVB 6, AC1 // 数据长度
CALL CRC16 // 调用CRC计算
MOVW AC0, VW106 // 存储CRC结果
// 设置结束位
MOVB 0xCC, VB108
MOVB 0xDD, VB109
// 发送数据
ATCH SEND_COMPLETE, 9 // 发送完成中断
ENI // 开启中断
XMT VB100, 0, 10 // 发送10字节数据
code复制// 接收完成中断处理
SEND_COMPLETE:
DTCH 9 // 断开发送中断
ATCH RECV_COMPLETE, 23 // 接收完成中断
RCV VB200, 0 // 开始接收数据
RETI
// 数据接收处理
RECV_COMPLETE:
DTCH 23 // 断开接收中断
// 检查帧头帧尾
LDB= VB200, 0xAA
LDB= VB201, 0xBB
LDB= VB208, 0xCC
LDB= VB209, 0xDD
JMPN ERROR_HANDLE // 校验失败跳转
// CRC校验
MOVD &VB200, AC0
MOVB 8, AC1
CALL CRC16
LDD= AC0, VW206 // 比较CRC
JMPN ERROR_HANDLE
// 数据处理
MOVW VW202, VW300 // 存储重量数据
JMP END_PROCESS
ERROR_HANDLE:
INCW VW310 // 错误计数器加1
END_PROCESS:
// 准备下一次通讯
CALL INIT_COMM
RETI
在实际应用中,必须增加超时检测机制:
code复制// 在初始化时添加
MOVB 100, SMB35 // 设置超时时间为1s(100×10ms)
ATCH TIMEOUT, 10 // 定时中断
// 超时处理程序
TIMEOUT:
DTCH 10 // 断开定时器中断
DTCH 23 // 断开接收中断
MOVB 0, SMB87 // 停止接收
CALL INIT_COMM // 重新初始化通讯
RETI
对于称重数据,通常需要进行滤波处理:
code复制// 移动平均滤波程序
FILTER:
MOVW VW300, VW400 // 当前值存入缓冲区
MOVW VW402, VW401 // 数据移位
MOVW VW401, VW400
// 计算平均值
MOVW 0, AC0
ADDW VW400, AC0
ADDW VW401, AC0
ADDW VW402, AC0
DIVW 3, AC0
MOVW AC0, VW500 // 滤波后数据
RET
code复制// 在错误处理中添加
ERROR_HANDLE:
INCW VW310 // 错误计数器加1
LDW>= VW310, 3 // 连续错误达到3次
JMPN END_PROCESS
MOVW 0, VW310 // 清零计数器
CALL RESET_COMM // 完全重置通讯
RESET_COMM:
MOVB 0, SMB30 // 关闭端口
TON T37, 100 // 延时1s
LD T37
JMPN RESET_COMM
CALL INIT_COMM // 重新初始化
RET
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 通讯完全无响应 | 1. 接线错误 2. 波特率不匹配 3. 设备地址错误 |
1. 检查接线,确认A/B线正确 2. 核对双方波特率设置 3. 确认设备地址设置 |
| 接收数据乱码 | 1. 接地不良 2. 电磁干扰 3. 校验设置错误 |
1. 检查屏蔽层接地 2. 增加终端电阻 3. 核对校验位设置 |
| 偶发性通讯中断 | 1. 线路过长 2. 电源干扰 3. 超时设置过短 |
1. 缩短通讯距离或加中继 2. 增加电源滤波器 3. 调整超时时间 |
分段调试法:
信号监测技巧:
数据记录方法:
code复制// 在PLC中添加数据记录功能
MOVB VB200, VB500 // 记录接收到的第一个字节
MOVB VB201, VB501 // 记录第二个字节
// ...以此类推
这样可以在出现问题时查看实际接收到的数据。
在实际项目中,这套系统经过长时间运行测试,通讯成功率保持在99.9%以上。最关键的是要处理好异常情况,确保在偶尔通讯失败时能够自动恢复,不影响生产流程。