# Ros_modbus
**Repository Path**: aitang/ros_modbus
## Basic Information
- **Project Name**: Ros_modbus
- **Description**: 在ros节点下实现modbus通信
- **Primary Language**: C++
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2021-01-15
- **Last Updated**: 2025-06-11
## Categories & Tags
**Categories**: web-dev-toolkits, iot
**Tags**: None
## README
# ROS中进行Modbus通讯节点功能包测试
## 第一步:创建工作空间,并编译
打开一个终端,依次执行下面命令
mkdir -p ~/catkin_ws/src
cd catkin_ws
catkin_make
## 第二步:编译
```
catkin_make
```
## 第三步:运行
### <1>确保设备连接:
随后->连接好USB转485
### <2>打开新终端,启动ros master
```
roscore
```
### <3>打开新终端,启动测试功能包
#### 查看串口设备
```
ls -l /dev/ttyUSB*
```
#### 终端打印下面信息
```
crw-rw---- 1 root dialout 188, 0 Aug 3 21:46 /dev/ttyUSB0
```
**如果这里不是/dev/ttyUSB0,更改ROS功能包中ros_modbus.cpp文件中的的串口设备名字**
#### 添加设备权限
```
sudo chmod 777 /dev/ttyUSB0 #根据自己的设备名自行改变
```
```
#source
cd catkin_ws_test
source devel/setup.bash
```
#### 启动功能包节点
```
rosrun modbus_test publish_node
```
### 协议内容
| 小车底盘 0001 | **0010断电 01 06 00 01 00 10 D9 C6
0001上电 01 06 00 01 00 01 19 CA** |
| ----------------- | ------------------------------------------------------------ |
| 路由器 0002 | **0002 0010断电 01 06 00 02 00 10 29 C6
0001上电01 06 00 02 00 01 E9 CA** |
| 激光雷达1 0003 | **01 06 00 03 00 10 78 06
01 06 00 03 00 01 B8 0A** |
| 激光雷达2 0004 | **01 06 00 04 00 10 C9 C7
01 06 00 04 00 01 09 CB** |
| 16线激光雷达 0005 | **01 06 00 05 00 10 98 07
01 06 00 05 00 01 58 0B** |
| 鱼眼相机 0006 | **01 06 00 06 00 10 68 07
01 06 00 06 00 01 A8 0B** |
| 预留接口 0007 | **01 06 00 07 00 10 39 C7
01 06 00 07 00 01 F9 CB** |
| 机械臂 0008 | |
# 协议测试
## 协议内容:
本协议是一种用于电源管理模块与工控机之间通信的自定义通信协议,采用RTU格式进行通讯,波特率为115200,以16进制格式传输。工控机向电源管理模块发送请求。
间隔两秒进行发送,上电0001与断电0010指令
实现代码如下:
```c
while(ros::ok())
{
ros::spinOnce();
writeModbus_in(0x01,0x0001,0x0010);
loop_rate.sleep();
ros::Duration(2).sleep();
writeModbus_in(0x01,0x0001,0x0001);
loop_rate.sleep();
ros::Duration(2).sleep();
}
```
### 实现功能:
测试功能的代码如下:
在ros_modebus.cpp中:addr: 从机地址 reg:寄存器 value:传输值
```C
void writeModbus_in(unsigned char addr,unsigned int reg,unsigned int value)
{
unsigned char cont = 0;
unsigned int crc;
modbus.Sendbuf[cont++] = addr;
modbus.Sendbuf[cont++] = 0x06; //功能码
modbus.Sendbuf[cont++] = reg /256; //寄存器
modbus.Sendbuf[cont++] = reg%256;
modbus.Sendbuf[cont++] = value /256; //数据区
modbus.Sendbuf[cont++] = value%256;
crc = crc16(modbus.Sendbuf,cont); //CRC校验
modbus.Sendbuf[cont++] = crc/256;
modbus.Sendbuf[cont++] = crc%256;
boost::asio::write(sp, boost::asio::buffer(modbus.Sendbuf));
ROS_INFO("OK!!!"); //传输成功提示
}
```
| 小车底盘 | 0001 | 0010 |
| -------- | ---- | ---- |
| 0001 | | |
## 测试方法:
通过键盘按下按键,在终端上可看到相应的提示,并可知道消息是否发送成功。
#### 按下数字1:
将会发送modbus通讯数据:
{0x01,0x06,0x00,0x01,0x00,0x10,0xD9,0xC6}; //写小车底盘断电,01从机地址,06写,00 01寄存器地址,00 01寄存器数量,校验码
实现发送数据至电源板,实现控制小车底盘对应的继电器断电
#### 按下数字2:
将会发送modbus通讯数据:
{0x01,0x06,0x00,0x01,0x00,0x01,0xD9,0xC6}; //写小车底盘上电,01从机地址,06写,00 01寄存器地址,00 01寄存器数量,校验码
实现发送数据至电源板,实现控制小车底盘对应的继电器上电