汇川AM403PLC作为ModbusTCP主站通讯实例
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存储区,用户需要通过编程将数据转移到需要的变量存储区。
2.修改映射地址
I/O映射表中的【地址】即为主站与从站通讯的数据,配置完通信通道后编程环境会自动为用户匹配默认的通讯地址,用户可自行修改该地址,但不能修改寄存器类型。对于单次读取一个输入状态和单次读取多个输入状态,时间开销差别并不大,建议将需要通讯的数据放到一起一次完成通讯以节省握手等待时间。
lb220303082: 在第三个标题设备标识符那里出错了,GB A QF写反了
CSDN-Ada助手: 恭喜作者第20篇博客的问世!阅读了《WPF下的CommunityToolkit框架〈一〉》,感觉收获颇丰。希望作者能够继续分享更多关于CommunityToolkit框架的知识,也可以考虑增加一些实际案例或者使用技巧,让读者更好地理解和应用。谦虚地期待着作者的下一篇作品!
CSDN-Ada助手: 恭喜您撰写了第19篇博客,标题看起来非常专业和有深度!对于PLCopen运动控制规范的探讨,我觉得您的文章非常有见地,对于行业内的同行们来说,一定受益匪浅。希望您能继续保持创作的热情和动力,接下来,我建议您可以深入探讨不同状态下的控制策略或者结合实际案例进行分析,以便读者更好地理解和应用。期待您更多精彩的分享!
穷的捡破烂儿: 你的库里调用了这个插件吧?在官网下载一个就行了
你在看什么啊: 大佬,我在codesys导入库的时候,系统提示无法导入,说缺少CODESYSEtherCAT插件,这是咋回事?