信捷XD PLC通过MODBUS-RTU控制三菱E700变频器的通讯方案

发布时间:2026/10/21 19:30:06
信捷XD PLC通过MODBUS-RTU控制三菱E700变频器的通讯方案
1. 项目背景与方案选型1.1 一台PLC拖3台变频器要解决什么问题接了个设备改造的活现场要一台信捷XD系列PLC同时控制3台三菱E700变频器每台变频器带一台交流电机。用户要求不复杂但很明确在触摸屏上单独启停每一台变频器、分别给定目标频率还要能实时看到每台的运行状态、输出电流和故障信息。停机时最好能通过程序自动切断对应变频器避免误动作。这个需求单独看哪一台都不难难就难在“同时”和“独立”上。3台变频器如果各用各的控制方式盘柜里要堆三套按钮、三个电位器操作台上一大堆线既不美观也容易接错。更关键的是现场要求的是远程集中控制人站在触摸屏前就能管所有设备。所以提前想清楚控制架构比直接写程序重要得多。我最初的方案其实是模拟量控制用PLC的AO模块给每台变频器送0-10V电压做频率给定启停走硬接点输出。但算了一下成本3路模拟量输出模块加上屏蔽电缆价格不算低而且模拟量信号在变频器柜这种电磁环境里要额外做滤波和屏蔽调试起来也不省心。后来我直接把方案换成了RS485通讯一台XD本体一根屏蔽双绞线把3台E700全部串起来既省了模块钱又让控制精度和抗干扰能力都上了一个台阶。1.2 为什么选MODBUS-RTU而不是模拟量选型之前我对比过几条路模拟量端子给定、RS485 Modbus-RTU、加专用通讯卡走总线。最后定下来用Modbus-RTU理由很简单三菱E700本身就带RS485接口不需要加任何通讯扩展卡Modbus-RTU协议开放、报文结构简单信捷XD的编程指令里直接就支持MODBUS主站连自由协议都不用自己拼帧。3台从站、每台几十个字的数据量9600波特率完全够用轮询周期在毫秒级现场完全感觉不到延迟。模拟量方案最大的问题在于“量”的多。3台变频器频率各不相同如果用模拟量至少需要3路AO通道加上匹配的屏蔽电缆投成本是一回事调试时信号漂移、零点校准、长线压降这些问题一个都躲不掉。而MODBUS一个字就把频率给定写过去了分辨率还能做到0.01Hz这个精度模拟量很难稳定做到。再加上触摸屏组态的时候直接把目标频率写到PLC寄存器里PLC再通过通讯写到变频器整个过程是数字化传输不存在“电压被干扰了导致转速波动”这种问题。另外RS485通讯还有个隐性好处后续想加第4台、第5台变频器不需要再加扩展模块往总线上一挂站号一变PLC程序里复制一段轮询逻辑就行。我这次虽然只有3台但做项目习惯性会留一点余量免得以后甲方一句话又要改柜子。1.3 硬件清单与RS485接线硬件其实非常简单我用的是信捷XD系列的本体PLC自带COM口选COM2作为RS485通讯口。这里有个细节不同型号的XD本体自带串口数量和类型不一样有的自带RS232有的带RS485如果型号上没带够得加一个XD-BD扩展板。我这次用的本体刚好有RS485口省了扩展板。3台三菱E700都是标准机型变频器侧的控制端子排上直接引出RS485信号不同批次端子的标注位置略有差异有的在PU接口有的在控制端子区接之前一定要翻一下随机手册确认信号名然后用屏蔽双绞线把所有设备并联起来。接线有个原则A接A、B接B所有从站并联千万不要手贱把A/B接反。一台接反轻则这台从站通讯超时重则整个总线通讯都不正常。总线两端各接一个120Ω终端电阻我用的是普通直插电阻直接拧在端子排上简单实用。屏蔽层我采用单端接地接在PLC侧的地排上避免形成地环路。由于变频器输出侧是强电动力线485线在柜内走线时要尽量避开动力线如果实在避不开就交叉走线不要平行长距离贴在一起。调试的时候我额外准备了一个USB转RS485的转换器先用串口调试助手跟变频器单聊这一条在后面现场调试部分会详细展开。先把这个工具备好能省掉联调阶段一大半的排查时间。2. 三菱E700从站参数配置2.1 通讯参数Pr.117~Pr.124怎么设和PLC这边是主站、变频器那边是从站的思路对应E700要进入MODBUS从站状态需要把一组通讯参数设对。这组参数分布在Pr.117到Pr.124不看手册很容易漏漏一个就可能导致通讯时好时坏。我这次用的参数组合是9600bps、8位数据位、1位停止位、无校验也就是常说的9600 8N1。3台E700的站号分别设成1、2、3互不重复。具体到参数号上Pr.117设站号三台分别设1、2、3Pr.118设波特率选96表示9600bpsPr.119设停止位和数据位设0代表8位数据加1位停止位Pr.120设校验方式设0表示无校验Pr.121是通讯重试次数我设1通讯瞬时干扰时能自动重试而不是立刻报错Pr.122是通讯校验时间设1秒左右这个参数决定通讯中断后多久报通讯故障别设太长否则断线了触摸屏还傻等Pr.123是等待时间设0Pr.124是CR/LF选择设0。这里要特别提醒一下Pr.119和Pr.120是配套的数据位、停止位、校验方式必须和PLC侧D8124里设置的完全一致差一个bit通讯都建立不起来。我之前做过一次项目PLC这边默认偶校验变频器那边默认无校验结果所有从站全部超时查了半天才发现是校验方式没对上。2.2 运行模式与通信权设置通讯参数设好了还要把变频器的“运行权”和“频率权”交给通讯。简单说E700默认启停信号来自面板按钮或外部端子频率信号来自旋钮或模拟量端子如果PLC光把频率写进去变频器也不会转因为它的运行指令还没被“遥控”。要让PLC通过MODBUS完全控制E700得把Pr.79运行模式切到网络运行模式。不同批次E700的参数选项编号略有差异我现场用的版本里Pr.79设为10就是纯网络运行模式面板上操作模式会显示NET此时面板的RUN键就不能直接启停了启停和频率都只能通过RS485通讯来控制。也可以用Pr.7911区别在于Pr.7911还允许面板急停参与如果工艺要求现场能随时拍急停建议用11。改Pr.79之前还有一道保险要打开Pr.77参数写入选择。这个参数默认是0很多参数在运行中是锁死的直接改会显示错误提示。要把Pr.77设成1或2允许参数写入否则Pr.79根本改不进去。现场经常有人在这里卡住我后来学乖了每次给E700设参数先抬手就把Pr.77设成2省得后面改一个参数报一次错。2.3 变频器侧容易踩的3个坑第一站号重复。三台变频器如果出厂默认都是站号0直接并联到总线上主站发一条指令三台从站都可能响应总线立刻乱套。所以上电之前务必确认三台Pr.117分别设为1、2、3不要图省事只改其中两台。第二Pr.79改完之后没有生效。有一些固件版本里Pr.79改了之后不会立刻切到网络模式需要变频器断电重启或者手动操作面板切换一下运行模式。现场判断方法很简单看面板上当前显示的是PU、EXT还是NET只有显示NET的时候通讯启停才真正生效。第三复位问题。E700出厂默认Pr.78是0也就是允许正反转。如果工艺上电机不能反转一定要把Pr.78设为1锁定反转这个保护优先级很高不然程序里一旦误写入反转指令电机直接反转设备可能损坏这是安全问题不是通讯问题宁可多设一步也别漏。3. 信捷XD主站程序框架3.1 COM口与D8124通讯格式变频器这边准备好之后回到PLC侧。信捷XD的RS485通讯口如果选的是COM2那通讯格式寄存器就是D8124。用MOV指令把通讯格式值写进去这个值决定了波特率、数据位、校验方式等参数。我这次PLC侧用的格式值是H0C081对应9600bps、8位数据、1位停止位、无校验正好和变频器那边Pr.118~Pr.120的设置对应上。如果用的是COM1对应寄存器是D8120COM3对应的是D8128不同型号的XD串口号和特殊寄存器对应关系不完全一样写程序前一定要对着硬件手册确认别想当然套用。通讯格式寄存器在程序初始化时写一次就够了可以放在首次扫描的段里用MOV指令一次性赋值后面正常运行中不要反复写。如果运行中被触摸屏或误操作改了通讯会瞬间断掉这个坑我踩过一次。另外信捷XD的编程软件里还需要把COM2的功能设置为“MODBUS主站”或“MODBUS RTU主站”不能默认设成“编程口”或“自由协议”。这一步是在系统配置里选的不是单纯程序里的MOV指令。选错协议下面所有MODRD/MODWR指令都不会正常工作。3.2 MODRD/MODWR指令怎么用信捷XD系列支持专用的MODBUS主站指令最常用的就是MODRD和MODWR。MODRD负责读从站数据基本格式是站号、功能码、寄存器起始地址、读取个数、存放读取结果的寄存器首地址。MODWR负责写从站数据基本格式是站号、寄存器地址、写入数据的来源寄存器。下面我给一段参考写法; 读1号从站功能码03读保持寄存器从寄存器0开始连续读4个寄存器存入D130开始的数据区 MODRD K1 H03 K0 K4 D130 ; 写1号从站寄存器地址1频率设定数据来源为D120 MODWR K1 H0001 D120这里必须强调信捷XD不同版本、不同子系列指令的操作数顺序和个数可能会有细微区别。我上面写的是我这次项目固件里实际使用的写法如果你拿到手的型号手册上格式不一样以手册为准。这个“对版本”的动作看着小实际影响很大操作数填错位置程序不会报错但通讯数据会全乱。还有一个关键点MODRD和MODWR是脉冲执行指令条件从OFF变ON时才执行一次不是常ON扫描执行。如果条件一直为ON这个指令会被反复触发相当于不断往总线上发帧三个从站一起来总线立刻拥堵后面全是超时。所以在轮询程序里一定要把触发条件设计成受控的脉冲信号。3.3 三站轮询状态机的设计思路RS485是半双工总线同一时刻只能有一个主站在发数据从站只能被动应答。而MODBUS一主多从的架构里主站必须一个一个地问这就是轮询。三台E700不可能同时读到数据只能按规矩排队。我的做法是单独用一个寄存器D200作为轮询计数器D200等于0时处理1号站等于1时处理2号站等于2时处理3号站。每次只对当前站做一次“写控制命令读运行数据”的组合操作等这次操作的完成标志到达后再把D200加1越界就回到0形成循环。这里建议用“完成标志驱动计数器加1”的方式而不是用定时器硬切。原因很简单定时器切轮询不管当前帧有没有完成到点就切下一个站这样如果某个从站掉线了后续指令还是照样发总线上的异常帧会一直堆积反而让问题更严重。用完成标志驱动的话每个站读完再切逻辑上更符合总线时序。但只靠完成标志也不行万一某个从站死掉了一直不回应完成标志永远不来轮询就会卡死在这个站不动。所以要加一个超时定时器当前站指令发出后启动一个定时器比如500ms如果在定时器到达之前完成标志还没来就判定这个站通讯超时强制把D200切到下一个站同时把该站的故障次数加1。这个超时保护是整套程序里最容易忽略但最重要的部分。3.4 数据区规划与触摸屏对接轮询框架搭好之后还要把数据区规划清晰。我习惯给每台变频器分配独立的数据块含义固定后面编触摸屏画面和排查问题都省事。以本项目为例1号站的目标频率放在D0启停命令放在D12号站的目标频率放在D10启停命令放在D113号站的目标频率放在D20启停命令放在D21。每个站在程序里分别读出运行状态字、输出频率、输出电流、故障代码分别存到各自的只读寄存器区域比如1号站读出的数据放在D130-D1332号站放在D140-D1433号站放在D150-D153。触摸屏上要显示什么直接绑定这些只读寄存器就行要修改目标频率和启停状态直接写D0/D1这些写寄存器。有一点必须提醒触摸屏和PLC之间如果有通讯触摸屏侧的寄存器类型要跟PLC这边一致。比如目标频率我定义成无符号整型单位是0.01Hz触摸屏的输入框如果直接用“数值输入”控件就要配套设置显示小数两位否则屏上显示40.00PLC里看到的是4000对不上就会出大问题。4. 寄存器映射与数据换算4.1 E700的MODBUS寄存器地址表接触过三菱E700的人都知道它作为MODBUS从站时内部的运行指令、频率设定、状态监视等数据都映射到不同的寄存器地址。这个地址表在E700使用说明书的“Modbus RTU通信”章节里一定能找到但现场翻手册比较麻烦我先把我实际验证过的常用地址列在下面供参考。寄存器地址功能说明读/写数据格式0x0000运行指令写0停止1正转2反转0x0001频率设定写单位0.01Hz50.00Hz对应50000x0006运行状态读bit0正转中bit1反转中0x0008输出频率读单位0.01Hz需除以1000x0009输出电流读单位0.1A需除以100x000C故障代码读十六进制异常编号这个表是我在项目现场用串口调试助手逐条验证过的但我仍然要强调E700不同固件批次、不同销售地区的版本寄存器映射可能会有一点点差异。最稳妥的做法是拿到变频器后先用串口调试工具读一遍确认地址和数据类型再写PLC程序。不要拿着网上随便找的地址表直接开工寄存器地址一旦搞错程序表面上通信正常读回来的数据却全是乱码。4.2 频率、电流数据的单位换算E700的频率设定是以0.01Hz为单位的也就是说要给变频器设40.00HzMODBUS写入的数值应该是4000而不是40。这个换算关系在调试时特别容易翻车触摸屏上输入40.00如果PLC里直接把40写到频率设定寄存器变频器实际只会收到0.40Hz电机转都转不起来还以为是通讯坏了。读取输出频率也是一样从0x0008读到的数值是频率值乘以100的结果如果读回数值是5000实际频率是50.00Hz。在PLC里做除法就行用DIV指令把读到的数据除以100商送整数部分余数送小数部分再到触摸屏上显示。电流的换算稍微不同0x0009读到的数值单位是0.1A也就是读回数值需要除以10。如果现场电流有80A读回来可能是800显示时除以10就是80.0A需要设置一位小数。这里有一个细节值得注意MODBUS寄存器是16位的有符号和无符号会对数据范围产生影响。E700的频率设定寄存器按有符号数理解最大值32767对应327.67Hz对E700来说完全够用。但读回来的电流值如果电机电流比较大可能超过3276.7A吗一般不会但如果你接的是大功率变频器还是要看一眼数据范围防止溢出变成负数。4.3 启停控制字的两种用法E700的运行指令寄存器0x0000写入0是停止写入1是正转写入2是反转。这是纯通讯启停的用法。我这次项目采用的就是这种方式触摸屏上的“启动”“停止”按钮通过PLC把对应数值写到这个寄存器里变频器就会执行启停动作。优点是不需要另外拉启停控制线控制逻辑全部集中在PLC程序里方便做各种联锁保护。也有一种更稳妥的混合用法启停信号用PLC的硬接点输出接到变频器的STF/STR端子而频率给定仍然走MODBUS通讯。这个方式的优点在于即使通讯出问题现场还能靠硬接点直接控制启停安全性更高特别适合不允许通讯故障导致误动作的工况。但注意用这种方案时Pr.79的运行模式不能设为纯网络模式要设成外部运行模式否则变频器不接受端子启停信号。两种方案没有绝对好坏看你的工艺需求。这次项目甲方明确要“触摸屏上软启停”所以我选了纯通讯启停联锁逻辑做得更细一些。5. 完整程序段实现5.1 上电初始化段前面讲了思路和参数这一节给一段接近实际可用的程序参考。梯形图我就不画了用指令表的方式表达逻辑信捷XD的编程软件可以直接按指令表输入思路是完全一致的。; 上电首次扫描时初始化 LD 首次扫描标志 ; 不同系列标志位不一样按实际使用 MOV H0C081, D8124 ; COM2通讯格式9600 8N1 MOV K0, D200 ; 轮询计数器清零 MOV K0, D210 ; 通讯故障总次数清零 RST M500 ; 通讯忙标志复位 RST M510 ; 轮询允许标志复位 SET M520 ; 通讯功能允许首次扫描标志在信捷XD里对应哪个特殊继电器不同型号略有差别用的时候最好看看软件里的系统标志说明。初始化段只是把关键寄存器定好基准值防止PLC上电后数据是随机值导致乱动作。5.2 写启动命令与频率给定每一台变频器的控制逻辑其实是同一套只是数据块不同。以1号站为例触摸屏把目标频率写到D0把启停命令写到D1PLC轮询到1号站时就把这两个数据分别写到变频器的频率设定寄存器和运行指令寄存器。; 当轮询计数器为0且通讯允许时进入1号站写控制段 LD D200, K0 AND M520 MOV D0, D120 ; 准备1号站频率数据 MODWR K1 H0001 D120 ; 向1号站写频率设定寄存器数据来自D120 MOV D1, D121 ; 准备1号站启停数据 MODWR K1 H0000 D121 ; 向1号站写运行指令寄存器数据来自D121这里有一个容易犯的错MODWR指令如果条件一直是ON它会反复执行。我上面用LD D200 K0作为触发条件但轮询过程中D200变成0以后如果这个段一直被扫描MODWR仍会被重复触发。所以实际项目里我在每个站的触发条件前都加了一个轮询脉冲保证只有状态切换的瞬间执行一次写操作。5.3 轮询读取运行状态与输出数据写控制之后紧接着就要读取运行状态、输出频率、电流和故障代码。以1号站为例读回的4个数据分别存放在D130-D133中。; 读1号从站从寄存器地址6开始连续读4个寄存器 LD D200, K0 MODRD K1 H03 K0006 K4 D130 ; 指令完成后把完成标志存入相应状态区 LD M8029 ; 通讯指令完成标志 SET M501 ; 1号站通讯完成标志读回来的D130对应运行状态D131对应输出频率D132对应输出电流D133对应故障代码。PLC程序里再用DIV指令把D131除以100得到实际频率把D132除以10得到实际电流放到显示寄存器里供触摸屏读取。三台站的读取逻辑完全一样只是站号、寄存器地址起始位置和数据存放区不同。5.4 通讯故障计数与自恢复轮询不能光顾着读还要处理掉线的情况。我的程序里给每一站都加了一个超时定时器指令发出后启动定时如果500ms到了完成标志还没来就判定该站超时故障次数加1并把轮询计数器强行切换到下一站。如果某个站连续超过3次超时就置位对应的通讯故障报警位同时停止向该站发送控制命令防止越绷越乱。; 1号站超时处理段 LD D200, K0 ; 当前轮询到1号站 AND T0 ; 500ms超时定时器到点 ANDNOT M501 ; 且没有收到完成标志 INC D210 ; 故障计数加1 MOV K0, T0 ; 定时器复位 MOV K1, D200 ; 强制切换到下一个站定时器复位和轮询计数切换放到同一段确保每次超时处理都不会漏。这个自恢复逻辑加上之后即使有一台变频器断电或者通讯线松了其余两台还能正常轮询不会整个系统瘫痪。实际现场调试时“一台掉线拖死全总线”是最常见的故障加了超时保护之后系统稳定性直接提升一个档次。6. 现场调试实录与问题排查6.1 先用串口调试助手打通从站我调试这种PLC加变频器通讯的项目有一个固定套路先不让PLC上场直接用USB转RS485连接电脑用串口调试助手先跟每一台E700单聊。把所有从站的物理链路和参数都验证通过之后再回到PLC写程序。这个习惯帮我省掉了太多联调时间。具体做法是把USB转RS485的A和B分别并到485总线的A和B上串口调试助手设置9600 8N1打开串口手动发送一条MODBUS写频率指令帧。比如把1号站的频率设定寄存器写入5000对应50.00Hz发送的报文是01 06 00 01 13 88 CRC。如果1号站返回了同样的报文说明1号站的物理链路、波特率、校验方式全部正常。然后逐个把站号改成02、03确认3台都能应答。这里有一个必须注意的点用串口调试助手测试时PLC一定要处于停止运行状态或者暂时把PLC的485线断开。不然调试助手和PLC同时在总线上发数据就是两个主站打架所有从站都会乱掉。调试助手验证完全部正常之后再恢复PLC的连接开始调试PLC程序。6.2 常见故障速查表我把这个项目调试过程中遇到过的、以及身边同行经常问的问题整理成了一张速查表现场遇到对应现象直接按表排查效率高很多。故障现象可能原因排查与处理办法3台变频器全部超时PLC与总线没接通/通讯格式不一致检查A/B接线、D8124通讯格式值和变频器Pr.118-Pr.120是否一致只有1台超时该台站号错误或接线松动单独检查该站Pr.117站号看485端子是否拧紧能读回数据但写入无效参数写保护未开/运行模式不对检查Pr.77是否设为1或2Pr.79是否切到NET模式读回频率/电流数值异常寄存器地址不对或单位换算错误核对E700寄存器映射表检查PLC程序里的除以100/除以10逻辑PLC程序运行后触摸屏频繁报警轮询卡死/指令反复触发检查超时定时器有没有加排查MODRD/MODWR的触发条件是否一直为ON通讯时好时坏、偶发超时干扰/终端电阻/屏蔽层接地问题总线远离动力线检查终端电阻屏蔽层单点接地这张表里的排查顺序很重要我踩过的坑是一看到通讯不正常就去改程序、改参数结果最后发现是485线A/B接反了。建议所有通讯问题都按“物理链路、参数配置、程序逻辑”的顺序排查不要跳步。6.3 我在现场总结的避坑清单第一带电不插拔485线。RS485接口芯片特别怕热插拔尤其是变频器柜里电磁环境复杂带电拔线很容易把通讯口烧掉。我见过不止一次调试完事急着改线没断电就拔插头结果通讯口直接报废。改线之前必须断电这个真不是小题大做。第二485屏蔽层只能一端接地。我的习惯是接在PLC侧的地排上如果电缆两端都接地会形成地环路干扰反而更严重。变频器输出侧的高频谐波电流会通过地环路耦合进通讯信号造成莫名其妙的误码。第三3站地址模板复制后必须逐个检查站号。写程序的时候三台站的控制逻辑高度相似复制粘贴很方便但也是最容易出问题的地方。我有一次把1号站的MODRD指令复制给2号站忘了把站号K1改成K2结果PLC一直在读1号站2号站的数据区永远没更新。这种错误非常隐蔽因为通讯指令本身不报错读出来的数据还是“正常”的只是来源错了。第四Pr.77参数写入保护一定要先放开。每次给E700写参数之前先把Pr.77设为允许写入不然改Pr.79或者调加减速时间时会报错提示白白浪费时间。这个参数不会自己跳回但有些固件会在运行中自动禁止写入还是养成习惯好。第五触摸屏上显示频率和电流时一定要把单位换算想清楚。触摸屏可以直接做显示格式转换也可以把PLC传来的整数值直接显示但两边必须统一。我这次在触摸屏上频率显示绑定的是PLC换算后的实际频率寄存器启停按钮绑定的是写寄存器D0/D10/D20数据类型都是无符号整数组态时不要选错不然数据翻来翻去非常乱。写在最后这套信捷XD加三菱E700的MODBUS-RTU通讯方案我后来又照着做过几个类似项目最快的记录是半天打通全线三天完成触摸屏联调。个人最大的体会是串口类通讯不怕程序复杂最怕物理链路和地址映射没想明白就急着开写梯形图。先用串口调试助手把每个从站都验证到位再在PLC里搭轮询状态机至少能省掉一半的联调时间。如果你以后接到5台、8台E700的项目思路完全一样把轮询计数器做宽一点数据块按站号做下标程序可以很方便地扩展。唯一要多留意的就是轮询周期从站多了之后总线负载会上升如果发现读完一圈的时间变长就把波特率从9600提到19200基本都能缓解。通讯程序这东西框架对了一切都好说框架错了后面全是补丁。