施耐德 M340、M580、昆腾 PLC CPU 及网卡模块 NOC、NOE 配置 ModbusTCP 通信方法

施耐德 M340、M580、昆腾 PLC CPU 及网卡模块 NOC、NOE 配置 ModbusTCP 通信方法 文章目录总体介绍1. 做客户端通过【I/O扫描器】服务DTM 中配置 DIO进行读写概述相关文档这种配置的特点具有此功能的模块这种方法的优缺点定义说明两种变量 -- 定位变量、非定位变量DTM 总体配置流程DTM 配置实例DTM 配置实例 1使用 M580 CPU 自带网口DTM 配置实例 2使用 NOC 网卡自带网口2. 做客户端通过内部程序调用功能块进行读写概述相关文档这种配置的优缺点2.1 不同型号 PLC 使用的通讯功能块2.2 M340、M580 ModbusTCP 通信相关程序块2.3 程序块读写的示例程序M340 / M580 / X80 IO 平台读写内部寄存器2.4 功能块的参数配置参数变量 GESTREAD_VAR 和 WRITE_VAR 中使用M340、M580、X80 IOADDM 功能块指定功能块使用的通讯端口M340、M580、X80 IO2.4 ADDM 功能块配置实例ADDM 配置实例 1使用 M340 CPU 自带网口ADDM 配置实例 2使用 NOE 网卡模块的网口ADDM 配置实例 3使用 NOC 网卡模块的网口ADDM 配置实例 4使用 M580 CPU 上的网口3. 做服务端进行数据交换3.1 概述相关文档这种配置的特点具有此功能的模块这种功能的优缺点3.2 实例使用 modbus-poll 对仿真的 M340 中的数据进行读写4. 一些小问题4.1 PLC 做服务器时寄存器起始地址设置4.2 各种通讯方式的限制CPU 自带网口 DTM 通信的限制 CPU 网口作客户端使用 I/O 扫描器进行 Modbus-TCP 通信NOC 网卡 DTM 通信的限制 NOC 网卡作客户端使用 I/O 扫描器进行 Modbus-TCP 通信最大请求数量限制最大节点数量限制最大数据量限制使用功能块做客户端进行读写的限制PLC/模块主动读写其他设备做服务端进行数据交换PLC/模块相应其他设备的读写请求4.3 更简便的功能块客户端通讯使用 GPL 库进行通讯4.4 PLC 作服务器时的通讯参数站号、寄存器范围及对应关系总体介绍施耐德 M340、M580、昆腾 PLC 及网卡模块支持 Modbus-TCP 协议进行数据读写PLC 本身支持做客户端或服务端作为客户端时PLC 模块主动发起请求向其他设备读写数据作为服务端时外部设备主动发起请求读写 PLC 中的数据1. 做客户端通过【I/O扫描器】服务DTM 中配置 DIO进行读写概述相关文档各模块说明书这种配置的特点配置完成后对应模块作为 Modbus 客户端自动周期性读写PLC 中无需额外编写通讯程序“扫描器”名称估计是来源于 Ethernet/IP 中的 IO Scanner 功能这里类似 Modbus 协议中的扫描器这个功能需要打开编程软件的【DTM 管理器】在 DTM 界面中配置 DIO具有此功能的模块老 Quantum 系统Quantum IO 平台中的 NOE、NOC 网卡老 Quantum 系统140 系列 CPU、新 M580 系统中的 CPU 网口新 M580、M340 系统X80 IO 平台中的 NOE、NOC 网卡M340 CPU 自带的网口一般不支持此功能总结大型 PLC 的网口、额外买的网卡模块一般都支持加钱就能变得更强注意这个功能在新旧两代平台上的叫法可能略有不同但本质的配置方法、特点是一致的都是在 DTM 界面里边进行配置配置好后无需额外编写通讯程序这种方法的优缺点优点不需要额外编程系统自动周期型读写数据对应模块自动进行轮询、错误处理在大批量读写数据时可以节省编写通讯程序耗费的大量时间新一代平台M580使用这种读写方法数据暂存在【非定位变量】数组中可以很方便的进行数据与 PLC 内部地址的映射未映射的数据不会占用 PLC 宝贵的对外通信的寄存器地址资源 。缺点数据更新的周期相对程序是异步的程序无法控制数据刷新的时序只支持内部寄存器的读写功能码 03、06、16、23对应%MW数据若要读写其他类型的数据、或是使用其他功能码还得老老实实写程序来读部分硬件使用这种方法有通讯数据量的限制详见最后一章中的描述如果想用这种方式进行大数据量通讯需要额外采购 NOE、NOC 网卡模块进行通讯得加钱DTM 配置无法批量导入/导出配置如果配置很多只能一个一个手动配置挺麻烦的DTM 配置无法在线修改如果要修改 DTM 配置需要离线编译后全量下载程序到 CPUNOC中配置的请求是并发多连接的若对应的服务端不支持多连接则会出现短时丢包、响应不及时的问题要实现单连接一次只激活单个请求需要使用功能块编程实现定义说明两种变量 – 定位变量、非定位变量上面的说明涉及到施耐德内部定义变量概念定位变量、非定位变量非定位变量没绑定 PLC 内部地址的变量类似西门子博途中优化的数据块中的变量PLC 内部的程序可通过变量名称进行读写但外部设备无法访问。非定位变量在保证内部的程序正常读写的情况下不会占用 PLC 宝贵的对外通信的寄存器地址资源 。非定位变量的数量由 COU 的存储容量决定可以定义很多非定位变量。定位变量绑定了 PLC 内部寄存器地址如%MWXXX、%MXXX的变量PLC 内部可通过内部寄存器地址 或 变量名读写此变量外部设备可通过内部寄存器地址度读写数据这是施耐德 PLC 的特点详见客户端的特点。但 CPU 的内部寄存器数量有总数限制总数最大不超65000。DTM 总体配置流程项目设置M580 建议进行的一些配置在 DTM 管理器中对应模块下【添加从站设备DIO 设备】在 DTM 管理器中的对应模块下【配置每个 DIO 设备的参数】名称、IP 地址等在 DTM 管理器每个从站设备下【配置每个 DIO 的“请求”参数】每个请求读写的寄存器数量、读写的寄存数量、错误处理、读写周期等一个“请求” 一个 Modbus 数据包DTM 配置实例DTM 配置实例 1使用 M580 CPU 自带网口省略操作方法同 NOC 网卡DTM 配置实例 2使用 NOC 网卡自带网口参考文章https://m.gkong.com/bbs/468223.ashx自己写的文章还没写完先挖个坑2. 做客户端通过内部程序调用功能块进行读写概述相关文档《EcoStruxure™ Control Expert - 通讯 , 功能块库》https://www.schneider-electric.cn/zh/download/document/33003683K01000/《EcoStruxure™ Control Expert - 通讯服务和架构、参考手册》https://www.schneider-electric.cn/zh/download/document/35012196K01000/《用于 Ethernet 的 Modicon M340 - 通讯模块和处理器 , 用户手册》https://www.schneider-electric.cn/zh/download/document/31007493K01000这种配置的优缺点优点程序可以控制数据刷新的时序及逻辑如禁用、跳站、优先级等功能理论上不限制通讯的数据总量但实际上要考虑并发问题、刷新周期问题可根据客户端是否支持多连接灵活配置轮询/并发逻辑若是轮询需要考虑超时时间配置、轮询时间配置、优先级若是并发需要考虑并发通讯资源限制见最后一章支持各种功能码数据的读写不同功能码的调用对应的功能块即可对于 M580 PLC增减功能块支持在线增量修改编译上面的 DTM 配置就不能在线修改需要先离线编译后重新上传完整的程序程序段文件xst、xdb、xld 文件理论上为 XML 格式的文件可在外部批量生成后导入参考我的文档先挖个坑缺点施耐德的相关文档、资料比较少要做好自己啃文档的心理准备个人感觉资料比 AB 的还少不同型号的 PLC 使用的程序各不相同移植性较差参考上面一小节需要额外编程如实现以下逻辑对于大佬来说也可以理解为优点参数初始化、错误信息记录/清除、错误复位轮询/并发处理轮询方式根据标志位轮询、根据时间段分片轮询并发方式结合多连接的多个功能块/请求并发控制优先级如指定优先级写控制指令 写一般数据 读状态数据 读一般数据 临时读数据错误处理超时/掉站处理、功能块卡死处理通讯状态输出/状态统计…2.1 不同型号 PLC 使用的通讯功能块参考文档《EcoStruxure™ Control Expert - 通讯 , 功能块库》https://www.schneider-electric.cn/zh/download/document/33003683K01000/一些常用指令如下看上面的图就知道咱们用施耐德的中大型 PLC 有多煎熬了这个文档写的还不如国内贴牌的小厂同一个软件平台还能有这么多种指令每种指令的配置、适用的 PLC 型号都不太一样移植性简直就是灾难这还是单个品牌内部哦真的难绷这么多指令也没个归类就只是列个表格也不说明一下具体指令有啥功能每个型号的 PLC 应该怎么配合使用、调用的顺序如何20260203更新是我草率了在这里有描述EF/EFB/DFB库 → 通讯库 → 常规信息 → 通讯 EF 的操作虽然描述依旧很抽象但我算他过关个人总结施耐德进行通讯调用的功能块如下首先【指定功能块使用的通讯端口】一个大型系统一般规模较大会扩展多个 IO 模块、网络模块因此要在程序中指定通讯功能块使用的模块、网口是哪个上图中的ADDM、ADDMX、ADDR功能块用于实现此功能不同型号的PLC使用不同指令参数形式也不同然后根据读写的寄存器类型/功能、PLC 型号【选择合适的功能块】进行通讯上图中的CREAD_REG/CWRITE_REG、READ_VAR/WRITE_VAR/DATA_EXCH用于实现此功能CREAD_REG/CWRITE_REG用于 Quantum PLC 批量读写READ_VAR/WRITE_VAR/DATA_EXCH用于 M340/M580/X80 IO 读写项目上使用的是M580M340的新一代 X80 IO 系统下面主要介绍新系统相关的通讯块及配置2.2 M340、M580 ModbusTCP 通信相关程序块参考文档《EcoStruxure™ Control Expert - 通讯 , 功能块库》https://www.schneider-electric.cn/zh/download/document/33003683K01000/Modbus 功能码如下读取内部寄存器%MW03 功能码、读线圈%M01功能码ADDMREAD_VARADDM 用于地址转换READ_VAR 执行读寄存器指令通过参数指定读取的类型%MW 或 %M写入单个/多个内部寄存器%MW06/16 功能码、写单个/多个线圈%M05/15 功能码ADDMWRITE_VARADDM 用于地址转换WRITE_VAR 执行写寄存器指令通过参数指定写入的类型%MW 或 %M、写入的数量1 或 多从而确定使用的具体功能码使用其他功能码如同时读写-功能码23、屏蔽写-功能码22ADDMDATA_EXCHDATA_EXCH也能替代上面的READ_VAR和WRITE_VAR功能块但这个功能块引脚比较多写法稍微麻烦一些如果使用的是 X80 RIO子站上的网卡而不是 CPU 机架上的寻址功能块要从ADDM换为ADDMX20260203-补充官方说明 – 功能块与支持的功能码M340与M580使用的功能块一致因此支持的功能码也一致https://www.schneider-electric.cn/zh/faqs/FA347763/2.3 程序块读写的示例程序M340 / M580 / X80 IO 平台读写内部寄存器示例参考程序READ_VAR 和 WRITE_VARhttps://blog.csdn.net/zhouwl72/article/details/131410211DATA_EXCHhttps://blog.csdn.net/weixin_39559463/article/details/137343652自己写的 READ_VAR 和 WRITE_VAR 示例程序截图2.4 功能块的参数配置这里只介绍有可能引起困惑的配置项完整的配置项请参考上面的【示例参考程序】或【相关文档】参数变量 GESTREAD_VAR 和 WRITE_VAR 中使用M340、M580、X80 IO使用READ_VAR和WRITE_VAR功能块时每个功能块都需要配置一个GEST参数GEST 长度为 4 的 INT 数组其中第 3 个字GEST[2]需要写入一个时间变量定义最长相应时间单位 100 ms如果不定义则认为响应时间 0则在发送请求时可能会因为超时导致报通讯失败若令 GEST[2] 10则定义最长相应时间 10 * 100ms 1000ms 1sADDM 功能块指定功能块使用的通讯端口M340、M580、X80 IO通过ADDM功能块指定进行通信的端口则此功能块的输入参数需要配置各个参数的意义2.4 ADDM 功能块配置实例ADDM 配置实例 1使用 M340 CPU 自带网口使用的 ADDM 地址r.m.c{IP}node.TCP.MBSr 机架编号。通常 CPU 所在的主机架机架编号 r 0m 模块位置。CPU 模块 m 0其他模块从左往右 m 从 1 开始算c 此模块上通道编号CPU 模块上的网口编号c 3IP 请求的 Modbus 设备的 IP 地址node ModbusTCP 读写的站号可省略省略则使用默认站号 1TCP.MBS 固定后缀指定使用 ModbusTCP 协议进行通信注意此指令即所有使用此软件编程的施耐德 PLC端口固定为标准的 502 端口不能修改参考文档《通讯服务和架构、参考手册》https://www.schneider-electric.cn/zh/download/document/35012196K01000/ADDM 配置实例 2使用 NOE 网卡模块的网口NOE 模块的通道编号 0可从 NOE 模块的组态配置中看到参考文档《用于 Ethernet 的 Modicon M340 - 通讯模块和处理器 , 用户手册》https://www.schneider-electric.cn/zh/download/document/31007493K01000使用的 ADDM 地址与 M340 CPU 通讯基本相同但是模块位置、通道等参数要根据实际情况更改r.m.c{IP}node.TCP.MBS模块所在机架编号 r、模块编号 m 根据模块位置决定通道编号 c 0 可通过上面软件组态界面中查看IP 请求的 Modbus 设备的 IP 地址node ModbusTCP 读写的站号可省略省略则使用默认站号 1TCP、MBS 为固定后缀加在地址最后表明使用 ModbusTCP 协议可省略注意此指令即所有使用此软件编程的施耐德 PLC端口固定为标准的 502 端口不能修改示例PLC主机架安装在插槽3的 NOE 模块连接IP地址为24.32.6.30站号为2的Modbus-tcp设备0.0.3{24.32.6.30}2ADDM 配置实例 3使用 NOC 网卡模块的网口使用的 ADDM 地址 r.m.c{IP}node.TCP.MBS模块所在机架编号 r、模块编号 m 根据模块位置决定通道编号 c 0IP 请求的 Modbus 设备的 IP 地址node ModbusTCP 读写的站号可省略省略则使用默认站号 1TCP、MBS 为固定参数加在地址最后表面使用的是 ModbusTCP 协议可省略注意此指令即所有使用此软件编程的施耐德 PLC端口固定为标准的 502 端口不能修改示例PLC主机架安装在插槽3的模块连接IP地址为24.32.6.30站号为2的Modbus-tcp设备0.0.3{24.32.6.30}2ADDM 配置实例 4使用 M580 CPU 上的网口参考上面的帮助文档如果使用 M580 CPU 上的网口需要设置参数为机架 r 0插槽 m 0通道 c 3 这是和其他模块最大的不同站号、IP地址同上面的设置同样的端口号固定不能更改示例CPU网口连接24.32.6.150地址、站号2。则写作0.0.3{24.32.6.150}23. 做服务端进行数据交换3.1 概述相关文档各模块说明书这种配置的特点CPU 模块、网卡模块做服务端其他设备主动发起请求读取 PLC 中的数据无需额外的通讯配置保证外部能正常与对应网口做 MODBUS-TCP 通讯即可只需做安全性配置寄存器地址 PLC 中变量表的地址还可指定是否使用偏移地址详见最后一章具有此功能的模块不论新旧平台Quantum / M580 / M340 / X80 IO各种模块/CPU上的网口都支持这种通讯这种功能的优缺点我只能说这个特性是施耐德 PLC 让我感觉最爽的地方建议其他 PLC 赶紧借鉴照抄bushi硬要写点缺点也有但个人感觉是鸡蛋里挑骨头优点无需额外的通讯配置只需做安全性配置保证外部能正常与对应网口做 MODBUS-TCP 通讯即可寄存器地址 PLC 中变量表的地址不需要做任何额外的地址映射、转换工作理论上不限制通讯的数据总量实际上会受硬件支持的连接数、Modbus 协议每包最多支持的寄存器数量限制缺点无法在程序中实时控制通讯的权限如指定条件下允许/禁止其他机器读写、只允许读写某些寄存器区域等只支持对内部寄存器%M功能码 01、05、15不支持 02和%MW功能码 03、06、16、23的读写其他功能码如 01、04只能使用特别的服务端指令实现详情自己去啃手册吧3.2 实例使用 modbus-poll 对仿真的 M340 中的数据进行读写参考我的文章 – 最后部分的通讯实例https://blog.csdn.net/weixin_44112083/article/details/1374435414. 一些小问题4.1 PLC 做服务器时寄存器起始地址设置施耐德 PLC 全系M340、M580、Quantum做服务器时默认寄存器起始地址从 0 开始而西门子等 PLC 则默认寄存器地址从 1 开始这些厂商称这种地址为“PLC形式地址”对于 M580 和 M340如果在作为服务端其他设备主动读写此 PLC时想使用“PLC形式地址”可以修改内部寄存器实现根据官方文档以下的配置可以实现偏移量的自由映射即不仅可以偏移1个寄存器、还能偏移N个寄存器比如 请求 400001 寄存器对应 PLC 中的 %MW2000 这种神奇操作参考文章https://www.schneider-electric.cn/zh/faqs/FA500598/图文步骤如下M340 寄存器地址M580 寄存器地址%SW139和%SW141%SW139配置线圈基地址功能码 01、05、15PLC 变量表中%W变量%SW138仅 M340 支持配置离散量输入基地址功能码 02只读PLC 变量表中%IW变量%SW141配置保持寄存器基地址功能码 03、06、16PLC 变量表中%MW变变量%SW140仅 M340 支持配置输入寄存器基地址功能码 04 只读PLC 变量表中%IW变量按照上面的介绍这两个寄存器不能在运行时被赋值只能在变量表中以“初始值”的形式赋值具体操作如下在变量表 -- 变量表格中添加%SW139和%SW141变量变量表显示“初始值”列。在表格中任意位置右键 -- 选择【自定义列】弹窗中勾选【值】然后点击【确定】在对应变量的【值】一列填 1这里的注释是我自己加的只有 M580 需要配置配置 PLC “冷启动时复位 %MW” 4.2 各种通讯方式的限制CPU 自带网口 DTM 通信的限制 CPU 网口作客户端使用 I/O 扫描器进行 Modbus-TCP 通信参考文章https://blog.csdn.net/weixin_39559463/article/details/137345753M580 CPU 自带网口配置 DTM 进行 Modbus 通信【I/O 扫描器】最多只支持读 写总共 1024 个寄存器超过 1024 个寄存则编译项目会报错若要使用 DTM 扫描器进行大量数据交换需要使用额外的网卡模块NOC、NOE进行通讯得加钱NOC 网卡 DTM 通信的限制 NOC 网卡作客户端使用 I/O 扫描器进行 Modbus-TCP 通信最大请求数量限制NOC主动读写其他设备时对单个设备在DTM列表点击右键“添加”的设备最多支持128条请求解决方法DTM配置支持多个节点、相同IP配置。若单个节点请求数量超过上面的上限可以创建多个IP相同的节点。这样做程序在编译时会警告XXXIP地址地址不唯一只是警告不是报错只是编程软件认为可能有问题最大节点数量限制对于NOC0301网卡最多支持创建114个节点其他网卡的最大限制请参考模块文档手册最大数据量限制对于每块 NOC 网卡在 DTM 中配置总体读写数据总量有限制使用功能块做客户端进行读写的限制PLC/模块主动读写其他设备参考文章https://www.se.com/ae/en/faqs/FAQ000271408/使用功能块读写也有一些限制且需要综合上面的 DTM 配置进行评估CPU 每周期发起主动请求的总数是有限的即下面的通讯请求总数限制每个端口并发时支持的最大读写数据总量是有限的即以下最大交换数据量每个功能块支持读写的寄存器数量有限由 Modbus 协议决定的CPU 支持的 ModbusTCP连接数是有限的以下截图均为上面参考文章中内容每周期通讯请求总数限制受限于CPU应包含CPU网口网卡请求总数最大交换数据量NOC网卡Modbus 协议规定的单指令支持读写的最大数据量读125个寄存器 125 字 250字节 2000位写120个寄存器 120 字 240字节 1920位做服务端进行数据交换PLC/模块相应其他设备的读写请求做服务端时要考虑以下两点问题每周期各种接口支持的请求数、请求数总和各端口支持的 Modbus TCP 最大连接数、CPU支持的最大连接数总和每周期各种接口支持的最大请求数、CPU支持的最大请求数之和CPU 支持的最大 ModbusTCP 连接数总和4.3 更简便的功能块客户端通讯使用 GPL 库进行通讯GPL 是施耐德官方开发的函数库包含通讯、过程控制、通用设备模型、施耐德专有设备等指令可提升PLC程序编写效率GPL 库中的通讯库功能块支持以下功能考虑以上最大通讯请求限制的并发轮询掉站、重连自动处理各站点的运行状态/错误输出、统计通讯整体状态统计数据读写优先级设置GPL 库的简介、下载、安装见文章先挖个坑使用 GPL 库进行通讯见我的文章先挖个坑4.4 PLC 作服务器时的通讯参数站号、寄存器范围及对应关系PLC 做服务器其他客户端向 PLC 读写数据时连接参数如下站号M580 做服务端时忽略站号即所有站号都能读写 CPU 中相同地址的相同数据除100站号都行100是CPU、网卡模块预留的诊断端口寄存器范围受两个配置影响起始地址上面介绍的【 4.1 寄存器起始地址设置】决定了 Modbus 请求的起始地址与 PLC 变量中的对应关系。若没有配置则默认 CPU 起始地址 %MW0 / %M0 对应 Modbus 中的 400001 寄存器 / 000001 线圈结束地址在 CPU 组态中可定义使用的 CPU 寄存器数量这里决定了 CPU 提供的最高的变量地址在左侧项目浏览器树状图中双击CPU进入右侧CPU配置界面点击“配置”右侧可配置 %M、%MW 寄存器数量此即为 CPU 做 Modbus 服务器是支持的最大地址。如下图最大地址地址从1开始算不带功能码线圈(0x) 、输入线圈(1x) 、内部寄存器(4x) 、输入寄存器(3x) 513、513、60001、4000注意这里分配的寄存器数量为“定位地址”“非定位地址”不受影响。只有“定位地址”可以被客户端读取但只有如图所示的固定数量。“非定位地址” 相当于 PLC 的内部变量外部无法直接读取内部变量的数量由 CPU 的存储容量决定可以创建很多根据不同的CPU型号最多能分配的寄存器数量不同具体可参考手册。右侧4种寄存器数量共同计算分配总数每种可分配数量可灵活定义可根据项目需要灵活分配