从主机读取数据网络通讯协议服务器
可通过Modbus读取的数据类型
的读
函数从四种目标可寻址区域执行读操作:
线圈
输入
输入寄存器
持有注册
执行读取时,必须指定目标类型(目标
),开始地址(地址
)和要读取的值的数量(数
).你也可以指定服务器的地址(serverId
),而数据格式(精度
)。
有关显示在PLC上读取持有寄存器的整个工作流程的示例,请参见从远程温度传感器读取温度.
阅读线圈网络通讯协议
如果读目标是线圈,则该函数从远程服务器中的1-2000个连续线圈中读取值,从指定的地址开始。线圈是一个单输出位。的值1
表示线圈处于开启状态,值为0
意味着它是关闭的。
读取线圈的语法是:
读(obj,“线圈”,地址,数量)
的obj
参数是Modbus对象的名称。下面的例子假设您已经创建了一个Modbus对象,米
.有关创建对象的信息,请参见创建Modbus连接.
的地址
参数是要读取的线圈的起始地址,指定为双精度。的数
参数是要读取的线圈数,指定为double。如果读取成功,则返回一个具有的双值的向量1
或0
,其中矢量中的第一个值对应于开始地址处的线圈值。
这个示例读取8个线圈,从地址1开始。
读(m,“线圈”1 8)
Ans = 1 1 0 1 1 0 10 0
您还可以将值读入变量以供以后访问。
数据= read(m,“线圈”1 8)
数据= 1 1 0 1 1 0 1 0
读取输入网络通讯协议
如果读目标是输入,则该函数从远程服务器中的1-2000个连续的离散输入中读取值,从指定的地址开始。离散输入是单个输入位。的值1
表示输入是打开的,值为0
意味着它是关闭的。
读取输入的语法是:
读(obj,“输入”,地址,数量)
的obj
参数是Modbus对象的名称。下面的例子假设您已经创建了一个Modbus对象,米
.有关创建对象的信息,请参见创建Modbus连接.
的地址
参数是要读取的输入的起始地址,指定为双精度。的数
参数是要读取的输入数,指定为双精度。如果读取操作成功,则返回的双值向量1
或0
,其中向量的第一个值对应于起始地址处的输入值。
这个示例从地址2开始读取10个离散输入。
读(m,“输入”、2、10)
Ans = 1 1 0 1 1 0 1 0 1 0 0 1
读取输入寄存器网络通讯协议
如果读目标是输入寄存器,则该函数从远程服务器中的1-125个连续输入寄存器中读取值,从指定的地址开始。输入寄存器是16位只读寄存器。
读取输入寄存器的语法是:
读(obj, inputregs、地址、数量)
的obj
参数是Modbus对象的名称。下面的例子假设您已经创建了一个Modbus对象,米
.有关创建对象的信息,请参见创建Modbus连接.
的地址
参数是要读取的输入寄存器的起始地址,用双精度值指定。的数
参数是要读取的输入寄存器数目,指定为双精度。如果读取操作成功,则返回一个double类型的向量。每个double表示一个16位寄存器值,其中vector中的第一个值对应于起始地址处的输入寄存器值。
这个示例读取4个输入寄存器,从地址20开始。
读(m,“inputregs”, 20岁,4)
Ans = 27640 60013 51918 62881
读取保持寄存器网络通讯协议
如果读目标是持有寄存器,则该函数从远程服务器中的1-125个连续持有寄存器中读取值,从指定的地址开始。保持寄存器是一个16位读/写寄存器。
读取输入的语法是:
读(obj, holdingregs、地址、数量)
的obj
参数是Modbus对象的名称。下面的例子假设您已经创建了一个Modbus对象,米
.有关创建对象的信息,请参见创建Modbus连接.
的地址
参数是要读取的保存寄存器的起始地址,指定为double类型。的数
参数是要读取的保存寄存器的数量,指定为double。如果读取操作成功,则返回一个double类型的向量。每个double表示一个16位寄存器值,其中vector中的第一个值对应于起始地址处的保存寄存器值。
这个示例读取4个保持寄存器,从地址20开始。
读(m,“holdingregs”, 20岁,4)
Ans = 27640 60013 51918 62881
有关显示在PLC上读取持有寄存器的整个工作流程的示例,请参见从远程温度传感器读取温度.
指定服务器ID和精度
您可以读取这四种类型的目标中的任何一种,还可以为服务器ID指定可选参数,并为寄存器指定精度。
服务器ID选项
的serverId
参数指定要将读命令发送到的服务器地址。有效值为0 - 247
,0
是广播地址。这个参数是可选的,默认为1
.
请注意
如果您的设备使用slaveID
属性,它可能会把它用作serverID
具有读
命令如下所示。
指定服务器ID的语法是:
读(obj,目标,地址,统计,serverId)
这个例子从服务器ID 3读取8个从地址1开始的线圈。
读(m,“线圈”1、8、3)
精确的选择
的“精度”
参数指定在Modbus上读取的寄存器的数据格式®服务器。有效值为“uint16”
,“int16”
,“uint32”
,“int32”
,“uint64”
,“int64”
,“单一”
,“双”
.这个参数是可选的,默认为“uint16”
.
请注意,“精度”
不引用返回类型,它总是“双”
.它只指定如何解释寄存器数据。
指定精度的语法是:
读(obj、目标、地址、计数、精度)
此示例读取从地址1开始的8个保存寄存器,其精度为“uint32”
.
读(m,“holdingregs”1 8“uint32”)
两个选项
你可以设置两个serverId
选项和“精度”
选项放在一起,当目标是一个寄存器时。当您同时使用两个选项时,serverId
列在必需的参数之后。
同时指定服务器ID和精度的语法是:
读(obj、目标、地址、计数、serverId精度)
此示例读取从地址1开始的8个保存寄存器,其精度为“uint32”
从服务器ID 3。
读(m,“holdingregs”1 8 3“uint32”)
读取混合数据类型
通过为每个值指定数据类型,可以在单个读取操作中读取不同数据类型(精度)的连续值。的语法中可以做到这一点读
函数,或设置包含计数和精度数组的变量。这里显示了这两种方法。
在读
语法
的例子读
只有一种数据类型的函数是:
读(m,“holdingregs”500年10“uint32”)
在那个例子中,目标类型是保存寄存器,起始地址是500
,计数为10
,精度为uint32
.要读取10个混合数据类型的值,可以使用以下语法:
读(m,“holdingregs”,500,[3 2 3 2],{“uint16”,“单一”,“双”,“int16”})
可以使用数组来指定计数和精度。在本例中,计数为3、2、3和2。该函数读取3个数据类型的值uint16
, 2个数据类型的值单
, 3个数据类型的值双
和2个数据类型的值int16
.寄存器是连续的,从address开始500
.下面的示例读取为3uint16
来自地址的值500 - 502
, 2单
来自地址的值503 - 506
3双
来自地址的值507 - 518
,和2int16
来自地址的值519 - 520
,都在一个操作。
使用变量
而不是使用文字数组在读
如上面所示,可以用数组值指定变量作为函数参数。上面例子的等价值是:
Count = [3 2 3 2] precision = {“uint16”,“单一”,“双”,“int16”}读取(m,“holdingregs”, 500年统计,精确)
当您有很多值要读取且它们是混合数据类型时,使用变量非常方便。