伽利略导航系统Modbus通信协议
注意此协议需要后端版本 6.6.3及以上
默认端口为3551。注意数据大小端规则是 byteorder=Endian.Big, wordorder=Endian.Little
触点寄存器说明
触点寄存器是只读的bool变量
地址 | 长度 | 类型 | 说明 |
---|---|---|---|
1 | 1 | bool | 当前导航状态,1时说明开启了导航,0说明未开启导航 |
2 | 1 | bool | 当前建图状态,1说明开启了建图,0说明未开启 |
3 | 1 | bool | GC状态,1说明正在进行内存回收, 0说明状态正常 |
4 | 1 | bool | GBA状态,1说明正在进行闭环优化,0说明状态正常 |
5 | 1 | bool | 局部充电状态,1说明正在执行局部充电,0说明未在执行局部充电动作 |
6 | 1 | bool | 充电任务状态, 1说明正在执行充电任务,0说明未执行充电任务 |
7 | 1 | bool | 循环状态,1说明正在执行循环任务,0说明未执行循环任务 |
8 | 1 | bool | 保留位 |
9 | 1 | bool | 保留位 |
10 | 1 | bool | 保留位 |
11 | 1 | bool | 保留位 |
12 | 1 | bool | 保留位 |
13 | 1 | bool | 保留位 |
14 | 1 | bool | 保留位 |
15 | 1 | bool | 保留位 |
16 | 1 | bool | 保留位 |
17 | 1 | bool | 虚拟io0 |
18 | 1 | bool | 虚拟io1 |
19 | 1 | bool | 虚拟io2 |
20 | 1 | bool | 虚拟io3 |
21 | 1 | bool | 虚拟io4 |
22 | 1 | bool | 虚拟io5 |
23 | 1 | bool | 虚拟io6 |
24 | 1 | bool | 虚拟io7 |
25 | 1 | bool | IO模块输入0 |
26 | 1 | bool | IO模块输入1 |
27 | 1 | bool | IO模块输入2 |
28 | 1 | bool | IO模块输入3 |
29 | 1 | bool | IO模块输入4 |
30 | 1 | bool | IO模块输入5 |
31 | 1 | bool | IO模块输入6 |
32 | 1 | bool | IO模块输入7 |
线圈寄存器说明
线圈寄存器是具有读写功能的bool变量
地址 | 长度 | 类型 | 说明 |
---|---|---|---|
1 | 1 | bool | 导航开关,1开始导航,0关闭导航 |
2 | 1 | bool | 建图开关,1开启建图,0关闭建图 |
3 | 1 | bool | 关机开关,1关机 |
4 | 1 | bool | 循环开关,1开启循环,0关闭循环 |
5 | 1 | bool | 充电开关,1开始自动充电任务,0停止自动充电任务 |
6 | 1 | bool | 保留位 |
7 | 1 | bool | 保留位 |
8 | 1 | bool | 保留位 |
9 | 1 | bool | 保留位 |
10 | 1 | bool | 保留位 |
11 | 1 | bool | 保留位 |
12 | 1 | bool | 保留位 |
13 | 1 | bool | 保留位 |
14 | 1 | bool | 保留位 |
15 | 1 | bool | 虚拟io8 |
16 | 1 | bool | 虚拟io9 |
17 | 1 | bool | 虚拟io10 |
18 | 1 | bool | 虚拟io11 |
19 | 1 | bool | 虚拟io12 |
20 | 1 | bool | 虚拟io13 |
21 | 1 | bool | 虚拟io14 |
22 | 1 | bool | 虚拟io15 |
23 | 1 | bool | IO模块输出0 |
24 | 1 | bool | IO模块输出1 |
25 | 1 | bool | IO模块输出2 |
26 | 1 | bool | IO模块输出3 |
27 | 1 | bool | IO模块输出4 |
28 | 1 | bool | IO模块输出5 |
29 | 1 | bool | IO模块输出6 |
30 | 1 | bool | IO模块输出7 |
输入寄存器说明
输入寄存器是只读的16位变量
地址 | 长度 | 类型 | 说明 |
---|---|---|---|
1 | 1 | int16 | 视觉系统状态,-1标系视觉系统处于关闭状态,0表示没初始化uninit,1表示正在追踪tracking,2表示丢失lost,1和2都表示视觉系统已经初始化完成。 |
2 | 2 | float32 | 电池电压 |
4 | 1 | int16 | 当前目标点编号,默认值为-1表示无效值,当正在执行无ID的任务是值为-2,比如通过Http API 创建的导航任务。 |
5 | 1 | int16 | 当前目标点状态,0表示已经到达或者取消free,1表示正在前往目标点过程中working,2表示当前目标点的移动任务被暂停paused,3表示目标点出现错误error,默认值为-1表示无效值。 |
6 | 2 | float32 | 机器人距离当前目标点的距离,单位为米,-1表示无效值,该值的绝对值小于0.01时表示已经到达。 |
8 | 2 | float32 | 导航系统计算给出的前进速度控制分量,单位为m/s |
10 | 2 | float32 | 导航系统计算给出的角速度控制分量,单位为rad/s |
12 | 2 | float32 | 当前机器人实际前进速度分量,单位为m/s |
14 | 2 | float32 | 当前机器人实际角速度分量,单位为rad/s |
16 | 2 | float32 | 当前机器人在map坐标系下的X坐标,此坐标可以直接用于设置动态插入点坐标 |
18 | 2 | float32 | 当前机器人在map坐标系下的Y坐标 |
20 | 2 | float32 | 当前机器人在map坐标系下的z轴转角(yaw) |
22 | 1 | int16 | 当前追踪点数 |
24 | 2 | uint32 | 当前信息时间戳,单位为秒 |
26 | 2 | uint32 | 当前信息时间戳,剩余小于1秒的部分,单位为纳秒 |
保持寄存器说明
保持寄存器是具有读写功能的16位变量
地址 | 长度 | 类型 | 说明 |
---|---|---|---|
1 | 2 | float32 | 机器人遥控速度前进方向线速度,单位m/s,用于遥控机器人 |
3 | 2 | float32 | 机器人遥控速度旋转方向角速度,单位rad/s,用于遥控机器人 |
5 | 1 | int16 | 导航目标index,设置此值后,机器人会导航至对应目标 |
6 | 1 | int16 | 1暂停任务,0继续任务 |
7 | 1 | int16 | 1取消任务 |
8 | 6 | 3个float32 | 三个float32分别为 x,y,theta,即目标点的坐标和角度。设置此值后机器人会导航至对应坐标 |
14 | 1 | int16 | 循环等待时间,单位为秒 |
程序例子
#!/usr/bin/env python3
"""
Test Modbus
"""
from pymodbus.client import ModbusTcpClient
from pymodbus.version import version
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
import time
ADDR_POWER = 2 # 电池电压, float32
if __name__ == '__main__':
print(f"pymodbus version: {version}")
address = ("127.0.0.1", 3551)
client = ModbusTcpClient(
host=address[0],
port=address[1],
)
client.connect()
while True:
time.sleep(1)
try:
# pymodbus默认的地址会有一个偏移
result = client.read_input_registers(ADDR_POWER - 1, 2, unit=1)
print(f"result: {result.registers}")
# 转换为浮点数
decoder = BinaryPayloadDecoder.fromRegisters(
result.registers, byteorder=Endian.Big, wordorder=Endian.Little)
voltage = decoder.decode_32bit_float()
print(f"voltage: {voltage}")
except Exception as e:
print(e)