恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
M580与ATV930通过Modbus TCP实现以太网通讯实验
首页
资讯中心
/
M580与ATV930通过Modbus TCP实现以太网通讯实验
M580与ATV930通过Modbus TCP实现以太网通讯实验
发布时间:2026/10/15 5:35:20
简介围绕施耐德M580 PLC与ATV930变频器以太网通讯的实战型实验指导文档面向工业自动化、PLC编程与变频器调试领域的工程师及电气专业学生。文档以Modbus TCP/IP和Ethernet IP两种通讯方式为主线依次梳理实验目的、设备清单、M580与ATV930的通讯端口、变频器参考频率及IP分配参数设置并分别演示通过READ_VAR/WRITE_VAR功能块实现Modbus TCP/IP通讯、通过嵌入式以太网配置实现Ethernet IP通讯的实验过程。其中特别强调了RJ45端口区分、DTM在线修改时PC与PLC必须网线连接、断电重启使参数生效等常见注意事项可帮助读者少走弯路并快速搭建同类通讯实验。资源为docx格式压缩包内共1个文件大小3.55MB已有4408人浏览学习适合作为从入门到进阶的实操参考。1. 一条网线能省掉几十根控制线这个实验到底在做什么一台 M580 PLC 和一台 ATV930 变频器之间如果不走以太网常规做法是启停、方向、给定、故障复位一路硬接线算下来二十多根线。这个实验要把这些信号全部塞进一根网线M580 用自带以太网口周期轮询 ATV930通过 Modbus TCP 交换控制字和频率给定同时读回状态字和输出频率。适合手里正好有 M580 CPU 和 ATV930、想用网络通道替代离散量 IO 的同行也适合第一次做施耐德系 PLC 与变频器通讯、需要一个半天内能跑通样板的人。读完你会得到一份从 IP 规划、寄存器映射到 IO Scanner 配置的作业模板外加几条靠手册查不出来的坑。2. 先选协议再谈接线Modbus TCP 与 IO Scanner 的取舍2.1 为什么是 Modbus TCP而不是 Profinet 或硬线 IOATV930 这台变频器上其实同时支持好几种以太网协议Modbus TCP、EtherNet/IP、Profinet 都能跑。选型时先看对端是谁M580 的 CPU 自带以太网口原生就是 Modbus TCP 主站不需要加任何协议模块配置入口就在 Control Expert 的以太网口属性里这对搭建样板实验来说是最短路径。如果走 ProfinetM580 侧要额外配 Profinet 主站模块涉及设备名、GSD 文件、IO 周期和实时性等级调试工具链也重如果你手头没有 Profinet 主站实验根本推不动。EtherNet/IP 在 M580 上也能做通过 Ethernet/IP 扫描器配置但要理解 Assembly 实例、CPR 和 RPI 那套概念同样是把简单问题变复杂。做实验的目的不是展示协议多而是用最短时间把电机转起来、把速度读回来。Modbus TCP 的报文本就是透明的用 Wireshark 抓包能看到每一个读写的寄存器地址对排查问题极其友好。硬线 IO 方案的问题在于启停、方向、复位、故障、给定、反馈全是独立点线多不说点位定义一旦变了就要改柜内接线故障定位全靠万用表在端子上量。而 Modbus TCP 把需要交互的数据集中到几个寄存器里PLC 程序里改一个位、改一个系数就能调整行为实验阶段改参数比改线快一个数量级。我的观点是如果你的项目里同时存在多台 ATV930或者未来要读电流、功率、能耗这类附加数据这个实验方向值得投入如果永远只有一台且控制逻辑极其简单硬线也够用但学习价值不在同一层面。2.2 ATV930 侧要用的 4 个寄存器CMD、状态字、给定、反馈打通 Modbus TCP 最少只需要 4 个保持寄存器这 4 个地址是整个实验的骨架。我一般先把它们写在一张纸条上贴在变频器面板旁边因为 IO Scanner 配置和 PLC 程序都要反复引用寄存器地址十进制十六进制名称读写方向实验中的作用85010x2135CMD控制字PLC - 变频器启停、方向、故障复位85030x2137ETAst状态字变频器 - PLC就绪、运行、故障标志86010x2199LFRD频率给定PLC - 变频器给定速度参考86030x219BRFRD输出频率反馈变频器 - PLC实际输出频率这里有一个新手最容易踩的坑ATV930 的寄存器体系和老款 ATV71/ATV61 不一样老款习惯用 40152 当控制字、40153 当状态字直接套用手册里的旧表格会把数据写到完全不相干的位置轻则变频器无响应重则误触发写入故障。ATV930 使用的是新平台地址CMD 在 8501状态字在 8503。我每次做实验前都会在面板的通讯菜单里再确认一次当前固件的映射表因为个别早期固件的地址偏移会有差异不信图省事。另外要注意“4x”前缀的含义。Modbus 里 4x 指保持寄存器IO Scanner 和大多数组态工具填地址时写成 4x08501而不是把寄存器编号换算成 40000 8501 再填。实际操作中有人把 8501 写成 48501这就错得更离谱了——48501 是 4 区偏移 8500 的另一种写法吗是但如果工具自动加 40001就可能变成 88502 之类的越界地址。我的习惯是在 Control Expert 的 IO Scanner 里严格按“4x 4 位数字 寄存器号”填例如 4x08501如果工具里是单独填寄存器号就填 8501同样写 4x 和不写 4x 效果一样。2.3 IO Scanner 与 READ_VAR/WRITE_VAR 的区别周期和 CPU 占用M580 读写 Modbus 从站有两条路一条是程序里调用 READ_VAR / WRITE_VAR 功能块另一条是配置 IO Scanner 扫描表。很多第一次做的人上来就用 READ_VAR结果发现程序扫描周期稍长一点变频器那边就报通讯超时这是因为 READ_VAR 是“按需访问”程序跑到才发报文被打断就被推迟。IO Scanner 则完全不一样它是网口硬件后台按固定周期自动收发不占用 MAST 任务时间也不受程序扫描周期抖动影响这一点在控制变频器时特别重要。我一般这样分工读写要求稳定周期的信号走 IO Scanner例如控制字、状态字、频率给定、输出频率偶发的一次性请求例如读变频器型号、读累计运行时间、写一套完整参数用 READ_VAR/WRITE_VAR 在程序里触发。实验阶段全部数据都可以走 IO Scanner先把循环数据打通再根据需要补充功能块调用。还要说清 IO Scanner 在 M580 上的地位它不是一个单独的模块而是 CPU 内置以太网口的一组扫描条目每个条目定义一个远程 IP 上的一段寄存器。扫描周期可以设为 10ms、20ms、50ms对变频器这种对象50ms 足够平滑实际项目我也常用 50ms因为 ATV930 的给定斜坡本身就会过滤掉给定值的跳变。周期太快反而容易在网线松动或交换机拥塞时触发通讯故障没必要追求极值。3. 网络组态实操把 ATV930 变成 M580 的一个 IO 从站3.1 ATV930 面板上要做的四步设置拿到一台新的 ATV930我建议先恢复一次出厂设置避免上一手留下的参数影响判断。在面板主菜单里找“管理 / 诊断”一类的入口执行恢复出厂完成后变频器会回到默认配置。接着按下面四步设置通讯参数全程可以在面板上完成不需要额外软件第一步固定 IP。ATV930 出厂的以太网默认 IP 通常是 10.10.0.1这个地址在实验环境里不一定和 PLC 同网段必须改成自己规划的固定地址。我的规划是PLC 用 192.168.10.1变频器用 192.168.10.30子网掩码 255.255.255.0。在面板菜单里找到“通讯 - 以太网 - IP 配置”把 DHCP 关掉手动填入 IP、子网掩码和网关。网关可以留空因为实验环境只有两台设备直连。第二步确认 Modbus TCP 服务开启。ATV930 的以太网口默认就启用 Modbus TCP一般不需要额外打开。但我在现场遇到过固件被改过、服务被关掉的情况所以在同一个“以太网”菜单里检查“Modbus 服务”或“协议”项是否处于启用状态。如果这里显示的是禁用后面 PLC 怎么扫都扫不到。第三步设置给定源。变频器要能接收网络下发的频率必须把“给定通道 1”切到 Modbus TCP。在参数菜单里找到 Fr1 或者“频率给定 1”这一项把值改为“Modbus”或“网络”。我习惯连“组合模式”一起检查如果控制模式里跑的是本地面板给定改成网络也启动不了。简单做法是直接把命令通道也设为“Modbus TCP”让启停、给定全部从网络来。第四步设置通讯超时行为。ATV930 有个参数决定“网络连接丢失后变频器怎么办”默认一般是报故障并自由停车。实验初期可以保留这个默认行为方便暴露问题。调试完成后如果你的现场不允许掉线就停车再把该参数改成“保持上次给定”或“按斜坡停止”。这一步先不用纠结知道它在哪里就行。3.2 M580 以太网口固定 IP 与直连网线M580 CPU 前面板有两个以太网口一个用于编程和 IO 扫描另一个通常保留给其他用途。实验为了减少干扰因素我用一根普通超五类直连网线把 PLC 的一个网口和 ATV930 的以太网口直接连起来中间不经过交换机。M580 CPU 上有旋转开关 SW1 和 SW2出厂时如果拨在非零位置CPU 上电后会按旋钮组合生成固定 IP而不是使用工程里的 IP 配置。实验前我把这两个旋钮都拨到 0表示“使用 Control Expert 中保存的配置”。拨完旋钮再上电不然改了不生效。然后在 Control Expert 里给 CPU 的以太网口分配固定 IP。双击设备树里的 CPU在“以太网口”属性里禁用 DHCP填入 192.168.10.1子网掩码 255.255.255.0。下载工程前检查一下“IP 分配”是不是真的写进了工程有些项目里 CPU 的 IP 还在用默认值 10.10.10.x下载后 PLC 可能连不上下载完成后再次上电确认。直连后先别急着配 IO 扫描表先做一次连通性测试。电脑的网线临时也接到同一台调试网里或者直接用 M580 的编程口隧道去 ping 变频器。我用电脑 ping 变频器时习惯一直开着持续模式ping 192.168.10.30 -t正常情况下回包时间应该在 1ms 以内如果超时或者丢包先查网线、查 IP、查面板上有没有“网络故障”提示不要一头扎进 IO Scanner 配置。连通性是后面所有工作的前提我见过有人扫了半个小时最后发现 ATV930 的 IP 输错了一位。3.3 在 Control Expert 的 IO Scanner 里登记寄存器连通之后在 Control Expert 里配置 IO Scanner。路径一般是设备树 - PLC 总线 - CPU - 以太网口右键打开“IO Scanner”。打开后里面是一张扫描表每一行对应一个远程寄存器段。我在实验里建立 4 个扫描条目条目方向远程设备起始地址长度字周期用途1读192.168.10.304x08503150ms状态字2读192.168.10.304x08603150ms输出频率3写192.168.10.304x08501150ms控制字4写192.168.10.304x08601150ms频率给定填表时有个细节读和写不要试图合并进同一个条目。ATV930 的保持寄存器虽然都是 4x 区但读操作和写操作在 Modbus 里是不同功能码M580 的 IO Scanner 对每个条目只能选择一种方向。控制字和给定虽然相邻也必须是两个独立的写条目。我就见过有人把 8501、8601 放在一个长度 2 的条目里结果 PLC 端报交换超时。每条扫描入口可以关联一个符号变量。我给四个条目分别起名STATUS_W、RFRD_W、CMD_W、LFRD_W这样程序里只碰符号名不纠结具体 IO 地址。IO Scanner 的实际数据区会由 Control Expert 自动分配一般落在 %IW 或 %QW 区域你不需要手动记。3.4 打通前的可观测性先把状态字读回来IO Scanner 配置完成后不要立刻写控制逻辑先把程序下载到 PLC打开在线监控看 STATUS_W 这个变量有没有变化。变频器上电且网络通讯正常时状态字的 bit0就绪应该是 1也就是说 STATUS_W 的值至少是 1。如果看到 STATUS_W 一直是 0或者 IO Scanner 条目报通讯超时直接去排查网络层例如 IP 网段、网线、Unit ID。Unit ID 是这里最容易被忽略的一项。ATV930 做 Modbus TCP 从站时默认的 Unit ID 一般可以填 0 或者 255具体由变频器的“设备地址”参数决定。我第一次做这个实验时 IO Scanner 里填的是 0结果变频器完全没有反应面板上也没有错误码后来把 Unit ID 改成和变频器面板里显示的设备地址一致数据立刻开始刷新。建议实验前先到变频器“以太网 - Modbus TCP - 设备地址”里看一眼把 IO Scanner 里的 Unit ID 对齐。状态字能读到就说明整条链路已经打通PLC 的 IO Scanner 在用 Modbus TCP 周期访问 ATV930变频器每 50ms 回一次状态。这时候再往下写控制字和给定做起来就有底了。4. 启停逻辑与频率给定换算从写寄存器到电机转起来4.1 控制字的位操作启停、反向、自由停车、故障复位CMD 是一个 16 位字ATV930 新平台的控制字采用按位定义的方式。以我这次实验用的固件为例各 bit 的含义如下位含义置 1 时的行为bit0运行命令变频器启动按给定方向运行bit1方向1 为反向0 为正转bit2自由停车封锁输出电机滑行停止bit8故障复位给出一个脉冲清除当前故障使用前最好和手里的固件手册核对一次位定义不同版本存在差异。实验里我把控制字放到 MAST 任务里用位访问的方式拼接不直接写整数值这样将来加功能也清晰(* 启停与方向逻辑MAST 任务中持续执行 *) CMD_W.%X0 : bCmdRun; (* bit0运行命令 *) CMD_W.%X1 : bCmdReverse; (* bit1方向选择 1反转 *) CMD_W.%X2 : bCmdCoast; (* bit2自由停车 *) (* 故障复位只执行一个扫描周期 *) IF bFaultResetCmd THEN CMD_W.%X8 : TRUE; ELSE CMD_W.%X8 : FALSE; END_IF;这段代码的逻辑说明四个位分开控制互不影响。正常启动时把 bCmdRun 置 TRUEbit0 为 1 变频器开始运行要停止时把 bCmdRun 清 FALSEbit0 变 0变频器按停车模式减速停机。bit1 控制方向注意在运行中切换方向应先停机再反向不要直接翻转否则会报过流或反倒转故障。bit2 是自由停车适合急停场景。bit8 是故障复位PLC 这边给一个扫描周期的 TRUE 脉冲就够了持续置 1 没有意义。有一个细节值得强调IO Scanner 的写周期是 50ms而 MAST 任务可能跑得比 50ms 快。MAST 里对 CMD_W 的修改并不会立刻送出去而是由 IO Scanner 按自己的周期取最新值发送。所以故障复位脉冲在 MAST 里只持续了一个周期也不怕IO Scanner 会在下个 50ms 周期把带 bit81 的控制字发出去。但如果 MAST 里置位和复位只隔了一个周期且这个周期小于 IO Scanner 的发送周期发送方实际看到的可能只有复位后的值故障就没复掉。稳妥做法是用一个定时器把复位脉冲拉长到 200ms 以上确保至少被发送一次。4.2 频率给定的 16 位带符号百分比换算ATV930 的频率给定寄存器 LFRD8601既不是直接的 Hz 整数也不是 BCD 码而是带符号的 16 位百分比。换算规则是32767 对应 100% 的正向额定频率0 对应 0Hz负值用补码表示反向。以电机额定频率 50Hz 为例想要 30Hz需要算 30/50 * 32767 ≈ 19660写入寄存器的是十进制 19660。我第一次做这个实验时在这里翻过车直接往 LFRD 里写了个 500以为就是 50.00Hz结果电机慢悠悠转了不到 1Hz当时还以为是变频器坏了。后来查手册才明白通信给定走的是百分比标度不是定点小数。这也是整个实验里最容易被误解的地方。正确换算代码(* 频率给定换算额定频率 50.0Hz目标 30.0Hz *) rPercent : (rTargetHz / rRatedHz) * 100.0; (* 先转百分比 *) iGivenInt : REAL_TO_INT(rPercent * 327.67); (* 再缩放为 16 位带符号值 *) (* 限幅保护 *) IF iGivenInt 32767 THEN iGivenInt : 32767; END_IF; IF iGivenInt -32767 THEN iGivenInt : -32767; END_IF; LFRD_W : INT_TO_WORD(iGivenInt);这里有个更直观的记忆方法把 32767 想象成“满刻度”给 10% 就写 3277给 50% 就写 16384给 100% 就写 32767。反向时写负值INT 转 WORD 会自动变成补码形式。再说明一点这里的 100% 对应的是电机的额定频率不是 100Hz如果你的电机额定频率是 60Hz那么 32767 对应的就是 60Hz公式里一定用电机铭牌上的额定频率做分母。调试时可以先给一个很小的值验证比例关系目标 5Hz、额定 50Hz算出来是 3277。启动后看反馈寄存器 RFRD_W 读回来的值换算成频率是不是接近 5Hz再慢慢加大不要上来就给 32767 满转怕机械或对中没检查就出危险。4.3 首次通电要看的三个现象面板、状态字、反馈逻辑写完后第一次上电我建议不要急着按启动先观察三个地方。第一个是变频器面板正常情况下会显示“网络控制”或类似图标说明命令源和给定源都已经切到了 Modbus TCP。如果面板上仍然显示“终端控制”或本地面板图标说明 CM1 或 Fr1 没有真正切过去控制字写过去也不会有反应。第二个是状态字的 bit0 和 bit1。bit0 为 1 表示变频器就绪可以在程序里先把这个状态做进面板或触摸屏bit1 为 1 表示正在运行。如果 bit0 一直为 0可能是变频器处于故障状态或者没有使能先看面板有没有故障码。第三个是反馈频率 RFRD_W。启动后反馈值会跟着给定值走电机的实际频率和给定频率之间的偏差取决于加速时间和负载。如果反馈完全不动先看是不是 IO Scanner 里把 8603 的地址填错了。按规定写 4x08603有的人想当然填成 8503结果读回来的其实是状态字反馈看起来就是乱的。这三个现象配合起来能快速定位一大半问题面板代表参数配置状态字代表链路反馈代表执行结果。每次实验我都按这个顺序检查而不是一上来就逮着某一个寄存器猜。5. 以太网通讯实验避坑现象、原因和解决办法5.1 现象 1面板一直报 nLP变频器根本不响应现象ATV930 面板上显示通讯故障代号类似 nLP 或通讯断线变频器不收任何 Modbus 请求IO Scanner 条目状态显示超时。 原因这个故障码是 ATV930 在“规定时间内没收到主站请求”时触发的。常见原因有三个PLC 侧 IO Scanner 没启动、IP 网段不通、Unit ID 对不上。我实验里遇到最多的是第三种因为 ATV930 默认设备地址和 PLC 侧填的 Unit ID 不一致而且 IO Scanner 报错的提示并不直接告诉你是地址问题。 解决先面板进“以太网-Modbus TCP-设备地址”确认当前值再把 IO Scanner 里的 Unit ID 改成一致。同时把通讯超时参数 tCO 从默认值调大例如 1000ms避免因为偶尔一次扫描超时就让变频器掉线。改完之后断电重启变频器让新参数生效。5.2 现象 2控制字明明写了 1电机却不转现象监控程序里 CMD_W 已经是 1状态字也正常但电机纹丝不动触摸屏上也没有故障码。 原因多半不是通讯问题而是命令通道没有切到网络。ATV930 出厂默认的命令源可能是端子排或面板控制字只能通过“当前有效的命令通道”触发启动。另一种可能是你写的 CMD_W 是 16 位字但 IO Scanner 写条目配置成了“读”数据实际没发出去。 解决先看面板上是不是“网络控制”图标亮没有就检查 CM1 参数把命令通道 1 改成 Modbus TCP。再回 Control Expert 里检查 IO Scanner 里第四个写条目的方向是不是写地址是不是 4x08501。如果方向错了把条目删掉重建避免只改方向保留缓存。5.3 现象 3给定值 50输出频率对不上现象给了某个数字电机转了但频率完全不在预期范围内例如写 500 只转出 0.49Hz或者写 16384 转了 50Hz 而你本意是给 16.384Hz。 原因给定寄存器用的不是整数 Hz也不是千分比而是带符号 16 位百分比。500 对应的是 500/32767 * 50Hz ≈ 0.76Hz所以输出低频是正常的。很多人第一次接触这个格式都会在这里困惑因为它和模拟量通道里 0-10V 对应 0-50Hz 的线性标度是两回事。 解决统一按“百分比-满刻度”换算控制器里把目标赫兹先除以额定频率再乘以 32767。建议把这段换算封装成一个函数块所有变量都用实际工程单位Hz、rpm寄存器里才做标度转换这样程序里其他人都能看懂。5.4 现象 4IO 扫描表填完 PLC 报数据交换超时现象Control Expert 在线监控里IO Scanner 的某个条目显示交换超时对应的输入变量不刷新。 原因条目配置问题居多。常见的包括起始地址格式写错例如填 8501 却漏了 4x 前缀读写方向写错寄存器长度写错还有前面提过的 Unit ID 不匹配。另外有一种情况你同时配置了多个写条目指向同一个 IP但其中一个地址超出了 ATV930 允许的范围整个设备的扫描会话都会被拖垮。 解决先删掉所有条目只保留一条读状态字的试试。能通再逐个加回写条目。这样能把问题锁定在哪一行配置上而不是几个条目一起排查。ATV930 的通讯手册里通常会写明支持的寄存器范围和功能码填之前扫一眼边界值。5.5 现象 5拔网线掉线后重新上线变频器不进运行状态现象实验过程中拔了网线或者 PLC 重启网线插回去之后状态字恢复了但变频器停在就绪状态给启动命令也不动。 原因ATV930 在检测到网络丢失后根据 tCO 参数选择报故障并停止输出。虽然后续网络恢复但故障锁存还在必须做一次故障复位才能清除。PLC 重启时 IO Scanner 必然有一段空窗这个空窗超过 tCO 就会触发同样的机制。 解决程序里做一个上电自动复位PLC 启动后延时 2 秒给 CMD_W 的 bit8 一个脉冲。如果现场不允许掉电重启后自动复位那就保留手动复位按钮。另一个更治本的做法是把 tCO 改成“网络丢失后保持上次给定”但这样有安全风险电机会在通讯中断时一直保持运行是否符合现场安全要求要单独评估。6. 进阶把整个实验封装成一个 DFB多台变频器批量管理实验跑通后建议把“起停 给定 状态反馈”这组逻辑封装成一个 DFB而不是散落在主程序里。我通常给这个块起名叫 ATV930_CTRL对外接口按工程单位定义接口方向类型说明bCmdRun输入BOOL运行命令bCmdReverse输入BOOL反向命令bCmdCoast输入BOOL自由停车bFaultReset输入BOOL故障复位脉冲rTargetHz输入REAL目标频率STATUS_W输入WORDIO Scanner 读回的状态字RFRD_W输入WORDIO Scanner 读回的频率反馈CMD_W输出WORD写入的控制字LFRD_W输出WORD写入的频率给定bReady输出BOOL就绪状态bRunning输出BOOL运行状态bFault输出BOOL故障状态rOutputHz输出REAL实际输出频率块内部做三件事把状态字按位拆成 bReady、bRunning、bFault把 rTargetHz 用 16 位带符号百分比公式换算成 LFRD_W把启停、方向、自由停车、故障复位按位拼装到 CMD_W。比例换算参数额定频率做成块的输入或实例变量这样同一套块既可以驱动 50Hz 电机也可以驱动 60Hz 电机。多台变频器场景下别复制粘贴一堆变量。Control Expert 里可以建一个结构体数据类型字段就是上面那十几个接口然后定义一个数组比如 [1..8] OF ATV930_DATAIO Scanner 里每个变频器占四个条目每条目关联到数组元素的一个字段。MAST 任务里再用一个 FOR 循环批量执行换算和位拼装代码量基本不随台数增长。IO Scanner 有一个健康位或错误码标识每条扫描是否正常这个要放到报警画面里不然变频器掉线了操作员也不知道。这个实验做完最大的收益不是省了二十根线而是建立了一个可以复用的通讯模板。后续接第二台、第三台变频器只需要改 IP 和数组下标不用重新设计通讯逻辑。做个实验时我习惯把参数和现象记录成一张表先写寄存器预期值再写实际读到值那种“好像通了又说不上哪里通”的状态最容易掩盖问题。希望这篇笔记能帮你少走几趟弯路顺着这套路径顺利把实验跑通。本文还有配套的精品资源点击获取