西门子S7-200 SMART系列PLC作为中小型自动化控制系统的核心设备,其自由通讯功能为用户提供了与第三方设备进行数据交互的灵活手段。自由口通讯(Freeport Communication)模式允许用户完全控制通讯协议,摆脱了标准通讯协议的限制,这在工业现场与定制化设备通讯时尤为重要。
自由通讯的核心在于对SMB30/SMB130寄存器的配置。这两个寄存器分别对应端口0和端口1的通讯参数设置。通过设置不同的位组合,我们可以定义波特率、数据位长度、校验方式等关键参数。例如,2#00000110表示9600波特率、8位数据、无校验,这是工业现场最常见的配置之一。
在实际工程中,自由通讯常用于以下场景:
在开始编程前,需要确认硬件连接正确。S7-200 SMART的端口0(Port 0)采用RS485接口,引脚定义如下:
初始化设置是通讯成功的第一步,以下代码展示了典型配置:
stl复制// 端口0初始化
SMB30 = 2#00000110; // 9600bps,8位数据,无校验,1停止位
SM0.1 = 1; // 首次扫描标志
XMT_RCV_EN:SM0.0 = 1; // 持续使能通讯
注意:SMB30的位定义如下:
- 位0-3:波特率选择(0110=9600)
- 位4:校验选择(0=无校验)
- 位5:校验类型(当有位4=1时有效)
- 位6:数据位长度(1=8位)
- 位7:保留位
发送数据需要三个关键步骤:准备数据缓冲区、配置中断、启动发送。以下是详细说明:
stl复制LD SM0.0
MOVB "A", VB100 // ASCII字符'A'存入VB100
MOVB 0, VB101 // 字符串结束符
ATCH INT_0, 9 // 关联发送完成中断(事件9)
ENI // 全局中断使能
XMT VB100, 0 // 从端口0发送VB100开始的数据
发送过程需要注意:
接收处理比发送更为复杂,需要考虑数据完整性和实时性:
stl复制LD SM0.0
ATCH INT_1, 2 // 关联接收字符中断(事件2)
ENI // 确保中断开启
RCV VB200, 0 // 启动接收,数据存入VB200
接收关键点:
中断程序是自由通讯的核心处理单元,两个关键中断:
stl复制// 发送完成中断
INT_0:
MOVB 0, VB100 // 清空发送缓冲区
RETI
// 接收字符中断
INT_1:
MOVB SMB2, VB200[VB201] // 存入接收缓冲区
INCB VB201 // 指针递增
LDB= VB201, 10 // 假设接收10个字节
JMPC DATA_COMPLETE // 接收完成处理
RETI
DATA_COMPLETE:
// 处理完整数据帧
MOVB 0, VB201 // 重置指针
RETI
工业通讯通常采用帧结构保证数据可靠性。典型帧格式:
| 字段 | 起始符 | 长度 | 地址 | 命令 | 数据 | 校验 |
|---|---|---|---|---|---|---|
| 示例 | 0xAA | 0x06 | 0x01 | 0x03 | ... | XOR |
对应的状态机处理流程:
stl复制// 状态定义
#define STATE_IDLE 0
#define STATE_HEAD 1
#define STATE_LEN 2
#define STATE_DATA 3
#define STATE_CHECK 4
INT_2:
LDB= STATE, #STATE_IDLE
JMPC CHECK_HEADER
CHECK_HEADER:
LDB= SMB2, 16#AA // 检测起始符
JCN NOT_HEADER
MOVB #STATE_HEAD, STATE
MOVB 0, VB301 // 重置指针
RETI
NOT_HEADER:
// 错误处理
RETI
// 其他状态处理类似...
常用校验算法包括:
异或校验实现示例:
stl复制// 计算VB200开始的10字节异或校验
MOVB 0, VB210 // 校验结果存储
MOVD &VB200, AC1 // 缓冲区地址
MOVW 0, AC0 // 循环计数器
CHECK_LOOP:
LDB>= AC0, 10
JMPC CHECK_DONE
XORB *AC1, VB210 // 异或计算
INCD AC1 // 指针递增
INCW AC0 // 计数器递增
JMP CHECK_LOOP
CHECK_DONE:
// VB210存储最终校验值
常见波特率设置错误表现:
解决方法:
典型症状:
处理方案:
缓冲区使用原则:
示例管理代码:
stl复制// 环形缓冲区实现
MOVB VB250, AC1 // 读指针
MOVB VB251, AC2 // 写指针
// 写入数据
LDB= AC2, 255
JMPC RESET_WRITE
MOVB SMB2, VB252[AC2]
INCB AC2
JMP WRITE_DONE
RESET_WRITE:
MOVB 0, AC2
MOVB SMB2, VB252[AC2]
WRITE_DONE:
MOVB AC2, VB251
工业环境干扰解决方案:
典型主从轮询流程:
定时轮询实现:
stl复制// 定时中断设置
MOVB 100, SMB34 // 100ms定时
ATCH INT_POLL, 10 // 定时中断0
ENI
// 轮询状态机
INT_POLL:
LDB= POLL_STATE, 0
JMPC POLL_NEXT
POLL_NEXT:
MOVB DEV_ADDR, VB110 // 设置从站地址
XMT VB110, 0 // 发送查询
INC DEV_ADDR // 下一地址
LDB> DEV_ADDR, 10
JMPC RESET_ADDR
RETI
RESET_ADDR:
MOVB 1, DEV_ADDR
RETI
从站地址管理方案:
健壮的超时处理应包含:
超时计数器实现:
stl复制// 在定时中断中递减计数器
INT_TIMER:
LDW> TIMEOUT, 0
DECW TIMEOUT
JMPC CHECK_TIMEOUT
RETI
CHECK_TIMEOUT:
LDW= TIMEOUT, 0
JMPC DO_TIMEOUT
RETI
DO_TIMEOUT:
// 超时处理程序
RETI
在实际项目中,自由通讯的稳定性往往取决于细节处理。我在多个现场项目中总结的经验是:通讯协议宜简不宜繁,数据帧尽量短小,错误处理要全面,重要数据需确认。一个实用的技巧是在关键设备通讯时,添加心跳包机制,定期检测连接状态。当通讯异常时,可以先尝试降低波特率,这往往能解决大部分干扰导致的问题。