ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

S7-1200与英威腾GD变频器Modbus RTU通讯实战

S7-1200与英威腾GD变频器Modbus RTU通讯实战

1. 项目背景与整体方案选型

1.1 为什么用S7-1200加英威腾GD这套组合

前阵子接手了一个产线改造项目,现场的设备说复杂不复杂,就是3台英威腾GD系列变频器分别驱动3台输送电机,工艺上要求这几台电机既能独立启停、调速,又要能在上位机或者触摸屏上统一监控运行频率、电流、故障状态。原来的方案是每台变频器硬接按钮和电位器,操作工得跑到设备跟前去调,故障了也只能看变频器面板上的代码,生产数据更是没法记录,车间主任想统计个运行时长都得靠人工拿本子记。

这种场景其实特别典型,尤其是很多中小型产线上,变频器就是“单机运行”状态,没有联网,也没有远程监控手段。改造需求也很直接:要能远程启停、远程调速、实时读取运行参数、故障报警能第一时间知道。我当时评估了几个方案:一种是走DP总线,但S7-1200这边要加DP模块,成本高,而且英威腾GD的DP扩展卡还得另外配;另一种是走PROFINET,GD系列有PN版本,但现场这几台是老款,不支持直接扩展PN;最后定下来用Modbus RTU,理由很实在——成本低、S7-1200本体就能支持、英威腾GD系列标配RS485通讯口,3台变频器串联一条两芯屏蔽线就搞定了。

这里有个点要跟各位说清楚,Modbus RTU虽然不是最快的通讯方式,波特率一般也就9600到19200,但对于变频器这种控制对象来说完全够用。变频器响应启停命令、频率给定,本质上是在毫秒级到几十毫秒级的范畴,而Modbus RTU一条指令的通讯时间在9600波特率下大约也就10毫秒左右,3台轮流问一遍,一个扫描周期内搞定,根本不影响控制效果。

1.2 系统架构与通讯协议选型

先把这个项目的整体架构说清楚,大家可以对着自己的现场情况做个参考。

系统组成大概是这样的:

  • 主站:西门子S7-1200 PLC,型号是1214C DC/DC/DC,本体集成一个RS485接口(通过CM1241通讯模块扩展也行,我这次用的是本体上的接口,因为1214C自带一个RS485口,省了一块模块的钱)。注意,S7-1200本体自带的那个RS485口是支持Modbus RTU主站的,不需要额外授权,直接调用库函数就行。
  • 从站:3台英威腾GD200系列变频器,每台设一个从站地址,分别是1、2、3。
  • 通讯链路:RS485屏蔽双绞线,手拉手串联,首尾两端不用接终端电阻(距离短,20米以内,实测不接也没问题,但正规做法是超过50米建议接120欧终端电阻)。
  • 监控层:一台昆仑通态触摸屏,通过以太网连接S7-1200,不直接占通讯口。

选Modbus RTU还有一个让我比较放心的地方,就是英威腾GD系列的Modbus寄存器地址非常规整,文档里写得很清楚,不会出现那种映射来映射去映射不明白的情况。后面我会把关键地址列出来。

有一点必须提醒大家:S7-1200的RS485接口虽然有,但你需要确认硬件型号。1214C有两个版本,一个是AC/DC/RLY(继电器输出),一个是DC/DC/DC(晶体管输出),两者的RS485接口位置和引脚定义是一样的,但注意看CPU面板上有没有X150这个接口标注。我这个项目用的是DC/DC/DC版本,确认过X150接口是标准RS485。

2. 硬件接线与通讯参数配置

2.1 硬件清单与选型理由

先列一下我实际用到的硬件清单,都是比较常规的东西,采购也方便:

序号名称型号/规格数量用途说明
1PLCS7-1200 1214C DC/DC/DC1主站控制器
2变频器英威腾GD200-2R2G-433台4kW电机驱动
3屏蔽双绞线RVSP 2×0.75mm²30米RS485通讯链路
4触摸屏昆仑通态TPC70621远程监控与操作
524V电源明纬DR-45-241PLC及通讯供电
6网线超五类屏蔽网线若干PLC与触摸屏通讯

选型的时候有几个考虑,一个是授权问题,S7-1200的Modbus RTU库指令在TIA Portal里是自带的,不额外收费;另一个是通讯线材,我用的是RVSP屏蔽双绞线,这种线在工业现场抗干扰能力明显好于普通网线或者平行线,尤其在变频器这种强干扰源旁边,屏蔽层接地处理得当的话能省掉后面很多麻烦事。

再补充一个硬件层面的常识:RS485是差分信号,抗共模干扰能力强,但总线上的设备数量、线缆长度、布线走向都会影响通讯质量。3台从站设备加起来才4个节点,属于小规模总线,对于1200米的理论最大通讯距离来说,现场这几十米的长度绰绰有余。唯一要注意的是线径不能太细,0.75平方毫米是底线,太细了压降大,长距离通讯容易丢包。

2.2 RS485接线实操细节

接线这件事看着简单,但恰恰是Modbus RTU通讯故障的重灾区。我这边的接线方式是手拉手串联,从PLC的X150接口的T/R+和T/R-两个端子分别对应接到第1台变频器RS485端子的A和B,然后再从第1台接到第2台,第2台接到第3台,形成一条总线。

这里有个细节:英威腾GD系列变频器上的RS485端子一般标的是A+和B-,对应的就是485+和485-,跟PLC这边的T/R+和T/R-接法要一致,不能交叉。A接A,B接B,这是一条铁的纪律。我曾经见过有人把A和B接反的,现象就是通讯时通时断,或者干脆不通,查了半天才发现是两根线接反了。

屏蔽层的处理也是一个关键点。我的做法是屏蔽层在PLC这一端单端接地,接到柜体上的接地铜排,变频器那一端不接地,这样可以避免形成地环流。地环流一旦形成,轻则通讯数据偶尔出错,重则直接把RS485芯片烧掉。这一点在变频器柜里尤其要注意,变频器本身的开关频率会产生高频干扰,如果屏蔽层两端都接地,干扰电流就会顺着屏蔽层跑,反而把干扰引进来了。

端子接线用屏蔽层压接好的话,还能顺便解决一个受力问题:线缆不要悬空受力,最好用线槽或者扎带固定在柜内,避免运行中振动导致端子松动。通讯线也不要跟变频器的主回路动力线绑在同一个线槽里,必须要分开走,间距至少20厘米,条件允许的话越远越好。

2.3 通讯参数统一约定

Modbus RTU通讯要跑通,关键参数必须保证主站和从站完全一致,有一项对不上就通讯失败。我这个项目的通讯参数表如下:

参数名称PLC侧设置变频器侧设置
波特率96009600
数据位88
校验方式无校验(None)无校验
停止位11
从站地址不涉及(主站)1#机为1,2#机为2,3#机为3

有的朋友可能会问,为什么不用偶校验?其实用偶校验在抗干扰上会好一些,但英威腾GD系列默认设置在无校验模式下也能稳定运行,而且无校验时数据帧少一个字节,通讯效率略高。稳妥起见,我直接把两边都设成无校验、8数据位、1停止位,也就是常见的9600,8,N,1格式,这样省得后面调试时还要来回核对校验位。

波特率这里也多说一句:9600是Modbus RTU最保险的选择,虽然19200速度更快,但现场只要有稍微长一点的通讯线或者干扰稍大,高速率就容易出问题。变频器通讯这种场合,控制周期要求在100毫秒以内就够了,9600完全够用,没必要为了那点速度提升去冒通讯不稳的风险。

3. PLC侧程序编写与轮询逻辑实现

3.1 MB_COMM_LOAD组态指令详解

S7-1200做Modbus RTU主站,核心就是要调用两个指令:MB_COMM_LOAD和MB_MSG。前者是通讯端口初始化,后者是数据收发指令。在TIA Portal里,这两个指令在“通信->通信处理器->Modbus”目录下能找到。

MB_COMM_LOAD的作用是把CPU的RS485接口配置成Modbus RTU协议。它的输入参数有端口号(PORT)、波特率(BAUD)、校验方式(PARITY)、从站数量等。我这里端口号填的是CPU本体RS485口的硬件标识符,在设备组态里能看到,一般是269或者类似的值。BAUD填9600,PARITY填0表示无校验。还有一个参数叫做FLOW_CTRL,填0禁用流量控制。

MB_COMM_LOAD只需要在首次扫描时调用一次,不需要每个扫描周期都执行。所以我用一个边缘检测指令(R_TRIG)配合一个置位标志位来控制MB_COMM_LOAD的调用,初始化完成后把标志位置1,后续就只调用MB_MSG做数据交互。如果不做这个处理,每次扫描都去重新初始化端口,通讯反而会乱套,甚至导致从站响应超时。

3.2 轮询调度与MB_MSG调用

接下来是重头戏——轮询调度。Modbus RTU是单主站总线协议,主站必须一个一个地跟从站通讯,同一时刻只能有一条指令在总线上,不能像以太网那样多发并行。3台变频器,每台都需要读状态、读电流、读频率、写启停、写频率给定,如果一条一条轮着写,程序会变得很长。

我的做法是建立一个轮询数组,每台变频器安排若干条读写任务,然后用一个整数型轮询指针(POINTER)在当前任务、下一任务之间循环切换。每完成一次MB_MSG调用,就把指针加1,指向下一个任务,最后一个任务执行完后再回到第1个任务。

具体每台变频器的任务清单是这样的:

  • 任务1:写启停命令(写单个保持寄存器)
  • 任务2:写频率给定(写单个保持寄存器)
  • 任务3:读运行状态(读2个保持寄存器:状态字+当前频率)
  • 任务4:读电流值等运行参数(读4个输入寄存器:电流、电压、母线电压、模块温度)

3台变频器共12个任务,轮询一圈的时间在9600波特率下大约300到400毫秒。这个速度对于监控画面更新来说完全够用,操作工在触摸屏上看到的参数基本是实时的。

MB_MSG指令的两个关键参数是RW和DATA_ADDR。RW=1表示写,RW=0表示读。DATA_ADDR在S7-1200的Modbus库里有特别的规定:数据地址是0开始的,写保持寄存器时填400001,读保持寄存器时填400001,但库内部会自动减1变成40000。这里有个坑要特别注意——S7-1200的Modbus地址范围是0到65535,对应Modbus协议里的40001到465535,英威腾手册里给的地址如果是40001,那你在PLC里要填的就是400001。很多新手在这上面栽过跟头,地址填错一位,数据读出来全是乱的。

MB_MSG还有一个关键参数是DATA_PTR,指向PLC侧的数据存储区。比如读回来的数据存在DB块里,就把DB块的地址指针传给DATA_PTR。写数据时,要把待写入的值先放到这个存储区里,然后MB_MSG会自动把存储区里的值发到总线上。这里注意存储区的数据类型,S7-1200的Modbus库默认读写是16位字,如果你传的是32位浮点数,还得自己做类型转换。我后面会具体讲这个转换过程。

3.3 数据读写与工程量转换

读写指令本身其实不复杂,复杂的是数据到了PLC之后怎么处理。以读取变频器电流为例,英威腾GD系列变频器的电流寄存器地址是1000H(十六进制),对应Modbus地址40001加偏移。但变频器返回的数据是16位无符号整数,单位是0.1A,意思是如果返回值是123,那实际电流就是12.3A。

所以在PLC侧要做一次工程量转换:实际电流 = 原始值 × 0.1。这个换算我要做一个浮点转换功能块,把从MB_MSG读回来的INT类型数据转成REAL,再做乘法。同理,频率给定也是0.01Hz为单位,原始值5000代表50.00Hz,写的时候要把50.00Hz乘以100再取整,然后转成十六进制写到变频器。

写启停命令这块,GD系列变频器用的是控制命令字寄存器,往里面写1、2、6、7等数值分别对应正转、反转、点动正转、点动反转等操作。我做了两个功能码:写1执行正转启动,写6执行停止。停止时我再多写一次7,也就是自由停车命令,这样在急停情况下可以快速切断输出。这个逻辑看起来有点绕,但实际运行下来比单一停止命令更可靠。

以下是SCL结构化文本编写的单任务轮询骨架,供参考:

// 轮询指针自增,范围1~12 IF #poll_pointer >= 12 THEN #poll_pointer := 1; ELSE #poll_pointer := #poll_pointer + 1; END_IF; // 根据当前轮询指针选择从站地址和任务类型 CASE #poll_pointer OF 1: // 1#写启停 #slave_addr := 1; #rw := 1; #data_addr := 400001; // 控制命令寄存器 #data_len := 1; #send_data := #cmd_1; 2: // 1#写频率 #slave_addr := 1; #rw := 1; #data_addr := 400002; // 频率给定寄存器 #data_len := 1; #send_data := #freq_1; // ... 依此类推 END_CASE;

这里要提醒一个节奏问题:Modbus通讯不是越快越好,每个任务之间最好留出一个短暂的时间间隔,我实操时在轮询循环末尾加了个2毫秒的延时,避免CPU扫描太快导致连续发送指令,从站还没来得及响应。这个延时可以通过TON定时器实现,也可以用S7-1200的循环周期直接控制,简单来说就是让轮询频率别太疯。

4. 变频器侧参数设置要点

4.1 电机基本参数与加减速时间

变频器侧的参数设置是整个项目里最容易被忽略但同样重要的一环。很多人喜欢一上来就设通讯参数,结果变频器通讯是通了,电机转起来却不对,加速过流、减速过压,各种报警。所以我的习惯是先把电机基本参数设准确,再谈通讯。

英威腾GD系列变频器在快速调试菜单里主要有以下几个参数要核对:

参数代码功能说明我的设置值
P00.01电机额定功率4.0kW
P00.02电机额定电压380V
P00.03电机额定电流8.2A
P00.04电机额定频率50.00Hz
P00.05电机额定转速1440rpm

这些数据在电机铭牌上都有,照着填就行,千万别自己估。电机启动如果加速时间太短,启动电流会非常大,触发变频器过流报警;减速时间太短,母线电压会被泵升机制拉高,触发过压报警。我设置的加减速时间分别是5秒和6秒,对于输送带这种轻负载来说足够平缓,也不会让操作工觉得反应太慢。

另外,如果这台电机是带编码器或者有特殊负载的,还需要设置相应的控制方式,比如矢量控制、V/F控制。我这个项目用的是普通异步电机,V/F控制模式就够用了。GD系列默认的控制方式我记得就是V/F,不需要额外调整,如果电机的特性比较特殊再考虑改成矢量控制,但矢量控制需要电机参数自学习,操作上会多一些步骤。

4.2 通讯参数组配置

英威腾GD系列的通讯参数主要集中在一组功能码里,我用的设置如下:

参数代码功能说明我的设置值
P14.00本机通讯地址1#设1,2#设2,3#设3
P14.01通讯波特率9600
P14.02数据位校验8-N-1(无校验)
P14.03通讯协议Modbus RTU
P14.04通讯超时时间10秒

通讯超时时间这个参数有点意思。它的含义是:如果在设定时间内收不到主站的任何报文,变频器就认为通讯中断,然后按照P14.05设定的方式处理。我这边P14.05设的是2,意思是通讯中断后变频器停止运行并报警。这样做的目的是出于安全考虑——万一PLC死机或者通讯线断了,变频器不会傻乎乎地按最后的频率一直转下去,而是立刻停下来,避免设备失控引发安全事故。

这个超时时间我试过几种值,最短的1秒实测下来偶尔会误报警,比如PLC那边正在下载程序或者触摸屏操作暂时占用通讯链路时,1秒超时太敏感了。设为10秒相对稳妥,既不会误动作,也能在真正通讯故障时及时停车。具体项目里可以根据现场的容忍度去调整,但原则上不要小于3秒。

4.3 命令源与频率源选择

这是整个变频器参数设置中最关键的一步:告诉变频器“你听谁的指挥”。英威腾GD系列变频器有两个关键参数:命令源选择(决定启动停止从哪里接收)和频率源选择(决定速度给到哪里)。

我的设置如下:

  • P10.00(命令源选择)设为2,即通讯控制。这样变频器的启动、停止指令完全由Modbus通讯下发,面板上的启动停止键就会失效。
  • P10.01(频率源选择)设为2,即通讯给定。频率值也由Modbus通讯写入。

这里有一个很常见的坑:如果你只设了命令源为通讯,但频率源还是面板电位器给定,那么即使频率写进去也没有效果,变频器还是按面板上的电位器速度在转。反过来也是一样,只设频率源不设命令源,你写启停指令也没反应。两个参数必须同时设为通讯方式,控制权才完成交接。

设置完这两个参数之后,面板上的按键会失效,如果现场需要应急操作,可以在P10.00里加一个“通讯优先、面板可切换”的选项。不过我这个项目直接锁死为通讯控制,因为触摸屏是现场唯一的操作入口,这样也避免操作工在面板和触摸屏之间搞混。

5. 常见问题与调试经验实录

5.1 通讯中断与恢复机制

这个项目调试过程中,最让我头疼过的就是通讯中断问题。主要表现为:触摸屏上显示的某个变频器状态突然变成离线,操作工一按启动按钮没有任何反应,过几分钟又自己恢复了。

排查的时候我拿了笔记本接在总线上监听Modbus报文,发现某个从站偶尔会不响应主站的请求,导致MB_MSG指令返回错误码16#8204(从站无响应或响应超时)。这个错误码在S7-1200的Modbus库文档里写得很清楚,意思是从站在设定时间内没有返回数据。

问题根源找到了:变频器侧的电抗器在运行时产生电磁干扰,耦合到了RS485通讯线上,导致某个从站的通讯芯片接收到了错误数据帧,但它不会自动丢弃错误帧,而是等超时后才重新监听总线,这个期间就表现为不响应主站。解决思路有两个方向,一个是软件层面把主站轮询每个从站的超时时间适当调长一点,默认的1000毫秒改成2000毫秒,给对方留出重新同步的时间;另一个是硬件层面把通讯线的屏蔽层接地重新处理了一下,把原先两端悬空的屏蔽层改为PLC侧单端接地,干扰明显减少。

现场实测下来,这两招同时用,通讯中断基本消失了。我做了一个故障自恢复逻辑:如果MB_MSG错误码连续出现3次,就把这个从站的轮询暂时跳过,等下一个周期再试,避免一个故障站点堵住整条总线。这个逻辑虽然简单,但保护了整个系统的可用性——一台变频器通讯坏了,另外两台不受影响。

5.2 数据错位与字节顺序问题

另一个调试中遇到的问题是数据错位。具体现象是:触摸屏上显示的1#变频器电流值,实际上是3#变频器的电流值;2#显示的是1#的值,数据整体串位了。

排查过程很有意思:程序逻辑从头看了一遍,轮询指针、从站地址、数据存储区,看起来都正确。最后用Modbus调试工具访问从站,分别读取1、2、3号变频器的电流寄存器,数值都能正确返回。那问题只能在数据存储区的映射上。

真相大白:我在MB_MSG的DATA_PTR参数里,每一路任务都用了同一个数据存储区起始地址,也就是每个任务读回来的数据都往同一个DB块偏移位置里写。当3个任务依次执行时,后一个任务的数据就把前一个覆盖了。触摸屏读的时候,因为时序差不多的原因,正好读到的是最后一个任务写入的数据,所以出现了串位。

解决方式很粗暴但有效:给每个从站的每类数据分配独立的存储区,也就是1#变频器的电流、频率、状态分别存在DB1.DBD10、DB1.DBD14、DB1.DBW18;2#的从DB1.DBD20开始;3#的从DB1.DBD30开始。这样数据各归各,谁也不会覆盖谁。

关于字节顺序,这里也要多说一句。英威腾GD系列变频器的Modbus数据默认是高字节在前(Big-Endian),西门子S7-1200也是高字节在前,两边一致,所以不需要交换字节顺序。但如果你用Modbus调试工具的时候发现读回来的数据大小端反了,那就可以考虑工具软件的显示设置或者其他厂商的设备,这时候才需要做交换处理。PLC里交换字节顺序可以用SWAP_BYTE指令,甚至简单点的移位运算也能搞定。

5.3 干扰问题处理实录

再分享一个跟干扰有关的经验。项目交付后运行了大概两个月,现场反馈说偶尔会出现频率给定漂移,就是触摸屏设定50Hz,变频器实际运行频率却变成49.7Hz或者50.3Hz,有时候还会闪一下52Hz。

这种情况十有八九是干扰导致的通讯数据错误。Modbus RTU本身没有数据校验机制(准确说RTU模式下用的是CRC校验,但这个CRC只能检查数据在传输过程中有没有被篡改,不能纠正),一旦CRC校验失败,这帧数据就被丢弃,不会产生错误动作。但如果干扰信号恰好没有破坏到CRC校验字节,那错误数据就会被当作有效数据接受。

我的对策有两层:第一层是在PLC侧程序里做数值合理性判断,比如读回来的频率值,如果大于55Hz或者小于0Hz,就认为是垃圾数据,直接保留上一次有效值,并且置一个报警标志。第二层是在写频率给定值之前,先做一个斜坡限制,避免设定值突变超过2Hz/100ms,这样就算通讯上有毛刺,也不会造成频率瞬间跳变,对电机冲击也能小很多。

实测下来这个方法很管用,干扰毛刺还在,但已经不影响系统运行了,操作工再也没有反馈过频率漂移的问题。这个方法也推荐给大家,因为你不可能完全消灭现场干扰,但可以通过软件逻辑把干扰造成的影响降到最低。这也是自动化控制里常说的“防错”思维,硬件做不到的事情,软件兜底来补。

再补充一点实际运行数据:这套系统目前已经稳定运行了大概8个月,期间除了变频器本体的一次散热风扇故障之外,通讯链路没有出现过一次需要维护的故障。轮询周期、响应时间、数据刷新率都完全满足工艺要求。

6. 一些实操上的心得与经验补充分享

聊了这么多技术细节,最后再分享几个我前后做了好几个类似项目后沉淀下来的心得,算不上什么高深理论,但都是实打实省过时间的经验。

第一,做这类PLC加变频器通讯项目,强烈建议先拿单台变频器做最小系统验证。就是把一台变频器接上485线,用Modbus调试工具(比如Modbus Poll)先单独把所有寄存器地址、数据格式摸清楚,确认能读到正确的数据之后,再接第二台、第三台。这个步骤能避免你在后面三台设备联调时出了错还要回头排查到底是哪一台的参数有问题。

第二,S7-1200的Modbus库指令虽然官方文档写得算清楚,但里面有些细节要自己试出来。比如MB_MSG的DONE和ERROR输出,我建议在主程序里用一个Q点或者M点把它们引出来,调试时直接监控这两个点,比每次去DB块里翻错误码要直观得多。DONE置位说明一帧通讯完成,ERROR置位说明这一帧出错了,这两个点一监控,通讯状态一目了然。

第三,关于变频器的参数备份,我强烈建议在调试完成后把所有变频器的参数上传到电脑里存一份,做一个参数备份文件。英威腾GD系列的面板可以插拔,先把面板参数拷贝到面板里,然后再从面板上传到电脑。这样万一以后变频器更换了,新变频器直接把参数下载进去,不用一台台手输参数。手输参数的麻烦程度,试过一次的人都会深有体会,几十个功能码挨个确认,不仅费神还容易敲错。

另外还有个小技巧,如果现场有不止一块触摸屏,或者以后有上位机系统,可以把PLC的通讯接口空出来一个以太网口,用S7-1200内置的PUT/GET功能把变频器的监控数据通过以太网再转发一层。这样就算以后增加监控层站点,也不影响RS485总线上原有的Modbus轮询逻辑,扩展性会好很多。这个方案我在另一个项目中已经用上了,实际效果很不错。

最后就是老生常谈的一句话:项目调试过程中遇到的问题,一定要记录下来,包括现象、排查过程、最终原因、解决办法,这些经验才是你作为工程师最宝贵的资产。我这篇文章里写的这些坑,基本都是实际踩过之后记录下来的,希望对正在做类似项目的朋友有帮助。如果你们在调试中也遇到了什么奇怪的问题,欢迎交流讨论,有些东西确实是聊着聊着才想明白的。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进