1、modbus tcp client事例一、MB_CLIENT 介绍说明“MB_CLIENT”指令作为 Modbus TCP 客户端通过 S7-1200 CPU 的 PROFINET 连接进行通信。 使用该指令,无需其它任何硬件模块。 通过“MB_CLIENT”指令,可以在客户端和服务器之间建立连接、发送请求、接收响应并控制 Modbus TCP 服务器的连接终端。参数下表列出了指令“MB_CLIENT”的参数:参数声明数据类型说明REQ InputBOOL与 Modbus TCP 服务器之间的通信请求REQ 参数受到等级控制。 这意味着只要设置了输入 (REQ=true),指令就会发送通信请求
2、。其它客户端背景数据块的通信请求被阻止。 在服务器进行响应或输出错误消息之前,对输入参数的更改不会生效。 如果在请求期间再次设置了参数 REQ,此后将不会进行任何其它传输。DISCONNECT InputBOOL通过该参数,可以控制与 Modbus 服务器建立和终止连接:0: 建立与指定 IP 地址和端口号的通信连接。1: 断开通信连接。 在终止连接的过程中,不执行任何其它功能。 成功终止连接后,STATUS 参数将输出值 7003。而如果在建立连接的过程中设置了参数 REQ,将立即发送请求。CONNECT_IDInputUINT确定连接的唯一 ID。 指令“MB_CLIENT”和“MB_SE
3、RVER”的每个实例都必须指定一个唯一的连接 ID。IP_OCTET_1InputUSINT1. Modbus TCP 服务器 IP 地址* 中的八位字节。IP_OCTET_2InputUSINT2. Modbus TCP 服务器 IP 地址* 中的八位字节。IP_OCTET_3InputUSINT3. Modbus TCP 服务器 IP 地址* 中的八位字节。IP_OCTET_4InputUSINT4. Modbus TCP 服务器 IP 地址* 中的八位字节。IP_PORTInputUINT服务器上使用 TCP/IP 协议与客户端建立连接和通信的 IP 端口号(默认值: 502).MB_M
4、ODE InputUSINT选择请求模式(读取、写入或诊断)。MB_DATA_ADDR InputUDINT由“MB_CLIENT”指令所访问数据的起始地址。DATA_LENInputUINT数据长度: 数据访问的位数或字数(请参见“MB_MODE 和 MB_DATA_ADDR 参数” - 数据长度)。 MB_DATA_PTRInOutVARIANT指向 Modbus 数据寄存器的指针: 寄存器是用于缓存从 Modbus 服务器接收的数据或将发送到 Modbus 服务器的数据的缓冲区。 该指针必须引用具有标准访问权限的全局数据块。寻址到的位数必须除以 8。DONEOutBOOL只要最后一个作业
5、成功完成,立即将输出参数 DONE 的位置位为“1”。 BUSYOutBOOL0: 当前没有正在处理的“MB_CLIENT ”作业1: MB_ CLIENT ”作业正在处理中ERROROutBOOL0: 无错误1: 出错。 出错原因由参数 STATUS 指示。STATUS OutWORD指令的错误代码。* Modbus TCP 服务器 32 位 IPv4 IP 地址 中的 8 位长度的部分。有关有效数据类型的更多信息,请参见“有效数据类型概述”。说明 “MB_CLIENT”调用过程中统一输入数据Modbus 客户端调用 Modbus 指令时,输入参数的状态将存储在内部,并在下一次调用时比较。
6、这种比较用于确定这一特定调用是否初始化当前请求。 如果使用一个通用背景数据块,那么可以执行多个“MB_CLIENT”调用。 在执行“MB_CLIENT”实例的过程中,不得更改输入参数的值。 如果在执行过程中更改了输入参数,那么将无法使用“MB_CLIENT”检查实例当前是否正在执行。多个客户端连接Modbus TCP 客户端可以支持多个 TCP 连接,连接的最大数目取决于所使用的 CPU。 一个 CPU 的总连接数,包括 Modbus TCP 客户端和服务器的连接数,不能超过所支持的最大连接数。 Modbus TCP 连接也可以由客户端和/或服务器连接共享。使用各客户端连接时,请记住以下规则:
7、每个“MB_CLIENT”连接都必须使用唯一的背景数据块。对于每个“MB_CLIENT”连接,必须指定唯一的服务器 IP 地址。每个“MB_CLIENT”连接都需要一个唯一的连接 ID。该指令的各背景数据块都必须使用各自相应的连接 ID。 连接 ID 与背景数据块组合成对,对每个连接,组合对都必须唯一。根据服务器组态,可能需要或不需要 IP 端口的唯一编号。该指令的静态变量下表列出了“MB_CLIENT”指令背景数据块的可编辑静态变量。变量数据类型起始值说明Blocked_Proc_TimeoutREAL3.0如果有一个被阻止的 Modbus 实例,则为复位静态变量 ACTIVE 前的等待时间
8、(单位为秒)。 例如,如果输出了一个客户端请求,而且在该请求完全执行之前中止执行客户端功能,则可能发生这种情况。 最大等待时间为 55 秒。MB_Transaction_IDWORD1Modbus TCP 协议的事务 ID。 只有在 Modbus TCP 服务器需要一个不同值的情况下,才能更改起始值“1”。MB_Unit_IDBYTE255Modbus 协议的单元 ID。 该变量对应于 Modbus RTU 协议的从站地址。 只有在将 Modbus TCP 服务器用作一个网关,同时由 Modbus 服务器中应用程序进行控制时,才能更改此值。RCV_TIMEOUTREAL2.0“MB_CLIEN
9、T”指令等待服务器响应的时间间隔(单位为秒)。ConnectedBOOL0指示是否已建立与所指定客户端的连接: 1 = 已连接,0 = 未连接。二、REQ 和 DISCONNECT 参数说明如果当前未执行“MB_CLIENT”指令的实例,并且 DISCONNECT 参数的值为“0”,那么将在 REQ = 1 时执行新作业。如果尚无连接,将在执行期间建立一个连接。如果在执行该活动作业之前再次执行“MB_CLIENT”指令的相同实例(DISCONNECT = 0 且 REQ = 1),那么不会在活动作业完成时执行该实例。 只有在活动作业完成时,才能启动新作业 (REQ = 1)。可以使用 DONE
10、 参数监视执行状态。 如果顺序执行“MB_CLIENT”指令,那么可以使用该参数监视执行状态。三、MB_MODE 和 MB_DATA_ADDR 参数说明“MB_CLIENT”指令将使用 MB_MODE 参数,而不是函数代码。 MB_DATA_ADDR 参数用于指定待访问的数据的 Modbus 起始地址。 MB_MODE 和 MB_DATA_ADDR 参数的组合定义了当前 Modbus 消息中所使用的函数代码。 下表列出了 MB_MODE 参数、Modbus 功能和地址空间之间的关系。MB_MODEModbus 功能数据长度功能和数据类型MB_DATA_ADDR0011 到 2000读取输出位:
11、 每个调用 1 到 2000 位1 到 99990021 到 2000读取输入位: 每个调用 1 到 2000 位10001 到 199990031 到 125读取保持寄存器: 每个调用 1 到 125 WORD40001 到 499990041 到 125读取输入字: 每个调用 1 到 125 WORD30001 到 399991051写入输出位:每个调用 1 位1 到 99991061写入保持寄存器: 1 WORD 每个调用40001 到 49999 1152 到 1968写入多个输出位: 每个调用 2 到 1968 位1 到 99991162 到 123写入多个保持寄存器:每个调用 2
12、到 123 WORD40001 到 49999 2 151 到 1968写入一个或多个输出位:每个调用 1 到 1968 位1 到 9999216 1 到 123写入一个或多个保持寄存器: 每个调用 1 到 123 WORD40001 到 49999 11110读取服务器通信的状态字和事件计数器:状态字反映了处理的状态(0 - 未处理,0xFFFF - 正在处理)每次成功发送一条消息时,事件计数器都将递增。执行该功能时,将不计算“MB_CLIENT”指令的 MB_DATA_ADDR 和 MB_DATA_LEN 参数。-80 08 1通过错误代码 0x0000 检查服务器状态(返回循环测试 -
13、服务器发回请求):1 WORD 每个调用-81081通过错误代码 0x000A 复位服务器的事件计数器:1 WORD 每个调用3 到 10、12 到 79、82 到 255预留四、MB_DATA_PTR 参数说明MB_DATA_PTR 参数是一个指向数据缓冲区的指针,该缓冲区用于存储从 Modbus 服务器读取或写入 Modbus 服务器的数据。 作为数据缓冲区,可以使用全局数据块或存储区域 (M)。对于存储区域 (M) 中的缓冲区,可通过以下方式使用 ANY 格式的指针: “P#位地址” “数据类型” “长度”(例如: P#M1000.0 WORD 500).MB_DATA_PTR 参数使用
14、一个通信缓冲区:对于“MB_CLIENT”指令的通信功能:读取和写入 Modbus 服务器地址 00001 到 09999 和 10001 到 19999 的 1 位数据。读取 Modbus 服务器地址 30001 到 39999 和 40001 到 49999 的 16 位 WORD 数据。写入 Modbus 服务器地址 40001 到 49999 的 16 位 WORD 数据。在从/向全局 DB 或 由 MB_DATA_PTR 参数指定的存储区 (M) 进行数据传输的过程中(长度:位或 WORD)。如果在 MB_DATA_PTR 参数中使用该缓冲区的一个数据块,那么需要为 DB 元素指定数
15、据类型。对于 Modbus 位地址,将使用 1 位的数据类型 BOOL对于 Modbus WORD 地址,将使用 16 位的数据类型,如 WORD、UINT、INT 或 REAL。对于 2 个 Modbus WORD 地址,将使用 32 位的数据类型(双字),如 DWORD、DINT 或 REAL。通过 MB_DATA_PTR,还可以访问复杂的 DB 元素,如:标准数组元素名称唯一的结构元素名称唯一且数据类型长度为 16 或 32 位的复杂结构。MB_DATA_PTR 参数的数据区可以在不同的全局数据块中(或在不同的存储区中)。 例如,可以根据读作业和写作业使用不同的数据块,或者为每个“MB_
16、CLIENT”站使用单独的数据块。参数 STATUS(常规状态信息)STATUS* (W#16#)说明0000指令已无错执行完毕。0001连接已建立。0003连接被终止。7000未激活任何调用 (REQ=0)。7001首次调用时,REQ=1: 启动处理;BUSY 的值为 1。7002中间调用(与 REQ 无关)。 处理已激活;BUSY 的值为 1。7003正在终止连接。7004连接已建立且处于受监视状态。未激活任何作业处理。7005已发送数据。7006已接收数据。80BBACTIVE_EST 参数值无效(建立此类连接的标识符,请参见 T_CON_PARAM): 只允许对服务器建立被动连接 (A
17、CTIVE_EST = FALSE)。只允许对客户端建立主动连接 (ACTIVE_EST = TRUE)。8380接收的 Modbus 帧格式错误或接收到的字节过少。* 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显示格式的更多信息,请参见“另请参见”。五、参数 STATUS参数 STATUS(协议错误)STATUS* (W#16#)响应 Modbus 客户端的代码 (B#16#)说明838101不支持功能代码。838203数据长度错误。838302数据地址错误或访问 MB_DATA_PTR 地址以外的区域。838403数据值错误。838503不支持诊断错误代码(功能代码 08)
18、。* 在程序编辑器中,错误代码可显示为整数或十六进制值。有关切换显示格式的更多信息,请参见“另请参见”。参数 STATUS(参数错误)除了下表列出的错误 还可能发生由通信指令(“TCON”、“TDISCON”、“TSEND”和“TRCV”)引起的“MB_CLIENT”指令错误。STATUS* (W#16#)说明80C8在指定的时间段中,服务器无响应。 请检查与 Modbus 服务器的连接。 只有在尝试了所组态的可重复尝试次数之后,才会报告该错误。 如果“MB_CLIENT”指令在指定时间内没有收到最初传输事务 ID(MB_TRANSACTION_ID 变量)的应答,则输出该错误代码。8188参
19、数 MB_MODE 的值无效。8189MB_DATA_ADDR 参数的数据地址无效。818AMB_DATA_LEN 参数中的数据长度无效。818B参数 MB_DATA_PTR 中的指针无效。 请检查 MB_DATA_ADDR 和 MB_DATA_LEN 参数的值。818CMB_DATA_PTR 指针将引用一个已优化的数据块。 既可以使用一个具有标准访问权限的数据块,也可以使用一个存储区参数 BLOCKED_PROC_TIMEOUT 超时(请参见指令的静态变量)。 已超出 55 秒的限制。818D事务 ID(MB_TRANSACTION_ID 变量)与最初发送的 ID 不一致(请参见指令的静态变
20、量)。8200该端口正在处理另一个 Modbus 请求。MB_CLIENT 具有相同连接参数的另一实例正在处理现有 Modbus 请求。8380接收到的已传输 Modbus 数据块格式不正确或接收到的字节过少。8386接收到的功能代码与最初发送的代码不一致。8387指定的连接 ID 与之前请求的不同。 “MB_CLIENT”指令的各背景数据块,只能使用一个连接 ID。服务器收到的 Modbus TCP 协议 ID 不为“0”时,也会输出错误代码。8388Modbus 服务器发送的数据长度与所请求的不同。 只有使用 Modbus 功能 15 或 16 时才会发生这种错误。* 在程序编辑器中,错误
21、代码可显示为整数或十六进制值。有关切换显示格式的更多信息,请参见“另请参见”。说明 内部使用的通信指令的错误代码。对于“MB_CLIENT”指令,除了会发生表中列出的错误外,还会发生由该指令所使用的通信指令(“TCON”、“TDISCON”、“TSEND”和“TRCV”)所引起的错误。错误代码通过“MB_CLIENT”指令的背景数据块来指定。 相应指令的错误代码会显示在 Static 部分中的 STATUS 下。错误代码的含义在相应通信指令文档中提供。 六、MB_CLIENT 示例 1: 通过 TCP 连接发送多个请求说明通过一个 TCP 连接,发送多个 Modbus 客户端请求。 为此,需使
22、用相同的背景数据块、相同的连接 ID 和相同的端口号。每次只能激活一个客户端。 处理完一个客户端后,再继续处理下一个。 必须在程序中定义执行顺序。在下列样本程序中,还将复制 STATUS 输出参数的值。程序段 1: Modbus 功能 1 - 16 个读取输出位程序段 2: Modbus 功能 2 - 32 个读取输入位七、MB_CLIENT 示例 2: 通过多个 TCP 连接发送多个请求说明通过不同的 TCP 连接,发送多个 Modbus 客户端请求。 为此,则需使用不同的背景数据块和不同的连接 ID。如果连接指向相同的 Modbus 服务器,则使用不同的端口号。 如果连接指向不同的 Mod
23、bus 服务器,则可以任意指定端口号。程序段 1: Modbus 功能 4 - 读取输入(WORD)程序段 2: Modbus 功能 3 - 读取保持寄存器(WORD)八、MB_CLIENT 示例 3: 协调多个请求说明确保执行了所有的 Modbus 请求。 可以通过程序协调各请求。 在以下示例中,演示了如何使用该指令协调第一客户端和第二个客户端请求的输出参数。程序段 1: Modbus 功能 3 - 读取保持寄存器(WORD)程序段 2: Modbus 功能 3 - 读取保持寄存器(WORD)九、MB_SERVER 示例: 多个 TCP 连接说明可以使用多个 Modbus TCP 服务器连接。 为此,每个连接都必须单独调用“MB_SERVER”指令。 每个连接都需要下列数据:指令的一个独立背景数据块唯一的连接 ID单独的 IP 端口(在 S7-1200 上,每个 IP 端口只允许一个连接)为了优化性能,每个连接的每个程序循环中都应执行“MB_SERVER”指令。程序段 1: 带有相关 IP 端口连接 ID 和背景数据块的连接 #1程序段 2: 带有相关 IP 端口连接 ID 和背景数据块的连接 #1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1