Modbus 3.0.8

L Master 3.0 版本以后,机器人支持作为 Modbus 主站(客户端),以便和 PLC(可编程逻辑控制器)连接进行编程。支持基于网络连接的 TCP/Socket 底层协议和 RTU 串口协议。

注意

由于通信不稳定等原因,可能导致错误发生。大多数情况下,需要使用错误处理机制来捕获错误,防止异常退出。

兼容说明

在老版本的 L Master 2.x 中,预置了一个开源库在新窗口打开来处理 Modbus 通讯:

require('libmodbus')

当串口或者网络通讯异常时,该库有可能会导致系统卡死、崩溃。该用法 3.0 版本已废弃。

连接Modbus/TCP IP 从站

modbus.new_tcp(ip, port)

通过 Modbus/TCP IP 连接从站。

支持 IPv4、IPv6

返回一个从站实例 或 抛出错误。

连接Modbus/RTU从站

modbus.new_rtu(com)

通过 Modbus/RTU 连接从站。

返回一个从站实例 或 抛出错误。

连接法兰从站

modbus.new_flange()

通过 法兰的 Modbus/RTU 连接从站。

波特率暂仅支持 115200 bps。

暂仅支持使用 8 位数据位、1 位停止位、无检验位。

返回一个从站实例 或 抛出错误。

设置从站 ID

mb:set_slave(id)

返回空

设置超时时间

mb:set_timeout(timeout)
  • 参数
    • timeout 超时时间,单位毫秒(ms)。默认800ms

写入单个线圈

mb:write_single_coil(addr, val)

返回空 或 抛出连接错误

写入多个线圈

mb:write_multiple_coils(addr, vals)

返回空 或 抛出连接错误

读取多个线圈

mb:read_coils(addr, num)

返回布尔数组 或 抛出连接错误

读取多个离散输入

mb:read_discrete_inputs(addr, num)

返回布尔数组 或 抛出连接错误

写入单个保持寄存器

mb:write_single_register(addr, val)

返回空 或 抛出连接错误

写入多个保持寄存器

mb:write_multiple_registers(addr, vals)

返回空 或 抛出连接错误

读取多个保持寄存器

mb:read_holding_registers(addr, num)

返回 u16 数组 或 抛出连接错误

读取多个输入寄存器

mb:read_input_registers(addr, num)

返回 u16 数组 或 抛出连接错误

读写多个寄存器

mb:read_write_multiple_registers(read_addr, read_num,write_addr, write_val)

返回 u16 数组 或 抛出连接错误

示例

-- 使用Modbus/RTU
local com1 = serial.open("/dev/ttyS1")
com1:set_timeout(200)
com1:set_baud_rate(9600)
local mb = modbus.new_rtu(com1)
-- 使用Modbus/TCP
local mb = modbus.new_tcp("192.168.1.2", 10001)
-- 使用末端法兰Modbus
local mb = modbus.new_flange()

-- 配置Modbus
mb:set_timeout(500)
mb:set_slave(0x01)

-- 设置1路DO,使用pcall捕获错误
success, result = pcall(function() mb:write_single_coil(0x0000, true) end)
if not success then
  print("Error: ", result)
end
-- 设置并读取5路DO,使用pcall捕获错误
success, result = pcall(function()
  -- 设置5路DO
  mb:write_multiple_coils(0x0000, {true,true,true,true,true})
  -- 读取5路DO
  mb:read_coils(0x0000, 5)
end)
if not success then
  print("Error: ", result)
end
-- 读取5路DI
mb:read_discrete_inputs(0x0000, 5)

-- 设置1路AO
mb:write_single_register(0x0090, 0x0088)
-- 设置2路AO
mb:write_multiple_registers(0x0090, {0x0088, 0x0088})
-- 读取2路AO
mb:read_holding_registers(0x0090, 2)
-- 读取2路AI
mb:read_input_registers(0x0080, 2)