搞工控的兄弟应该都有同感PLC和变频器之间最容易上手、同时也最容易翻车的就是Modbus RTU串口通讯。省了模拟量模块的线、省了一堆屏蔽电缆一根双绞线就能把频率、电流、启停全部捞回来但调不通的时候也真能把人熬成熊猫。这次拿欧姆龙CP1H做主机、台达VFD-M做从机把整套Modbus RTU通讯从接线、参数、报文、程序到调试的完整流程捋一遍适合做水处理、风机水泵联动、单机自动化设备的朋友参考。这个方案解决的痛点很直接变频器如果全靠开关量端子启停和模拟量给定频率一是接线多、二是模拟量信号在变频器附近特别容易受干扰、三是多台变频器联动时现场得拉一大把线。换成通讯之后一根RS-485总线串联所有设备启停、频率、电流、故障状态全靠报文来回传递从电气设计到后期维护都轻松不少。下面直接进入正题。1. 项目怎么拆解先搞清楚PLC和变频器之间要传什么1.1 这套组合要解决的问题做项目之前先把需求列清楚不然程序写到一半会乱。CP1H作为主站要干的事有这几件给台达VFD-M发送频率给定值、发送启停命令、读取变频器当前的运行频率、读取输出电流、必要时读取输出电压和母线电压、处理通讯故障后的报警停机。归纳起来就是一类写命令、一类读命令没有其他花活。把需求拆细之后方案自然就出来了。VFD-M的Modbus寄存器地址并不复杂核心就两个方向往2000H写频率命令往2001H写运行命令从2100H附近读各种实时监视值。这里要提醒一句不同批次、不同固件版本的电控板寄存器定义可能有细微差别但主框架都是一样的。万一手头设备跟经典地址表对不上优先翻随机手册里的通讯章节一般在参数表附近能找到寄存器对应关系。另一个要提前定的事是通讯组网方式。一台PLC带一台变频器是最简单的点对点如果现场是三台、五台风机组网就用RS-485把变频器并联在总线上靠从站地址区分。这个方案天然支持多从站后面我会专门讲多台轮询的改法。前期设计时建议先把地址规划好1号机、2号机、3号机别到了现场临时改。1.2 硬件选型与接线思路硬件清单并不复杂核心是PLC本体、通讯选件板、变频器、通讯线缆。CP1H本体自带一个RS-232C口但这个口默认不是485电平现场如果要走RS-485组网一般要装CP1W-CIF11选件板插在CPU的选件板插槽上提供RS-422/RS-485接口。如果只是一台变频器、距离又近用本体RS-232C口加一个转接头也行但不推荐因为RS-232C的抗干扰能力和传输距离都弱不少工业现场还是老老实实上RS-485。台达VFD-M的通讯端子一般标着SG、SG-和CP1W-CIF11上的485正负对应连接。注意不同功率、不同批次的变频器端子布置不一样接线之前一定以机器面板丝印或手册端子图为准不要想当然觉得都在同一个位置。通讯线我习惯用0.5平方或更粗的屏蔽双绞线屏蔽层单端接地也就是只在PLC侧或者只在变频器侧接PE不要两头都接否则反而容易形成地环流。关于终端电阻很多朋友问要不要接。如果现场就只有PLC和一台变频器距离二三十米不接120欧姆终端电阻往往也能跑。距离超过五十米或者在电柜里跟动力线挤在一起建议在RS-485总线的物理两端各并一个120欧姆电阻。台达VFD-M的端子上没有内置跳线的话就外接PLC选件板一侧同样处理。加了终端电阻之后波形质量会明显改善表现为误码率下降。2. 接线和参数通信前最容易被忽略的一步2.1 现场接线细节与共地问题RS-485看起来只是两根线但真正出问题的时候多数故障都能归结到接线不规范。第一件要注意的是A/B或正/负的极性CP1W-CIF11的接线端子用485、485-标注比较多台达变频器的SG接485SG-接485-。这里有个坑是不同品牌的A/B定义并不完全统一有些设备把Data标成A有些标成B调试时如果通讯完全无响应第一反应就应该是调换这两根线试试。第二件容易被忽视的是参考地。RS-485是差分传输理论上不依赖地线但现场变频器、开关电源、电机对地之间的电位差会实实在在地影响通讯稳定性。我通常建议把两台设备的通讯端子M或COM、以及屏蔽层单端接在同一个接地排上让双方有一个共同的参考电位。特别是变频器功率较大的场合强电侧的共模噪声会通过分布电容灌到通讯线上不处理好的话通讯会表现为时好时坏、偶发误码。第三件是走线路径。通讯线不要跟电机电缆、变频器输出线捆在一起走同一根桥架至少要保持二十厘米以上的间距。动力线里的dU/dt干扰对RS-485来说非常致命。如果现场空间实在避不开就加屏蔽层并做好单端接地必要时套一段金属软管或穿铁管能起到一定的屏蔽作用。2.2 台达VFD-M侧的参数设置变频器侧的通讯参数设置是整个项目里最容易翻车的一步。VFD-M的通讯参数集中在Pr.88往后手头这台机器的常用设置是Pr.88设成从站地址比如1号机设1Pr.89设通讯波特率通常选9600Pr.90选通讯格式一般选RTU模式对应项。不同固件版本中Pr.90的选项编号不完全一样有的版本里0代表ASCII、1代表RTU 8N1、2代表RTU 8E1现场必须对照手册确认我在这里不敢给你死记硬背一个固定数字就是怕把老版本的选项和新版本的选项搞混。变频器除了通讯格式参数还有一个更关键的来源切换参数。要让PLC能通过2000H和2001H控制运行必须把主频率指令来源和运转指令来源都切到通讯控制。在VFD-M上一般对应Pr.00和Pr.01不同批次的命名或者编号可能略有差异但逻辑一样运行指令来源要选RS-485通讯频率指令来源也要选RS-485通讯。设置完之后面板的手动启动按钮和外部端子启动就都不起作用了只能靠通讯帧控制。这是现场很多人忘记设置、导致写入频率失败的根本原因。还有几个跟故障保护有关的参数也值得一并确认比如通讯超时检测时间、通讯故障时的动作方式。我认为现场最好把通讯故障处理设为停机并报警而不是无限继续运行。Modbus通讯一旦中断变频器没有收到新的频率给定按安全原则应该停下来免得现场在无人发现的情况下继续按旧频率运转这在风机、水泵类负载上尤其重要。2.3 CP1H侧的通讯口设置CP1H这边要在CX-Programmer的PLC设置里做两件事把串口选件板的通信协议设成无协议再把波特率、数据格式改成和变频器完全一致。波特率两边都选9600数据格式如果变频器选的是RTU 8E1PLC这边就选8位数据、偶校验、1个停止位。这里不要凭感觉PLC设置里帧格式那一栏通常有一串类似1-8-E-1的选项选完要和变频器面板显示的通讯参数逐项核对过去。还有一个坑是改完串口设置之后很多人直接在软件里点在线传输PLC设置然后发现通讯没变化。这是因为CP1H的串口参数并不是下载完立刻生效的要把PLC断电重启一次才会真正应用。我刚开始做这个项目时也在这里耗了半天后来习惯是先下设置、断电、重新上电、再去监控程序顺序搞对了就顺了。这个细节很多手册藏在不起眼的注释里不实际踩一次很容易忽略。另外在无协议模式下TXD和RXD指令负责收发数据。CP1H每个串口都有对应的握手标志区内置RS-232C口和选件板端口的标志地址不一样。在我的程序里发送前会检查发送就绪位接收完成后靠接收完成标志去触发数据处理。具体是A640区还是A641区的哪一位跟端口编号相关程序设计时建议打开编程软件里的符号表确认别按网上抄来的位号硬套。3. 报文与CRCModbus RTU的本质就这些3.1 一条完整报文的结构Modbus RTU报文长得非常规矩结构是从站地址1个字节、功能码1个字节、数据区N个字节、CRC校验2个字节。整条报文以字节流形式连续发出字节之间不允许有超过1.5个字符时间的空闲否则从站可能会认为帧结束了。CP1H用TXD指令发送时实际上是把D区里连续的字逐个发出去字与字之间基本不存在这种长间隔所以一般不用担心。功能码就三类常用的。读变频器数据用03H读取保持寄存器比如读输出频率、电流写单个寄存器用06H比如把频率给定值写到2000H、把运行命令写到2001H如果一次要连续写多个寄存器可以用10H。台达VFD-M的日常控制用03H和06H就够了我用下来没遇到必须用10H的场景。看一个读输出频率的例子地址1号、功能码03H、寄存器地址2100H、读取数量0001H再追加两个字节CRC校验就是一条完整的读请求帧。变频器收到后返回的帧结构是从站地址、功能码、字节计数、数据字节、CRC。返回的功能码和请求的一致说明正常响应如果返回的功能码最高位置1比如03H变成83H说明变频器报错了后面还会跟一个错误码这个后面调试部分专门讲。3.2 台达VFD-M的寄存器地址对应关系台账VFD-M的寄存器地址是按功能划分的。写方向最关键的两个2000H是频率给定寄存器单位一般是0.01Hz比如要给30Hz就填3000也就是0x0BB82001H是运行命令寄存器通过不同的位组合实现正转、反转、停止、故障复位具体哪一位对应哪个动作要看这台机器固件对应的通信手册。我用过的好几个版本定义大同小异无外乎是bit0正转、bit1反转、bit2停止、bit3复位这类布局但别的版本未必完全相同写命令前一定要对着手册确认。读方向常用地址从2100H开始。2100H一般对应输出频率监视值2101H对应输出电流监视值往后还会排输出电压、直流母线电压、输出功率、累计运行时间等信息。监视值的单位换算也得看清楚频率是0.01Hz还是0.1Hz电流是0.1A还是0.01A差一个量级读出来就是天壤之别。这里没有捷径拿到新设备先去面板上看一下实际数值再和通讯读回来的值作对比一次就能把换算关系锁死。我把常用的几个寄存器整理成了一张表方便直接抄。寄存器地址含义方向数据说明2000H频率给定写常用单位0.01Hz2001H运行命令写控制字按位定义2100H输出频率监视读注意0.01Hz或0.1Hz2101H输出电流监视读注意0.1A或0.01A2102H输出电压监视读一般0.1V2103H直流母线电压读一般0.1V2104H输出功率读一般0.1kW地址虽然看着简单但现场还容易踩一个十六进制的坑。寄存器地址2100H传进报文时要先发高字节21再发低字节00这和CRC的低字节在前不是一回事不要混。很多新手把CRC的低字节在前习惯带到寄存器地址里结果报文地址错位从站直接回非法地址错误码。3.3 CRC16校验的两种实现方式CRC校验是Modbus RTU最容易写错的地方也是通讯稳定性最关键的环节。标准算法是把所有字节按序处理初始值0xFFFF每来一个字节先跟CRC低字节异或再按位右移如果移出的位是1就跟多项式0xA001异或重复8次最终CRC的低字节先发送、高字节后发送。实现方式我推荐两种。第一种是查表法把256个CRC表项固化在PLC的D区处理一个字节时查一次表速度快、梯形图好写第二种是直接用ST在功能块里循环计算代码量短、逻辑直观。我在CP1H上习惯用ST功能块封装CRC计算程序结构更清爽大概就是这么个思路(* 伪代码实际功能块需按项目封装输入输出 *) crc : 16#FFFF; FOR i : 0 TO len - 1 DO crc : crc XOR data[i]; FOR j : 0 TO 7 DO IF (crc AND 16#0001) 0 THEN crc : (crc / 2) XOR 16#A001; ELSE crc : crc / 2; END_IF; END_FOR; END_FOR; (* 发送时先发CRC低字节再发CRC高字节 *)要注意的是无论查表还是按位循环最终字节序都是低字节在前。比如算出来CRC是8E36H报文字节里要先发8E再发36。这个顺序调反了从站收到后校验必然失败但协议本身又不会回错误帧表现出来就是发送端看着一切正常、接收端毫无反应排查起来非常隐蔽。3.4 用串口助手先空转验证报文PLC程序还没写的时候我建议先拿电脑串口助手把报文验证一遍。用USB转485模块接上变频器软件里设好同样的串口参数手动发送读频率帧比如给1号机发01 03 21 00 00 01 加CRC。如果变频器回了一串有规律的数据说明接线、参数、寄存器地址全部正确接下来写PLC程序就只是把同样的报文用TXD发出去而已。这个办法能在一个环节里把绝大多数前期问题过滤掉。如果串口助手里发的报文完全没回问题一定出在物理层或参数层根本不用去碰PLC程序。如果回了错误码比如01 83 02说明功能码能通但寄存器地址不对去核对地址表。等串口助手调通了再回头写PLC心态完全不一样因为你知道通讯链路本身没问题后面所有工作都是水到渠成。4. CP1H通讯程序实战从读状态到写控制4.1 程序整体状态机设计CP1H的无协议通讯程序我强烈建议用状态机来组织而不是每个扫描周期无脑发报文。道理很简单Modbus是主从问答式主机发一帧、从机回一帧如果PLC这边只管发不管收报文和响应一旦错位整个链路就乱套了。状态机把通讯过程分成空闲、等待响应、超时处理、解析数据几个阶段每个时刻只做一件事逻辑清晰排查也方便。我的程序里用一个字变量做状态寄存器0代表空闲1代表等待从站响应2代表超时或错误。周期定时器比如200毫秒触发一次只要状态是空闲就发下一帧发完立刻把状态置1同时启动一个500毫秒的超时定时器。收到完整响应并校验通过后状态回到0等待下一个周期触发。这个节奏对台达VFD-M来说非常从容变频器处理能力完全跟得上也不会频繁打扰总线。超时处理要做重试和故障计数。我习惯连续三次无响应才判定通讯故障因为工业现场偶尔丢一帧是很正常的由于一个偶发干扰就停机反而容易误动作。但故障一旦确认建议在HMI上报警同时把变频器命令字里的停止位置位让设备安全停下来。这个逻辑放到状态机里就几行但确实现场运行时不至于被偶发丢帧坑得天天跳闸。4.2 读运行频率和输出电流的实现细节读频率的逻辑本质上就是把一条固定的读请求帧塞进发送缓冲区然后等回复。以1号变频器为例D区里先放4个字0103、2100、0001再加两个字节CRC。TXD发送时一次性把这4个字发出去变频器返回的帧长度一般也就是8到12个字节RXD把收到的数据搬进接收缓冲区再做CRC校验和地址核对。收到响应之后关键是解析数据。返回帧里从站地址和功能码各占一字节后面是字节计数再往后才是真正的数据。比如读频率返回的字节计数值是02说明后面跟两个字节把这两个字节拼成一个字再按0.01Hz或0.1Hz的单位换算成实际频率存到给HMI或者PID用的数据区。我在程序里会单独做一个解析子程序把地址、功能码、数据长度、数据值拆开放到不同的字里方便多个寄存器共用一套解析逻辑。有一个细节容易出问题RXD接收不一定每一次都把完整响应帧收齐。Modbus是流式传输PLC可能在变频器还没发完最后一字节时就被接收标志触发导致缓冲区里只有半帧。我处理这个问题的办法是加一个接收长度计数和结束字节判断或者直接把接收完成到一个固定时间窗口后再去解析。CP1H的无协议接收从站数据时我建议确认返回帧的字节数是否符合预期不符合就丢弃等下一轮重新发请求。宁可丢一帧也别拿半截数据去算频率。4.3 写频率给定和启停命令写频率的报文是06H功能码帧结构为地址、06H、寄存器地址2000H、频率数据高字节、频率数据低字节、CRC。比如给定30Hz2000H写入数据就是0x0BB8对应十进制3000。注意频率数据在报文里的字节顺序是高位在前和CRC的低字节在前不一样别搞混。写频率给定时我一般在程序里先把目标频率乘以100再转十六进制摆进寄存器这样程序里不用处理小数。启停命令的编写更要注意时序。我的习惯是先把频率给定写进去延时几十毫秒再发运行命令让变频器有时间接收并应用频率值。直接同时发两条帧偶尔会出现频率值是零的悲剧尤其是从HMI修改目标频率后马上启动。这个先后顺序在现场实测下来很稳。停止时直接写2001H的停止位或者按手册写对应停止码。故障复位也用2001H写写完等变频器复位完成再重新给运行命令。关于运行命令字的细节我再啰嗦一次2001H的控制字不同固件版本定义有差异。我手头这台是bit0正转、bit1反转、bit2停止、bit3复位所以正转启机写0001H、反转写0002H、停止写0004H。但如果读者拿到的版本把停止定义成0000H那按我这个写法就停不下来。所以这个位置必须去看随机手册别盲目抄网上的码表。4.4 多台变频器轮询扩展思路如果现场不止一台变频器轮询逻辑需要在状态机里加一个从站号指针。先用一个字变量保存当前轮询到第几号机每次状态机回到空闲时切到下一台变频器的请求同时把D区里对应的发送缓冲区数据复制到发送区再执行TXD。两台之间的发送间隔至少留20到50毫秒给从站留出响应和总线释放时间别把总线塞得太满。我做过一个六台变频器的组网项目轮询周期是每一台200毫秒六台整体一轮下来1.2秒左右。对于风机水泵这类大惯性负载完全够用。如果有一台无响应不要卡在那里等直接跳下一台超时重试次数到了再报那台的单独故障。每一台的运行状态、当前频率、故障标志分别放在对应的D区这样程序虽然多台轮询但数据区井井有条。5. 调试实录那些容易踩的坑5.1 通讯完全不通的排查顺序通讯完全没反应时我有一套固定的排查顺序能快速把问题收敛。第一步是量线确认485两个端子没有接反同时用万用表量一下两边设备是否有正常的直流偏置电压一般能测到1到5伏左右的电压差都算正常。第二步是对参数把PLC设置的波特率、校验、停止位和变频器面板逐项核对一个标点都不能差。第三步是看报文用电脑串口助手直接挂在同一根总线上抓包。如果手动发请求帧有响应说明链路和从站都正常问题肯定在PLC发送或接收逻辑如果手发也没有响应问题在物理层或从站参数。这样一层层剥下去一般半小时内能找到根因。最忌讳的是上来就怀疑PLC坏了然后把程序改来改去浪费时间。5.2 数据偶发错乱与CRC校验通讯不是完全不通而是时不时读到乱码这种问题最先怀疑CRC校验。把收到的返回帧重新算一遍CRC和帧尾附带的CRC比对如果对不上说明中间某个字节被干扰数据不能采信。但CRC本身只负责发现错误不负责纠错所以程序里校验失败的处理就是丢弃这帧数据保持等待状态等下一轮轮询。现场实测下来偶尔丢一帧并不会影响控制系统稳定性关键是别把错的数据拿去做闭环控制。如果CRC频繁失败就得到物理层找原因。用示波器看A、B两线之间的波形是最直观的手段正常通信时应该能看到干净的差分方波。出现毛刺、过冲或者幅值过低基本能确定是接线、屏蔽或者终端电阻的问题而不是程序问题。很多人觉得通讯乱是PLC的问题但其实在变频器这种强干扰源旁边物理层才是最容易出问题的地方。5.3 关键参数设置陷阱汇总我把调试中遇到的典型问题整理成了一个速查表每次去现场都按这个思路快速定位。现象可能原因处理方法完全无响应485极性接反对调SG/SG-或485/485-完全无响应波特率、校验不一致双方参数逐项核对完全无响应从站地址设错确认Pr.88地址能读不能写频率来源未切到通讯修改Pr.00/Pr.01相关参数能读不能写运行中禁止写频率先停止再写给定偶发错乱干扰、屏蔽未接地检查屏蔽层、走线、终端电阻返回错误码寄存器地址填错核对地址高字节在前数据数值异常单位换算错误与面板显示值对比这里还有一个容易忽略的坑修改变频器控制来源相关参数时很多变频器要求先停机才能改运行中修改可能不生效甚至报错。所以现场改参数之前最好先把变频器停下来改了之后重新上电确认参数真的保存进去了。VFD-M这类机器面板上的参数可能有多级菜单改完没确认保存就断电等于白改。5.4 现场抗干扰处理通讯调试稳定之后还要做一次抗干扰检查。最典型的现象是变频器一启动、电机一加速通讯就开始漂这种基本是共模干扰和辐射干扰混在一起。处理手段有三板斧第一板斧是通讯线用屏蔽双绞线屏蔽层单端接地第二板斧是通讯线远离动力线不得不交叉时尽量垂直交叉第三板斧是在485总线两端加终端电阻必要的时候再加上下拉偏置电阻让空闲状态下A、B之间有一个稳定电平。还有一个小细节值得提一下变频器输出的PWM波形会在电机侧产生明显的漏电流这个电流会通过PE线回流如果通讯线屏蔽层恰好也在变频器侧接了地干扰就会顺着屏蔽层耦合进信号。所以屏蔽层到底在哪一端接地现场要试一下不一定手册说在哪就在哪。我个人的习惯是PLC侧接PE如果干扰还压不住再反过来试变频器侧接地以实测效果为准。这套通讯方案做完之后我把整个流程固化成了一个模板工程后面再碰到CP1H带变频器的案子改改地址和参数就能直接用省了不少重复劳动。最后说个体会Modbus RTU看起来简单但真正调试时不光要会写报文还要会量线、会抓波形、会跟变频器面板较劲。通讯这种东西九成问题是参数不一致剩下的是噪声和接线别一上来就怀疑PLC坏了。把这套思路理顺CP1H和台达VFD-M的通讯基本就是一次通电的事。