干这行十几年,PLC和变频器之间的通讯总是一个绕不开的核心需求。把西门子S7-200SMART和三菱变频器拉通控制,这是很多设备改造、电控柜集成项目里最常见的组合,说它是工控界的"标配搭配"一点也不夸张。这个项目要解决的问题很具体:用S7-200SMART作为Modbus主站,通过RS485总线实时控制三菱变频器的启停、读写频率、监控运行状态,整套方案不光要能跑通,还要稳、要扛得住现场环境的干扰。
这篇文章我直接把整套方案的思路、硬件接线、变频器参数设置、PLC程序框架、调试排错全程捋一遍,涉及的关键点都附上为什么这么做的解释和实操中踩过的坑。适合正在做同类项目的电气工程师、设备调试人员,也适合刚入门想搞懂PLC和变频器通讯原理的同行,照着走一遍基本就能把项目落地。
1. 项目整体设计与通讯方案选型
1.1 为什么用通讯控制而不是模拟量控制
很多工程师一提到变频器控制,第一反应还是模拟量:PLC输出0~10V电压或者4~20mA电流信号,接到变频器的模拟量输入端子上,通过电压或电流大小控制频率。这套方案有个致命短板——它只是单向的。PLC能发指令给变频器,但变频器当前的实际频率、输出电流、故障状态,PLC一概不知。想监控这些数据,就得额外接模拟量输入模块,信号线越拉越多,接线和排查故障的成本也水涨船高。
而且模拟量信号在工业现场特别容易被干扰。动力电缆和信号线走在一起,变频器一启动,输出电流大,谐波严重,模拟量信号只要屏蔽做得不好,频率设定值就会跳来跳去,设备转速忽高忽低,这种场面我相信不少人都经历过。
通讯方案就不一样了。RS485是差分信号,抗干扰能力强得多,而且只需要一对双绞线,就能把PLC和变频器串起来。更重要的是,通讯是双向的,PLC既能下发运行指令、写入目标频率,又能实时读取变频器的输出频率、电流、母线电压、故障代码。一套线解决所有问题,从根上规避了模拟量方案的物理接线复杂度和干扰问题。
1.2 选定Modbus RTU协议的底气在哪
通讯协议的选型是这个项目的核心决策。为什么最终锁定Modbus RTU,而不是走Profibus-DP或者别的什么协议?原因非常实际:
第一,西门子S7-200SMART自带Modbus RTU主站指令库,不用加任何额外通讯模块,一个本体上的RS485口就够用了,硬件成本基本为零。
第二,三菱新一代变频器,比如FR-E700、FR-D700系列,出厂就带RS485接口,默认就支持Modbus RTU协议,不需要加装通讯选件卡,两个设备先天就是一对。
第三,Modbus RTU是工控界最通用的协议之一,结构简单,报文帧就是地址码、功能码、数据区、CRC校验这几段,调试工具遍地都是,后期维护时随便找个串口助手或者Modbus调试软件就能排查问题,不用依赖某个厂商的专用软件。
Protocol的开放性带来的好处是,同一个PLC以后想再去控制别的品牌的变频器、智能电表、温控仪表,只要对方支持Modbus RTU,程序框架几乎不用动,只是地址和参数映射不一样而已。这种可迁移性,对于经常做多种设备集成的工程师来说,价值非常大。
2. 硬件准备与通讯接线细节
2.1 硬件清单
这个项目用到的硬件并不复杂,列一个清单出来给大家参考:
- PLC:西门子S7-200SMART,型号上用CPU SR30或者ST30都可以,本体自带一个RS485口(Port 0),选型时注意一下是继电器输出还是晶体管输出,不影响通讯方案本身。
- 变频器:三菱FR-E700系列或者FR-D700系列,这两款是市面应用量最大的通用变频器,RS485端子是标配。
- 通讯线缆:屏蔽双绞线,规格用RVSP 2×0.5mm²或者2×1.0mm²都行,建议不要用普通的平行线。
- 终端电阻:120Ω左右,作用是在总线上消除信号反射。
- D型9针插头:用来接S7-200SMART一侧的RS485口。
- 编程调试工具:安装了STEP 7-MicroWIN SMART的电脑一台,外加一个USB转RS485的调试器,用于现场报文抓取。
2.2 S7-200SMART一侧的RS485口
S7-200SMART本体上有两个通讯口,Port 0是RS485口,外观是一个DB9公头。引脚定义大家要记清楚:3号引脚是信号B(对应RS485的B线),8号引脚是信号A(对应RS485的A线)。很多人在这一步出错,因为不同厂家对A/B的标识和定义有差异,一不小心就把A、B接反了。接反之后的现象很有迷惑性:通讯偶尔通、偶尔断,或者干脆一直超时。所以接线前先把引脚定义核对清楚。
DB9插头焊线的时候注意,只需要用到3脚和8脚,其他引脚不用接。我见过有人把5脚(公共地)也接上了,在某些场合可能没问题,但三菱变频器和PLC的RS485口电气隔离情况不一样,乱接公共地反而容易形成地环路,引入干扰。稳妥的做法是只接A和B两根线。
2.3 三菱变频器一侧的接线
三菱变频器的PU接口是一个RJ45样式或者端子排样式的RS485接口,具体看型号。以FR-E700系列为例,PU接口在面板下方,对应端子分别是RDA和RDB,在接口旁边能看到丝印标识。RDA就是A线位置,RDB就是B线位置。
接线对应关系是:PLC的8脚A线接变频器的RDA,PLC的3脚B线接变频器的RDB。这个接法是标准的"正接正、负接负"。
还有一个端子是SD,它是变频器数字信号的公共端,在Modbus通讯里,SD要不要接一直有争议。我的经验是:如果PLC和变频器距离不远,且供电来自同一个三相电源系统,SD可以不接;如果距离超过10米,或者现场有较强的共模干扰,建议把SD和PLC侧的公共地(不是RS485的A/B)接在一起,给通讯信号提供一个稳定的参考电位,能明显减少异常数据。
2.4 屏蔽、终端电阻与布线
通讯线必须用屏蔽双绞线,屏蔽层要单端接地,也就是说屏蔽层只在其中一端(通常是PLC柜内)接地,另一端悬空。两端都接地的话,屏蔽层会形成地环路,在大电流设备频繁启停的现场反而会引入干扰。这个细节非常重要,我见过不少通讯不稳定的案例,最后查来查去就是屏蔽层两端接地的问题。
终端电阻原则上是在RS485总线的最远两端各并接一个120Ω电阻。实际操作中,如果这套系统只有一台PLC和一台变频器,短距离(10米以内)通讯时,不加终端电阻也能正常工作;但如果距离拉长到30米以上,或者现场干扰严重,就必须在两端接上终端电阻。把电阻加在PLC侧时,直接并在A和B之间就行;加在变频器侧时,并在RDA和RDB之间。
布线方面,通讯线要尽量避开变频器的输入输出动力线,不能和动力电缆走同一个线槽,平行间距至少保持20厘米以上,交叉布线时要垂直交叉。变频器本身是一个强干扰源,它的输出侧IGBT高频开关动作会辐射大量谐波,通讯线离得越近,出问题的概率越大。很多现场通讯一天到晚丢包,最后把线重新敷设一遍就好了,这种教训太常见了。
3. 三菱变频器通讯参数设置
3.1 运行模式与初始化
三菱变频器要进入通讯控制状态,第一个要改的参数是Pr.79。这个参数控制变频器的运行模式:
- Pr.79 = 0:PU/外部切换模式,上电默认是外部模式,可以用面板按钮切换。
- Pr.79 = 1:PU运行模式,此时所有控制指令只能来自操作面板或者RS485通讯,外部端子STF/STR失效。
- Pr.79 = 2:外部运行模式,强制端子控制,这种模式会禁用RS485的运行指令,只能通过通讯写频率,但启停要靠端子。
如果你打算完全通过PLC来控制启停和频率,Pr.79设成1是最省心的。要注意的是,有些案例里变频器原有的程序是端子控制,改造时只改了通讯参数但没改Pr.79,结果通讯写频率正常,按下启动却一点反应都没有,报错都没有一个。这种隐蔽问题,排查起来很费时间。
新拿到的变频器,我建议先做一次参数初始化。把Pr.CL参数恢复出厂设置(Pr.CL=1然后按面板的WRITE键确认),然后再逐个设置通讯参数。原因很简单:二手设备或者以前调过参数的设备,里面可能残留一些特殊参数,比如某些输入端子被重新分配了功能、加减速时间被设得特别离谱,这些都会成为调试期的绊脚石。从干净状态开始调,思路能清爽很多。
3.2 通讯协议相关的参数组
三菱变频器和Modbus RTU相关的核心参数集中在Pr.117到Pr.124,逐个说明:
| 参数号 | 功能 | 实验设置值 | 设置说明 |
|---|---|---|---|
| Pr.117 | 站号 | 1 | 总线上的设备编号,PLC通过它区分设备。取值范围0~247,注意同一个总线上不能重复 |
| Pr.118 | 通讯速率 | 19200 | 单位bps。和PLC侧MBUS_CTRL指令里设置的Baud必须完全一致 |
| Pr.119 | 数据停止位长 | 1 | 8位数据位、1位停止位的组合,Pr.119填1表示停止位1位 |
| Pr.120 | 奇偶校验 | 2 | 2表示偶校验,0表示无校验。必须和PLC侧Parity参数一致 |
| Pr.121 | 通讯重试次数 | 1 | 通讯异常时自动重试的次数,设成1或2比较合理,设成0的话异常直接报警停机 |
| Pr.122 | 通讯校验时间间隔 | 9999 | 9999表示不检测通讯断线,如果设成一个具体秒数,通讯中断超过该时间就报警 |
| Pr.123 | 等待时间 | 9999 | 9999表示无等待,即变频器收到请求后立即响应。只有当主站要求时才有必要设等待 |
| Pr.124 | CR/LF选择 | 1 | 1表示有CR LF,0表示无。三菱默认有的场景更多,要和PLC侧的报文格式对应好 |
这里面最容易踩坑的就是Pr.118和Pr.120。有些工程师变频器侧忘了改波特率,默认9600,PLC侧设了19200,结果PLC发指令变频器根本不理;还有些是PLC侧设了偶校验,变频器侧设了无校验,报文CRC对不上,通讯就一直在超时状态。这两组参数必须做到PLC侧和变频器侧完全一致,属于"一根绳上的蚂蚱"。
Pr.122这个参数值得一提。如果你把它设成具体秒数,意味着通讯一旦中断,变频器会在一段时间后自动报警停机,这在一些需要"安全失速"的场景下很有用,可以防止通讯断了之后设备还在以失控的方式继续运行。但反过来,如果你正在调试阶段,程序还没调稳,Pr.122设得比较小的话,通讯抖动也会触发报警,干扰调试节奏。所以初期调试建议Pr.122=9999,程序稳定后再根据工艺需求决定要不要启用断线监测。
3.3 频率源相关参数
频率设定来源也要检查一下。三菱变频器的频率来源由Pr.73决定。Pr.73=0是模拟量端子输入频率,Pr.73=1是面板频率,通讯控制时要确保频率来源不是被模拟量端子占用。具体来说,如果你已经设置了Pr.79=1(PU运行模式),频率来源天然就是面板/通讯通道,此时模拟量端子输入的频率信号是无效的,不用担心冲突。但如果你用的是Pr.79=0的切换模式,那就要留意当前激活的模式使用哪个频率源。
我的建议是:这套方案里直接用Pr.79=1硬锁定RS485控制,简单粗暴,不容易出逻辑上的问题。等以后项目成熟了,再考虑用Pr.79=0去搞外部/通讯双通道切换,实现PLC和面板手动操作的冗余控制。
4. PLC通讯程序框架与核心解析
4.1 西门子Modbus RTU指令库的使用
S7-200SMART的编程软件里内置了Modbus RTU主站指令库,一共有两条核心指令:MBUS_CTRL和MBUS_MSG。
MBUS_CTRL用于初始化主站通讯参数,每个扫描周期都要用SM0.0(常ON)去调用。它的参数含义:
- Mode = 1:启用Modbus协议,Mode=0是禁用。
- Baud:波特率,和变频器Pr.118保持一致,填9600或19200。
- Parity:校验方式,0是无校验,1是奇校验,2是偶校验,这里和变频器Pr.120匹配。
- Timeout:主站等待从站响应的时间,单位毫秒,填1000比较稳妥,太短容易误判通讯故障,太长影响轮询效率。
- Done:初始化完成后该位为ON。
- Error:初始化异常代码,在程序里关联一个报警输出。
MBUS_MSG用于执行一次具体的读写操作,调用条件是一个上升沿触发(每轮询只触发一次)。它的参数:
- First:脉冲输入。因为是上升沿触发,所以通常在Mode位、单次标志位配合下使用。
- Slave:从站站号,对应变频器Pr.117,这里填1。
- RW:0是读操作,1是写操作。
- Addr:Modbus寄存器地址,规则是40001对应变频器参数地址0。
- Count:读写的寄存器数量,最多可以读120个字。
- DataPtr:指向PLC内部V存储区的首地址,读回来的数据放到这里,写的数据也从这里取。
很多人第一次用MBUS_MSG都会困惑:为什么First必须用脉冲触发?原因在于MBUS_MSG执行的是异步通讯任务,如果同一个占位一直被持续使能,后面新的读写请求根本排不上队。用脉冲触发的方式,确保每条指令在特定的时刻只发起一次,完成后再启动下一条。
4.2 三菱变频器的Modbus地址映射
三菱变频器的Modbus寄存器地址是它内部参数地址直接映射过来的。常用地址如下:
| 寄存器地址 | 功能说明 | 读写属性 |
|---|---|---|
| 40001 | 控制指令:写入0002正转、0001反转、0000停止 | 写 |
| 40002 | 频率设定:单位0.01Hz,写入5000表示50.00Hz | 写 |
| 40007 | 运行状态监控:可以读取当前频率、电流等数据 | 读 |
| 40009 | 输出电流等(具体寄存器位规则要配合变频器手册看) | 读 |
| 40010 | 输出电压等状态信息 | 读 |
这里有一个关键点:Modbus协议里的寄存器地址指的是"协议地址",40001是线圈/寄存器区的偏移地址,而PLC的MBUS_MSG指令里的Addr参数填的就是这个40001格式的地址,比如Addr=40001,表示向变频器的第一个保持寄存器内部地址0写入数据。不需要额外加偏移,直接按手册上的地址填写即可。
控制指令的数值不要搞反了,三菱的规则是:0001H是反转,0002H是正转,0000H是停止。有些国产变频器正好相反,0001是正转、0002是反转,转用的时候一不留神就把设备转向搞反了。第一次调试的时候,先不要接负载,空转确认转向后再投入实际生产。
频率设定值要乘以100。比如要设定50.00Hz,PLC程序里就要算出来5000这个数值,通过Modbus写入40002。如果设定值带了小数点,比如45.5Hz,那就是4550。这个换算逻辑一定要在PLC程序里明确处理,避免直接把整数Hz值写过去造成频率偏差10倍、100倍的"神奇"现象。
4.3 轮询程序框架设计
在实际项目中,一个PLC往往不只是控制一台变频器,可能是3台、5台甚至更多。Modbus RTU主站是半双工轮询机制,同一时刻只能发起一个读写请求,所以程序框架必须处理好"排队"问题。
我的做法是采用一个简单的状态机轮询。把整个通讯任务拆成多个MBUS_MSG步骤,每个步骤完成之后用Done位产生一次脉冲,触发下一个步骤。伪代码逻辑如下:
- 第1步:写运行指令到40001(控制变频器启停)。
- 第2步:写频率设定到40002(控制目标频率)。
- 第3步:读40007(读取当前运行频率)。
- 第4步:读40009(读取输出电流)。
- 全部完成后返回第1步,循环执行。
每一轮通讯轮询周期大概在150ms~300ms之间。这样的速度对于大多数工艺控制来说完全够用,而且能够保证总线上不会同时出现多个请求,避免数据冲突。
S7-200SMART程序里可以用SM0.5(0.5秒脉冲)或者定时器来产生轮询切换信号,也可以用一个递增的索引值结合比较指令来选择当前执行哪个MBUS_MSG。我在实际项目里常用的方式是:定义M区的几个标志位来表示当前步骤,每步完成后触发第一步,这样逻辑最直观,现场排查问题也方便。
4.4 频率给定与启停控制的程序实现
PLC内部要做哪些运算?以频率控制为例:
- 触摸屏或者上位机给一个目标频率值,单位是Hz,比如45.5。
- PLC把这个值乘以100,转换成4500。
- 用整数运算指令把4500传给V区发送缓冲区的首地址。
- 调用MBUS_MSG,执行写操作,Addr=40002,Count=1,DataPtr指向上面的缓冲区地址。
启停逻辑要做一个互锁保护。触摸屏上"正转"按钮按下,PLC输出M0.0,程序里写40001地址的操作数为0002;"反转"按下,M0.1置位,写0001;如果两个按钮同时按下,或者急停信号有效,必须优先强制写入停止指令0000。这个逻辑直接关系到设备安全,是程序里必须覆盖的边界情况。
还有一个实操细节:DataPtr指向的数据缓冲区,如果是写入操作,PLC需要先把数据按"高字节在前、低字节在后"的方式放到V区。Modbus RTU协议在寄存器传输时是大端模式,也就是高8位先发,低8位后发。如果程序里直接把一个16位整数存入VW地址,CPU会自动按大端排列,没有特殊问题。但如果从别的设备或者触摸屏变量区直接搬到缓冲区,就要注意字节序的问题,否则会看到频率值对不上、花屏一样的数据。
4.5 多台变频器的扩展思路
如果现场不止一台变频器,程序框架基本不变,只需要把轮询的步骤数增加,并把每台的站号改掉(变频器Pr.117分别设1、2、3),MBUS_MSG里的Slave参数分别填对应的站号即可。
这里有一个很实用的建议:每一台变频器的数据区域,在PLC的V区里划分成独立的区块。比如VW200存1号变频器的设定频率,VW210存2号变频器,以此类推。这样程序结构清楚,触摸屏上面做配方、显示、手动调试都非常方便。避免把不同设备的数据乱插到同一片缓冲区里,那是给自己埋雷。
轮询顺序上,建议优先保证"启停控制"和"频率写入"这两个关键指令的执行频率,读取状态数据可以排在后面。因为Modbus是轮询,如果先把读状态排满,写指令被延后几十毫秒,操作人员会觉得按钮响应"顿了一下",体验很不好。
5. 调试步骤与现场问题排查
5.1 第一步:用工具验证通讯链路
搞通讯调试,切忌上来就编程序、直接怼PLC程序刷进去看动作。正确做法是先验证底层链路是否通。
先把变频器的通讯参数按第3节设置好,PLC程序里只保留MBUS_CTRL初始化,然后打开串口调试软件(比如Modbus Poll或CommMonitor),用USB转RS485接到变频器的通讯线上,模拟Modbus主站发一帧报文,比如写入频率5000到40002,看变频器面板频率是否跟着变成50.00Hz。
如果这个环节通了,说明变频器侧的协议参数没有问题,接线也没有问题,后面PLC程序只要参数一致,通讯就是水到渠成的事。如果这里都不通,先检查站号、波特率、校验方式,再检查A/B是不是接反了、屏蔽层有没有处理好。链路通了再往上走,不要跳步。
5.2 第二步:PLC单指令测试
通讯链路验证通过后,编写一个最简化的PLC测试程序:一个常开按钮触发一条MBUS_MSG写指令,比如按下按钮给变频器写入正转指令。下载到PLC之后,按下按钮,观察变频器是否启动。
这个阶段如果需要抓PLC发出的报文,可以把USB转RS485调试器并联在PLC和变频器的通讯线上(RS485总线支持并联),串口工具设为监听模式。这样做既不干扰正常通讯,又可以看到PLC发出的具体报文。读报文的重点是看CRC校验码是否正确、寄存器地址是否填对。
5.3 第三步:整个轮询程序联调
单指令没问题后,再把完整的轮询框架刷进去。观察点有几个:
- 变频器面板上显示的运行频率是否和PLC设定的目标频率一致。
- 触摸屏上显示的电流、电压数据是否有规律地刷新。
- 连续运行半小时以上,观察是否有偶发超时或通讯中断。
如果一切正常,就可以进行带载测试了。注意,带载测试时,先低速运行(比如10Hz)验证转向和机械动作,再逐步升速。直接满频率带载空转测试,一旦转向错误,机械冲击会非常大,这种错误代价太高。
5.4 常见问题排查表
整理一个我在现场反复用到的排查表,遇到问题照着筛一遍,大部分都能解决:
| 故障现象 | 可能原因 | 排查方法 |
|---|---|---|
| 通讯完全不通,PLC报错超时 | A/B接反;站号不对;波特率或校验不一致 | 万用表测A/B电压差,核对所有参数 |
| 能写频率,但启动无反应 | Pr.79运行模式不对;控制指令数值错误 | 确认Pr.79=1,写0002验证正转 |
| 偶发通讯超时,重启后恢复 | 通讯线离动力线太近;屏蔽层接地不良;波特率过高 | 重新走线,单端接地,降低到9600试试 |
| 读取数据跳变、乱码 | 数据字节序不对;CRC校验错 | 抓报文核对数据格式,检查PLC缓冲区地址是否存在重叠 |
| 频率写入值面板显示不对 | 频率单位换算错误;Pr.73频率来源被占用 | 检查PLC侧是否乘以100,核对Pr.73值 |
| 触摸屏数据显示不及时 | 轮询周期太长;读步骤过多 | 优化轮询逻辑,读区合并成多寄存器连续读 |
| 断电重启后通讯失效 | 变频器参数未写入EEPROM;PLC程序丢失 | 参数设置完成后按面板WRITE键确认保存 |
还有一个容易被忽视的问题:S7-200SMART和变频器之间的通讯故障,可能就是"PLC程序里用了一个已经被其他指令占用的V区地址"。比如MBUS_MSG发送缓冲区用VW0,另一段程序也在写VW0,两边数据互相覆盖,通讯就会莫名其妙出错。查这种问题最快的方法是把程序里所有用到V区的地址列出来,看看有没有重叠。
6. 经验和避坑记录
这套S7-200SMART加三菱变频器的Modbus RTU通讯方案,我已经在不同项目里反复验证过很多次,稳定性是经得起考验的。但再成熟的方案也有几个深水坑,最后单独拎出来说一下。
第一个是关于屏蔽线敷设的态度问题。有的现场为了省事,直接把通讯线丢在动力电缆桥架里,用扎带跟变频器输出线捆在一起。短时间调试可能看不出来,但一到大功率设备重载启动,通讯立刻开始丢包、超时。别跟电磁干扰较劲,布线规范搞好了,后面会省非常多的事。我给的建议是:通讯线走独立线管或者独立线槽,哪怕距离远一点绕一下也不要跟动力线走同一个桥架。屏蔽层单端接地,这个习惯从一开始就养成。
第二个是关于参数保存的细节。三菱变频器的参数修改后,如果只是面板显示改好了,并代表已经永久保存。需要按一下面板的WRITE键,把参数写入EEPROM,否则变频器断电后再上电,参数会恢复成修改前的旧值。这个坑我踩过不止一次:调试时一切正常,客户第二天一早打电话说设备不对,跑到现场一看,参数全部归零。所以每次调完参数,务必逐页WRITE确认。
第三个是通讯断线后的设备安全逻辑。如果你的项目所在工艺对安全要求比较高,设备不能在没有通讯的状态下持续运行,那Pr.122这个参数不要设成9999,而是根据工艺要求设一个合理的断线报警时间,比如2秒。这样一旦通讯中断,变频器会在2秒后报警停机,防止设备"闷头跑"。这个设计在很多安全评审里都是加分项。对应地,PLC程序里也要做通讯心跳监测,比如长时间读取不到变频器状态,就立即触发急停或者声光报警。
第四个是小技巧:触摸屏不要直接和变频器通讯。有些项目图省事,让触摸屏直接通过串口或者网关跟变频器通讯,PLC插在中间反而显得多余。但这样做以后,PLC就失去了对变频器的"知情权",很多联动逻辑没办法做。比如设备需要根据变频器的实际运行频率做加减速补偿,或者需要记录电流曲线,这些数据如果只存在于触摸屏和变频器之间,PLC拿不到,程序就写不下去。让PLC作为通讯的唯一主站,触摸屏只和PLC通讯,所有数据都由PLC转发,这个架构虽然多了一层,但扩展性、故障隔离能力和安全性都好得多。
最后再分享一个小技巧:现场调试时,准备一个USB转RS485调试器真的非常有帮助。很多通讯问题,肉眼看不见、万用表量不出,但只要抓一次报文,立刻真相大白。是站号不对、还是地址错、还是CRC算错,报文里清清楚楚。与其对着参数面板冥思苦想,不如直接看原始数据。这是我调试所有Modbus项目的固定动作,也是效率最高的排障方式。