在工业自动化控制系统中,PLC与变频器的通讯是实现设备控制的关键环节。今天我要分享的是基于西门子S7-200 PLC的自由口协议与英威腾GD200变频器的通讯实现方案。这个方案不仅能够控制变频器的启停,还能实时读取运行参数,为设备监控和故障诊断提供了基础。
我曾在多个工业现场实施过类似的通讯方案,发现自由口协议虽然需要更多的编程工作,但其灵活性和兼容性使其成为连接非标设备的理想选择。本文将详细介绍从硬件连接到软件实现的完整过程,包括我在实际项目中积累的经验和常见问题的解决方法。
自由口协议是西门子S7-200系列PLC提供的一种灵活的通讯方式。与预设的PPI、MPI等协议不同,自由口允许用户完全自定义通讯协议,通过编程实现与各种第三方设备的通讯。这种特性使其特别适合与变频器、仪表等非西门子设备的连接。
在实际应用中,自由口协议有以下几个显著特点:
虽然自由口协议本身不限定具体应用层协议,但在工业自动化领域,Modbus RTU因其简单可靠而成为事实标准。英威腾GD200变频器原生支持Modbus RTU协议,这也是我选择它作为通讯协议的原因。
Modbus RTU协议的主要特点包括:
提示:虽然本文以Modbus RTU为例,但自由口协议同样适用于其他自定义协议,只需调整相应的数据帧格式和处理逻辑即可。
S7-200 PLC通常提供两个通讯端口:
考虑到编程调试的便利性,我建议使用PORT1作为自由口通讯端口(如果PLC型号支持),保留PORT0用于程序下载和监控。
英威腾GD200变频器通常提供RS485通讯端子(标记为485+/485-),与S7-200的连接需要注意以下几点:
我遇到过一个典型问题:在某现场调试时,通讯时好时坏,最终发现是屏蔽层未单端接地导致的干扰。正确的做法是将电缆屏蔽层在PLC端接地,变频器端悬空。
在硬件连接完成后,需要在变频器端进行以下参数设置:
自由口的初始化是通讯的基础,需要在PLC的第一个扫描周期完成配置。以下是详细的初始化代码分析:
stl复制NETWORK 1 // 自由口初始化
LD SM0.1 // 首次扫描标志
MOVB 16#98, SMB30 // 通讯参数设置
MOVB 16#10, SMB87 // 接收控制寄存器
MOVB 10, SMB90 // 空闲线时间10ms
MOVB 50, SMB94 // 最大接收字符数
ATCH INT_0, 23 // 接收完成中断
ATCH INT_1, 9 // 发送完成中断
ENI // 允许中断
XMT VB0, 0 // 初始化发送
这段代码的关键点在于:
注意:空闲线时间(SMB90)的设置需要大于3.5个字符时间(9600bps下约4ms),这里设为10ms提供了足够的余量。
变频器的启动通过写保持寄存器实现,具体到GD200变频器,运行命令寄存器地址为0004H(见变频器说明书)。以下是启动命令的构建过程:
stl复制NETWORK 2 // 启动命令
LD I0.0 // 启动按钮
MOVB 16#01, VB10 // 从站地址
MOVB 16#06, VB11 // 功能码(写单个寄存器)
MOVB 16#00, VB12 // 寄存器地址高字节
MOVB 16#04, VB13 // 寄存器地址低字节
MOVB 16#00, VB14 // 数据高字节
MOVB 16#01, VB15 // 数据低字节(启动)
CALL SBR_0 // 调用发送子程序
数据帧解析:
停止命令与启动类似,只是写入寄存器的值变为0000:
stl复制NETWORK 3 // 停止命令
LD I0.1 // 停止按钮
MOVB 16#01, VB10 // 从站地址
MOVB 16#06, VB11 // 功能码
MOVB 16#00, VB12 // 寄存器地址高
MOVB 16#04, VB13 // 寄存器地址低
MOVB 16#00, VB14 // 数据高
MOVB 16#00, VB15 // 数据低(停止)
CALL SBR_0 // 调用发送子程序
GD200变频器的输出频率存储在0002H寄存器中,读取命令构建如下:
stl复制NETWORK 4 // 读取频率
LD I0.2 // 读取按钮
MOVB 16#01, VB20 // 从站地址
MOVB 16#03, VB21 // 功能码(读保持寄存器)
MOVB 16#00, VB22 // 起始地址高
MOVB 16#02, VB23 // 起始地址低
MOVB 16#00, VB24 // 寄存器数量高
MOVB 16#01, VB25 // 寄存器数量低
CALL SBR_0 // 调用发送子程序
接收到的频率数据需要经过转换才能得到实际值。变频器通常返回的是16位整数,需要根据量程进行换算。例如,如果变频器量程为50.00Hz,返回值为2000对应50.00Hz:
stl复制NETWORK 5 // 频率处理
LD SM0.0 // 始终执行
MOVW VW110, VW200 // 接收到的原始值
ITD VW200, VD202 // 转换为双整数
DTR VD202, VD206 // 转换为实数
/R 40.0, VD206 // 换算为实际频率(2000/50=40)
MOVR VD206, VD210 // 存储最终频率值
发送子程序负责构建完整的Modbus RTU帧并发送,包括CRC校验计算:
stl复制SBR_0: // 发送子程序
NETWORK 1
MOVB VB10, VB0 // 地址
MOVB VB11, VB1 // 功能码
MOVB VB12, VB2 // 数据高
MOVB VB13, VB3 // 数据低
MOVB VB14, VB4 // 值高
MOVB VB15, VB5 // 值低
MOVW 16#FFFF, VW100 // CRC初始值
MOVB VB0, AC0
FOR VW110, 1, 6 // 对前6字节计算CRC
XORB *AC0, VB101 // CRC低字节处理
... // 详细CRC计算过程
NEXT
MOVB VB101, VB6 // CRC低字节
MOVB VB102, VB7 // CRC高字节
XMT VB0, 0 // 发送8字节数据
RET
CRC计算是Modbus RTU的关键,确保数据完整性。实际项目中,我通常会预先计算好常见命令的CRC值做成表格,减少运行时计算量。
在实际应用中,必须考虑通讯超时的情况。我通常采用以下策略:
stl复制NETWORK 6 // 超时处理
LD SM0.0
TON T37, 200 // 200ms超时
LD T37
MOVB VB30, VB30 // 重发计数器加1
MOVW +0, VW100 // 复位CRC
CALL SBR_0 // 重发
LDW>= VB30, 3 // 超过3次
S Q0.0, 1 // 触发报警
CRC校验失败可能由以下原因引起:
解决方法:
如果变频器完全不响应,建议按以下步骤排查:
虽然GD200支持最高115200bps的通讯速率,但在工业环境中我建议:
更高的波特率虽然能提高响应速度,但抗干扰能力会下降。
如果需要监控多个参数,建议采用分时轮询的方式:
stl复制NETWORK 7 // 自动轮询
LD SM0.0
INCW VW300 // 轮询计数器
LDW= VW300, 10
MOVW +0, VW300
CALL 读取频率
LDW= VW300, 20
MOVW +0, VW300
CALL 读取电流
...
健壮的系统需要完善的错误恢复:
在某个现场项目中,我实现了一个错误恢复流程,使得系统在干扰消失后能自动恢复正常运行,大大减少了维护需求。
通过以上步骤和优化,S7-200与英威腾GD200变频器的通讯可以达到工业级的可靠性和实时性要求。实际应用中,还需要根据具体工况调整参数和处理逻辑。