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通讯等。
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)
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)
ret = modbus_connect(ctx)
参数:
ctx:modbus句柄
返回值:
int ret:-1连接失败;其他值连接成功。当连接modbus rtu句柄时,该接口返回的数值不作为判断连接成功的标志
示例:
modbus_connect(ctx)
modbus_close(ctx)
参数:
ctx:modbus句柄
返回值:
无
示例:
modbus_close(ctx)
ret = modbus_set_slave(ctx, slave_id)
参数:
ctx:modbus句柄
int slave_id:从站地址
返回值:
int ret:-1:连接失败;其他正常
示例:
modbus_set_slave(ctx ,0x2)
ret = modbus_write_register(ctx, reg, value)
参数:
ctx:modbus句柄
int reg:保持寄存器地址(十进制)
int value:值
返回值:
int ret:-1:出错;其他正常
示例:
modbus_write_register(ctx , 771, 1)
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)
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)
ret = modbus_write_bit(ctx, reg, value)
参数:
ctx:modbus句柄
int reg:线圈地址
int value:写入线圈的数据
返回值:
int ret:-1:出错;其他正常
示例:
modbus_write_bit(ctx , 1, 1)
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)
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})
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
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)
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)