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)