把西门子S7-200 SMART和三菱E740变频器放到同一条RS485总线上,让PLC去控制变频器的启停、正反转和频率,这是很多小型自动化设备里最常见的需求。E740本身自带Modbus RTU通信口,S7-200 SMART本体上的RS485口又能直接调用Modbus主站库指令,所以不需要增加任何昂贵的扩展模块,一根两芯屏蔽线加上正确的参数设置,通信就能跑起来。这篇文章会把变频器参数怎么设、PLC程序怎么写、报文怎么看、现场容易踩哪些坑一次讲清,适合刚接触Modbus通信的电气工程师,也适合准备改造旧设备的调试人员参考。
1. 项目整体思路:为什么用Modbus RTU而不是模拟量
1.1 这个项目到底在解决什么问题
以前控制变频器转速,最常见的方法是PLC输出0-10V或4-20mA模拟量信号,再用两个继电器去控制正转和反转。这种方式接线多、抗干扰差,而且频率精度完全取决于模拟量模块的分辨率和现场干扰水平。如果现场有十几台变频器,每台都要再接模拟量线和开关量线,控制柜会变得非常乱。
用Modbus RTU通信控制变频器,本质上就是把原来需要物理端子传递的指令和频率值,变成一串数字报文通过RS485总线发送过去。这样做的好处非常直接:接线从“每个变频器一大把线”缩减到“一条总线把所有变频器串起来”,启停、正反转、频率给定、状态监视全都通过通信完成。对于S7-200 SMART加E740这种组合,Modbus RTU是性价比最高、也最容易上手的方案,因为两边都原生支持,不需要额外硬件。
1.2 方案选型的三个关键理由
从PLC侧来看,S7-200 SMART的CPU本体上带了一个RS485口,也就是端口0,STEP 7-Micro/WIN SMART软件里内置了Modbus RTU主站指令库。这意味着做Modbus通信不需要买任何扩展模块,也不需要自己拼RTU报文。对于刚入门的朋友,可能觉得“Modbus主站”是个很高深的东西,实际用起来就是拖两个库指令出来填参数,后面我会详细写。
从变频器侧来看,E740本身就是支持Modbus RTU的通用型变频器,通信参数通过Pr参数设置,站号、波特率、校验方式都可以自由配置。作为从站,它的响应速度完全满足普通设备控制需求,而且E740的通信地址定义比较规整,运行指令、频率设定、状态监视都有固定的寄存器地址,非常适合PLC直接读写。
从成本角度来看,RS485通信只需要两根信号线加一根公共地线,屏蔽线也不贵。相比模拟量方案还需要模拟量输出模块、模拟量输入端子、屏蔽电缆,通信方案省下的硬件成本相当可观。更重要的是,通信方案的调试和维护也方便,参数不对直接改寄存器,不用去柜子里重新接线。
1.3 系统架构与硬件清单
整个系统的拓扑结构其实很简单:S7-200 SMART作为Modbus主站,通过端口0的RS485口挂一条总线,E740变频器作为唯一的从站挂在总线上。如果以后要扩展第二台、第三台变频器,直接在总线上并接即可,只要站号不重复就行。
完整硬件清单如下:
- S7-200 SMART PLC,例如CPU SR20、ST20或SR40,需要带RS485端口
- 三菱FR-E740变频器一台,型号可根据电机功率选择
- 两芯屏蔽双绞线若干米,用来连接RS485总线
- 120欧姆终端电阻两个,现场线路较长时使用
- USB转RS485调试模块,推荐准备一个,调试阶段非常有用
这里特别提一下S7-200 SMART的RS485口形态。CPU本体的端口0是一个9针D型孔座,其中3号脚是RS485信号B,8号脚是RS485信号A,5号脚是公共地。如果PLC上装了SB CM01通信信号板,那么信号板上也会有RS485端子,直接接A、B即可。我实际调试时更喜欢用信号板的端子,因为接线比9针D型座方便很多,而且信号板上的RS485口可以作为端口1使用,不影响CPU本体端口0的原有功能。
2. 三菱E740变频器设置:通信之前的必修课
2.1 先搞懂接线定义
E740变频器的RS485通信端子在主回路端子排的下方,有三个端子:SDA、SDB、SG。其中SDA是485正信号,SDB是485负信号,SG是信号公共地。这三个端子和PLC侧RS485口的对应关系是:
- PLC的RS485 A信号接到变频器SDA
- PLC的RS485 B信号接到变频器SDB
- PLC的公共地接到变频器SG
很多第一次调试的朋友容易在这里栽跟头。西门子的A、B命名和三菱的SDA、SDB命名并不是完全一致的,实际调不通时第一件事就是对调A、B两根线再试,大多数情况下问题就出在这里。另外,如果现场有两台以上设备挂在同一条总线上,建议在总线的物理两端各接一个120欧姆终端电阻,防止信号反射导致通信不稳定。
2.2 通信参数对照表
E740的通信参数都集中在Pr参数区,设置之前最好把变频器恢复出厂设置,避免以前遗留的参数干扰。需要设置的参数如下表:
| 参数号 | 参数名称 | 推荐值 | 说明 |
|---|---|---|---|
| Pr.79 | 运行模式选择 | 10 | 10代表网络运行模式,也就是通信控制 |
| Pr.117 | 通信站号 | 1 | 0-31,多台设备时每台必须不同 |
| Pr.118 | 通信速率 | 1 | 1代表9600bps,要和PLC侧保持一致 |
| Pr.119 | 数据位长度 | 0 | 0代表8位数据、1位停止位 |
| Pr.120 | 奇偶校验 | 2 | 2代表偶校验,要和PLC侧保持一致 |
| Pr.121 | 通信重试次数 | 1 | 通信异常时自动重试的次数 |
| Pr.122 | 通信校验时间 | 0 | 0代表不检测,调试阶段建议保持0 |
| Pr.123 | 响应等待时间 | 0 | 默认0即可 |
| Pr.124 | CR/LF选择 | 0 | 0代表无CR/LF,标准Modbus RTU不需要 |
| Pr.77 | 参数写入选择 | 0 | 0代表允许写入,方便用通信修改参数 |
这里要重点解释一下Pr.79。很多人在做通信时只设置了Pr.117到Pr.124,发现PLC怎么发指令变频器都没反应,就是因为Pr.79没有切到网络运行模式。Pr.79设为10以后,变频器面板会显示NET,此时启动、停止、频率给定都只能通过通信通道或操作面板控制,原来的STF、STR端子信号全部失效。如果想保留端子启停功能,只能通过通信写频率,那Pr.79可以设成11或者12,具体看你的控制需求。
2.3 参数设置步骤与验证
实际操作时,我的习惯是先把Pr.79以外的参数全部设好,最后再改Pr.79。这样即使参数设错了,变频器还保持原来的运行模式,不会突然失控。如果中途改乱了,直接按面板上的MODE键进入参数设置界面,把Pr.CL(参数清除)设为1恢复出厂设置,再重新设置。
一个常见的误区是:Pr.118通信速率到底填1还是填9600?在E740中,Pr.118的设定值是索引,不是波特率本身。0代表4800bps,1代表9600bps,2代表19200bps,3代表38400bps。所以如果你想用9600,Pr.118就填1。我推荐通信速率统一用9600,这个速率在工业现场足够用,而且传输距离可以更远一些,调试时也更容易排查问题。
参数设好以后,可以先不接PLC,用USB转RS485模块连接变频器的SDA、SDB、SG三个端子,打开串口调试工具,手动发送一帧Modbus报文验证。比如读取1号站的输出频率,发送报文:
01 03 00 28 00 01 CRC如果变频器正确响应返回功能码03和数据,说明通信链路和参数设置都没问题。这一步验证非常重要,它帮你把故障范围缩小到“PLC侧”还是“变频器侧”,后面的调试会顺利很多。
3. S7-200 SMART通信程序设计与注释
3.1 库指令与存储区分配
S7-200 SMART的软件里自带Modbus RTU主站库,不需要额外安装任何东西。打开STEP 7-Micro/WIN SMART,在指令树里找到“库”,展开后就能看到Modbus RTU Master相关的指令,核心就是两个:MBUS_CTRL和MBUS_MSG。
从指令树里拖出库指令时,软件会弹窗要求分配库存储区,也就是V存储区地址。这一步很多人容易忽略,导致程序运行后通信功能不正常或者程序区冲突。建议用一个独立的V区地址段,比如VB0到VB200,并且在自己编写程序时避开这个区域。如果在写程序过程中发现数据被莫名覆盖,大概率就是库存储区和用户程序区重叠了。
MBUS_CTRL是主站初始化指令,每个扫描周期都必须调用一次,用来配置主站的波特率、校验方式、超时时间等基础参数。MBUS_MSG则是实际的读写指令,每条MBUS_MSG执行一个读或写操作,执行完成后输出完成位和错误码。要注意的是,同一时刻只能有一个MBUS_MSG在动作,两台以上MBUS_MSG同时触发会报“忙”错误,这也是后面轮询程序要解决的核心问题。
3.2 MBUS_CTRL初始化网络
初始化程序我习惯放在第一个网络。用一个首次扫描标志置位初始化允许位,然后每个扫描周期都调用MBUS_CTRL。调用参数如下:
LD SM0.1 S M5.0, 1 LD SM0.0 CALL MBUS_CTRL, 1, // Mode:1=Modbus主站 9600, // Baud:9600bps 2, // Parity:2=偶校验 1000, // Timeout:1000ms M5.1, // Done:初始化完成位 MB5 // Error:初始化错误码这里的Parity参数对应关系是:0代表无校验,1代表奇校验,2代表偶校验。前面我们在E740上把Pr.120设为2,也就是偶校验,所以PLC侧Parity也填2,两边必须完全一致。波特率也是同理,E740的Pr.118设为1代表9600,PLC侧Baud就填9600。
超时时间1000ms是实践经验值。设置太短,比如200ms,当现场干扰较大或者变频器处理稍慢时,一帧正常的通信也会被判为超时;设置太长,故障响应会变得迟钝。对于普通设备控制场景,1000ms是一个比较折中的选择。初始化完成后M5.1会置位,这条网络里的错误码MB5如果为0,说明主站模式建立成功。
3.3 写运行指令与频率设定
E740的通信控制逻辑很直观:40001寄存器是运行指令字,bit0为1代表正转,bit1为1代表反转,bit0和bit1同时为1代表停止;40002寄存器是频率设定值,单位是0.01Hz。也就是说,要输出50.00Hz,就往40002写入5000。
在S7-200 SMART中调用MBUS_MSG写寄存器,需要特别注意Addr参数的格式。MBUS_MSG的Addr是一个32位双字,它的组成规则是:高8位是从站站号,次高8位是Modbus功能码,低16位是寄存器偏移地址。以写1号站的40001为例,Addr参数写成16#01060000,其中01表示站号1,06表示写单个寄存器的功能码,0000表示40001这个寄存器相对于40001区的偏移是0。写40002时偏移变成1,Addr就是16#01060001。
程序示例中的梯形图逻辑我用文字加助记符的方式描述,方便理解:
// 正转启动:I0.0上升沿 LD I0.0 EU MOVW 16#0001, VW100 // 运行指令字:bit0=1,正转 S M10.0, 1 // 置位写运行指令请求 // 反转启动:I0.1上升沿 LD I0.1 EU MOVW 16#0002, VW100 // 运行指令字:bit1=1,反转 S M10.0, 1 // 停止:I0.2上升沿 LD I0.2 EU MOVW 16#0000, VW100 // 运行指令字清零 S M10.0, 1 // 执行写运行指令 LD M10.0 A M5.1 // 要等到主站初始化完成 EU CALL MBUS_MSG, 1, // RW:1=写 16#01060000, // Addr:1号站,功能码06,偏移0000,指向40001 1, // Count:写1个字 &VB100, // DataPtr:数据来源VW100 M10.1, // Done位 MB6 // 错误码写频率设定的逻辑与之类似,区别在于数据来源和地址偏移。我会把频率设定值先存到VW200,比如触摸屏上设定50Hz时换算成5000写入VW200,然后程序里用VW202作为发送缓冲,每次频率值变化时触发一次写操作:
// 频率值变化检测 LDW<> VW200, VW204 S M10.2, 1 // 置位写频率请求 // 执行写频率指令 LD M10.2 A M5.1 EU MOVW VW200, VW202 // 把设定值复制到发送缓冲 CALL MBUS_MSG, 1, 16#01060001, // 1号站,功能码06,偏移0001,指向40002 1, &VB202, // 数据来源VW202 M10.3, MB7 // 完成以后更新比较值 LD M10.3 MOVW VW200, VW204 R M10.2, 1这里有个关键细节:VW200里的频率设定值是字类型,S7-200 SMART存储大端格式,高字节在低地址。MBUS_MSG发送时也是先发高字节再发低字节,所以直接把VW202作为数据指针即可,不需要额外交换字节。
3.4 读监视数据的轮询设计
读变频器状态也是MBUS_MSG完成的。E740的输出频率监视地址是40041,输出电流监视地址是40042。按40001偏移0计算,40041的偏移是40,十六进制就是0x0028;40042的偏移是41,十六进制就是0x0029。所以读取1号站输出频率的Addr参数是16#01030028,读输出电流的Addr参数是16#01030029,功能码03代表读保持寄存器。
典型读频率的逻辑:
// 0.5秒定时脉冲 LD T37 TOND T37, 500 // 定时到触发读取 LD T37 EU CALL MBUS_MSG, 0, // RW:0=读 16#01030028, // 1号站,功能码03,偏移0028,指向40041 1, &VB210, // 读取结果存到VW210 M10.4, MB8这样VW210里就是实时输出频率,单位同样是0.01Hz。如果现场要显示电流,再复制一段读40042的程序即可。
但这里需要特别提醒:如果程序里同时存在写运行指令、写频率、读频率、读电流等多个MBUS_MSG,绝对不能在同一个扫描周期里让两个MSG同时触发。S7-200 SMART的Modbus主站库不允许这样操作,后触发的MSG会返回“忙”错误,时间长了还可能导致通信状态混乱。
我实际项目中常用的处理方式是做一个简单的轮询状态机。定义四个任务位M20.0到M20.3,分别代表写运行、写频率、读频率、读电流。初始时M20.0为1,第一个任务完成后复位自己,置位下一个任务,依次循环。最后一个任务完成后延时几百毫秒再重新开始。这样每个扫描周期最多只有一个MSG在动作,逻辑清楚,排查也方便。
用一个字节M20.0-M20.7做轮询状态,梯形图里用置位复位指令实现顺序切换。关键是要抓住“完成位”这个信号。每个任务自己的MSG完成位置位时,就说明本次通信已经处理完毕,可以放心切换到下一个任务。
4. 通信报文与调试实录
4.1 看懂Modbus RTU报文,调试不再黑盒
很多朋友调试时只会看PLC程序里的错误码,但真正出问题时还是要回到报文层面去分析。Modbus RTU的报文结构很简单,用例子说明。
读输出频率时,PLC发出的请求报文是:
01 03 00 28 00 01 CRC拆开来看,01是站号,03是功能码(读保持寄存器),00 28是起始地址偏移,00 01是读取数量,CRC是循环冗余校验。变频器收到后,如果一切正常,会返回:
01 03 02 13 88 CRC这里01是站号,03是功能码,02表示后面跟着2个字节数据,13 88换算成十进制是5000,也就是当前输出频率是50.00Hz。
写正转指令时,PLC发出的报文是:
01 06 00 00 00 01 CRC01是站号,06是功能码(写单个寄存器),00 00是寄存器偏移,00 01是要写入的数据,也就是正转运行指令字。停止时把00 01改成00 00即可。
调试时最实用的办法是用USB转RS485模块连接变频器,用Modbus调试助手直接发送这些报文。如果报文发出去变频器能正确响应,说明变频器侧完全没问题,接下来专心排查PLC侧;如果报文没响应或者返回异常码,问题就出在变频器参数或者接线上了。这种分而治之的排查思路能把调试效率提高一大截。
4.2 现场调试的标准流程
按照我自己的习惯,现场调试流程一般是这样:
第一步,先用串口助手验证变频器通信是否正常。把USB转RS485模块接到变频器的SDA、SDB、SG上,打开Modbus调试工具,确认站号、波特率、校验方式都与变频器参数一致,发送读频率报文。如果此时变频器面板显示NET模式,读到的频率为零,说明通信链路已经通了。
第二步,PLC侧先用最简单的读操作建立通信。程序里只保留MBUS_CTRL和一条读40041的MBUS_MSG,其他读写任务全部屏蔽。观察MBUS_CTRL的Done位是否周期性地闪烁,错误码是否为0。这一步如果通过,说明PLC的RS485口、库存储区、初始化参数都没问题。
第三步,再加入写操作。手动输入一个频率设定值,比如在VW200里给5000,观察变频器面板的目标频率是否变成50.00Hz。然后再给正转启动指令,确认变频器能正常启动运行。
第四步才是把原来屏蔽掉的其他任务逐步加回来,包括反转、停止、读电流、多台变频器轮询等。每一步都验证无误后再进行下一步,避免一次引入太多变量导致问题无法定位。
4.3 常见错误码速查表
S7-200 SMART的MBUS_CTRL和MBUS_MSG错误码含义,我整理成了一张速查表:
| 错误码 | 含义 | 处理思路 |
|---|---|---|
| 0 | 无错误 | 正常 |
| 1 | 非法的功能码 | 检查Addr参数中的功能码是否与操作匹配 |
| 2 | 非法的数据地址 | 检查寄存器偏移是否超出从站范围 |
| 3 | 非法的数据值 | 检查写入的数据是否在允许范围内 |
| 4 | 从站设备故障 | 检查变频器本身状态和参数 |
| 6 | 从站忙 | 降低轮询频率,确保上一条指令已完全处理 |
| 10 | CRC校验错误 | 检查线路、波特率、校验方式是否一致 |
| 11 | 通信超时 | 检查接线、站号、终端电阻 |
这里要说明的是,不同版本的软件库错误码可能略有差异,以软件自带帮助为准。但实际调试中遇到最多的就是超时和CRC错误,基本可以锁定在接线、站号、波特率这三个因素上。还有一种情况让不少人困惑:明明PLC侧错误码为0,但变频器没动作。这时候要优先检查Pr.79是不是设在10,以及运行指令字是否写对了。E740的运行指令字是16位数据,正转是0001,反转是0002,停止是0000,并不是简单的置位线圈,这一点特别容易忽略。
5. 扩展:多台变频器组网与参数读写
5.1 多站轮询的思路
一条RS485总线上挂多台E740是常见的扩展场景。比如一台S7-200 SMART控制三台变频器,那么只需要把每台变频器的SDA、SDB、SG端子并联到总线上,分站号设为1、2、3。PLC侧就是把之前针对单台变频器的MBUS_MSG复制几份,把Addr参数里的站号字节分别改成02、03即可。例如写2号站的40001,Addr参数就是16#02060000。
但要注意,总线上站数增加后,轮询周期会成倍拉长。比如原来一个轮询周期是1秒,挂三台之后可能变成3秒以上。如果现场对响应速度要求高,可以适当缩短每个MSG之间的延时,或者把低频任务放到更慢的轮询周期里。另外,RS485总线长度超过50米时,一定要在总线两端加120欧姆终端电阻,否则远端设备容易通信不稳定。
5.2 通过通信读写变频器参数
除了常规的运行控制和频率给定,Modbus通信还能直接读写E740的参数。E740的寄存器映射中,40003是参数号寄存器,40004是参数值寄存器。读写参数的一般方法是:先向40003写入想要操作的目标参数号,然后再从40004读取或者写入参数值。
举个例子,如果要在PLC里修改Pr.4这个参数,第一步向40003写入4,第二步再向40004写入新的参数值。实际使用中要注意,并不是所有参数都允许在运行状态下通过通信修改,而且前提是Pr.77必须设为0,也就是允许参数写入。如果Pr.77设为1,通信只能读取参数,不能写入。修改Pr.79这类控制模式参数时尤其要谨慎,改错了变频器可能直接失去控制。
5.3 我从这套方案里总结的几个经验
这套S7-200 SMART加E740的通信方案,我在好几个项目里用过,也帮朋友排查过问题,有些经验分享一下。
第一,RS485的A和B对应关系一定要亲自验证。不同品牌的接线端子叫法五花八门,即使SDA看起来像“A”,实际通信不上时对调一下往往就好了,这不算什么丢人的事,反而是最快的排查手段。
第二,通信调试阶段的轮询周期不要设得太快。很多新手喜欢追求高速,把每个MSG的间隔压缩到100毫秒以内,结果错误码满天飞。实际上对于变频器控制和监视这种应用,几百毫秒的响应时间完全够用,稳定可靠比快更重要。
第三,屏蔽线一定要选质量好的双绞屏蔽线,屏蔽层单端接地。现场如果同时有变频器的主回路动力电缆,RS485线尽量远离动力线,至少保持20厘米以上的间距。通信不定时报CRC错误时,往往就是屏蔽层没处理好或者线缆离动力线太近。
第四,程序里给MBUS_MSG的错误码加上报警功能。我在实际项目里会把MB8、MB7这一类的错误码做累加统计,连续出错超过设定次数就输出通信故障信号,让触摸屏报警。这样即使通信偶尔被干扰,也能第一时间发现问题,而不是等到变频器停半天才发现异常。
这套方案做好之后,后续如果要再接触摸屏、上位机或者组态软件,也不需要动变频器侧的设置,因为S7-200 SMART本身还有网口,上位机可以通过网口和PLC通信,PLC继续通过RS485总线控制变频器。整个系统的扩展性是比较好的,遇到类似的设备改造项目,这个套路可以放心复用。