文章目录
总体介绍
施耐德 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,
%MW
数据)的读写
若要读写其他类型的数据,还得老老实实写程序来读 - 部分硬件使用这种方法有通讯数据量的限制(详见最后一章中的描述)
如果想用这种方式进行大数据量通讯,需要额外采购 NOE、NOC 网卡模块进行通讯(得加钱)
非定位变量:没绑定 PLC 内部地址(如%MWXXX
、%MXXX
)的变量,类似西门子博途中优化的数据块中的变量,PLC 内部的程序可通过变量名称进行读写,但外部设备无法访问。非定位变量在保证内部的程序正常读写的情况下,不会占用 PLC 宝贵的对外通信的寄存器地址资源 。
定位变量:绑定了 PLC 内部寄存器地址的变量,PLC 内部可通过内部寄存器地址 或 变量名读写此变量,外部设备可通过内部寄存器地址度读写数据(这是施耐德 PLC 的特点,详见客户端的特点)
DTM 总体配置流程
- 项目设置(M580 建议进行的一些配置)
- 在 DTM 管理器中,对应模块下【添加从站设备(DIO 设备)】
- 在 DTM 管理器中的对应模块下,【配置每个 DIO 设备的参数】:名称、IP 地址等
- 在 DTM 管理器每个从站设备下,【配置每个 DIO 的“请求”参数】:每个请求读写的寄存器数量、读写的寄存数量、错误处理、读写周期等(一个“请求” = 一个 Modbus 数据包)
DTM 配置实例
DTM 配置实例 1:使用 M580 CPU 自带网口
参考文章(还没写完):AAA
DTM 配置实例 2:使用 NOC 网卡自带网口
参考文章:
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
这种配置的优缺点
- 优点
- 程序可以控制数据刷新的时序及逻辑
- 理论上不限制通讯的数据总量
- 支持各种功能码数据的读写(不同功能码的调用对应的功能块即可)
- 缺点
- 需要额外编程,程序中需要编写参数初始化、轮询、错误处理等逻辑
- 不同型号的 PLC 使用的程序各不相同,移植性较差(参考上面一小节)
2.1 不同型号 PLC 使用的通讯功能块
参考文档:《EcoStruxure™ Control Expert - 通讯 , 功能块库》
https://www.schneider-electric.cn/zh/download/document/33003683K01000/
一些常用指令如下
看上面的图就知道咱们用施耐德的中大型 PLC 有多煎熬了😂这个文档写的还不如国内贴牌的小厂🤬🤬🤬
- 同一个软件平台还能有这么多种指令,每种指令的配置、适用的 PLC 型号都不太一样
移植性简直就是灾难,这还是单个品牌内部哦,真的难绷😂 - 这么多指令也没个归类,就只是列个表格,也不说明一下具体指令有啥功能,一般每个型号的 PLC 应该怎么配合使用、调用的顺序如何
个人总结,施耐德进行通讯调用的功能块如下:
- 首先【指定功能块使用的通讯端口】
一个大型系统一般规模较大,会扩展多个 IO 模块、网络模块,因此要在程序中指定通讯功能块使用的网口是哪个(应该没有人用这套系统还一个网卡模块都不扩展吧?)
上图中的ADDM
、ADDMX
、ADDR
功能块用于实现此功能(不同型号使用不同指令,参数形式也不同) - 然后根据读写的寄存器类型/功能、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 读写
项目上使用的是M580
+ M340
的新一代 X80 IO 系统,下面主要介绍新系统相关的通讯块及配置
2.2 M340、M580 ModbusTCP 通信相关程序块
参考文档:《EcoStruxure™ Control Expert - 通讯 , 功能块库》
https://www.schneider-electric.cn/zh/download/document/33003683K01000/
Modbus 功能码如下:
- 读取内部寄存器(%MW、%MD,03 功能码):ADDM + READ_VAR
ADDM 用于地址转换,READ_VAR 执行读寄存器指令 - 写入内部寄存器(%MW、%MD,06 功能码):ADDM + WRITE_VAR
ADDM 用于地址转换,WRITE_VAR 执行写寄存器指令 - 批量写入内部寄存器(%MW、%MD,16 功能码)ADDM + DATA_EXCH
ADDM 用于地址转换,DATA_EXCH 执行写寄存器指令(有些设备不支持这个功能码,就只能使用 WRITE_VAR 进行写入)
2.3 程序块读写的示例程序(M340 / M580 / X80 IO 平台)
示例参考程序:
- READ_VAR 和 WRITE_VAR:https://blog.csdn.net/zhouwl72/article/details/131410211
- DATA_EXCH:https://blog.csdn.net/weixin_39559463/article/details/137343652
自己写的 READ_VAR 和 WRITE_VAR 示例程序截图:
2.4 功能块的参数配置
这里只介绍有可能引起困惑的配置项,完整的配置项请参考上面的【示例参考程序】或【相关文档】
参数变量 GEST:READ_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 = 1s
ADDM 功能块:指定功能块使用的通讯端口(M340、M580、X80 IO)
通过ADDM
功能块,指定进行通信的端口,则此功能块的输入参数需要配置
各个参数的意义
2.4 ADDM 功能块配置实例
ADDM 配置实例 1:使用 M340 CPU 自带网口
使用的 ADDM 地址:r.m.c{IP}node.TCP.MBS
- r = 机架编号。通常 CPU 所在的主机架,机架编号 r = 0
- m = 模块位置。CPU 模块 m = 0,其他模块从左往右 m 从 1 开始算
- c = 此模块上通道编号,CPU 模块上的网口编号 c = 3
- IP = 请求的 Modbus 设备的 IP 地址
- node = ModbusTCP 读写的站号(可省略,省略则使用默认站号 1)
- TCP.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 读写的站号(可省略,省略则使用默认站号 1)
- TCP、MBS 为固定后缀,加在地址最后,表明使用 ModbusTCP 协议
- 注意,此指令(即所有使用此软件编程的施耐德 PLC)端口固定为标准的 502 端口,不能修改
ADDM 配置实例 3:使用 NOC 网卡模块的网口
- 使用的 ADDM 地址 = r.m.c{IP}node.TCP.MBS
- 模块所在机架编号 r、模块编号 m 根据模块位置决定
- 通道编号 c = 0
- IP = 请求的 Modbus 设备的 IP 地址
- node = ModbusTCP 读写的站号(可省略,省略则使用默认站号 1)
- TCP、MBS 为固定参数,加在地址最后,表面使用的是 ModbusTCP 协议
- 注意,此指令(即所有使用此软件编程的施耐德 PLC)端口固定为标准的 502 端口,不能修改
3. 做服务端,进行数据交换
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/137443541
4. 一些小问题
4.1 PLC 做服务器时寄存器起始地址设置
施耐德 PLC 全系(M340、M580、Quantum)做服务器时默认寄存器起始地址从 0 开始
而西门子等 PLC 则默认寄存器地址从 1 开始,这些厂商称这种地址为“PLC形式地址”
对于 M580 和 M340,如果在作为服务端(其他设备主动读写此 PLC)时,想使用“PLC形式地址”,可以修改内部寄存器实现
参考文章:https://www.schneider-electric.cn/zh/faqs/FA500598/
图文步骤如下:
M340 寄存器地址:
M580 寄存器地址:%SW139
和 %SW141
%SW139
配置线圈基地址(功能码 01、05、15,PLC 变量表中%W
变量)%SW138
(仅 M340 支持)配置离散量输入基地址(功能码 02,只读,PLC 变量表中%IW
变量)%SW141
配置保持寄存器基地址(功能码 03、06、16,PLC 变量表中%MW
变变量)%SW140
(仅 M340 支持)配置输入寄存器基地址(功能码 04 ,只读,PLC 变量表中%IW
变量)
按照上面的介绍,这两个寄存器不能在运行时被赋值,只能在变量表中以“初始值”的形式赋值,具体操作如下
-
在变量表 --> 变量表格中,添加
%SW139
和%SW141
变量 -
变量表显示“初始值”列。在表格中任意位置,右键 --> 选择【自定义列】
-
弹窗中,勾选【值】,然后点击【确定】
-
在对应变量的【值】一列,填 1(这里的注释是我自己加的)
-
(只有 M580 需要配置)配置 PLC “冷启动时复位 %MW” :
4.2 CPU 自带网口通信的限制: CPU 网口作客户端使用 I/O 扫描器进行 Modbus-TCP 通信)
参考文章:https://blog.csdn.net/weixin_39559463/article/details/137345753
M580 CPU 自带网口,配置 DTM 进行 Modbus 通信【I/O 扫描器】,最多只支持(读 + 写总共) 1024 个寄存器
超过 1024 个寄存,则编译项目会报错
若要使用 DTM 扫描器进行大量数据交换,需要使用额外的网卡模块(NOC、NOE)进行通讯(得加钱)