跳到主要内容

Modbus

指令列表 Modbus函数用于建立Modbus主站与从站进行通讯,寄存器地址的取值范围与定义请参考对应从站的Modbus寄存器地址定义说明。

指令功能
ModbusCreate创建Modbus主站
ModbusRTUCreate创建基于RS485接口的Modbus主站
ModbusClose和Modbus从站断开连接
GetInBits读取触点寄存器
GetInRegs读取输入寄存器
GetCoils读取线圈寄存器
SetCoils写入线圈寄存器
GetHoldRegs读取保持寄存器
SetHoldRegs写入保存寄存器

各类寄存器对应的Modbus功能码遵循标准Modbus协议:

寄存器类型 读取寄存器 写单个寄存器 写多个寄存器 线圈寄存器 01 05 0F 触点寄存器 02 - - 输入寄存器 04 - - 保持寄存器 03 06 10

ModbusCreate

原型:

ModbusCreate(IP, port, slave_id, isRTU)

描述:

创建Modbus主站,并和从站建立连接。最多支持同时连接15个设备。

连接机器人自带的从站时IP设置为机器人的IP(默认192.168.5.1,可修改),端口设置为502(map1)或1502(map2),详见附录A Modbus寄存器定义。

连接第三方从站时,IP和端口为第三方从站的地址,读写寄存器时的寄存器地址的取值范围与定义请参考对应从站的Modbus寄存器地址定义说明。

必选参数:

  • IP:从站IP地址。
  • port:从站端口。

可选参数:

  • slave_id:从站ID。

  • isRTU:布尔值。如果不携带或为fasle,建立ModbusTCP通信; 如果为true,建立ModbusRTU通信。

    注意:
    此参数决定了连接建立后传输数据使用的协议格式,并不影响连接结果。因此,如果创建主站时该参数设置错误,依然可以创建成功,但后续通讯时会导致异常。

返回:

  • err:

    • 0:创建Modbus主站成功
    • 1:创建的主站已达到最大数量,创建新主站失败
    • 2:初始化主站失败,建议检查IP,端口,网络是否正常等
    • 3:连接从站失败,建议排查从站是否正常建立,网络是否正常等
  • id:返回的主站索引,后续调用其他Modbus指令时使用。取值范围:[0, 14]

示例:

-- 创建Modbus主站,并和指定从站建立连接。
local ip="192.168.5.123"
local port=503
local err=0
local id=0
err, id = ModbusCreate(ip, port, 1)
-- 创建Modbus主站,并和机器人自带从站建立连接。
local ip="192.168.5.1"
local port=502
local err=0
local id=0
err, id = ModbusCreate(ip, port)

ModbusRTUCreate

原型:

ModbusRTUCreate(slave_id, baud, parity, data_bit, stop_bit)

描述:

创建基于RS485接口的Modbus主站,并和从站建立连接。最多支持同时连接15个设备。

必选参数:

  • slave_id:从站ID。
  • baud:RS485接口的波特率。

可选参数:

  • parity:是否有奇偶校验位。"O"表示奇校验,"E"表示偶校验,"N"表示无奇偶校验位。不带参时默认值为“E”。
  • data_bit:数据位长度。取值范围:8。不带参时默认值为8。
  • stopbit:停止位长度。取值范围:1,2。不带参时默认值为1。

返回:

  • err:
    • 0表示创建Modbus主站成功
    • 1表示创建Modbus主站失败。
  • id:返回的主站索引,后续调用其他Modbus指令时使用。

示例:

-- 创建Modbus主站并与RS485接口连接的从站建立连接,从站ID为1,波特率为115200。
err, id = ModbusRTUCreate(1, 115200)

ModbusClose

原型:

ModbusClose(id)

描述:

和Modbus从站断开连接,释放主站。

必选参数:

  • id:已创建的主站索引。

返回:

  • 操作结果
    • 0:断开连接成功。
    • 1:断开连接失败。

示例:

-- 和Modbus从站断开连接。
ModbusClose(id)

GetInBits

原型:

GetInBits(id, addr, count)

描述:

读取Modbus从站触点寄存器地址的值。对应Modbus功能码02。

必选参数:

  • id:已创建的主站索引。
  • addr:触点寄存器起始地址。
  • count:连续读取触点寄存器的数量。取值范围:1~2000(ModbusTCP协议协议限制,实际取值范围请根据从站寄存器数量或协议规范确定)

返回:

触点寄存器地址的值,存储在table中。table中第一个值对应触点寄存器起始地址的值。

示例:

-- 从地址0开始连续读取5个地址的值。 inBits = GetInBits(id,0,5)

GetInRegs

原型:

GetInRegs(id, addr, count, type)

描述:

按照指定的数据类型,读取Modbus从站输入寄存器地址的值。对应Modbus功能码04。

必选参数:

  • id:已创建的主站索引。

  • addr:输入寄存器起始地址。

  • count:连续读取输入寄存器的数量。取值范围:1~125(ModbusTCP协议协议限制,实际取值范围请根据从站寄存器数量或协议规范确定) 可选参数:

  • type:数据类型。如果为空,默认为U16

    • U16:16位无符号整数(2个字节,占用1个寄存器)
    • U32:32位无符号整数(4个字节,占用2个寄存器)
    • F32:32位单精度浮点数(4个字节,占用2个寄存器)
    • F64:64位双精度浮点数(8个字节,占用4个寄存器)

返回:

输入寄存器地址的值,存储在table中。table中第一个值对应输入寄存器起始地址的值。

示例:

-- 从地址2048开始读取一个32位无符号整数。
data = GetInRegs(id, 2048, 2, "U32")

GetCoils

原型:

GetCoils(id, addr, count)

描述:

读取Modbus从站线圈寄存器地址的值。对应Modbus功能码01。

必选参数:

  • id:已创建的主站索引。
  • addr:线圈寄存器起始地址地址。
  • count:连续读取线圈寄存器的数量。取值范围:1~2000(ModbusTCP协议协议限制,实际取值范围请根据从站寄存器数量或协议规范确定) 返回:

线圈寄存器地址的值,存储在table中。table中第一个值对应线圈寄存器起始地址的值。

示例:

-- 从地址0开始连续读取5个地址的值。
Coils = GetCoils(id,0,5)

SetCoils

原型:

SetCoils(id, addr, count, table)

描述:

将指定的值写入线圈寄存器指定的地址。对应Modbus功能码05(写单个)和0F(写多个)。

必选参数:

  • id:已创建的主站索引。
  • addr:线圈寄存器起始地址。
  • count:连续写入线圈寄存器的数量。取值范围:1~1968(ModbusTCP协议协议限制,实际取值范围请根据从站寄存器数量或协议规范确定)
  • table:要写入线圈寄存器的值,存储在table中。table中第一个值对应线圈寄存器起始地址的值。 示例:
-- 从地址1024开始,连续写5个线圈。
local Coils = {0,1,1,1,0}
SetCoils(id, 1024, #coils, Coils)

GetHoldRegs

原型:

GetHoldRegs(id, addr, count, type)

描述:

按照指定的数据类型,读取Modbus从站保持寄存器地址的值。对应Modbus功能码03。

必选参数:

  • id:已创建的主站索引。

  • addr:保持寄存器起始地址。

  • count:连续读取保持寄存器的数量。取值范围:1~125(ModbusTCP协议协议限制,实际取值范围请根据从站寄存器数量或协议规范确定) 可选参数:

  • type:数据类型。如果为空,默认为U16

    • U16:16位无符号整数(2个字节,占用1个寄存器)
    • U32:32位无符号整数(4个字节,占用2个寄存器)
    • F32:32位单精度浮点数(4个字节,占用2个寄存器)
    • F64:64位双精度浮点数(8个字节,占用4个寄存器)

返回:

保持寄存器地址的值,存储在table中。table中第一个值对应保持寄存器起始地址的值。

示例:

-- 从地址2048开始读取一个32位无符号整数。
data = GetHoldRegs(id, 2048, 2, "U32")

SetHoldRegs

原型:

SetHoldRegs(id, addr, count, table, type)

描述:

按照指定的数据类型,写入指定的值到保持寄存器指定的地址。对应Modbus功能码06(写单个)和10(写多个)。

必选参数:

  • id:已创建的主站索引。

  • addr:保持寄存器起始地址。

  • count:连续写入保持寄存器的数量。取值范围:1~123(ModbusTCP协议协议限制,实际取值范围请根据从站寄存器数量或协议规范确定)

  • table:要写入保持寄存器的值,存储在table中。table中第一个值对应保持寄存器起始地址的值。 可选参数:

  • type:数据类型。如果为空,默认为U16

    • U16:16位无符号整数(2个字节,占用1个寄存器)
    • U32:32位无符号整数(4个字节,占用2个寄存器)
    • F32:32位单精度浮点数(4个字节,占用2个寄存器)
    • F64:64位双精度浮点数(8个字节,占用4个寄存器)

示例:

-- 从地址2048开始,写入一个64位双精度浮点数。
local data = {95.32105}
SetHoldRegs(id, 2048, 4, data, "F64")