3.0.8
ModbusL 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 连接从站。
- 参数
com
。serial实例。
返回一个从站实例 或 抛出错误。
连接法兰从站
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)