ModBus主从通讯-主站篇
  • ModBus
  • 主站
  • TCP
  • RTU
  • 通讯
Elite
Always Easier Than Before

介绍

ModBus是一种串行通信协议,一种标准的工业通信协议,同时是目前工业电子设备之间常用的连接方式。

艾利特机器人分别支持ModBus主、从站功能,从通讯的形式上分为MoBus TCP和ModBus RTU,其中ModBus从站功能通过配置即可。

通过ModBus主站功能,机器人可以向外部设备读取写入数据,已达到数据交互和逻辑控制的用途。

艾利特机器人的ModBus主站同时也支持ModBus RTU 和 ModBus TCP,其中ModBus TCP功能需要连接以太网接口,而ModBus RTU的硬件接口形式分为控制器485口工具末端485口

ModBus主站功能通过lua脚本实现,可以参考Elite_lua手册进行使用。其中MODBUS MASTER为已经封装的接口,用户只需传入相应参数即可;如有其他特殊协议要求,可以使用TCP/UDP通讯、485通讯、TCI通讯(工具末端485)和232通讯等。

ModBus Master接口简介

获取modbus rtu句柄

ctx = modbus_new_rtu(choose, baud, parity, data_bit, stop_bit)

参数:

int choose: 0 主板 485 口,2 TCI 485 口(必须)

int baud: 4800 9600 ...(非必须,可写可不写,不写默认 4800)

int parity:‘E’,‘N’,‘O’的 ASCII 码值 69,78,79(非必须,可写可不写,不写默认 78)

int data_bit: 7/8 (非必须,可写可不写,不写默认 8)

int stop_bit: 1/2 (非必须,可写可不写,不写默认 1)

返回值:

ctx: modbus句柄

示例:

ctx = modbus_new_rtu(1, 9600, 78, 8, 1)

获取modbus tcp句柄

ctx = modbus_new_tcp(ip, port)

参数:

string ip:modbus slave的ip地址

int port:modbus slave的端口号

返回值:

ctx:modbus句柄

示例:

ctx = modbus_new_tcp("192.168.1.15", 502)

连接modbus句柄

ret = modbus_connect(ctx)

参数:

ctx:modbus句柄

返回值:

int ret:-1连接失败;其他值连接成功。当连接modbus rtu句柄时,该接口返回的数值不作为判断连接成功的标志

示例:

modbus_connect(ctx)

关闭modbus句柄

modbus_close(ctx)

参数:

ctx:modbus句柄

返回值:

示例:

modbus_close(ctx)

设置slave地址

ret = modbus_set_slave(ctx, slave_id)

参数:

ctx:modbus句柄

int slave_id:从站地址

返回值:

int ret:-1:连接失败;其他正常

示例:

modbus_set_slave(ctx ,0x2)


写单个保持寄存器 功能码06

ret = modbus_write_register(ctx, reg, value)

参数:

ctx:modbus句柄

int reg:保持寄存器地址(十进制)

int value:值

返回值:

int ret:-1:出错;其他正常

示例:

modbus_write_register(ctx , 771, 1)

读线圈 功能码01

reg_value = modbus_read_bits(ctx, reg, len)

参数:

ctx:modbus句柄

int reg:线圈地址

int value:线圈个数(<128)

返回值:

table reg_value:读取线圈地址的数据列表

示例:

ret= modbus_read_bits(ctx , 771 ,1)

写多个线圈 功能码15

ret = modbus_write_bits(ctx, reg, size, value)

参数:

ctx:modbus句柄

int reg:线圈地址

int size:线圈数量

int value:写入线圈的数据,table

返回值:

int ret:-1:出错;其他正常

示例:

value_array = {1, 1, 1}
modbus_write_bits(ctx, 1, 3, value_array)

写单个线圈 功能码05

ret = modbus_write_bit(ctx, reg, value)

参数:

ctx:modbus句柄

int reg:线圈地址

int value:写入线圈的数据

返回值:

int ret:-1:出错;其他正常

示例:

modbus_write_bit(ctx , 1, 1)

读输入寄存器 功能码04

ret, reg_value = modbus_read_input_register(ctx, addr)

参数:

ctx:modbus句柄

int addr:输入寄存器地址

返回值:

int ret:-1:出错;其他正常

int reg_value:读取成功返回的寄存器数值

示例:

modbus_read_input_register(ctx , 1)

写多个保持寄存器 功能码16

modbus_write_registers(ctx, reg, size, value)

参数:

ctx:modbus句柄

int reg:寄存器地址

int size:数量

table value:写入的数据

返回值:

int -1:出错;其他正常

示例:

modbus_write_registers (ctx , 1, 3, {0x3444, 0x3333, 0x4444})

读保持寄存器 功能码03

modbus_read_registers(ctx, addr, len)

参数:

ctx:modbus句柄

int addr:寄存器地址

int len:个数 [1,125]

返回值:

失败:空,成功:寄存器值table

示例:

sleep(5)
ctx = modbus_new_rtu(2 ,9600 ,78 ,8 ,1)
sleep(1)
modbus_set_slave(ctx ,0x1)
elite_print(value)
table_c = modbus_read_register(ctx ,1 ,12)
sleep(1)
i = 1
for i,v in pairs(table_c) do
    elite_print(v)
end

RTU 示例

sleep(5)
ctx = modbus_new_rtu(0,9600,78,8,1)
modbus_connect(ctx)        
ret1 = modbus_set_slave(ctx,0x3)
if(ret1 == -1) then
    elite_print("Wrong address")
end        
ret2 = modbus_write_register(ctx,771,1)        
if(ret2 == -1) then     
    elite_print("Write error")
end
ret3,value = modbus_read_register(ctx,771)        
if(ret3 == -1) then       
    elite_print("Read error")
end
elite_print("value is:",value)
modbus_close(ctx)

TCP 示例

sleep(5)
ip = "192.168.1.7"
port = 502
ctx = modbus_new_tcp(ip,port)
repeat
    ret = modbus_connect(ctx)
until(ret ~= -1)
ret2 = modbus_write_register(ctx,771,1)
if(ret2 == -1) then        
     elite_print("Write error")
end
ret3, value = modbus_read_register(ctx,771)
if(ret3 == -1) then        
    elite_print("Read error")
end
elite_print("value is:",value)
modbus_close(ctx)
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
1.436K
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明