AM403作为ModbusTCP主站通讯实例
一、通讯方案实例
1.客户端/服务端
客户端和服务端是计算机网络中常见的两种网络设备类型,在工业通信中也称之为主站/从站,它们在网络通信过程中扮演着不同的角色。简单来说,客户端通常在网络中发起请求,而服务端则为客户端提供资源或数据。本例中使用主站/从站来描述这种关系。
本例以汇川AM403作为ModbusTCP主站,与从站进行数据交互,主站IP设为 192.168.0.10,从站IP设为192.168.0.11。
阅读本博文前请先熟悉汇川中型PLC的编程环境,即 InoProShop。
2.通讯方案设计
在从站未指定的前提下实现以下几种通讯方案:
● 读取从站输入状态;
● 读取从站状态寄存器;
● 更新从站线圈;
● 更新保持寄存器;
● 读取地址连续的混合类型变量(即struct,结构体);
● 更新地址连续的混合类型变量(即struct,结构体)。
二、AM403作为Modbus主站的配置过程
1.将AM403设为主站
AM403本体带一路EtherNET口(CN3),本例使用该网口作为ModbusTCP通讯口。
如下图所示展开项目树,从设备树中找到网络组态(或者Network Configuration):
双击该节点标题打开网络组态设置界面,在Ethernet选项框中找到ModbusTCP 主站,勾选该复选框,如下图所示:
2.给主站添加从站节点
展开【网络设备列表】中的【以太网口】节点:
双击【Modbus_TCP】或拖动【Modbus_TCP】放置到网络组态界面即可添加从站设备,可以添加多个从站。
3.修改通讯参数
-
修改主站通讯参数
双击设备节点打开设备属性界面,选择【系统设置】选项框:
找到【网络】→【网口0】,在此处的EhtherNet 口地址即是 Modbus TCP 通讯口,将该网口参数设置为工程实际值。
-
修改从站通讯参数
找到并展开设备节点下的Modbus TCP主站节点,该节点下挂载了刚才添加的从站设备:
双击从站节点打开通讯设置:
在【ModbusTCP从站设置】选项卡里即可设置从站IP等通讯参数,当寄存器SM3001为1时从站被使能。
三、Modbus主站与从站通讯任务配置
汇川AM403通过设置通讯任务而不需要编程即可完成Modbus通讯。
1.通讯任务设置入口
汇川中型PLC的Modbus TCP通讯任务是配置在从站节点中的:
a).找到Modbus TCP主站节点下挂载的从站设备节点:
b).双击从站设备打开通讯设置,切换选项卡到【Modbus TCP通信设置】选项:
c).点击选项卡最底部的【添加】按钮或者右击选项卡空白处在右键选项卡中选择【添加】,弹出【Modbus 通信设置】页面:
每个从站可以配置多个Modbus TCP通信通道,每个通道对应一条通讯任务。下面分别介绍实现实例的通讯目标。
2.读取从站输入状态
-
Channel 01:电平触发读取一个输入状态,读取失败则返回最后一次成功的值,输入状态地址为0x0000
存取类型设置为【读输入状态(功能码02)】,触发器设置为电平触发,触发变量为 SM3101;起始地址为0x0000,长度为1;错误处理方式是保持最后的值。
-
Channel 02:持续读取八个输入状态,读取失败则返回0,状态起始地址为0x0010
存取类型设置为【读输入状态(功能码02)】,触发器设置为循环执行,每隔100ms发起一次请求;起始地址为0x0010,长度为8;错误处理方式是设置为0。
不建议将循环事件设置的太短,会增加CPU的负担。
3.读取从站输入寄存器
-
Channel 03:电平触发读取一个输入寄存器,读取失败则返回最后一次成功的值,输入寄存器地址为0x0002
存取类型设置为【读输入寄存器(功能码04)】,触发器设置为电平触发,触发变量为 SM3102;起始地址为0x0002,长度为1;错误处理方式是保持最后的值。 -
Channel 04:持续读取2个输入寄存器,读取失败则返回0,输入寄存器起始地址为0x0003
存取类型设置为【读输入寄存器(功能码04)】,触发器设置为循环执行,每隔100ms发起一次请求;起始地址为0x0003,长度为2;错误处理方式是设置为0。
4.更新从站线圈
-
Channel 05:电平触发更新一个线圈状态,线圈地址为0x0000
存取类型设置为【写单个线圈(功能码05)】,触发器设置为电平触发,触发变量为 SM3103;起始地址为0x0000。 -
Channel 06:持续更新一组连续线圈状态,线圈起始地址为0x0010
存取类型设置为【写多个线圈(功能码15)】,触发器设置为循环执行,起始地址为0x0010,长度为8。同理,循环时间应当适当延长以降低CPU负载。
5.更新保持寄存器
-
Channel 07:电平触发更新一个寄存器,寄存器地址为0x0000
存取类型设置为【写单个寄存器(功能码06)】,触发器设置为电平触发,触发变量为 SM3104;起始地址为0x0000。 -
Channel 08:持续更新2个寄存器,寄存器起始地址为0x0001
存取类型设置为【写多个寄存器(功能码16)】,触发器设置为循环执行,循环时间即为两次通讯间隔时间;起始地址为0x0001,长度为2。同理,循环时间应当适当延长以降低CPU负载。
5.读取复杂数据的寄存器
-
Channel 09:读取Real类型变量,寄存器地址为0x0003
Modbus无法直接读取浮点型变量,需要将数据进行转换。假如从站有一个地址为0x0003的Real类型变量(长度为32位),主站可以通过读取两位寄存器,然后再组装的方式获取该Real类型变量。
利用InoProShop中的联合数据单元可以方便的实现数据转换,联合中可以设置内存对齐的数据,这样无需编程就可以安全的实现数据转换:
// wBuffer 、byteBuffer 和 rValue 是长度相同的数据结构,通过联合 (UNION) ,使它们共用一块对齐的内存。
// 如果你熟悉西门子的PLC,你可能很容易理解 MW0、MW2和MD0的联系,联合即是这种关系的另一种描述。
TYPE uW_R:
UNION
wBuffer : ARRAY[0..1] OF WORD ;
byteBuffer : ARRAY[0..3] OF BYTE;
rValue : REAL;
END_UNION
END_TYPE
-
Channel 10:读取struct类型变量,寄存器地址为0x0005
假如从站有连续的 16个 bool 型变量、1个 word 、1个 float ,主站读取这写数据,bool、word、float 都属于值类型。InoProShop 中,struct 也是值类型的,int、word、float 等都是 struct 的简单方式。使用Modbus通讯复杂结构的数据时可以将复杂数据组装成 struct ,然后通过联合获取 struct 序列化的寄存器(word)数组:
// 将数据组装成 STRUCT
TYPE MixData :
STRUCT
arrayBool : ARRAY[0..15] OF BOOL;
wValue : WORD;
fValue : REAL;
END_STRUCT
END_TYPE
// 将数据序列化成 WORD 数组
TYPE uW_St:
UNION
wBuffer : ARRAY[0..1] OF WORD ;
stValue : MixData ;
END_UNION
END_TYPE
同理,将float变量换成结构体,即可利用联合实现由寄存器数组到结构体的数据转换。
6.更新复杂数据的寄存器
-
Channel 11:更新Real类型变量,寄存器地址为0x0007
和读取Real类型变量同理。 -
Channel 12:更新struct类型变量,寄存器地址为0x0009
和读取复杂结构数据同理。
其它通信任务请自行测试,此处不再赘述。
四、配置通讯地址
1.IO映射
完成通讯配置后在从站属性里会多出一个Internal I/O映射选项卡,通过【通道】名称,I/O映射表和通讯设置里的变量形成映射关系。
只能将从站的数据映射到主站的I/O存储区,用户需要通过编程将数据转移到需要的变量存储区。
文章来源:https://www.toymoban.com/news/detail-767762.html
2.修改映射地址
I/O映射表中的【地址】即为主站与从站通讯的数据,配置完通信通道后编程环境会自动为用户匹配默认的通讯地址,用户可自行修改该地址,但不能修改寄存器类型。对于单次读取一个输入状态和单次读取多个输入状态,时间开销差别并不大,建议将需要通讯的数据放到一起一次完成通讯以节省握手等待时间。文章来源地址https://www.toymoban.com/news/detail-767762.html
到了这里,关于汇川AM403PLC作为ModbusTCP主站通讯实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!