跳转至

modbus - modbus主从协议栈协议

-- 本库用于方便的管理和处理Modbus的主从消息

常量

常量 类型 解释
modbus.MODBUS_RTU number ModbusRTU模式
modbus.MODBUS_ASCII number ModbusASCII模式
modbus.MODBUS_TCP number ModbusTCP模式
modbus.CIOLS number 线圈寄存器
modbus.INPUTS number 触点寄存器
modbus.INPUT_REGISTERS number 输入寄存器
modbus.REGISTERS number 保持寄存器
modbus.READ number 操作类型,读操作
modbus.WRITE number 操作类型,写操作
modbus.LOOP number 通讯模式,自动通讯
modbus.LOOP number 通讯模式,手动通讯
modbus.SLAVE_NORMAL number 从站状态正常
modbus.SLAVE_OFFLINE number 从站通讯离线
modbus.SLAVE_UNKNOWN number 从站状态未知
modbus.SLAVE_COMM_TIMEOUT number 从站通讯超时
modbus.SLAVE_ERROR number 从站错误

modbus.set_comm_interval_time(master_handler, time_ms)

设置通讯间隔时间

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
int 通讯间隔时间,单位ms。
return

返回值

例子

-- 设置通讯间隔时间为100ms
modbus.set_comm_interval_time(mb_rtu, 100)

modbus.set_comm_timeout(master_handler, time_ms)

设置通讯超时时间

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
int 通讯超时时间,单位ms。
return

返回值

例子

-- 设置通讯超时时间为1000ms
modbus.set_comm_timeout(mb_rtu, 1000)

modbus.set_comm_resend_count(master_handler, resend_count)

设置消息发送失败、超时重发次数

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
int 消息发送失败、超时重发次数
return

返回值

例子

-- 设置消息发送失败、超时重发次数为1
modbus.set_comm_resend_count(mb_rtu, 1)

modbus.set_comm_reconnection_time(master_handler, reconnection_time)

设置断线重连时间间隔(该函数仅对TCP类型的主站生效)

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
int 断线重连时间间隔,单位ms
return

返回值

例子

-- 设置断线重连时间间隔为5000ms
modbus.set_comm_reconnection_time(mb_rtu, 5000ms)

modbus.get_all_slave_state(master_handler)

获取所有从站状态

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文

返回值

返回值类型 解释
boolean 如果所有从站状态为正常,返回true,其他情况返回false

例子

-- 获取所有从站状态
modbus.get_all_slave_state(mb_rtu)

modbus.exec(master_handler, msg_handler)

执行一条modbus指令。该指令仅执行一次,优先级为最高,执行完成自动结束。

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
userdata 通过modbus.create_msg获取到的上下文

返回值

返回值类型 解释
boolean 成功返回true,其他情况返回false

例子

-- 执行一条modbus指令
modbus.exec(mb_rtu, msg)

-- 注意: 使用的 msg_handler 句柄,在创建时,必须具有modbus.EXEC属性,否则该指令无效

modbus.master_start(master_handler)

启动modbus主协议栈

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
return

返回值

例子

-- 启动modbus主协议栈
modbus.master_start(mb_rtu)

modbus.master_stop(master_handler)

停止Modbus主协议栈

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
return

返回值

例子

-- 停止modbus主协议栈
modbus.master_stop(mb_rtu)

modbus.add_slave(master_handler, slave_id, ip, port)

创建并向主站添加一个modbus从站

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
int 从站地址(范围1-247)
string 从站设备的ip地址(当主站为RTU、ASCII模式时,该参数无效)
int 从站设备的端口号(当主站为RTU、ASCII模式时,该参数无效)

返回值

返回值类型 解释
userdata 创建成功返回上下文,否则返回nil

例子

-- modbus主站为RTU、ASCII模式,忽略ip和port参数
-- 向主站创建并添加一个从站,从站站号为1
slave = modbus.add_slave(mb_rtu, 1)

-- TCP模式,向主站创建并添加一个从站,从站站号为1,ip为"192.168.10.133",port为502
slave = modbus.add_slave(mb_tcp, 1, "192.168.10.133", 502)

modbus.remove_slave(master_handler, slave_handler)

删除一个从站对象,并删除与之相关的通讯消息句柄。(需在主站停止(modbus.master_stop)时执行该操作,否则无效)

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
userdata 通过modbus.add_slave获取到的上下文

返回值

返回值类型 解释
boolean 成功返回true,失败返回false

例子

-- 删除一个从站
modbus.remove_slave(mb_rtu, slave)

modbus.get_slave_state(slave_handler)

获取一个从站的状态

参数

传入值类型 解释
userdata 通过modbus.add_slave获取到的上下文

返回值

返回值类型 解释
int modbus.SLAVE_NORMAL(状态正常),modbus.SLAVE_OFFLINE(设备离线),modbus.SLAVE_UNKNOWN(状态未知),modbus.SLAVE_COMM_TIMEOUT(通讯超时,超时N次转化为离线),modbus.SLAVE_ERROR(错误)

例子

-- 获取一个从站的状态
modbus.get_slave_state(slave)

modbus.create_msg(master_handler, slave_handler, reg_type, opt_type, reg_addr, reg_len, data_addr, comm_period,comm_mode)

向指定从站,创建并添加一条通讯消息

参数

传入值类型 解释
userdata 通过modbus.create_master获取到的上下文
userdata 通过modbus.add_slave获取到的上下文
int 寄存器类型,modbus.CIOLS(线圈)、modbus.INPUTS(触点)、modbus.INPUT_REGISTERS(输入寄存器)、modbus.REGISTERS(保持寄存器)
int 操作类型,modbus.READ(读寄存器)、modbus.WRITE(写寄存器)
int 寄存器地址,0-65535
int 寄存器数量,最大120
userdata 用户数据缓冲区,通过zbuff.create获取到的上下文
int 通讯周期,默认值1
int 通讯模式,取 modbus.LOOP(自动执行模式)、modbus.EXEC(手动执行模式),默认值为modbus.LOOP

返回值

返回值类型 解释
userdata 创建成功返回上下文,否则返回nil

例子

-- 向指定从站,创建并添加一条通讯消息
-- 从 slave 从站中读取消息,寄存器类型为modbus.REGISTERS,操作类型为modbus.READ,寄存器地址为0,寄存器数量为10,数据缓存地址为zbuf,通讯周期为1,通讯模式为modbus.LOOP
msg = modbus.create_msg(mb_rtu, slave, modbus.REGISTERS, modbus.READ, 0, 10, zbuf, 1, modbus.LOOP)

--缺省的写法
msg = modbus.create_msg(mb_rtu, slave, modbus.REGISTERS, modbus.READ, 0, 10, zbuf)

modbus.create_slave(type, slave_id, uartid_port, adapter_index)

创建一个从站句柄

参数

传入值类型 解释
int modbus协议类型,modbus.MODBUS_RTU、modbus.MODBUS_ASCII、modbus.MODBUS_TCP
int 从站地址,范围1-247
int 若协议类型为modbus.MODBUS_RTU、modbus.MODBUS_ASCII模式,则该参数为串口ID(uartid);若协议类型为modbus.MODBUS_TCP则该参数为本地端口号
int 网卡适配器序列号,如果不填,则为最后一个注册的网卡适配器序号(协议类型为modbus.MODBUS_RTU、modbus.MODBUS_ASCII模式时,该参数无效)

返回值

返回值类型 解释
userdata 创建成功返回上下文,否则返回nil

例子

-- 创建一个从站句柄,协议类型为RTU模式,从站ID为1,usrt设备id为1
mb_rtu_s = modbus.create_slave(modbus.MODBUS_RTU, 1, 1)

-- 创建一个从站句柄,协议类型为TCP模式,从站ID为1,本次端口号为502,网络设备为本地有线网络
mb_tcp_s = modbus.create_slave(modbus.MODBUS_TCP, 1, 502, socket.LWIP_ETH)

modbus.add_block(slave_handler, reg_type, reg_addr, reg_len, data_addr)

添加一块寄存器内存区

参数

传入值类型 解释
userdata 通过modbus.create_slave获取到的上下文
int 寄存器类型,modbus.CIOLS(线圈)、modbus.INPUTS(触点)、modbus.INPUT_REGISTERS(输入寄存器)、modbus.REGISTERS(保持寄存器)
int 寄存器地址,0-65535
int 寄存器数量,最大120
userdata 用户数据缓冲区,通过zbuff.create获取到的上下文

返回值

返回值类型 解释
boolean 添加成功返回true,其他情况返回false

例子

-- 添加一块寄存器内存区,寄存器类型为modbus.REGISTERS,寄存器地址为0,寄存器数量为32,数据缓存地址为registers
modbus.add_block(mb_tcp_s, modbus.REGISTERS, 0, 32, registers)

modbus.slave_start(slave_handler)

启动modbus从协议栈

参数

传入值类型 解释
userdata 通过modbus.create_slave获取到的上下文
return

返回值

例子

-- 启动modbus从协议栈
modbus.slave_start(mb_tcp_s)

modbus.slave_stop(slave_handler)

停止modbus从协议栈

参数

传入值类型 解释
userdata 通过modbus.create_slave获取到的上下文
return

返回值

例子

-- 停止modbus从协议栈
modbus.slave_stop(mb_tcp_s)