
简介S7-1200外部端子控制启停与MODBUS读写频率方案面向需要实现PLC与V20变频器远程监控的电气工程师、自动化调试人员。文档从硬件接线讲起给出CB1241模块与变频器P/N-的屏蔽双绞线连接细节并梳理变频器参数设置、CN011宏选择、MODBUS寄存器地址及PLC程序读写流程尤其强调40100控制字在写频率与读频率前的切换要点能避免实际调试中常见的读写失败问题。资料共1个docx文件压缩包约1.14MB虽然文件数不多但知识点密度高适合现场调试前快速查阅或作为培训笔记。目前已有902人学习下载内容经多人验证具备实用参考价值。读者可获得完整参数配置表、关键寄存器地址对照、程序编写步骤与注意事项基本覆盖从硬件连接到通信实现的完整链路有助于快速完成启停控制和频率读写功能。1. 外部端子启停加MODBUS读写频率S7-1200方案的第一道分水岭变频器面板控制频率、端子控制启停单独拿出来都不难但一旦换成“S7-1200通过外部端子控制启停同时用MODBUS读写频率”现场问题立刻变多频率能写进去但变频器不动端子能合闸但电机按上一次的频率猛冲到高速通讯灯闪但读回来的频率永远是零。这些现象的背后只有一个原因——变频器的启停命令源和频率给定源被分成了两套独立通路S7-1200必须同时管理硬端子的电气时序和MODBUS寄存器的通信时序而不是简单地把频率塞给变频器。把这条路走通需要掌握四件事硬件接线与通信单元选型S7-1200里的启停输出逻辑和频率读写轮询变频器侧参数表与MODBUS地址的换算以及用上位机工具做对外验证。下面按我实际完成这类改造的顺序展开适合做设备维护、非标自动化和产线集成的工程师。2. 硬件连接与模块选型S7-1200外部端子启停回路和CM1241的MODBUS RTU接口2.1 端子启停是硬回路频率必须走通信不能混成一路所谓“外部端子控制启停”指的是变频器的运行命令来自DI数字输入端子例如DI1接正转信号、DI2接反转信号而不是来自通信控制字。S7-1200侧的数字输出Q0.0、Q0.1接到变频器DI1、DI2通过PLC程序保持一个“运行使能”电平。频率给定则走MODBUS总线例如把目标频率写入变频器的频率设定保持寄存器再把实际输出频率从状态寄存器读回。这套组合在生产线上非常常见因为端子启停比通信启停更可靠急停、门锁、安全继电器都能串进硬回路而频率通过总线设置方便HMI和上位机远程修改。S7-1200做这个项目时最容易踩的坑是把启停输出做成瞬时脉冲。变频器DI端子是电平型输入脉冲只能点动无法持续运行。所以程序里必须做成“置位/复位”或SR触发器保证启动后Q0.0一直保持TRUE直到收到停止指令或故障信号。2.2 S7-1200做MODBUS RTU需要什么硬件S7-1200本体自带的是PROFINET和PN接口不带RS485物理口。按常见的做法S7-1200做MODBUS RTU需要扩展一个CM1241 RS422/485通信模块或者使用CB1241 RS485通信板。CM1241可以插在CPU左侧扩展槽占用一个IM/CM槽位组态完成后系统会给它分配一个硬件标识符后续程序里的通信指令要用这个标识符来指向端口。如果变频器支持MODBUS TCP也可以不用CM1241直接利用S7-1200本体网口与变频器网口通信。MODBUS TCP不需要处理RS485的极性和终端电阻但要求变频器侧有稳定以太网且现场网络不能有大量广播帧干扰。针对单个变频器做频率读写RTU更抗干扰也更适合老产线改造。所以下面以CM1241 RS485加MODBUS RTU为例。CM1241的接线端子通常是A和B对应RS485的A和B。很多国产变频器标的是“A/B-”或“485/485-”接线时A对A、B对B不要交叉。RS485总线两端各接一个120欧终端电阻一端在CM1241模块上通过拨码或组态启用另一端在变频器侧接线端子并接。通信线推荐用屏蔽双绞线屏蔽层单端接PLC侧保护地不要两点同时接地否则容易形成地环路。下面是一个改造项目的IO分配和接线示意信号S7-1200地址接线目标说明启动按钮I0.0普通常开按钮到1M也可以来自HMI软按钮停止按钮I0.1普通常闭按钮到1M常闭接入断线可检测变频器正转端子Q0.0接变频器DI1电平型运行信号变频器反转端子Q0.1接变频器DI2不需要反转可不接变频器故障复位Q0.2接变频器故障复位DI可选RS485通信CM1241 A/B接变频器A/B-屏蔽双绞线// IO分配表对应的PLC变量表结构TIA Portal中定义 // 名称 数据类型 逻辑地址 // VFD_DI1_Start Bool Q0.0 // VFD_DI2_Reverse Bool Q0.1 // PB_Start Bool I0.0 // PB_Stop Bool I0.1 // MB_Comm_DB GlobalDB TIA数据块有人习惯把启动按钮直接接变频器DI不经过PLC。从功能上可行但会失去PLC对启停状态的感知也无法在通信故障时自动断开运行信号。所以更稳妥的是把所有启停都收进S7-1200由程序把运行状态输出到变频器端子。这套做法的另一个好处是以后要改成自动模式或上位机控制不再需要动硬接线。3. 在TIA Portal里写启停逻辑和MODBUS频率读写程序块3.1 先写外部端子启停输出逻辑再做写频率程序建议拆成两个功能块一个负责启停输出另一个负责MODBUS通信。启停块中不需要处理频率细节只做电平保持和条件联锁。SCL代码如下我习惯把这段放在FB里避免OB1越来越乱// FB VFD_StartStop // 输入: StartCmd, StopCmd, Fault, CommFault // 输出: Q_DI_Start, RunStatus #RunStatus : #RunStatus OR (#StartCmd AND NOT #Fault AND NOT #CommFault); IF #StopCmd OR #Fault OR #CommFault THEN #RunStatus : FALSE; END_IF; #Q_DI_Start : #RunStatus; // Q0.0 - 变频器DI1启动信号用了“保持”逻辑不是常规的线圈输出。StopCmd建议接常闭触点这样急停回路断线时程序会自动停止。CommFault来自后面的MODBUS错误位一旦通信异常就断开端子运行信号避免变频器在无频率刷新时仍带载运行。3.2 MODBUS通信初始化OB100里调用一次S7-1200的MODBUS RTU有两种常见库老一些的MODBUS_MASTER / MODBUS_CTRL以及新指令MODBUS_COMM_LOAD / MODBUS_MSG。新指令的参数更直接。初始化只需要在冷启动时执行一次不需要每次扫描都调。// OB100冷启动中调用 #InitComm( REQ : TRUE, PORT : 257, // CM1241 RS485的硬件ID在设备组态中查 BAUD : 9600, // 必须与变频器参数一致 PARITY : 0, // 0无校验, 1奇校验, 2偶校验 FLOW_CTRL : 3, // RS485模式具体值看模块手册 RTS_ON_DLY : 0, RTS_OFF_DLY : 0, RESP_TIMEOUT : 1000, // 从站响应超时单位ms ERROR #InitError, STATUS #InitStatus );PORT填的是模块硬件ID不是1或2这种逻辑号。BAUD要和变频器侧完全一致。PARITY一般用0无校验对应数据格式8N1如果选用偶校验变频器侧也要改成8E1。RESP_TIMEOUT按从站数量调整单台变频器给500到1000ms足够多台轮询时给到1000ms以上防止轮询到靠后的从站时不响应。3.3 MODBUS_MSG写频率周期刷新而不是只写一次写频率是这套方案的另一个关键动作。很多人只在HMI改变设定值时写一次结果变频器停机再启动后就按上次保持的频率运行。正确做法是周期向变频器写目标频率每次启动前刷新一次运行中继续周期刷新。下面是写目标频率和读输出频率的调用代码// FB VFD_Modbus // 写目标频率保持寄存器40001长度2数据指针指向连续字数组 #WriteReq : #ModbusReady AND NOT #WriteBusy; ModbusMsg_DB( REQ : #WriteReq, MB_MODE : 1, // 1写 MB_DATA_ADDR : 40001, // 变频器频率设定寄存器地址 MB_DATA_LEN : 2, // 写入2个字 MB_DATA_PTR : #FreqCmd, // 数组[0..1] OF WORD DONE #WriteDone, ERROR #WriteError, STATUS #WriteStatus ); // 读输出频率保持寄存器40003读回2个字 #ReadReq : #ModbusReady AND NOT #ReadBusy AND #WriteDone; ModbusMsg_DB( REQ : #ReadReq, MB_MODE : 0, // 0读 MB_DATA_ADDR : 40003, // 变频器输出频率寄存器 MB_DATA_LEN : 2, MB_DATA_PTR : #FreqActual, DONE #ReadDone, ERROR #ReadError, STATUS #ReadStatus );注意两个MODBUS_MSG不能同时置REQ否则后一个会返回忙错误。我一般用“写完成再触发读”的顺序把写排在读前面。数据指针#FreqCmd必须是连续的WORD数组因为多个寄存器是连续读取的用单个INT变量会导致数据错位。3.4 多台变频器轮询频率的调度方法一台上位机同时接4台甚至32台变频器时S7-1200需要按从站地址逐个轮询。每轮询一个站先改MODBUS_MSG的数据块实例或背景DB然后给REQ一个上升沿。典型的步进调度可以放在一个FOR循环或CASE语句里按站号依次执行写频率、读频率、切换下一站。// 轮询调度示意4台变频器从站地址1~4 CASE #Station OF 0: // 写1号变频器频率 #ActiveAddr : 1; // 在这里调用ModbusMsg_DBMB_DATA_PTR指向#FreqCmd[0] IF #WriteDone THEN #Station : 1; END_IF; 1: // 读1号变频器输出频率 // 同样调用ModbusMsg_DBMB_MODE:0 IF #ReadDone THEN #Station : 2; END_IF; // ... 重复到4号站后再回到0 END_CASE;这种写法能避免多个从站频率同时刷新造成的总线占用过高。每个站的写频率、读频率可以共用同一个MODBUS_MSG背景DB关键是切换站号后要重新把MB_DATA_PTR指向对应站的数据区并确保地址偏移正确。4. 变频器参数和MODBUS地址换算S7-1200读写频率要对准哪个寄存器4.1 变频器侧必须参数让“端子启停”和“通信给定频率”同时生效变频器侧要设置两组源一组是运行命令源决定启停从哪里来一组是频率给定源决定频率从哪里来。两者可以独立设置。比如把运行命令源设为“外部端子”频率给定源设为“通信给定”那么启停信号只在DI端子上有效频率则只认通信数据。常见的设置步骤如下功能参数名称示例推荐设置说明频率给定源P00 频率来源通信给定不是面板不是模拟量运行命令源P01 运行指令外部端子DI1启动DI2停止或反转波特率P02 通信波特率9600与S7-1200侧一致数据格式P03 数据位/校验8N1无校验8数据位1停止位从站地址P04 Modbus站号1从站地址不能为0通信超时P05 通信丢失动作自由停车超时后必须安全停车不同品牌参数号差异很大但上述结论通用。施耐德ATV320、三菱D700、西门子G120都有类似选择关键是找到“频率给定源”和“运行命令源”两个参数。这里要留意的是“运行命令源设为外部端子”后通信控制字就不会再启动变频器这正是我们想要的——启停交给端子频率交给MODBUS。4.2 MODBUS地址和协议地址的换算变频器手册通常会给一张寄存器表标着“地址(Hex)”或“modbus地址”。S7-1200的MODBUS_MSG填的MB_DATA_ADDR是“MODBUS地址”不是协议地址。两者差一个字号保持寄存器40001对应的协议地址是0x000040002对应0x0001。如果手册写“频率设定寄存器地址0002H”换算到S7-1200指令里就是40001加上2即40003。这个偏差是现场最常见的低速问题写错后读写指令会返回功能码错误或者读回一堆0。手册协议地址MODBUS_MSG输入实际报文寄存器地址0000H400010x00000001H400020x00010002H400030x00022000H480010x2000如果要用功能码03、06还是16不要强行指定。MODBUS_MSG的MB_MODE和MB_DATA_ADDR组合会自动决定功能码。写单个寄存器用MB_MODE1、地址40001写多个寄存器用MB_MODE2或者数据长度大于1。以你手上的指令库为准先确认版本里的MB_MODE定义。4.3 S7-1200侧通信参数检查表在TIA Portal里除了硬件ID还要确认以下参数被正确组态参数项推荐值原因通信模块端口模式RS485CM1241支持RS422/485必须选RS485终端电阻启用只有一台变频器时也建议启用通信指令扫描周期OB1循环或定时OB不要在多个OB里同时调用同一个ModbusMsg超时次数连续3次错误才报故障防止总线瞬时抖动导致停机有一个使用习惯值得说不要简单地把MODBUS_MSG放在OB1最后而不考虑扫描周期。Modbus通信本身是异步的一个MS指令可能跨多个PLC扫描周期完成。如果OB1执行时间很短REQ信号直接由BOOL变量持续置TRUE会出现“REQ在DONE之前就被重复触发”的问题。我用一个#ModbusBusy状态位REQ只在IDLE状态下给一个上升沿能明显降低报错频率。4.4 用Modbus Poll做通信对表把PLC、变频器、CM1241都接好但频率读写不通时最直接的方法是先抛开S7-1200用PC的USB转RS485接变频器再打开Modbus Poll工具填从站地址、波特率、功能码和寄存器地址。比如目标是读变频器状态字就填功能码03起始地址填219或寄存器表里的实际地址读取长度填1。Modbus Poll能让工程师立刻看出是变频器没回数据还是回的数据解析错误。热词里提到的Modbus Poll、Modbus Slave、Modscan都是这类工具它们的作用是简化调试不替代程序逻辑。5. 调试时最值得检查的MODBUS收发细节和S7-1200端子启停验证技巧5.1 先甩开PLC用Modbus Poll验证变频器从站在S7-1200里去查RS485线序和波特率不一致的问题非常痛苦。更快的办法是把CM1241的A、B两根线从端子拆下接上一个USB转RS485转换成PC口用Modbus Poll手动读写变频器。能读到频率设定寄存器值说明变频器从站正常写进去再读不出来多半是寄存器地址偏了一位或频率倍率不对。这一步是整套调试的分水岭能排除掉PLC程序因素。5.2 启停端子动作后再发写频率命令外部端子启停和MODBUS频率的配合顺序比大部分人想象得更讲究。变频器很多机型的频率寄存器在停止状态下也能写入但写入值会在重启后被寄存器中的旧值覆盖或者被运行命令上升沿锁存。因此我一般会在启动命令Q0.0置TRUE后延时500ms再启动一次写频率任务。这样变频器内部先完成运行状态切换频率给定源再刷新能有效避免“合闸瞬间频率窜到最大”的隐患。5.3 通信故障与端子运行信号的联锁最后补一个实用的软保护。S7-1200读到MODBUS_MSG的ERROR或者连续超时后不光要报故障还应该把启停端子信号拉掉。之前用过的项目因为漏了这一步发生过一次通信线被老鼠咬断后变频器按最后一次频率持续运行三小时的情况。代码可以这样写// 连续两次读写失败判定通信故障断开外部端子启停 IF #WriteError OR #ReadError THEN #FailCount : #FailCount 1; ELSE #FailCount : 0; END_IF; IF #FailCount 2 THEN #CommFault : TRUE; // 进入3.1中的CommFault END_IF;在TIA Portal在线监视时除了看#CommFault我还会把STATUS和ERROR送到HMI报警区。S7-1200的MODBUS_MSG的STATUS值对应的16进制错误码例如0x8180、0x818F可以直接按指令帮助中的错误列表查阅比凭经验猜更省时间。5.4 验证整套方案的最终动作把启动按钮按下Q0.0变为TRUE变频器DI1带电之后观察HMI上读回的当前频率是否跟设定频率一致再把设定频率改成10Hz、25Hz、45Hz每次改完看输出频率在1秒内是否跟随。跟随说明MODBUS读频率正常不跟随则重点排查频率源参数是否仍是面板给定。这套验证做完才算是真正的“外部端子启停MODBUS读写频率”闭环。本文还有配套的精品资源点击获取