信捷XDH系列PLC和西门子V20变频器,一个国产小型PLC,一个德系经济型变频器,单独看都是各自圈子里很常见的设备,但要把它俩老老实实接到同一根RS485总线上干活,网上能一次性说清楚完整步骤的资料并不多。前阵子我做一套输送设备控制,XDH需要管两台V20的启停、调速、状态回读和故障复位,最后走的方案就是Modbus RTU通讯。这篇把功能实现、配件说明和参数设置按实际调试顺序完整记下来,给后面要碰这套组合的工程师当个参考样本。
先说明一下我这里的硬件基础:主站是信捷XDH系列PLC,从站是西门子V20变频器(固件版本较新,支持标准Modbus RTU),物理接口走RS485,通讯协议用Modbus RTU。整套系统已经连续运行了一段时间,中间踩过接线、参数、地址映射、干扰方面的坑,下面这些内容算是我把这些坑填平之后沉淀下来的东西。
1. 为什么非要用Modbus RTU把PLC和V20拉在一起
1.1 现场控制需求带来的选型压力
很多设备里,PLC控制变频器并不是什么新鲜事,但需求一旦多了,控制方式的选择就会直接影响工程量。比如我这套输送设备,要求变频器做到:
- 远程正转、反转、停止;
- 远程连续调速,而不是只有几个固定频率;
- 实时回读运行频率、电流;
- 能读取报警和故障代码;
- 两台变频器用同一种方式管理,方便以后扩展第三台、第四台。
如果只做启停,最简单的方案是一人给变频器两个端子接中间继电器,PLC输出点控制继电器,继电器触点接到V20的数字输入端子。但是这种方案调速没戏,最多用固定频率端子凑几段速,实际运行频率无法回读,故障信息也拿不到。
如果用模拟量,常见做法是PLC扩展模拟量模块,输出0~10V或4~20mA给V20的模拟量输入端子,同时再扩展一路模拟量输入把V20的模拟量输出接回来。这样调速和回读倒是能实现,但代价是模拟量模块成本上去了,接线多了一圈,而且模拟量信号在现场容易受干扰,调试时经常出现频率跳变。
最后我选了RS485加Modbus RTU。一根两芯屏蔽线,把启停、正反转、调速、状态回读、故障复位全包了。V20本体就带RS485通讯口,XDH本体自带RS485串口,硬件上几乎零额外成本,只在接线细节上下功夫就行。这是我最终放弃模拟量方案的最直接原因。
1.2 V20支持Modbus但不原生支持信捷,协议选择上其实没悬念
西门子V20变频器支持两种串行通讯协议:一种是西门子私有的USS协议,另一种是开放标准的Modbus RTU。如果上位主站是西门子自家的PLC,比如S7-200 SMART、S7-1200,用USS或者Modbus都有人做。但我的主站是信捷,信捷PLC里并没有封装好的USS协议库,USS帧格式还得自己拼,这显然不合理。Modbus RTU是工控行业通用语言,信捷XDH的通讯功能块原生支持,V20侧也原生支持,两者之间不需要任何协议转换器,属于“双方都会说普通话”。
所以这个标题里看起来有“采购选型”的意思,实际上协议的答案从选型那一刻就定了:主站信捷、从站西门子V20,走Modbus RTU是唯一一条最省事的路线。如果以后要把这套逻辑迁移到别的PLC上,只要对方支持Modbus RTU主站,几乎可以原样复用。
2. 动手前先备好这几样东西:配件清单与接线细节
2.1 这套通讯真正需要的配件清单
很多人以为PLC和变频器通讯只需要两根线,真上手才发现少了这个少了那个。我把实际安装中用到的配件列出来,按必要性排序:
| 序号 | 配件 | 用途 | 是否必须 |
|---|---|---|---|
| 1 | 屏蔽双绞线(2芯) | RS485信号传输 | 必须 |
| 2 | V20通讯连接插头 | 接V20面板下方的RJ45通讯母座 | 强烈建议 |
| 3 | 120Ω终端电阻 | RS485总线末端匹配 | 视距离而定 |
| 4 | USB转RS485调试线 | 电脑单独测试变频器从站响应 | 强烈建议 |
| 5 | 光隔离RS485中继/隔离模块 | 远距离、地电位差场合 | 视现场而定 |
V20变频器面板下方有一个RJ45形状的通讯母座,这个口就是RS485物理接口。注意,它长得像网口,但走的不是以太网电平,别拿普通网线往交换机或者电脑网口上插,插了也没用甚至可能损坏设备。V20原装通讯连接插头其实就是把RJ45里的引脚引到螺丝端子上,方便接裸线。网上也有第三方兼容插头,只要引脚一致就能用,我自己用的就是兼容件,稳定性和原装没有明显区别。
屏蔽双绞线建议选0.5~1.0mm²截面的两芯线,V20距离PLC通常不会太远,几十米内完全够用。之所以强调屏蔽,是因为变频器本身就是强干扰源,功率越大,运行时对通讯线的干扰越明显,普通平行线在这个场合耐不住。
2.2 V20侧端子与信捷XDH侧RS485端子的对应关系
V20通讯母座的引脚定义,我这边参考的是随机手册里的端子表,常见定义为:1脚24V,2脚0V,3脚RS485+(A),4脚RS485-(B),5脚屏蔽地。但这里必须提醒一句:不同批次或者不同固件版本的V20,引脚标注细节可能有差异,接线前一定先拿万用表通断档按手册核实,不要凭网上的公版图直接做线。尤其是A、B极性,网上有不少人把3脚和4脚标反,接反的结果就是通讯完全不通,但并不会烧设备。
信捷XDH侧,PLC上通常自带一个或两个串口,我做项目时用的是COM2,端子丝印上标注有RS485+和RS485-,分别对应A和B。接线时按如下规则对应:
- V20的3脚(RS485+)接XDH COM口的RS485+;
- V20的4脚(RS485-)接XDH COM口的RS485-;
- 屏蔽层在PLC侧或者机柜的PE端单端接地,不要两端都接,避免形成地环路。
如果现场只有一台PLC和一台变频器,距离又短,可以不接终端电阻。但如果线长超过30米,或者现场变频器功率大、干扰重,建议在RS485物理链路的两端各并联一只120Ω电阻。注意,终端电阻是并联在A、B之间的,不是串联,也不是每个设备都接,只在链路最远端和主站侧各接一个,全链路超过两个反而会加重总线负载。
2.3 接线时最容易忽略的三个细节
第一个细节是通讯线不能和电机动力线走同一个线槽。电机电缆在变频器输出侧是强干扰源,通讯线一旦和它平行走几十厘米,干扰就能让通讯帧直接报废。现场布线实在绕不开时,至少让通讯线垂直跨过动力线,不要长时间平行。
第二个细节是V20的RJ45母座不接BOP操作面板时,面板是可以拔走的。如果调试时需要面板点动试机,可以在试完机之后把P0700切到通讯模式再拔面板,或者干脆保留一个延长座。别把面板一直挂在通讯口上,面板本身会占住这个口,通讯线就没地方插了。
第三个细节是防反接。RS485虽然有A、B极性之分,但很多设备的端子标法并不统一,有的标A/B,有的标D+/D-,有的标485+/485-。我在现场遇到过一次V20侧和XDH侧各自都按丝印接好了,结果两头对不上,查了半天才发现是A、B定义恰好反了。碰到这种情况,把通讯A、B对调重插是排查通讯不通时最快的一步操作。
3. V20侧参数设置:把变频器配置成Modbus从站
3.1 先恢复默认环境,从专家模式开始
V20上电后,我习惯先做一次参数清理。如果这台变频器以前被别人调过,里面可能残留了旧项目参数,这些残留参数有时候会在你配置完通讯后“跳出来”捣乱。V20恢复出厂设置的常用做法是:把P0010设为30,屏幕上会提示恢复出厂相关的确认信息,确认后参数会回到默认状态。
恢复出厂完成之后,把P0003设为3,进入专家访问级别,因为通讯相关的不少参数在标准模式下看不到。我记得第一次做这套通讯的时候,就是因为P0003级别不够,找P2012协议选择参数找了好久。专家模式下,所有参数都能看到,后面设置起来会方便很多。
3.2 通讯相关的核心参数表
V20侧需要设置的参数就一张表,我按现场经验整理如下:
| 参数号 | 设置值 | 含义说明 |
|---|---|---|
| P0003 | 3 | 专家访问级别 |
| P0010 | 0 | 退出快速调试,进入运行准备状态 |
| P0700 | 5 | 命令源选择Modbus通讯(启停控制由通讯下发) |
| P1000 | 5 | 频率设定值源选择Modbus通讯 |
| P2000 | 50 | 参考频率,一般设成电机额定频率50Hz |
| P2010 | 6或7 | 波特率,6是9600,7是19200,必须和PLC一致 |
| P2011 | 1 | 从站地址,范围1~247,多台变频器时各站号唯一 |
| P2012 | 2 | 通讯协议选择为Modbus RTU |
| P2014 | 50 | 通讯超时时间,单位为10ms,50即500ms |
这里重点解释一下P0700和P1000。P0700是“命令源”,决定变频器的“启停命令从哪来”,默认是面板或者端子,设置成5之后,启停命令只认通讯帧里的控制字,面板按键和端子启停会被忽略。P1000是“频率设定值源”,决定“目标频率从哪来”,设置成5之后,面板电位器旋钮调速就不起作用了,频率完全由通讯下发的设定值决定。
注意,调试初期哪怕已经接好通讯线,我仍然建议先把P0700保持为原来的端子模式或者面板模式,先用面板点动确认电机方向、电机参数设置正确,再切到5。原因很简单:一旦切到通讯模式,面板按键就不能直接启停机了,万一电机参数设置有问题,现场又没有通讯调试工具,操作起来会非常被动。
P2014这个通讯超时参数容易被忽略,但对安全很关键。它代表从站多久没收到主站报文就判定通讯中断,并进入故障停车状态。设置太短,PLC扫描周期稍长就会出现误报警;设置太长,通讯断了可能转了半天才停下来。我这边设500ms,和PLC侧100ms的轮询周期配合下来,没有误报,断线后反应也够快。
3.3 变频器到底有没有变成“准备好”的从站
参数设置完成后,V20会自动保存。不放心的话可以把P0003调回标准模式,再上电断电一次,然后回到参数表里核对一遍P0700、P1000、P2011、P2012这几项,确认没被改回去。
到这里,V20作为Modbus从站已经就绪。但此时先不要急着写PLC程序,我强烈建议用电脑加一条USB转RS485线,先直接和V20通讯一把。这样做可以把“变频器侧是否正常”和“PLC程序是否正确”两个问题拆开排查,否则后面出了问题还要两头怀疑。
用任意串口调试助手,设置波特率9600或19200、8数据位、偶校验、1停止位,先发送一条最简单的读状态字报文,看V20是否回正常响应。如果电脑能读到数据,说明V20侧所有通讯参数和硬件接线都没问题,接下来可以放心去写PLC端。
4. 信捷XDH PLC侧配置:把串口变成Modbus主站
4.1 COM口协议设置:最容易翻车的一步
信捷XDH的串口默认不一定处于Modbus主站状态。我用的那台XDH,COM2需要在编程软件的系统设置里,把协议模式改成Modbus RTU主站,同时把串口参数设成和V20一致:波特率9600、8数据位、偶校验、1停止位、站号不需要设置因为主站本身作为请求发起方。
这一步容易被忽略的原因是,信捷PLC的同一个物理串口可以切换成多种协议模式,比如自由口、Modbus从站、X-NET,甚至某些型号还能做编程口使用。如果这里没切换成Modbus主站,程序里写再多通讯指令,报文也发不出去,或者发出去之后自己变成了从站等待别人来读。
另一个需要注意的点是串口参数里的校验位。V20默认的Modbus帧格式是8位数据、偶校验、1停止位,所以PLC侧通讯参数也要配对成偶校验。如果两侧校验不一致,报文物理上能发出去,但从站解析出来全是错帧,直接不回应。我建议在调试阶段先固定用9600波特率加偶校验,把链路跑通了再考虑升19200,这样排查范围更小。
4.2 功能码与读写功能块的选择
Modbus RTU通讯,本质上就是主站按功能码去读或者写从站的寄存器。信捷XDH编程软件里提供了现成的Modbus主站功能块,不需要自己拼CRC校验和组帧,只需要在功能块配置里填清楚:
- 从站站号:填1(和P2011一致);
- 功能码:读用03,写单个寄存器用06,写多个连续寄存器用16;
- 起始地址;
- 数据长度;
- 数据存储区。
实际使用中,读取状态字和实际频率这类数据,我习惯用03功能码一次连续读多个寄存器,比如从40102开始读3个字,一次把状态字、实际频率、电流全部拿回来。写控制字和写频率设定值时,因为40100和40101是连续的两个寄存器,可以用16功能码一次写2个字,也可以分两次用06功能码写。两种方式我都跑过,一次写多字报文数更少,但从站解析和执行上没有本质差别,按个人习惯选就行。
4.3 程序骨架:定时触发轮询,先读后写
XDH侧的程序逻辑,我的整体思路是这样:不要让Modbus功能块在每个扫描周期都执行,而是用一个定时器做节拍,比如每100ms触发一次通讯任务。通讯任务内部按顺序执行,读取完成后再执行写入,整个过程串起来。
我习惯把程序写成类似下面的结构:
// 每100ms定时脉冲触发一次通讯轮询 T100ms(定时器,100ms周期): 第一步:触发读请求 读:从站1,功能码03,起始地址40102,长度3 数据存入:D100(状态字),D102(实际频率),D104(电流) 第二步:等待读完成标志 如果读完成标志=1 且 错误码=0: 第三步:触发写请求 写:从站1,功能码16,起始地址40100,长度2 数据来源:D200(控制字),D201(频率设定值) 第四步:等待写完成标志 如果写完成标志=1: 清除通讯任务标志,等待下一个100ms脉冲这样做的核心目的是避免同一个扫描周期内既发读请求又发写请求。RS485是半双工总线,同一时刻只能有一个方向的数据传输,主站发完一帧,必须等从站回应完才能发下一帧。如果在同一个扫描周期连续发多条报文,第二帧发出去的时候,从站可能还没来得及回第一帧,通讯就直接卡死或者超时。
控制器人机交互也是同样的道理:你说完一句话,总要等对方回复,不能自己不停地说。
4.4 为什么轮询周期不建议太短
RS485波特率9600时,一帧数据大约几十个字节,传输时间在10ms级别,加上变频器内部的响应时间,一读一写一个循环,100ms是足够保守的周期。我实际测试过,把周期压到20ms也能跑,但一遇到现场干扰,偶尔就会出现通讯超时报警。后来我把周期放到100ms,连续跑了一个星期,再没有因为轮询频率出现过通讯中断。通讯稳定性的优先级,应该高于响应速度。
如果现场要求速度,可以把波特率提到19200,但我的建议是前提是先把干扰解决好,否则波特率越高,抗干扰能力反而越弱。
5. 功能码地址映射与控制字计算:功能实现的核心
5.1 V20常用的Modbus寄存器地址表
V20的Modbus数据区,通过功能码03可以读,通过06或16可以写,我实际使用中用得最多的寄存器地址如下:
| Modbus地址 | 内容 | 读写属性 | 说明 |
|---|---|---|---|
| 40100 | 控制字1 | 读写 | 控制启停、正反转、故障复位 |
| 40101 | 频率设定值 | 读写 | 0~16384对应0~100%参考频率 |
| 40102 | 状态字1 | 只读 | 反映变频器运行状态 |
| 40103 | 实际频率 | 只读 | 0~16384对应0~100%参考频率 |
| 40104 | 实际电流 | 只读 | 以实际电流对应值显示 |
| 40106 | 报警代码 | 只读 | 数据非零时表示有报警 |
| 40107 | 故障代码 | 只读 | 数据非零时表示有故障 |
这里我特意要说一句:以上地址是我在V20手册和现场实测后采用的PZD数据映射。不同固件版本或者不同调试工具下,地址可能有偏移,所以拿到一台新V20之后,第一件事就是用USB转RS485工具直接读一遍这些地址验证。能读回合理数据,再写PLC程序,避免程序写完了发现地址不对。
5.2 西家控制字怎么算出来
西门子变频器的控制字不是简单的“1=启动,0=停止”,它是一组16位的位组合,每一含义固定。V20继承的是西门子标准STW1控制字定义,我实际用到的位如下:
- 位0:ON/OFF1,1=接通,0=按斜坡减速停止;
- 位1:OFF2,0=自由停车,正常运行要置1;
- 位2:OFF3,0=快速停车,正常运行要置1;
- 位3:使能运行,1=允许运行;
- 位4:使能斜坡发生器,1=允许加减速;
- 位5:使能频率设定值,1=允许给定频率生效;
- 位7:故障确认,上升沿用于复位故障;
- 位10:由PLC控制,1=接受通讯控制;
- 位11:反转,1=反转,0=正转。
把这些位组合起来,正转启动的命令字就是0x047F。这个数值的由来很简单:先把OFF2、OFF3、使能运行、使能斜坡、使能频率设定都置1,位0也置1,PLC控制位置1,此时十六进制就是0x047F。
基于同样的逻辑,常用的命令字如下表:
| 命令 | 控制字 | 说明 |
|---|---|---|
| 正转启动 | 0x047F | 最常用的运行命令 |
| 反转启动 | 0x0C7F | 在0x047F基础上把位11置1 |
| 减速停止 | 0x047E | 位0清零,斜坡减速到零 |
| 故障复位 | 0x04FF | 位7置1,用于清除故障 |
| 自由停车 | 0x0000 | OFF2激活,电机自由滑行 |
这里必须提醒一个初学者常犯的错:停止不是直接把0写进控制字。写0x0000会给变频器一个OFF2自由停车信号,电机不是按斜坡减速,而是直接失去转矩自由停车,这在传送带、提升类设备上是非常危险的。正常停止应该写0x047E,也就是把位0从1变成0,让电机按设定斜坡减速停车。
故障复位也不一样:平时运行控制字是0x047F,故障发生后要复位,先写一次0x04FF,让故障确认位产生一个上升沿,然后再写回0x047E或0x047F。如果一直保持4FF,变频器不一定能正常进入运行状态,因为故障确认位是沿触发信号,不是电平保持信号。
5.3 频率设定值换算:16384这个数从哪来
V20的频率设定值寄存器,数值范围是0~16384,对应0~100%参考频率。16384就是0x4000,西门子的通讯设定值惯用十六进制满量程表示。参考频率由P2000决定,我设在50Hz,所以换算公式是:
设定值 = 目标频率 ÷ 50 × 16384
举例来说:
- 目标25Hz:25÷50×16384 = 8192;
- 目标10Hz:10÷50×16384 = 3276,实际约9.99Hz;
- 目标50Hz:直接写16384。
反过来,从变频器读回实际频率时,如果读到8192,换算成实际频率就是8192÷16384×50 = 25Hz。
我通常在HMI上让人输入实际频率值(比如输入25表示25Hz),PLC内部先把输入值乘以16384,再除以50,然后下发到40101寄存器。整数运算要注意溢出,25×16384结果在16位范围内,但如果目标频率到50Hz以上,乘法结果就会超16位,所以程序里我习惯用32位寄存器做中间计算,再截取低16位给通讯写操作。
另一个要点是:频率设定值寄存器不支持写负值。想要反转,不是给设定值写负数,而是通过控制字0x0C7F把位11反转位置1。这个逻辑和模拟量控制时“负电压反转”的思路不一样,初次接触的人容易卡在这里。
5.4 一整套启停调速逻辑的伪代码
把上面的控制字和频率换算组合起来,我在XDH里的控制逻辑大致是这样:
// 输入: // M0 = 正转启动按钮 // M1 = 停止按钮 // M2 = 反转按钮 // M3 = 故障复位按钮 // D10 = HMI上设定的目标频率(单位0.1Hz) // 频率换算 D201 := D10 * 16384 / 500; // 假设D10单位是0.1Hz,50Hz即为500 // 正转启动 IF M0 AND NOT M1 AND NOT M2 THEN D200 := 16#047F; END_IF // 反转启动 IF M2 AND NOT M0 AND NOT M1 THEN D200 := 16#0C7F; END_IF // 停止 IF M1 THEN D200 := 16#047E; END_IF // 故障复位 IF M3上升沿 THEN D200 := 16#04FF; // 延时200ms后再恢复为停止状态 END_IF实际调试时,启停按钮和正反转按钮之间必须做互锁。我见过一个现场,维护人员误操作同时按下正转和反转,两台设备之间出现硬怼。PLC程序里加互锁后,即使按钮都按着,逻辑上也只会执行其中一个命令,安全边界能兜住一层。
6. 调试中的常见坑和我的排查顺序
6.1 先分清是“没数据”还是“有数据但不会动”
调试遇到问题,第一件事不是改程序,而是定位问题在哪一层。我的排查顺序固定是:电脑直连变频器 → 确认从站正常 → 再查PLC → 最后查逻辑。
先用USB转RS485加串口调试助手,按刚才的寄存器表和参数表直接对V20发一条报文,比如向40100写0x047F。这个动作能隔离出两大类问题:
- 如果变频器有响应但电机不转,优先级最高的是检查P0700是否设为5,P1000是否设为5。P0700没切过来,命令源还是端子或者面板,通讯控制字写得再对也白搭。
- 如果变频器完全没有回应,那就往下查站号、波特率、校验位、A/B接线、协议P2012。这几个参数有一个不对,从站都不回帧。
我在现场碰到过有人把P2012设置成了USS,通讯帧发到V20,V20按USS解析,当然不回Modbus包。这种情况用电脑串口工具一测就能看出来,因为报文发出后完全静默。
6.2 PLC侧最容易犯的三个错
确认V20没问题之后,轮到PLC侧查,我最常遇到的三个问题如下。
第一个是XDH的COM口协议没有切换成Modbus主站,导致程序里的功能块根本没有被执行。这种情况程序下载进去,变频器端一点动静都没有。解决办法是把系统设置里的该COM口协议改成Modbus RTU主站,重新下载程序。
第二个是寄存器地址“多一位少一位”的偏移问题。Modbus协议里,PLC侧功能块里填的地址有时候是协议地址,有时候是PLC内部映射地址,填40100还是40001,不同品牌PLC的填写习惯可能不同。我遇到过一次,功能块里把地址填成了40001,以为这是控制字,结果写进去的是另一个参数,变频器行为完全异常。后来回到手册对照才确认,V20的控制字在40100。
第三个是控制字写不好。有些人调试时习惯先给控制字写0x0000试一下,结果电机自由停车,再想用0x047F启动的时候,变频器还停在OFF2状态,必须先把OFF2解除。这就要回到控制字的位定义去理解:0x0000并不等于“停机”,它等于“切断所有使能”,和正常停机完全不是一回事。
6.3 现场干扰类问题
通讯上线之后,还要面对一个更烦人的问题:变频器一运行,通讯就开始丢帧。V20如果长时间收不到报文,会按P2014设置的超时时间报通讯故障,现场表现就是“一转就报警停机”。
这类干扰问题的处理优先级,我按下面顺序做:
- 第一,把通讯线和动力线分开走,这是最有效也最容易做到的一步;
- 第二,屏蔽层单端接地,接在机柜PE排上;
- 第三,把波特率从19200降到9600;
- 第四,在RS485链路两端加120Ω终端电阻;
- 第五,最后才考虑加RS485隔离模块。
实际项目里,我遇到过最顽固的一次干扰,是变频器本身和PLC不在同一个接地系统里,地电位有差异,RS485接口上的共模电压过高。后来加了一个光隔离型RS485中继模块,把两侧电气完全隔开,问题才彻底消失。所以如果现场干扰怎么处理都不行,别死磕布线,考虑一下隔离供电和隔离通讯一起做。
6.4 参数保存与恢复出厂带来的教训
还有一点,V20如果被误操作恢复出厂设置,所有通讯参数会全部丢失,回不到通讯模式。我在调试中发生过一次,原本参数都设好了,后来发现电机参数不对,顺手做了恢复出厂,结果P0700、P1000、P2011全被清回默认,PLC端这边以为链路没问题,实际上变频器已经悄悄变成了面板控制模式,导致现场一通操作都没反应。
所以我强烈建议,参数调好之后,把下表和变频器侧现场面板核对一遍再收工:
| 检查项 | 确认值 |
|---|---|
| P0700 | 5 |
| P1000 | 5 |
| P2011 | 1 |
| P2012 | Modbus RTU |
| P2010 | 9600或19200 |
| P2000 | 50 |
7. 几个提高稳定性的细节与后续扩展思路
7.1 轮询节奏里加一点“死等”和“超时复位”
通讯功能块执行完成之后,我习惯把完成标志位利用起来,作为下一轮的允许条件。比如读请求完成后才开始写请求,写请求完成后才允许下一个100ms脉冲触发新一轮。这样可以保证每条报文都在总线上“一发一收”完整走完。
如果出现连续几次通讯错误,我还会加一个错误计数器,连续错误达到一定次数之后,把控制字复位成停止状态,并给HMI报“通讯故障”。这种兜底逻辑虽然简单,却能避免在通讯短暂异常时变频器继续运行,从安全角度来说值得做。
7.2 多台V20的扩展思路
一台PLC管多台V20,逻辑上就是主站循环给每个从站各做一轮读和写。V20的从站地址由P2011设置,1号设为1,2号设为2,3号设为3,PLC侧在最外层套一个“从站序号循环”,每一轮依次访问各站,报文结构完全一样,只是从站号和地址不同。
这样扩展下来,程序不需要复制太多,只要把功能块参数做成按索引变化的结构就行。我后来给这套输送设备又加了一台V20,总共多花了不到半小时,主要时间花在设站号和接线确认上。
7.3 调试经验沉淀
整个项目做完,我最大的感触是:Modbus RTU硬件上不挑厂家,但不同品牌对寄存器地址的偏移、控制字的习惯、数据格式的表示并不一样,尤其是西门子变频器的“位定义控制字”逻辑,值得第一次接触的人多花点时间理解清楚。只要把数据手册里的寄存器表和工作原理看明白了,这类通讯调试基本就是对着表格填参数。
平时做类似项目,我建议备一条USB转RS485调试线、两个120Ω终端电阻、一个光隔离中继模块,成本不高,但在现场排查时能节约大量时间。通讯问题九成都是“参数不一致、接线不对、干扰”这三类,搞清楚了,XDH和V20这套组合实际上是很好用的。上次回访那套输送设备,已经连续跑了几个月,再也没接到过现场通讯故障的电话,这就是对这套方案最好的验收。