modbus tcp client事例.docx
《modbus tcp client事例.docx》由会员分享,可在线阅读,更多相关《modbus tcp client事例.docx(18页珍藏版)》请在冰豆网上搜索。
modbustcpclient事例
一、MB_CLIENT介绍
说明
“MB_CLIENT”指令作为ModbusTCP客户端通过S7-1200CPU的PROFINET连接进行通信。
使用该指令,无需其它任何硬件模块。
通过“MB_CLIENT”指令,可以在客户端和服务器之间建立连接、发送请求、接收响应并控制ModbusTCP服务器的连接终端。
参数
下表列出了指令“MB_CLIENT”的参数:
参数
声明
数据类型
说明
REQ
Input
BOOL
与ModbusTCP服务器之间的通信请求
REQ参数受到等级控制。
这意味着只要设置了输入(REQ=true),指令就会发送通信请求。
其它客户端背景数据块的通信请求被阻止。
在服务器进行响应或输出错误消息之前,对输入参数的更改不会生效。
如果在请求期间再次设置了参数REQ,此后将不会进行任何其它传输。
DISCONNECT
Input
BOOL
通过该参数,可以控制与Modbus服务器建立和终止连接:
0:
建立与指定IP地址和端口号的通信连接。
1:
断开通信连接。
在终止连接的过程中,不执行任何其它功能。
成功终止连接后,STATUS参数将输出值7003。
而如果在建立连接的过程中设置了参数REQ,将立即发送请求。
CONNECT_ID
Input
UINT
确定连接的唯一ID。
指令“MB_CLIENT”和“MB_SERVER”的每个实例都必须指定一个唯一的连接ID。
IP_OCTET_1
Input
USINT
1.ModbusTCP服务器IP地址*中的八位字节。
IP_OCTET_2
Input
USINT
2.ModbusTCP服务器IP地址*中的八位字节。
IP_OCTET_3
Input
USINT
3.ModbusTCP服务器IP地址*中的八位字节。
IP_OCTET_4
Input
USINT
4.ModbusTCP服务器IP地址*中的八位字节。
IP_PORT
Input
UINT
服务器上使用TCP/IP协议与客户端建立连接和通信的IP端口号(默认值:
502).
MB_MODE
Input
USINT
选择请求模式(读取、写入或诊断)。
MB_DATA_ADDR
Input
UDINT
由“MB_CLIENT”指令所访问数据的起始地址。
DATA_LEN
Input
UINT
数据长度:
数据访问的位数或字数(请参见“MB_MODE和MB_DATA_ADDR参数”-数据长度)。
MB_DATA_PTR
InOut
VARIANT
指向Modbus数据寄存器的指针:
寄存器是用于缓存从Modbus服务器接收的数据或将发送到Modbus服务器的数据的缓冲区。
该指针必须引用具有标准访问权限的全局数据块。
寻址到的位数必须除以8。
DONE
Out
BOOL
只要最后一个作业成功完成,立即将输出参数DONE的位置位为“1”。
BUSY
Out
BOOL
0:
当前没有正在处理的“MB_CLIENT”作业
1:
"MB_CLIENT”作业正在处理中
ERROR
Out
BOOL
0:
无错误
1:
出错。
出错原因由参数STATUS指示。
STATUS
Out
WORD
指令的错误代码。
*ModbusTCP服务器32位IPv4IP地址中的8位长度的部分。
有关有效数据类型的更多信息,请参见“有效数据类型概述”。
说明
“MB_CLIENT”调用过程中统一输入数据
Modbus客户端调用Modbus指令时,输入参数的状态将存储在内部,并在下一次调用时比较。
这种比较用于确定这一特定调用是否初始化当前请求。
如果使用一个通用背景数据块,那么可以执行多个“MB_CLIENT”调用。
在执行“MB_CLIENT”实例的过程中,不得更改输入参数的值。
如果在执行过程中更改了输入参数,那么将无法使用“MB_CLIENT”检查实例当前是否正在执行。
多个客户端连接
ModbusTCP客户端可以支持多个TCP连接,连接的最大数目取决于所使用的CPU。
一个CPU的总连接数,包括ModbusTCP客户端和服务器的连接数,不能超过所支持的最大连接数。
ModbusTCP连接也可以由客户端和/或服务器连接共享。
使用各客户端连接时,请记住以下规则:
每个“MB_CLIENT”连接都必须使用唯一的背景数据块。
对于每个“MB_CLIENT”连接,必须指定唯一的服务器IP地址。
每个“MB_CLIENT”连接都需要一个唯一的连接ID。
该指令的各背景数据块都必须使用各自相应的连接ID。
连接ID与背景数据块组合成对,对每个连接,组合对都必须唯一。
根据服务器组态,可能需要或不需要IP端口的唯一编号。
该指令的静态变量
下表列出了“MB_CLIENT”指令背景数据块的可编辑静态变量。
变量
数据类型
起始值
说明
Blocked_Proc_Timeout
REAL
3.0
如果有一个被阻止的Modbus实例,则为复位静态变量ACTIVE前的等待时间(单位为秒)。
例如,如果输出了一个客户端请求,而且在该请求完全执行之前中止执行客户端功能,则可能发生这种情况。
最大等待时间为55秒。
MB_Transaction_ID
WORD
1
ModbusTCP协议的事务ID。
只有在ModbusTCP服务器需要一个不同值的情况下,才能更改起始值“1”。
MB_Unit_ID
BYTE
255
Modbus协议的单元ID。
该变量对应于ModbusRTU协议的从站地址。
只有在将ModbusTCP服务器用作一个网关,同时由Modbus服务器中应用程序进行控制时,才能更改此值。
RCV_TIMEOUT
REAL
2.0
“MB_CLIENT”指令等待服务器响应的时间间隔(单位为秒)。
Connected
BOOL
0
指示是否已建立与所指定客户端的连接:
1=已连接,0=未连接。
二、REQ和DISCONNECT参数
说明
如果当前未执行“MB_CLIENT”指令的实例,并且DISCONNECT参数的值为“0”,那么将在REQ=1时执行新作业。
如果尚无连接,将在执行期间建立一个连接。
如果在执行该活动作业之前再次执行“MB_CLIENT”指令的相同实例(DISCONNECT=0且REQ=1),那么不会在活动作业完成时执行该实例。
只有在活动作业完成时,才能启动新作业(REQ=1)。
可以使用DONE参数监视执行状态。
如果顺序执行“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_MODE
Modbus功能
数据长度
功能和数据类型
MB_DATA_ADDR
0
01
1到2000
读取输出位:
每个调用1到2000位
1到9999
0
02
1到2000
读取输入位:
每个调用1到2000位
10001到19999
0
03
1到125
读取保持寄存器:
每个调用1到125WORD
40001到49999
0
04
1到125
读取输入字:
每个调用1到125WORD
30001到39999
1
05
1
写入输出位:
每个调用1位
1到9999
1
06
1
写入保持寄存器:
1WORD每个调用
40001到49999
1
15
2到1968
写入多个输出位:
每个调用2到1968位
1到9999
1
16
2到123
写入多个保持寄存器:
每个调用2到123WORD
40001到49999
2
15
1到1968
写入一个或多个输出位:
每个调用1到1968位
1到9999
2
16
1到123
写入一个或多个保持寄存器:
每个调用1到123WORD
40001到49999
11
11
0
读取服务器通信的状态字和事件计数器:
状态字反映了处理的状态(0-未处理,0xFFFF-正在处理)
每次成功发送一条消息时,事件计数器都将递增。
执行该功能时,将不计算“MB_CLIENT”指令的MB_DATA_ADDR和MB_DATA_LEN参数。
-
80
08
1
通过错误代码0x0000检查服务器状态(返回循环测试-服务器发回请求):
1WORD每个调用
-
81
08
1
通过错误代码0x000A复位服务器的事件计数器:
1WORD每个调用
3到10、
12到79、
82到255
预留
四、MB_DATA_PTR参数
说明
MB_DATA_PTR参数是一个指向数据缓冲区的指针,该缓冲区用于存储从Modbus服务器读取或写入Modbus服务器的数据。
作为数据缓冲区,可以使用全局数据块或存储区域(M)。
对于存储区域(M)中的缓冲区,可通过以下方式使用ANY格式的指针:
“P#位地址”“数据类型”“长度”(例如:
P#M1000.0WORD500).
MB_DATA_PTR参数使用一个通信缓冲区:
对于“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元素指定数据类型。
对于Modbus位地址,将使用1位的数据类型BOOL
对于ModbusWORD地址,将使用16位的数据类型,如WORD、UINT、INT或REAL。
对于2个ModbusWORD地址,将使用32位的数据类型(双字),如DWORD、DINT或REAL。
通过MB_DATA_PTR,还可以访问复杂的DB元素,如:
标准数组
元素名称唯一的结构
元素名称唯一且数据类型长度为16或32位的复杂结构。
MB_DATA_PTR参数的数据区可以在不同的全局数据块中(或在不同的存储区中)。
例如,可以根据读作业和写作业使用不同的数据块,或者为每个“MB_CLIENT”站使用单独的数据块。
参数STATUS(常规状态信息)
STATUS*(W#16#)
说明
0000
指令已无错执行完毕。
0001
连接已建立。
0003
连接被终止。
7000
未激活任何调用(REQ=0)。
7001
首次调用时,REQ=1:
启动处理;BUSY的值为1。
7002
中间调用(与REQ无关)。
处理已激活;BUSY的值为1。
7003
正在终止连接。
7004
连接已建立且处于受监视状态。
未激活任何作业处理。
7005
已发送数据。
7006
已接收数据。
80BB
ACTIVE_EST参数值无效(建立此类连接的标识符,请参见T_CON_PARAM):
只允许对服务器建立被动连接(ACTIVE_EST=FALSE)。
只允许对客户端建立主动连接(ACTIVE_EST=TRUE)。
8380
接收的Modbus帧格式错误或接收到的字节过少。
*在程序编辑器中,错误代码可显示为整数或十六进制值。
有关切换显示格式的更多信息,请参见“另请参见”。
五、参数STATUS
参数STATUS(协议错误)
STATUS*(W#16#)
响应Modbus客户端的代码(B#16#)
说明
8381
01
不支持功能代码。
8382
03
数据长度错误。
8383
02
数据地址错误或访问MB_DATA_PTR地址以外的区域。
8384
03
数据值错误。
8385
03
不支持诊断错误代码(功能代码08)。
*在程序编辑器中,错误代码可显示为整数或十六进制值。
有关切换显示格式的更多信息,请参见“另请参见”。
参数STATUS(参数错误)
除了下表列出的错误还可能发生由通信指令(“TCON”、“TDISCON”、“TSEND”和“TRCV”)引起的“MB_CLIENT”指令错误。
STATUS*(W#16#)
说明
80C8
在指定的时间段中,服务器无响应。
请检查与Modbus服务器的连接。
只有在尝试了所组态的可重复尝试次数之后,才会报告该错误。
如果“MB_CLIENT”指令在指定时间内没有收到最初传输事务ID(MB_TRANSACTION_ID变量)的应答,则输出该错误代码。
8188
参数MB_MODE的值无效。
8189
MB_DATA_ADDR参数的数据地址无效。
818A
MB_DATA_LEN参数中的数据长度无效。
818B
参数MB_DATA_PTR中的指针无效。
请检查MB_DATA_ADDR和MB_DATA_LEN参数的值。
818C
MB_DATA_PTR指针将引用一个已优化的数据块。
既可以使用一个具有标准访问权限的数据块,也可以使用一个存储区
参数BLOCKED_PROC_TIMEOUT超时(请参见指令的静态变量)。
已超出55秒的限制。
818D
事务ID(MB_TRANSACTION_ID变量)与最初发送的ID不一致(请参见指令的静态变量)。
8200
该端口正在处理另一个Modbus请求。
MB_CLIENT具有相同连接参数的另一实例正在处理现有Modbus请求。
8380
接收到的已传输Modbus数据块格式不正确或接收到的字节过少。
8386
接收到的功能代码与最初发送的代码不一致。
8387
指定的连接ID与之前请求的不同。
“MB_CLIENT”指令的各背景数据块,只能使用一个连接ID。
服务器收到的ModbusTCP协议ID不为“0”时,也会输出错误代码。
8388
Modbus服务器发送的数据长度与所请求的不同。
只有使用Modbus功能15或16时才会发生这种错误。
*在程序编辑器中,错误代码可显示为整数或十六进制值。
有关切换显示格式的更多信息,请参见“另请参见”。
说明
内部使用的通信指令的错误代码。
对于“MB_CLIENT”指令,除了会发生表中列出的错误外,还会发生由该指令所使用的通信指令(“TCON”、“TDISCON”、“TSEND”和“TRCV”)所引起的错误。
错误代码通过“MB_CLIENT”指令的背景数据块来指定。
相应指令的错误代码会显示在Static部分中的STATUS下。
错误代码的含义在相应通信指令文档中提供。
六、MB_CLIENT示例1:
通过TCP连接发送多个请求
说明
通过一个TCP连接,发送多个Modbus客户端请求。
为此,需使用相同的背景数据块、相同的连接ID和相同的端口号。
每次只能激活一个客户端。
处理完一个客户端后,再继续处理下一个。
必须在程序中定义执行顺序。
在下列样本程序中,还将复制STATUS输出参数的值。
程序段1:
Modbus功能1-16个读取输出位
程序段2:
Modbus功能2-32个读取输入位
七、MB_CLIENT示例2:
通过多个TCP连接发送多个请求
说明
通过不同的TCP连接,发送多个Modbus客户端请求。
为此,则需使用不同的背景数据块和不同的连接ID。
如果连接指向相同的Modbus服务器,则使用不同的端口号。
如果连接指向不同的Modbus服务器,则可以任意指定端口号。
程序段1:
Modbus功能4-读取输入(WORD)
程序段2:
Modbus功能3-读取保持寄存器(WORD)
八、MB_CLIENT示例3:
协调多个请求
说明
确保执行了所有的Modbus请求。
可以通过程序协调各请求。
在以下示例中,演示了如何使用该指令协调第一客户端和第二个客户端请求的输出参数。
程序段1:
Modbus功能3-读取保持寄存器(WORD)
程序段2:
Modbus功能3-读取保持寄存器(WORD)
九、MB_SERVER示例:
多个TCP连接
说明
可以使用多个ModbusTCP服务器连接。
为此,每个连接都必须单独调用“MB_SERVER”指令。
每个连接都需要下列数据:
∙
指令的一个独立背景数据块
唯一的连接ID
单独的IP端口(在S7-1200上,每个IP端口只允许一个连接)
为了优化性能,每个连接的每个程序循环中都应执行“MB_SERVER”指令。
程序段1:
带有相关IP端口连接ID和背景数据块的连接#1
程序段2:
带有相关IP端口连接ID和背景数据块的连接#1