资讯详情

资讯详情

S7-200 SMART与三菱E740变频器Modbus RTU通讯程序实战解析

前阵子接手一个项目现场16台三菱E740变频器客户要求用一个西门子S7-200 SMART PLC全部管起来实现联动调速、统一启停还要在触摸屏上看到每台电机的实时频率和电流。搭完这套系统我最大的感受是通讯本身不难难的是把16台设备“排队”排明白以及现场调试时不被各种干扰和参数配置坑得怀疑人生。这篇就把这套S7-200 SMART控制16台三菱E740变频器的Modbus RTU通讯程序从方案选型、硬件接线、变频器参数到轮询调度、程序实现和现场排错完整拆一遍。内容偏向实战适合正在做多从站通讯项目、或者准备从模拟量控制切到总线控制的工程师参考。1. 系统架构与通讯方案选型1台PLC怎么带16台变频器1.1 项目需求与控制规模的真实情况这个项目规模其实不算大一台输送线设备16台异步电机每台电机的功率从0.75kW到5.5kW不等驱动设备是清一色的三菱E740变频器。客户最初给的要求也很朴素所有变频器能在同一个触摸屏上启停能统一给定速度也能单独微调某台电机的速度最好还能看到每台的电流。看起来不复杂但有个细节很关键这16台变频器不是装在一个柜子里而是分布在两段长约40米的产线上中间还要穿过桥架。这就意味着通讯距离、抗干扰、设备扩展性这些问题从一开始就绕不开。如果按最传统的方式做——用模拟量控制PLC需要至少16个模拟量输出通道用来给频率指令还得有16个开关量输出用来做启停再加上把变频器状态反馈回PLC的数字量输入IO点数量会非常夸张。我粗略算了一笔账一套16通道模拟量输出模块加上16个点的DO和DI扩展模块再加上对应的屏蔽电缆和现场接线材料成本已经抵得上一台小型PLC。而且模拟量方案还有个要命的缺点——频率给定是模拟量精度受干扰影响速度反馈也拿不回来客户想要的“实时频率和电流”根本没法实现。所以这个项目从需求分析阶段就基本锁定了总线通讯方案。1.2 为什么选RS485总线加Modbus RTU协议确定走总线通讯之后摆在我面前的可选方案其实有好几个三菱自己的CC-Link、DeviceNet、PROFINET、CANopen、Modbus RTU。但结合这套系统的构成选择逻辑其实非常清晰。先看变频器侧。三菱E740自带一个标准RS485通讯口支持三菱专用协议和Modbus RTU协议。使用Modbus RTU时不需要加任何扩展卡这是成本最低的路子。再看PLC侧S7-200 SMART的CPU本体上自带一个RS485口Port0在软件里装一个西门子官方的Modbus库就能当主站用同样不需要加模块。两边都是开箱即用不需要第三方协议转换器这是Modbus RTU方案最大的优势。再对比一下其他方案CC-Link虽然也是三菱的但E740要上CC-Link必须插通讯选件卡成本直接上去DeviceNet在国产项目里用得少而且S7-200 SMART要接DeviceNet还得专门挂协议网关PROFINET更不用说了E740配套的PROFINET模块价格几乎顶半台变频器。所以在这个项目里RS485总线加Modbus RTU协议就是那个“便宜又大碗”的选项。1.3 网络拓扑与硬件清单规划通讯方案定了之后网络拓扑其实没什么好纠结的就是标准的菊花链手拉手接法。S7-200 SMART的Port0口通过RS485总线和16台E740变频器串联在一起首尾两端各接一只120Ω终端电阻屏蔽双绞线的屏蔽层在PLC侧单端接地。这里要注意RS485总线是半双工的信号线和回线各一根接变频器端子排上的A和B端子A接信号的正B接信号的负顺序错了会通不通或者时通时断。具体硬件清单如下序号设备型号/规格数量用途说明1PLC西门子S7-200 SMART CPU SR401台主站运行Modbus RTU轮询程序2变频器三菱E740系列16台从站站号分别设为1~163通讯电缆屏蔽双绞线2芯截面积≥0.5mm²约60米手拉手串联所有设备4总线连接器S7-200 SMART配套DP头1个接PLC的Port0口5终端电阻120Ω1/4W2只接总线首末两端6触摸屏任意支持Modbus TCP/S7协议的型号1台通过以太网连接PLC做操作和监视这里有个容易忽略的小细节S7-200 SMART的Port0物理接口是RS485针脚定义和标准DP头是一致的所以直接用西门子配套的DP总线连接器就行不需要自己做转换线。接线时注意DP头上有两排进线和出线端子手拉手进出的线都压在对应端子上别把进线和出线搞错了。2. Modbus RTU通讯协议与S7-200 SMART库指令的使用要点2.1 报文格式其实没有想象中复杂做Modbus RTU通讯首先要搞清楚报文到底长什么样。很多第一次做通讯的工程师一看十六进制就头疼其实把它拆开看一套报文就是四个部分从站地址、功能码、数据区、CRC校验。比如我要写一台变频器的运行指令地址是01功能码是06数据区是寄存器地址加数据最后跟两个字节的CRC校验码。完整报文就是下面这样01 06 9C 41 00 02 08 0B这里面01是从站地址06是写单个保持寄存器9C41是寄存器地址0002是要写入的数据080B是CRC校验码。S7-200 SMART的Modbus库指令会自动处理CRC的计算和校验不需要自己写CRC算法但理解这个结构对后续排错特别有帮助——我后边排查故障时很多时候就是在仿真器里对比这个报文帧看是地址错了还是数据区发成了别的值。实际项目中我们主要用到三个功能码03读保持寄存器、06写单个保持寄存器、16十六进制10写多个保持寄存器。频率设定和运行指令这种瞬时量用06写读回频率电流状态字用03读偶尔批量改参数时用16写。三菱E740作为Modbus从站对这些功能码的支持是完整兼容的这点不用担心。2.2 MBUS_CTRL指令的参数设置思路S7-200 SMART的Modbus主站功能是通过西门子官方库指令实现的库里有两个核心指令MBUS_CTRL用于初始化主站MBUS_MSG用于发送具体的读写请求。MBUS_CTRL在程序里要一直保持使能状态相当于给主站通讯模块上电。MBUS_CTRL的参数设置要仔细看因为Parity位直接决定了和变频器侧的通讯协议格式是否一致Mode填1使能Modbus RTU协议主站功能。Baud填9600和变频器Pr.118的设定保持一致。Parity填0对应8数据位、无校验、1停止位即8N1格式。Timeout填100单位是毫秒指主站发出请求后等待从站响应的最长时间。这里有个细节需要注意S7-200 SMART库的Parity只有0、1、2三个选项分别对应无校验、奇校验、偶校验但停止位数量没有单独暴露出来。三菱E740那边的Pr.119是停止位参数Pr.120是校验方式参数。所以我要把E740的Pr.119设为11位停止位、Pr.120设为0无校验两边才能严格对齐成8N1。如果三菱那边用了默认的8N2跟PLC做成8N1通讯也能跑但很勉强不定时丢帧。2.3 MBUS_MSG指令的触发机制与常见误区MBUS_MSG用来完成实际的读或写操作。如果程序里要轮询16台变频器最核心的逻辑就是严格按照“一次只发一条请求、等上一条完成后再发下一条”的规则来。MBUS_MSG的First管脚必须接上升沿信号来触发请求这是我最想强调的一点因为这里太容易踩坑了。如果你用常ON信号去使能MBUS_MSG主站就会在每个扫描周期疯狂发送同一个请求报文。Modbus RTU是串行半双工协议从站根本来不及处理这么多连续请求轻则报错重则总线直接被占死。所以在程序里每条MBUS_MSG请求的上一个扫描周期必须在First管脚处创造一个上升沿我用的是完成位配合取反加与门的方式确保一条请求只触发一次。另外一点MBUS_MSG的Done位是请求完成的标志Error是错误码存放区。每次请求完成之后都要先判断Error的值再决定下一步怎么走。我后边单独写一节现场调试那里面会详细讲错误码的含义和排查方向。3. 三菱E740变频器侧参数配置面板设置的完整参数表3.1 通讯相关参数从Pr.117到Pr.124一次讲清三菱E740的通讯参数集中在Pr.117到Pr.124再加一个Pr.549用来切换协议类型。第一次做这个项目的时候我拿着手册一个一个参数核对后来发现把这些参数理解了后面就顺了。先看最常用的参数配置表参数号参数名称设定值说明Pr.117从站站号1~16每台变频器必须唯一Pr.118通讯速率9696表示9600bpsPr.119停止位长度11位停止位Pr.120奇偶校验0无校验Pr.121通讯重试次数1允许重试1次Pr.122通讯校验时间间隔999通常设为999表示无校验Pr.123通讯等待时间0从站响应前等待时间Pr.124CR/LF有无0无CR/LFPr.549协议选择11表示Modbus RTU协议Pr.117是站号范围1~31但要考虑S7-200 SMART做Modbus主站时从站地址填1~16对应我的任务表所以我就干脆把16台变频器站号排成1到16和产线上电机编号保持一致方便后续调试找设备。有一点要注意站号0在Modbus协议里有特殊含义是广播地址不能用来作为单台从站的地址现场千万别把变频器站号设成0。Pr.118这里填96是表示9600bps这个编码规则是早期三菱变频器的老设计很多第一次用的工程师会直接填9600结果通讯完全不响应。对了Pr.118如果填192则代表19200bps但我这个项目跑下来觉得9600bps的稳定性明显优于19200因为现场变频器多、输出频率高干扰环境比较复杂。另一方面9600bps下16台全轮询一遍大概1.5秒左右对这种输送线的速度同步来说完全够用。3.2 面板设置步骤和运行模式切换参数设置必须在变频器面板上操作。具体步骤是按MODE键切换到参数设定模式按上下键找到Pr.117按SET确认进入参数值修改再按上下键改站号最后按SET保存。每台变频器都要把上述表格里的参数按顺序过一遍。这个过程很机械但也很容易出错我的习惯是设置完一台就打一个勾全部设置完之后再复查一遍关键参数特别是站号和Pr.549、Pr.79这两个位置。Pr.79是运行模式选择这个参数很多人会漏掉。三菱变频器默认运行模式是面板操作或者端子控制模式如果Pr.79不切到网络控制模式你通过Modbus写入运行指令根本没有用变频器不会响应。本项目完全靠PLC统一控制启停所以把Pr.79设为0也就是外部/网络运行模式。这样设置之后PLC通过通讯写入运行指令就能正常启停变频器了。实际操作中我需要把每台变频器的STF、STR正反转端子保持悬空状态就是不接任何外部线。因为如果STF端子接了常闭触点或者参与了原有控制回路的自锁变频器的运行权限会被端子信号抢占通讯控制反而会失效或者出现“面板可以启动通讯启动不了”这种灵异现象。这是通讯控制项目里最容易出现的问题之一我第一次做的时候就吃过这个亏。3.3 参数写完后必须做的两个验证动作参数都设置完之后不要急着写PLC程序先在每台变频器面板上调一个最简单的验证动作用面板的监视模式看看通讯地址有没有被正确识别。具体可以这样做把PLC侧只接一根线和第一台变频器连接临时写一个只有一行MBUS_MSG的小测试程序向站号1的40002寄存器写入1000对应10.00Hz如果变频器面板上的频率监视值变成了10.00Hz说明通讯链路已经打通。如果没有反应第一时间检查Pr.549是不是设成了0三菱专用协议。三菱E740的默认协议是三菱专用协议不改成Modbus RTU西门子发什么报文它都不认识。另一件要验证的事是确认Pr.79运行模式确实生效设完Pr.79后最好断一次变频器电源重新上电因为三菱部分版本的参数修改需要掉电重启才能完全生效不断电直接测试偶尔会出现参数看似保存了实际没生效的情况。4. 轮询调度逻辑与程序实现16台设备排队处理的核心设计4.1 寄存器地址映射PLC侧怎么组织和控制数据通讯协议和变频器参数都就绪之后剩下的重头戏就是PLC程序了。S7-200 SMART做Modbus主站核心工作其实是两件事一是维护一张每个从站的寄存器访问映射表二是设计一套轮询调度逻辑让16台设备排队有序地收发报文。先看寄存器映射。这里给出一个参考E700系列手册整理出的常用映射实际做项目时以随机手册为准功能Modbus地址数据含义运行指令40001bit0正转、bit1反转、bit2复位频率设定40002单位0.01Hz50.00Hz写5000输出频率监视40003单位0.01Hz输出电流监视40004单位0.01A状态监视40005bit0运行、bit1反转、bit2到达、bit3故障PLC侧我规划了这样一组数据区VB100开始的数组放16台变频器的目标频率设定值每台占2个字节VB200开始的数组放16台变频器的启动命令字每台占1个字节VB300开始的数组放16台变频器的状态字每台占2个字节。从站读回来的频率电流数据也专门划了对应的V区存放。这样后期接触摸屏时直接把这些V区变量映射到屏上就行不用再重新理数据流。4.2 任务表设计与轮询指针推进逻辑Modbus RTU是半双工单主站协议一个主站同一时刻只能和一台从站通讯所以16台设备必须排队处理。我设计的轮询任务表是这样的把每个从站拆成两个任务第一个任务是“写运行指令和频率设定”第二个任务是“读状态字、输出频率和输出电流”。这样16台变频器一共32个任务用一个字型变量做任务索引指针从0递增到31然后循环回0。对应关系如下任务0向站号1写控制指令4000140002 任务1读站号1状态400034000440005 任务2向站号2写控制指令 任务3读站号2状态 ... 任务30向站号16写控制指令 任务31读站号16状态轮询指针的推进逻辑是典型的“等上一条完成再发下一条”。每启动一条MBUS_MSG请求当Done位置1时说明这条请求已经处理完毕。这时候不管Error是否为0任务索引都加1开始发起下一条任务。如果Error不为0就把错误码记录到专门的错误缓冲区方便诊断但轮询不停滞。这条原则很重要个别从站掉线、通讯干扰、变频器正在初始化等瞬态问题都不应该让整个系统的轮询卡死。S7-200 SMART的库要求MBUS_MSG的数据指针必须字对齐这一点必须牢记。也就是你要做Modbus通讯的数据缓冲区地址必须从偶数地址开始。如果你用VB499这种奇数地址去读轻则数据错位重则直接报参数错误。这是西门子库隐藏的一个坑我在测试程序时还真踩过一次后来翻手册才看到这行小字。4.3 启动顺序为什么要“先写频率再给运行指令”回到程序逻辑上还有一个我专门踩过坑的地方启动顺序。如果对一台正在停止状态的变频器先写运行指令再写频率设定会发生一个很尴尬的事——变频器收到运行指令瞬间立即开始运行但当时频率设定值还是上次残留的数值。如果残留值是0电机会低速抖动一下然后才慢慢升到设定值如果残留值是上次的50Hz那电机会瞬间冲到50Hz这在很多场合是不允许的。我的做法是每一轮的写控制任务里先执行一条MBUS_MSG写40002频率设定等这条完成并进入下一轮任务之后再执行一条MBUS_MSG写40001运行指令。也就是说频率设定永远比运行指令“提前一拍”到达变频器。这样即使变频器收到运行指令的瞬间频率寄存器里的值已经是目标值了启动过程会非常平滑。这个逻辑听起来简单但在轮询调度里实现时要小心如果你把“写频率”和“写指令”当成两个独立的任务放在任务表里那你实际上等于要定义64个任务而不是32个。我最终的做法是把它们合并成一个任务内部连续发两条MBUS_MSG先完成后一个再开启下一个避免了额外的任务表膨胀。代价是每个从站的单轮通讯时间增加了约40毫秒但对整体1.5秒的轮询周期来说完全可接受。4.4 梯形图逻辑的主干框架因为S7-200 SMART的库指令是Tick符号实际程序就是标准的梯形图串联结构。主干逻辑我用文字描述一下方便理解1. SM0.0常ON使能MBUS_CTRL初始化主站。 2. 用边沿检测库指令捕获MBUS_CTRL的Done上升沿表示初始化完成。 3. 初始化完成后执行任务索引加1的累加逻辑。 4. 根据任务索引查表得到当前应该访问的从站号、读写类型、寄存器地址和缓冲区指针。 5. 用这些参数接线MBUS_MSG的各个管脚。 6. MBUS_MSG的Done位再次产生上升沿回到第3步推进索引。任务索引查表我用了查表指令FILL指令的组合。先把32个从站号、32个功能码、32个寄存器起始地址分别做成三个常量表放到V区然后按照任务索引去取。这样程序修改起来很方便——如果某天要把从站数量扩展到20台只需把表扩大并重新规划任务数就行不需要把梯形图推倒重来。这种表驱动的设计思路在多从站通讯项目里真的能省掉大量后期维护时间。5. 现场调试与故障排查从超时、CRC到干扰的完整链路5.1 最常见的错误码到底在说什么S7-200 SMART Modbus库的错误码在MBUS_MSG的Error管脚输出。调试时通过在线监控watch窗口看这个值是最快的手段。我整理了本项目中反复遇到的几个错误码的含义和排查方向错误码含义可能的排查方向0无错误正常完成1从站响应校验错误通讯线路干扰、波特率不一致、屏蔽层接地不良2未请求得到的响应从站地址冲突、多台设备站号重复3从站无响应超时站号错误、Pr.549不是Modbus、接线错误4从站地址错误请求帧地址和从站站号不匹配5CRC校验错误线路干扰、通讯速率过高、阻抗不匹配6从站忙变频器正处于参数写入保护状态、或响应延迟过长其中错误码3出现频率最高。第一次调试时1号站通讯正常2号站怎么都连不上报错就是3。后来排查发现那台变频器Pr.117站号设成了和1号站相同的1两台都叫1号主站自然不知道叫谁了。改完站号之后通讯立刻恢复正常。5.2 一次“时通时断”故障的完整排查链路还有一个印象深刻的案例所有参数都设对了站号也不冲突但通讯总是运行十几分钟就报错。现场观察发现报错的变频器集中在产线后半段而且报错码是5CRC错误。这个现象很典型CRC校验不过关基本就是信号在传输过程中被干扰或者发生了衰减。排查链路我当时是这样走的第一步检查通讯电缆和动力线是否分开走桥架。结果发现有一段约5米的通讯线正好和两条变频器输出动力线捆在同一根桥架里。变频器输出侧是PWM斩波波形高频干扰很强直接耦合到旁边的通讯线上CRC校验自然过不了。第二步把这段通讯线从动力线桥架中拆出来单独穿管走线。第三步检查屏蔽层接地。这里有个容易踩的坑屏蔽层必须在PLC侧单端接地不能在变频器那端也接地否则两端接地会产生地环路电流反而把干扰引进来。三步做完之后通讯连续跑了几天错误码始终为0。5.3 调试阶段的专用小工具和技巧现场调试时我习惯在PLC程序里预留一个“通讯诊断”功能块。具体做法是在数据区里用两个字分别累计总请求次数和失败次数再用一个数组记录最近10次错误的错误码和时间戳。上线跑一段时间之后直接看统计数据比守着在线监控看瞬时值要高效得多。另外S7-200 SMART软件里的状态图表可以用来强制修改V区的目标频率数组和启动命令数组。调试时我先把某台变频器的启动命令强制为1再看频率变量有没有按照预期写入这样一台一台地验证比一次性接入16台然后瞎猜问题出在哪要靠谱。等每台都单点验证通过了再把所有从站的轮询全部打开做整体联调。6. 工程化扩展监控界面、参数备份与后续升级方案6.1 把V区数据接到触摸屏和上位机这套系统做完之后整个PLC的数据基础已经相当干净了。16台变频器的目标频率、启动命令、反馈频率、反馈电流、状态字、错误代码全部按数组形式放在V区。这些数据接触摸屏是非常自然的动作——在触摸屏组态软件里建一个变量表和PLC端建立连接把每个V区地址映射过来即可。在服务器或操作员站做上位机监控时更推荐用Modbus TCP方式通过PROFINET和S7-200 SMART的编程口软件走以太网或者接一个支持Modbus TCP转RTU的网关。S7-200 SMART本体自带以太网口这意味着触摸屏和上位机都可以直接通过以太网连接PLC不需要再买额外的通讯模块。这样做的结果是操作台上的触屏负责日常启停和参数微调中控室的上位机可以同步看到全部16台变频器的运行趋势并能记录历史数据。6.2 参数备份与程序防丢的工程习惯多从站项目里16台变频器的参数设置是真正的隐性资产。谁也不想变频器坏了一台换新后要重新对着表格手工输入几十个参数。E740支持通过面板上的参数复制功能把参数拷贝出来但我建议更稳的做法是在PLC侧预留一个参数读写通道将来可以通过Modbus报文把Pr.117、Pr.118这类参数批量读出来存入PLC数据块再导出成文件存档。这样做还有个好处如果PLC程序被误改了至少变频器侧参数可以通过上位机一键下发恢复不用一台一台拿面板按。6.3 从这套系统往上扩展的几条思路这套结构天然具备扩展性。加一台变频器只需要把任务表扩大给新设备分配一个未被使用的站号存货量数据的V区数组相应加长即可。如果哪天现场设备超过32台S7-200 SMART单口带负载能力吃紧可以考虑加RS485中继器把总线分成两段。如果现场对通讯速率或者同步性有了更高要求也可以把这个架构平移升级到S7-1200加以太网网关的形态。我个人做这类项目的习惯是开工之前在Excel里先把任务表排一遍把站号、寄存器地址、读写类型、缓冲区分配都列好再动手写梯形图。这个习惯帮我规避了至少一半的通讯程序低级bug。最后再分享一个实用小技巧所有MBUS_MSG请求用的数据缓冲区程序里统一按偶数地址对齐安排宁可浪费一两个字节也不要在这个地方节省因为这种坑一旦踩了排查起来真的很耗时间。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →