用 WinAC 测试 ModbusTCP 通信

目录 Content
[hide]

WinAC 的使用可参考前面一篇文章《在 VMWare 环境使用 WinAC 做西门子 PLC 开发测试》,本文重点描述一下 “ModbusTCP 通信” 中需要注意的一些设置。

本文使用场景是 WinAC 作为客户端去连接另一个 ModbusTCP 服务器。

一、背景

从 STEP7 V13 (TIA Portal) 起,可使用 MODBUSPN 指令。MODBUSPN 指令允许在带有集成 PN 接口的 CPU 和支持 Modbus/TCP 协议的伙伴之间进行通信。 支持功能代码 1、2、3、4、5、6、15 和 16。根据参数分配,该指令可用作客户端(S7 为客户端),也可用作服务器(S7 为服务器)。 使用 MODBUSPN 指令在通信伙伴之间建立连接以传送数据并控制连接终止。

MODBUSPN 指令基于 Modbus Application Protocol Specification V1.1b3, April 26, 2012 – 请参见 Modbus 主页  http://www.modbus.org/

不过,需要注意的一点是 MODBUSPN 并不是免费的,需要根据硬件申请授权码,不然CPU会一直重复报错 A090 ,但是,即使没有授权码也是可以进行 Modbus通信的,这就是 OB121 在例程中的作用。

二、组态和程序块编写

参考西门子官方文档即可。文档里的步骤已经很清楚了,按照做就可以完成。

当然,也可以下载已经组态好的项目文件:WinAC_VM_ModbusTCP_TIA.zip

三、DB块设置

程序块有三个DB块需要设置

1. DATA_AREA_1

此DB块( 号码为11,后面要用到 )用于存放 Modbus 数据。在例程中,创建了一个500个Word类型的数组 Holding_Register。原例子中,定义索引是 1..500,有误,需要更改成 Array[0..499] of Word

2. MODBUS_PARAM

此DB块用于连接和Modbus参数。详细参考 TIA 帮助文件 “MODBUSPN: 作为 Modbus/TCP 客户端或 Modbus/TCP-Server 进行通信” 一节。

a. Connection settings

在此结构中定义连接特定的参数,如通信伙伴的本地硬件接口和IP地址。TCON 和 TDISCON 使用这些参数。

  • id: 每一个逻辑连接分配一个新ID,用于 TCON/TSEND/TRCV/TDISCON
  • connection_type : 取决于CPU类型。 WinAC 是 16#11
  • active_est : 作为客户端是主动连接,而服务端是被动连接。本例是客户端。
  • local_device_id : 定义所用 PN CPU 的 IE 接口。WinAC IF1 为 16#1
  • rem_staddr_len : 定义通信伙伴的IP地址长度。 16#4
  • rem_tsap_id_len : 定义远程通信伙伴的端口号的长度。主动连接为2个字节

  • rem_staddr : 在字节数组中设置远端通信伙伴的IP地址。本例为 192.168.23.180
  • rem_tsap_id : 设置远端通信伙伴的端口。因CPU类型不同而connection_type不同而高低字节不同。本例 connection_type 是 16#11,所以是 rem_tsap_id[1]  是高字节,rem_tsap_id[2] 是低字节。端口 502 十六进制为 01 F6

b. Modbus settings

在此结构中存储操作模式和地址引用所需要的数据。

  • server_client : S7作为服务端,为 TRUE;S7作为客户端,为 FALSE
  • single_write : 在S7作为客户端时,如果参数 single_write = TRUE ,则功能代码 5 和 6 用于执行长度为 1 的写入作业。如果 single_write = FALSE,则功能代码 15 和 16 用于所有写入作业。
  • connect_at_startup : 指定连接建立的时间。如果将 connect_at_startup 设置为 TRUE,将在 CPU 重新启动后立即建立连接。 这种情况下,只有正确建立连接 (CONN_ESTABLISHED = TRUE) 才能传送数据作业,否则将在 ERROR 和 STATUS_CONN 中显示相应的错误。
    FALSE:通过设置 ENQ_ENR 建立连接
    TRUE: 重新启动后立即建立连接
  • data_type : Modbus 功能码。1:线圈 2:输入 3:保持寄存器 4:输入寄存器
  • db : 存储modbus数据的DB块的号码,本例为 11
  • start : 指定 DB 的数据字 0 中映射的第一个 Modbus 地址,本例为 0
  • end :  定义最后一个 MODBUS 地址 ,本例为 499

3. CONTROL_DAT

此DB块用于设置控制参数

四、测试通信

通过设置 ENQ_ENR 上升沿进行数据通信。

延伸阅读

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.