跳到主要内容

Modbus

不同版本的控制器、插件和上位机支持不同的 lua API 指令,开发者可在 DobotStudio Pro “应用” 菜单,“脚本编程” 的指令侧边栏查看具体支持的 lua API

指令列表 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")