做自动化项目,最不缺的就是“明明能跑起来,但一联动就出怪问题”的场面。我年初经手了一套小型产线改造:一台西门子S7-1200 PLC当控制核心,一台TP700触摸屏做交互,三台台达VFD变频器驱动电机。触摸屏负责启停和频率给定,PLC负责联锁和自动逻辑,所有变频器的控制数据都走MODBUS通讯,而不是像老设备那样一对一拉几十根控制线。整套系统调完到现在运行稳定,中间踩了不少坑,也沉淀了不少经验。这篇就把从选型、接线、参数设置到程序调通的完整过程拆开讲清楚。
适合看这篇的人,是正要拿S7-1200去连台达变频器、又被TP700画面和MODBUS地址搞得头晕的电气工程师或调试人员。如果你手里是S7-200 SMART配国产变频器,思路也完全能平移,只是寄存器地址和指令名称要换一下。
1. 为什么用MODBUS-RTU把PLC、触摸屏、变频器串在一起
1.1 三个设备在这个系统里各自负责什么角色
先说清楚系统拓扑,这是后面一切调试的前提。S7-1200是MODBUS主站,通过RS485总线下挂三台台达变频器作为从站,站地址分别设为1、2、3。TP700触摸屏不直接和变频器通讯,它通过以太网和S7-1200建立连接,操作员在屏上按下启动按钮,HMI把命令写入PLC的变量,PLC再通过MODBUS把运行命令发给对应变频器。数据流向是:
触摸屏 → 以太网 → PLC → RS485/MODBUS → 变频器
为什么要这样绕一层?因为TP700本身虽然有COM口,但让它同时兼顾画面刷新和批量读取多台变频器数据,一方面HMI脚本里维护通讯状态很繁琐,另一方面启停逻辑、联锁条件、故障记忆都应该集中在PLC里做,HMI只负责“显示和下发指令”。把通讯职责全交给PLC,后续加设备、改逻辑都只需要动PLC程序,触摸屏画面基本不用大改。这个架构在产线改造里是性价比最高的,没有之一。
1.2 为什么选MODBUS而不是PROFINET或模拟量
有人会问,S7-1200和TP700都支持PROFINET,变频器为什么不也走PROFINET?现实原因很直接:台达VFD变频器大部分机型不带PROFINET接口,要加通讯卡,成本直接高出一截,而且要买西门子GSD文件做设备组态,调试周期也长。MODBUS-RTU虽然老了点,但它有几个突出优势:
- 所有台达VFD变频器标配RS485接口,硬件零成本;
- MODBUS协议极其简单,报文结构一眼能看懂,抓包排查容易;
- 一台PLC通过RS485最多可挂几十个从站,三台变频器只是小场面;
- 西门子TIA Portal自带MODBUS指令库,不需要额外授权。
模拟量控制方案我也认真考虑过:用PLC的模拟量输出端子给变频器AI端口送0~10V或4~20mA,频率给定确实简单,但启停信号还得再占用数字量输出点,正转反转、故障复位、故障反馈各占一点,一台变频器就要占用五六个IO点。三台变频器下来,PLC的IO点资源就紧张了,而且模拟量信号在电柜里容易受干扰,走线距离一长电压跌落明显,频率精度也受影响。MODBUS方案一根屏蔽双绞线全部搞定,还能同时读取输出电流、母线电压、故障码这些运行数据,性价比完全碾压。
1.3 硬件接口选型:CB1241还是CM1241
S7-1200本体不带RS485口,必须加通讯模块。西门子提供了两种选择:
CB1241是通讯板,直接插在CPU前面板上,占用的是一个通讯板扩展槽,不占信号模块位置。支持一个RS485接口,供电从CPU背板取,不需要额外接线。CM1241是通讯模块,插在CPU左侧的模块扩展槽里,有RS232和RS485两种型号,接口数量更多,还支持modbus从站、自由口等更灵活的模式。
我这个项目选的是CB1241,理由很简单:只做MODBUS主站,一个RS485口就够,成本最低,CPU选1214C DC/DC/DC,直接卡上去就行。如果以后要做双网冗余或者一边接变频器一边接仪表,那就得考虑CM1241了。提醒一点:CB1241和CM1241虽然长的位置不一样,但使用的指令是一样的,程序迁移成本很低。
2. S7-1200的MODBUS主站配置:从端口初始化到读写指令
2.1 硬件接线和通讯端口参数的统一约定
CB1241上有两个端子:A(DATA+)和B(DATA-)。台达变频器RS485端子通常标SG+和SG-,对应关系是CB1241的A接SG+,B接SG-,千万别接反。接反的表现很典型:用Modbus调试工具能读到数据,但PLC一上电通讯就超时,或者通讯时通时断,检查半天才发现是收发极性错了。
三台变频器在RS485总线上是菊花链连接:PLC的A/B接到第一台变频器SG+/SG-,再从第一台的RS485端子并联接到第二台,依次往后。每一台变频器的SG+和SG-其实是同一个网络节点,不能串成“从一台出来进下一台”的链式供电方式,而是所有节点的正接正、负接负,和并联一模一样。
通讯参数必须全局统一:波特率9600、8数据位、偶校验、1停止位,从站地址1/2/3。有几个现场喜欢把波特率改成19200甚至38400,短距离确实能跑,但电柜里动力线一多,高速率的误码率会明显上升。我的经验是9600最稳,反正变频器通讯数据量很小,完全不是瓶颈。
2.2 Modbus_Comm_Load端口初始化指令怎么用
TIA Portal里需要在OB100或首次扫描时调用一次Modbus_Comm_Load指令。这条指令的作用是把CB1241的通讯端口配置成MODBUS模式,设置波特率、校验方式,然后生成一条“虚拟通讯链路”,每个端口只能调用一次。
指令参数里注意这几个:
- REQ:初始化请求信号,用一次脉冲就行;
- PORT:硬件标识符,TIA中组态CB1241后会自动分配;
- BAUD:波特率,填9600;
- PARITY:校验方式,0=无校验、1=偶校验、2=奇校验,这里填1;
- MB_DB:主站背景数据块。
初始化完成后,Modbus_Comm_Load会持续占用这个通讯板,不用每次读写都重新初始化。程序里可以加一个“初始化完成”标志位,避免重复触发。
2.3 MB_MASTER功能码与DATA_ADDR地址换算
数据读写靠MB_MASTER指令,每个请求可以指定从站地址、功能码、寄存器地址和数据长度。和普通MOV指令不同,这条指令的DATA_ADDR不是“寄存器的十进制编号”,而是标准MODBUS协议里的保持寄存器地址,格式是4xxxx。这意味着访问从站某个寄存器时,要先做一次换算。
台达VFD手册里给出的是十六进制寄存器编号,比如2000H。0x2000转换成十进制是8192。MB_MASTER的DATA_ADDR按“40001+协议地址”来填,那么2000H对应的就是41993。如果手册上直接给你的是4x地址,那就简单了,填4x后面的数字即可。
MB_MASTER的MODE参数和MODBUS功能码对应关系如下:
| MODE | 功能 | 对应功能码 |
|---|---|---|
| 0 | 读保持寄存器 | 03 |
| 1 | 写单个保持寄存器 | 06 |
| 2 | 写多个保持寄存器 | 16 |
| 3 | 读输入寄存器 | 04 |
| 4 | 写单个线圈 | 05 |
| 5 | 写多个线圈 | 15 |
现场最常用的就是MODE 0读状态、MODE 1写运行命令、MODE 2写频率给定。要注意的是,DATA_ADDR在READ和WRITE之间必须是一致的,发送请求时主站会自动加上功能码,报文的实际寄存器地址还是协议内部的十六进制地址。
2.4 通讯程序框架里必须有的超时和错误处理
MODBUS请求发出后,从站可能因为干扰、参数错误或自身故障不回响应。如果程序里不做超时处理,MB_MASTER会一直等待,后续轮询全部卡死。我的做法是每个从站建一个错误计数器,连续三次无响应就置位该站的通讯失败标志,触摸屏弹出报警,同时PLC自动切断该变频器的运行指令。
示例代码(SCL风格):
// 触发一个读请求 IF "ReadTrig_1" THEN "MB_MASTER_DB_1"( REQ := TRUE, MB_ADDR := 1, MODE := 0, DATA_ADDR := 41999, // 换算后的2003H输出频率 DATA_LEN := 2, DATA_PTR := "VFD1_Read_Buffer", ERROR => "MB1_Error", STATUS => "MB1_Status" ); END_IF;读取到的原始数据放在一个WORD数组里,再做工程量换算。比如输出频率寄存器原始值5000,实际频率是50.00Hz,换算公式就是把原始值除以100。电流同理。
3. TP700触摸屏的画面组态与数据联动设计
3.1 HMI连接设置和变量映射
TP700在TIA Portal里通过集成以太网接口和S7-1200连接,不需要额外通讯处理器。新建HMI连接时选择S7-1200/1500协议,填入PLC的IP地址,注意两者必须在同一网段,触摸屏IP设为192.168.0.10这类地址,PLC保持默认192.168.0.1,避免冲突。
HMI变量不是随便建的,最好和PLC数据块变量一一对应。我在PLC里建了一个“VFD_Control_DB”数据块,里面包含启动命令、停止命令、设定频率、当前频率、电流等变量。触摸屏直接引用这个DB的绝对地址,比如DB3.DBX0.0对应启动按钮,DB3.DBD4对应频率设定值。这样程序里所有联锁逻辑都对DB3操作,画面变量和PLC逻辑同步更新,不会出现“画面变量值变了但PLC程序读不到”的割裂问题。
3.2 控制画面如何拆分功能
TP700屏幕尺寸虽然不大,但画面布局不能太乱。我把它拆成三个主画面:
主监控画面显示三台变频器的运行状态,每台一行,包含运行/停止指示灯、当前频率、输出电流、累计运行时间,下面一排启停按钮。参数设置画面放频率给定输入框,加减速时间、上限频率这类参数也可以放在这里。报警画面记录通讯故障、变频器故障、过流过压等信息,带时间戳。
这里有个细节:频率给定输入框的数据类型要设成实数,再配合PLC里的限幅逻辑。现场操作员如果在屏上直接输80Hz,但变频器上限频率是60Hz,PLC要把这个值截断再写入变频器,不能直接把原始值下发,否则变频器会报频率超限故障。
3.3 启停按钮为什么用“置位/复位”而不是“值取反”
触摸屏上常见的按钮类型有两种:一种叫“反转位”,触摸时把变量取反;另一种是“置位/复位”,按下时把变量置1,松开后保持为1,需要另一个按钮或PLC逻辑复位。
如果直接用“反转位”来做启动按钮,会出现很尴尬的情况:操作员按一下启动,MODBUS恰好通讯卡顿没发出,操作员又按一次,结果是变量恢复到0,等于又发了一次停止命令。连续按几次,启停状态完全和按钮状态脱节。
我推荐的做法是:启动按钮和停止按钮分别是两个不同的变量,启动按钮触发一个上升沿,PLC把运行命令写入变频器;停止按钮触发另一个上升沿,PLC写停止命令。触摸屏侧只负责“产生一次脉冲”,最终状态判断全部由PLC执行并回读变频器状态字刷新指示灯。这样即使误触多次,PLC逻辑也能保证每次操作是唯一的、可预期的。
3.4 画面权限和操作便利性
TP700支持用户管理,至少应该分两级:操作员只能启停和调频率,工程师可以修改参数和进入系统设置。密码级别和画面元素绑定,防止现场人员误入通讯参数页面把波特率改了,一改就是全线通讯瘫痪,这种低级事故在工厂里太常见了。
画面还可以加一个“系统心跳”指示灯,PLC程序里做一个1Hz闪烁位,触摸屏读这个位作为通讯健康标志。如果触摸屏和PLC的以太网断开,这个灯会停止闪烁。操作员不用看任何诊断信息,只看这个灯就知道系统是不是正常的,项目交付后维护电话能少一半。
4. 台达VFD变频器的MODBUS参数与寄存器映射
4.1 变频器侧需要修改的关键参数
台达VFD变频器系列很多,VFD-M、VFD-EL、VFD-CP2000的参数编号有差异,但方向一致。以常用的VFD-EL为例,以下几项必须设对:
| 参数 | 设定值 | 含义 |
|---|---|---|
| 02-00 | 3 | 主频率指令来源为RS485通讯 |
| 02-01 | 3 | 运转指令来源为RS485通讯 |
| 09-00 | 1 | 通讯地址:1号站 |
| 09-01 | 1 | 传输速率9600bps |
| 09-02 | 3 | MODBUS RTU模式,8-E-1 |
| 09-04 | 0 | 通讯错误时不动作 |
不同批次的产品参数编号可能有微调,调试前一定先翻一遍对应型号的手册。这里有个最常见的翻车点:只设了频率来源为通讯,但运转指令来源还是面板或端子,结果就是频率能通过MODBUS写进去,但变频器不转;或者能启动,但频率不受控。这两个参数必须同时指向通讯,缺一不可。
通讯地址不要设0,0在MODBUS里是广播地址,部分变频器收到广播地址报文会不响应。从站地址范围取1~247,我这个项目设1/2/3。
4.2 运行命令寄存器2000H和频率给定寄存器2001H
台达VFD系列有两类核心寄存器,一类是控制类,一类是监视类。控制类寄存器主站写入,监视类主站读取。
常用寄存器如下:
| 寄存器地址 | 功能 | 读写方向 | 说明 |
|---|---|---|---|
| 2000H | 运行命令 | 主站写 | 控制字,如正转、反转、停止 |
| 2001H | 主频率给定 | 主站写 | 单位0.01Hz |
| 2003H | 输出频率 | 主站读 | 单位0.01Hz |
| 2004H | 输出电流 | 主站读 | 单位0.01A |
| 2100H | 变频器状态 | 主站读 | 状态字位映射 |
| 2101H | 异常故障码 | 主站读 | 故障代码 |
运行命令2000H的常见写法,不同系列略有区别,但一般正转运行等于写1,反转写2,停止写3,故障复位写4,或者采用位映射方式,bit0正转、bit1反转、bit2停止。具体要对照手册。我建议不要在程序里写死,把控制字定义成CONSTANT常量区,调试时改一处就行。
频率给定寄存器2001H的数值换算很关键:实际频率除以0.01Hz。比如目标频率50.00Hz,写入值就是5000,十六进制是0x1388。写30.00Hz就写3000。注意MODBUS寄存器最小单位是字,不能写负数,变频器正反转由控制字决定,频率指令都是正数。
4.3 状态字的读取和故障诊断思路
状态字2100H回读后,PLC可以判断变频器是否在运行、是否到达目标频率、是否发生故障。一般bit0表示正转运行,bit1表示反转运行,bit2表示零速/停止,bit5表示加速中,bit6表示减速中。把这些位映射到触摸屏指示灯,比单纯看HMI按钮状态准确得多。因为按钮按下只是PLC“写命令成功”,而状态字是变频器“真正执行”的反馈,这两者之间可能差好几秒。
故障码2101H读取到非零值后,触摸屏直接显示故障代码含义。台达手册里有故障码对照表,比如过电流、过电压、模块过热等。PLC程序里做一个查表函数,读取故障码后翻译成中文文本,操作员不用翻手册就知道是什么问题。如果能在故障发生时同时锁定当时的输出频率和电流,对事后分析更有帮助,但这就涉及历史数据存储了,篇幅原因这里不展开。
5. 系统联调:先看报文,再查接线,最后谈抗干扰
5.1 用Modbus工具做最小系统验证
整套系统联调前,强烈建议先不要碰PLC程序,也不要在触摸屏上折腾。直接拿一台笔记本电脑,通过USB转RS485模块连接到变频器RS485端子,用任意一款MODBUS调试软件发报文。这一步的目的就是把“PLC程序”和“变频器参数”两个变量隔离开,先确认变频器侧通讯完全正常。
我用调试软件读出2003H寄存器的值,面板上显示的实际频率和报文值对应,说明变频器从站功能OK。接着再测2001H写入:给1号变频器写50Hz频率,变频器面板频率显示50.00Hz,说明写功能OK。这个最小系统验证通过后,再接CB1241和PLC,问题范围就能压缩到PLC组态或地址换算上。很多现场调不通,最后发现是变频器侧站地址设错了,或者根本没保存参数,这种低级问题用调试工具几秒钟就能定位。
5.2 几组真实报文样例和CRC校验
MODBUS RTU报文结构很简单,但看懂它对排查问题帮助巨大。比如读1号变频器输出频率寄存器2003H,主站请求报文是:
01 03 20 03 00 01 CRC_LO CRC_HI- 01:从站地址
- 03:功能码03读保持寄存器
- 20 03:寄存器地址2003H
- 00 01:读取1个寄存器
如果变频器正常运行,响应报文类似:
01 03 02 13 88 CRC_LO CRC_HI- 01:从站地址
- 03:功能码
- 02:数据长度2字节
- 13 88:十六进制0x1388,十进制5000,换算成50.00Hz
CRC校验在报文中占两字节,主站发出请求时CRC必须正确,否则从站会直接丢弃。调试工具一般自动计算CRC,PLC的MODBUS库也内置CRC逻辑,两者正常情况下不用手工算。但如果发现通讯时通时断,就要怀疑是不是用了劣质RS485转换器,它的CRC计算逻辑有Bug,偶尔发出错误报文,变频器自然不响应,表现为“重试几次偶尔成功一次”。
写频率的完整报文(用06功能码写单个寄存器):
01 06 20 01 13 88 CRC_LO CRC_HI这是指把50.00Hz写入1号变频器的2001H寄存器。如果变频器返回同样的这串报文,说明写入成功。
5.3 常见故障现象排查表
我把联调阶段最常遇到的几个现象和排查方向整理成表,照着查能省很多时间:
| 现象 | 大概率原因 | 排查动作 |
|---|---|---|
| 完全无响应,超时报警 | 站地址不对或接线断 | 先查A/B正负,再查站地址 |
| 偶发超时,重试可恢复 | 波特率不一致或校验设置不一致 | 核对PLC与变频器通讯参数 |
| 报文能发,但写频率无效 | 频率指令来源没设成通讯 | 查02-00等参数 |
| 能写频率但不转 | 运转指令来源没设成通讯 | 查02-01等参数 |
| 读数正常,但偶尔多跳几个数 | 屏蔽层接地不良 | 检查屏蔽层是否单端接地 |
| 触摸屏上数值卡住不刷新 | HMI变量地址偏移或PLC通讯指令未循环触发 | 检查MB_MASTER的REQ脉冲 |
特别要提醒的是,MODBUS主站程序不能一直把REQ置TRUE,那样会重复发送请求,导致变频器响应拥堵。REQ必须用脉冲触发,一个请求完成后再触发下一个。这种轮询逻辑很多人第一次写容易踩坑。
5.4 屏蔽层、终端电阻和接地
RS485的抗干扰能力很大程度取决于现场布线。变频器本身是强干扰源,变频器输出侧的动力电缆如果不走独立线槽,RS485通讯线很容易被耦合干扰。我的经验是:
- 屏蔽双绞线的屏蔽层在PLC侧单端接地,不要在变频器侧也接地,否则会形成地环路;
- RS485总线两端各并一个120Ω终端电阻,三台短距离变频器可以只在物理最远端加一个;
- 通讯线走独立线槽,与变频器输入输出动力线保持至少20cm间距,必须交叉时垂直交叉;
- 变频器的SG+和SG-端子如果和内部开关电源共地,接线时不要和PLC侧的地混在一起。
电容性干扰导致的典型症状是:低速运行时通讯正常,变频器一开始加速通讯就乱码,或者直接超时。这种问题靠改程序解决不了,必须从布线和接地入手。
6. 从单站到多站:轮询架构与最终验收总结
6.1 多台变频器的轮询思路
三台变频器不能同时在一个扫描周期里并行发送MODBUS请求,因为S7-1200的MODBUS主站指令在同一时刻只能处理一条。要么在PLC里建一个轮询状态机,要么用定时器把请求错开。我用的是一个简单的轮询状态机:
第一步读1号状态字和故障码,第二步写1号频率,第三步读2号,第四步写2号,以此类推。每条请求间隔50ms。三台变频器完整轮询一遍不到300ms,触摸屏刷新完全够用。
如果以后扩展到八台十台,轮询周期会拉长,这时候要把“需要实时监控的变量”和“偶尔读一次的变量”分开处理。运行状态、频率、电流每轮都读;累计运行时间这种慢变量每隔几十轮读一次。否则所有变量都挤在一个轮询周期里,数据量翻倍,刷新率急剧下降。
6.2 超时联锁和故障后处理
通讯失败后不能只是报警,必须有一套安全策略。我的PLC逻辑是这样的:
- 第一次通讯超时:记录错误次数,不切断输出;
- 连续第二次超时:触摸屏报警提示“通讯异常,请检查485线缆”;
- 连续第三次超时:判定该变频器通讯中断,自动清除运行命令,让变频器按自身停机方式停车,并锁存故障状态;
- 通讯恢复后:需要操作员手动复位,不能自动恢复运行。
这样做的原因是,通讯中断时变频器可能仍在运行,如果PLC不知道变频器当前状态,贸然恢复运行或者不切断输出都可能造成安全事故。变频器本身也有通讯错误检测功能,可以设置成通讯中断后自由停车或按减速时间停车,PLC和变频器双重保护。
6.3 几条值得写进笔记里的经验
这套项目做下来,有几条经验我觉得对后来者特别有价值。
第一,触摸屏里的频率输入框一定要做限幅,PLC端再限一次,变频器参数里也设上限,三层保险。任何一层失效都不会导致电机超速。
第二,运行命令和频率给定写入顺序有讲究。如果同时写2000H和2001H,应该先写频率再写运行命令,或者干脆两条报文间隔几个毫秒。否则变频器可能用上次的频率启动,如果上次频率是零,启动瞬间电流会很大,触发过流保护。
第三,程序里给每个从站做一个“最近通讯成功时间戳”,触摸屏上直接显示各站的通讯状态。接线断、参数错,第一时间就能看出是哪一台的问题,不需要拿着万用表在电柜里反复量电压。
第四,备份程序时,把变频器参数表也一起归档。项目交接时,给客户一份《变频器调试参数记录表》,上面写好站地址、波特率、校验方式、频率来源、控制字定义。半年后变频器坏了换新,照着表设参数,半小时就能恢复生产,这种细节在工厂里比任何高深的算法都更能解决问题。