2 Star 3 Fork 0

iotang / Ros_modbus

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
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指令

实现代码如下:

 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:传输值

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寄存器数量,校验码 实现发送数据至电源板,实现控制小车底盘对应的继电器上电

空文件

简介

在ros节点下实现modbus通信 展开 收起
C++
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/aitang/ros_modbus.git
git@gitee.com:aitang/ros_modbus.git
aitang
ros_modbus
Ros_modbus
master

搜索帮助