
1. 项目缘起与整体设计思路1.1 为什么还在用S7-200 SMART做RS485通信干了十多年工控有个现象挺有意思每次聊到小型PLC组网总有人觉得S7-200 SMART是“老古董”应该直接上1200或者1500。但实际跑现场你会发现大量中小型项目——尤其是几十个变频器、温控仪表、称重传感器需要联网的场合——S7-200 SMART的性价比和稳定性依然很难被替代。它本体自带一个RS485口Port 0再配一个SB CM01信号板就能扩展出第二个串口两个口可以同时跑Modbus RTU主站和从站这在小型控制器里相当实用。这个项目的核心目标很明确用一台S7-200 SMART作为Modbus RTU主站通过RS485总线控制多台变频器。热词里有人问“一个西门子PLC与32个变频器Modbus通讯控制是否可行”我的回答是协议层面完全可行但实际工程中要考虑轮询周期、总线负载和终端电阻匹配。32台设备如果每台轮询10个寄存器波特率9600的情况下一轮扫描下来大概需要3到5秒对于一般风机水泵类负载完全够用但如果要求实时响应就得提高波特率或者分多条总线。这篇文章我会把整个流程拆开讲从RS485的物理层原理、DB9接口定义、接线拓扑到S7-200 SMART的Modbus库指令调用、轮询程序架构再到用Modbus Poll和Modbus Slave做调试的全过程。适合刚接触工控通信的入门者也适合做过一些项目但遇到通信不稳定问题的同行参考。1.2 整体方案选型与架构设计先说说为什么选Modbus RTU而不是别的协议。在RS485物理层上跑通信可选协议很多自由口自定义协议、PPI、Modbus RTU、Profibus DP等。自由口最灵活但开发量大PPI是西门子私有协议不对外开放Profibus DP需要专用芯片和更高的硬件成本。Modbus RTU是唯一一个既开放、又简单、还被几乎所有变频器厂商原生支持的方案。汇川、台达、ABB、施耐德、西门子V20/V90系列变频器基本都标配Modbus RTU接口。架构上我采用的是单主站多从站的经典拓扑主站S7-200 SMART CPU SR20或ST20本体Port 0作为RS485通信口从站N台变频器每台分配唯一站号1~247物理层屏蔽双绞线手拉手连接A接A、B接B协议层Modbus RTU波特率9600或192008位数据位无校验或偶校验1位停止位这里有个关键决策点波特率选9600还是19200。很多人觉得越快越好但实际现场如果总线较长超过50米或者变频器干扰较大19200反而容易丢包。我的经验是总线长度小于30米、变频器数量少于10台可以用19200否则老老实实9600。轮询周期慢一点没关系工业控制里稳定性永远排第一。注意S7-200 SMART的Port 0是RS485电平不是RS232。如果你电脑只有USB口需要一个USB转RS485转换器不要买成USB转RS232的两者电气特性完全不同。2. RS485物理层核心细节与接线实操2.1 RS485差分信号原理与DB9接口定义RS485之所以抗干扰能力强核心在于差分传输。它用两根线A和B传输一个信号接收端判断的是两根线之间的电压差而不是单根线对地的电压。当A线电压高于B线时表示逻辑1B线高于A线时表示逻辑0。外部干扰通常会同时耦合到两根线上接收端做减法时干扰就被抵消了。这就是为什么RS485能跑1200米而RS232只能跑15米。热词里有人搜“db9 com口 r232和rs485 定义”这里必须说清楚DB9接口本身只是一个连接器形状它上面跑什么信号完全取决于设备定义。标准的RS232 DB9定义是2脚RXD、3脚TXD、5脚GND。而RS485在DB9上的定义没有统一标准常见的有两种引脚常见RS485定义一常见RS485定义二1未使用未使用2未使用未使用3AB-4未使用未使用5GNDGND6未使用未使用7未使用未使用8B-A9未使用未使用所以拿到一个DB9口的RS485设备第一件事是查手册确认A和B到底在哪两个脚上千万不要凭经验猜。我见过太多人因为A、B接反导致通信不上查了半天程序最后发现是线接错了。S7-200 SMART本体Port 0是一个DB9母头它的RS485信号定义是3脚为B-8脚为A5脚为GND。这个定义和上面表格里的“常见定义二”一致。如果你用西门子的原装编程电缆它内部已经处理好了信号转换如果自己焊线记住3和8这两个脚。2.2 RS485组网接线与终端电阻配置接线拓扑我强烈推荐手拉手菊花链不要用星型或树型。星型拓扑会让信号在分支点产生反射波特率越高、分支越长反射越严重表现为通信时好时坏、随机丢包。正确的做法是从主站出发依次连接到第一台从站、第二台从站……最后一台从站中间不要有分支。终端电阻的问题经常被忽略。RS485标准要求在总线的物理两端各接一个120欧姆的终端电阻作用是吸收信号反射。但实际工程中要不要接取决于总线长度和波特率总线长度小于10米、波特率9600可以不接影响不大总线长度超过50米、波特率19200以上必须接总线长度超过200米必须接且要使用屏蔽双绞线终端电阻的接法很简单在总线最远端的设备A和B之间并联一个120欧姆电阻。很多变频器自带终端电阻拨码开关拨到ON即可如果没有就需要自己焊一个电阻在DB9插头上。实操心得我曾经遇到一个项目12台变频器分布在一条80米长的生产线上通信时断时续。查了程序、换了转换器都没用最后发现是终端电阻没接。在最后一台变频器的A、B之间加了一个120欧姆电阻问题立刻消失。这个坑很典型记住一句话通信不稳定先查物理层再查协议层。屏蔽线的处理也有讲究。屏蔽层应该单端接地通常在主站侧接地从站侧悬空。如果两端都接地会在屏蔽层上形成地环流反而引入干扰。如果现场电磁环境特别恶劣可以考虑在从站侧通过一个0.1微法电容接地兼顾屏蔽和隔直。2.3 RS485自动收发电路与隔离保护如果你需要自己做RS485转换板或者中继器会涉及到自动收发电路。RS485是半双工通信发送和接收共用一对差分线所以需要一个方向控制信号DE/RE来切换收发状态。手动控制需要PLC的一个输出点来控制方向占用IO资源自动收发电路则通过检测发送数据流来自动切换方向省去控制线。典型的自动收发电路用一片MAX485或者SP3485芯片配合几个电阻电容就能实现。核心思路是发送数据时数据线上的电平变化通过一个三极管或门电路控制DE引脚使能发送发送完毕后自动切回接收。这个电路在淘宝上有很多现成模块几十块钱一个比自己焊省事。隔离保护是工业现场必须考虑的问题。不同设备的地电位可能不同如果直接连接地电位差会在通信线上产生大电流烧毁收发芯片。光耦隔离或者磁隔离是标配好的RS485转换器都会标注“隔离型”价格贵一点但能省去很多麻烦。另外在A、B线上并联TVS瞬态抑制二极管可以防止雷击或感性负载切换产生的浪涌。3. S7-200 SMART Modbus RTU主站程序实现3.1 Modbus库指令调用与初始化S7-200 SMART的Modbus RTU主站功能通过MBUS_CTRL和MBUS_MSG两条指令实现。MBUS_CTRL用于初始化和监控通信口MBUS_MSG用于发送具体的读写请求。这两条指令在STEP 7-Micro/WIN SMART的“库”里面可以直接拖出来用。先看MBUS_CTRL的引脚定义引脚类型说明EN输入使能一般用SM0.0常闭Mode输入1Modbus0PPIBaud输入波特率4800/9600/19200/38400/57600/115200Parity输入0无校验1奇校验2偶校验Timeout输入超时时间单位毫秒一般设1000Done输出初始化完成置1Error输出错误代码0表示无错误初始化程序很简单在第一个扫描周期用SM0.1触发或者用SM0.0常使能。Mode设为1Baud设为9600Parity设为0无校验Timeout设为1000。Done位置1后就可以开始发请求了。这里有个细节MBUS_CTRL的EN端不要用SM0.0一直使能虽然手册上说可以但实际项目中如果通信口被其他指令占用会报错误代码。我的习惯是用SM0.1触发一个置位指令把EN端保持住这样只初始化一次。3.2 MBUS_MSG轮询架构与站号管理MBUS_MSG是核心指令每个扫描周期只能有一条MBUS_MSG指令处于激活状态否则会报错误代码6“同时有多条MBUS_MSG指令”。所以多从站轮询必须用状态机的方式一条一条地发请求。MBUS_MSG的关键引脚引脚说明EN使能First触发请求上升沿有效Slave从站站号1~247RW0读1写AddrModbus寄存器地址40001对应040002对应1以此类推Count读写的数据个数读保持寄存器最大125个DataPtr数据缓冲区指针指向V存储区轮询架构我通常这样设计用一个整数变量Step表示当前轮询到第几步每一步对应一台从站的一个操作。比如有8台变频器每台读2个寄存器状态字和频率那就是16步。每步触发一次MBUS_MSGDone位置1后Step加1进入下一步。最后一步完成后Step归零重新开始。// 伪代码示意 IF Step 0 AND First_Done THEN Slave : 1; RW : 0; Addr : 0; Count : 2; First : TRUE; Step : 1; END_IF; IF Step 1 AND Done THEN First : FALSE; Step : 2; END_IF; // ... 以此类推实际写梯形图的时候可以用一个整数比较指令配合MOV指令来切换参数。数据缓冲区用一个连续的V存储区比如VB1000开始每台从站占4个字节2个寄存器8台就是32个字节。注意事项MBUS_MSG的Addr参数是从0开始的。也就是说要读变频器的40001寄存器Addr填0读40002Addr填1。这个和很多触摸屏软件的地址偏移方式不同第一次用很容易搞错。3.3 通信超时与错误处理机制工业现场通信不可能永远正常变频器断电、线路松动、干扰丢包都会导致超时。MBUS_MSG的Error输出会给出错误代码常见的几个错误代码含义处理建议0无错误正常1响应校验错误检查波特率、校验位2响应错误从站返回异常码3响应超时检查接线、站号、从站是否上电6同时有多条MBUS_MSG检查轮询逻辑我的处理策略是超时后不停止轮询而是跳过当前从站继续下一台。具体做法是给每个从站设一个“离线计数器”超时一次计数器加1连续超时3次就标记该从站离线跳过它不再轮询直到计数器被手动复位。这样可以避免一台变频器故障导致整个系统通信瘫痪。另外MBUS_CTRL的Timeout参数不要设太小。9600波特率下一个完整的Modbus RTU帧8个数据字节传输时间大约10毫秒加上从站处理时间和响应时间一般设500到1000毫秒比较稳妥。设太小会导致正常通信也被误判为超时。4. Modbus调试工具实战与问题排查4.1 用Modbus Poll模拟主站调试从站调试阶段我习惯先单独调试每一台从站确认从站本身通信正常再接入PLC轮询。这时候Modbus Poll就派上用场了。它运行在电脑上通过USB转RS485转换器连接到变频器模拟主站发送请求。Modbus Poll的使用步骤打开软件点击Connection菜单选择Serial Port设置串口参数波特率、数据位、校验位、停止位必须和变频器一致点击Setup菜单选择Read/Write Definition设置Slave ID变频器站号、Function03读保持寄存器、Address起始地址、Quantity寄存器数量点击OK如果通信正常主窗口会显示寄存器数值如果显示“No Connection”或者“Timeout”排查顺序是先确认串口号选对了没有再确认波特率和校验位然后确认A、B线有没有接反最后确认变频器站号和地址是否正确。热词里有人搜“modbus poll密钥”这里说明一下Modbus Poll是付费软件但有30天试用期调试阶段够用了。如果不想用付费软件也可以自己写一个简单的Python脚本用pymodbus库来测试效果一样。4.2 用Modbus Slave模拟从站调试PLC反过来如果要调试PLC的主站程序但手头没有变频器可以用Modbus Slave模拟一个从站。它运行在电脑上通过USB转RS485连接到PLC的Port 0响应PLC发来的请求。Modbus Slave的设置和Modbus Poll类似关键是Slave ID要和PLC程序里MBUS_MSG的Slave参数一致寄存器地址也要对应。比如PLC程序里读Addr0、Count2Modbus Slave里就要设置起始地址为0、数量为2的保持寄存器。调试的时候可以实时看到PLC发来的请求帧和Modbus Slave的响应帧对于理解Modbus RTU的报文结构非常有帮助。一个典型的读请求帧是这样的01 03 00 00 00 02 C4 0B拆解一下01是从站站号03是功能码读保持寄存器00 00是起始地址00 02是寄存器数量C4 0B是CRC校验码。响应帧则是01 03 04 00 64 00 32 XX XX其中04是数据字节数00 64和00 32是两个寄存器的值。4.3 常见通信故障速查与避坑经验整理一个速查表覆盖我这些年遇到的大部分RS485通信问题现象可能原因排查方法完全无响应A、B接反交换A、B线再试完全无响应站号不对确认从站站号设置完全无响应波特率不匹配确认双方波特率一致偶尔丢包终端电阻未接总线两端加120欧姆电阻偶尔丢包屏蔽层两端接地改为单端接地偶尔丢包总线有分支改为手拉手拓扑通信一段时间后断开干扰导致芯片复位加隔离模块或TVS读到的数据不对地址偏移错误确认Addr从0开始写数据不生效功能码用错写单个用06写多个用16最后分享几个踩坑经验。第一USB转RS485转换器一定要买带隔离的我早期用过一个十几块钱的调试时好好的一到现场就各种丢包换了隔离型立刻稳定。第二PLC的Port 0和Port 1不能同时用作Modbus主站如果两个口都要跑Modbus需要分别调用MBUS_CTRL指令且两个口的波特率可以不同。第三变频器的Modbus地址表一定要查对应型号的手册不同品牌的地址定义完全不同ABB和西门子的地址偏移方式就不一样不能混用。通信调试这件事说到底就是物理层、参数层、协议层三层排查。物理层看接线和终端电阻参数层看波特率和校验位协议层看站号和地址。按这个顺序查90%的问题都能定位到。剩下10%是干扰问题那就需要从布线、屏蔽、隔离几个方面综合处理了。