200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP

(slam导航第一篇)200smart PLC(ST60)(主站)使用Modbus-TCP与ROS(从站)系统进行通讯

全程用虚拟机
就是它在这里插入图片描述
plc软件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m55GaINL-1685360687080)(null)]
在这里插入图片描述

前言

目标:使用PLC控制四个麦克纳姆轮进行运动,ROS连接SICK561激光雷达进行数据采集建图避障,使用算法为cartographer(轮子不使用编码器)现在是第一步:建立通讯。

主要参考文章:https://www.guyuehome.com/18142
解决问题参考文章:https://blog.csdn.net/xu19950525/article/details/98096254
参考ros anwsers:https://answers.ros.org/question/306065/error-on-import-ros-packages/
解决问题参考文章:https://blog.csdn.net/abc9567/article/details/130912570?spm=1001.2014.3001.5502

一、什么是Modbus_TCP通讯?为什么要选择这个通讯协议?首选简单介绍一下ROS的通讯机制,与几种常用的协议(TCP/IP,Modbus_TCP,Modbus_RTU,HTTP)(后面几个通讯协议建议不看,是我自己学习时候的总结,不准确,当简单科普看)

Modbus

Modbus是一种通信协议,用于在工业自动化领域中连接电子设备。它最初是为串行通信设计的,但现在也支持TCP/IP通信。Modbus协议简单易懂,易于实现,并且被广泛应用于各种工业自动化设备之间的通信。

Modbus协议有两种通信方式:RTU和TCP。

RTU是一种串行通信协议,它使用二进制编码,数据帧中包含从站地址、功能码、数据、错误检测和校验等信息。RTU协议通常用于较短距离(如几米)的通信,因为它的通信速率比TCP/IP协议慢,但是它的实现成本低,适用于一些较简单的设备。

TCP是一种基于网络的协议,它使用IP地址和端口号来标识设备。TCP协议使用ASCII码或者二进制编码,数据帧中包含了从站地址、功能码、数据、错误检测和校验等信息。TCP协议通常用于广域网和局域网之间的通信,因为它可以支持更高的通信速率和更远的距离,但是它的实现成本相对较高。

选择使用哪种通信方式需要根据具体的应用场景和设备需求来决定。

在工业自动化系统中,Modbus TCP协议广泛应用于PLC、传感器和其他设备之间的通信,以及与上层控制系统的通信。它是一种可靠、高效的通信协议,已经成为工业自动化领域中最常用的通信协议之一。因为我轮子的主控器(下位机)用的是西门子公司的200smart plc(ST60)所以我选择的通讯是Modbus_TCP。还有一个原因是Modbus TCP是一种基于TCP/IP协议的变种,它允许设备通过以太网进行通信。Modbus TCP协议使用客户端-服务器架构,其中客户端向服务器发送请求,服务器响应请求并返回数据。Modbus TCP协议的通信数据是以16位寄存器为单位传输的,可以在单个数据包中传输多个寄存器。此外,Modbus TCP协议还支持多个客户端同时连接到一个服务器。我的手机端与PLC的通讯也是用的Modbus_TCP通讯。

TCP/IP

TCP/IP通讯是一种广泛使用的网络通讯协议,它是互联网的基础协议之一。TCP/IP是指传输控制协议(Transmission Control Protocol)和互联网协议(Internet Protocol)的组合,它们共同定义了数据在网络中的传输方式和格式。TCP/IP协议族包括了许多不同的协议,其中最常用的是IP、TCP和UDP协议。TCP/IP协议是一种面向连接的协议,它保证了数据的可靠性,确保了数据的传输顺序和完整性。TCP/IP协议被广泛应用于各种网络通讯场景,包括互联网、局域网、广域网等等。哈哈哈这是简单说一手。
接下来还是详细而又不失去简单的介绍一下:
TCP/IP协议的通讯机制可以分为四个层次,分别是应用层、传输层、网络层和数据链路层。

应用层:应用层是网络通讯的最高层,它定义了各种应用程序之间的通讯协议,如HTTP、FTP、SMTP等。应用层协议的数据被封装在数据报中,然后通过下一层传输。

传输层:传输层主要负责数据的传输,它通过TCP或UDP协议提供可靠的数据传输服务。TCP协议提供面向连接的、可靠的数据传输服务,确保数据的完整性和传输顺序;而UDP协议则提供无连接的、不可靠的数据传输服务,适用于实时传输和不需要可靠性保证的场景。

网络层:网络层主要负责数据的路由和转发,它通过IP协议提供数据包的传输服务。IP协议定义了数据包的格式和传输规则,数据包被分为若干个数据报进行传输,每个数据报包含了源地址、目的地址等信息。

数据链路层:数据链路层主要负责数据在物理链路上的传输,它通过以太网、WiFi等协议提供数据帧的传输服务。数据帧是数据链路层传输的基本单位,包含了源地址、目的地址等信息。

这四个层次共同构成了TCP/IP协议的通讯机制,通过这个机制,数据可以在网络中进行可靠、高效的传输

感觉还是少了点什么,对!!!!!!!握手
TCP协议采用三次握手(Three-way Handshake)机制来建立连接,具体过程如下:

第一次握手:客户端向服务器发送SYN(同步)请求报文段,其中SYN标志位被设置为1,同时客户端随机生成一个初始序列号(ISN)。

第二次握手:服务器收到客户端的SYN请求报文段后,向客户端发送SYN+ACK(同步+确认)报文段,其中SYN和ACK标志位都被设置为1,同时服务器随机生成一个初始序列号(ISN),并将确认序列号(ACK)设置为客户端的ISN+1。

第三次握手:客户端收到服务器的SYN+ACK报文段后,向服务器发送ACK(确认)报文段,其中ACK标志位被设置为1,同时将确认序列号(ACK)设置为服务器的ISN+1。

三次握手完成后,TCP连接建立成功,双方可以开始进行数据传输。这个过程可以确保双方都能够接收到对方的数据,并且建立了可靠的连接。

斯-----------到此为止,

HTTP

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议,它是Web的基础。HTTP是一个客户端-服务器协议,客户端通过发送HTTP请求与服务器通信,服务器则通过发送HTTP响应来响应客户端的请求。

**HTTP协议基于TCP/IP协议,**它的通信过程一般包括以下几个步骤:

  1. 客户端发起HTTP请求:客户端向服务器发送HTTP请求,请求包括请求方法、请求URL、协议版本、请求头部等信息。

  2. 服务器响应请求:服务器接收到客户端的请求后,会根据请求的内容进行处理,并返回HTTP响应,响应包括响应状态码、响应头部、响应正文等信息。

  3. 客户端接收响应:客户端接收到服务器的响应后,会根据响应的内容进行处理,例如解析HTML页面、下载文件等。

  4. 连接关闭:HTTP是一种无状态协议,即服务器不会保存客户端的状态信息。因此,当一个请求完成后,连接会被关闭。

HTTP协议的请求方法包括GET、POST、PUT、DELETE、HEAD等,其中GET和POST是最常用的两种请求方法。GET方法用于获取资源,而POST方法用于提交数据。

HTTP协议也支持状态码,常见的状态码包括200 OK(请求成功)、404 Not Found(请求的资源不存在)等。状态码可以帮助客户端和服务器进行通信,以便更好地处理请求和响应。

**不多哔哔了,接下来进入正题,适合小白(但是你的ROS和ubuntu一定要配置好!)(重要的事情说三遍 一定要配置好 一定要配置好 一定要配置好!!!!!!! )**没有配置好的可以去看古月居老师,与鱼香肉丝的他们可以帮助你。

二、ubuntu(linux)(ROS端)端的配置(作为客户端)

首先介绍一下我用的虚拟机版本是17的,然后我的ubuntu是18.04版本的长这个b样子
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第1张图片

第一步:首先再ROS中安装基本的modbus支持,顾名思义就是装酷(库)

sudo apt-get install python-pymodbus
sudo apt-get install python-pyasn1 python-twisted-conch
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第2张图片
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第3张图片
对比一下这样就算迈开步子了!!!!!!

第二步:接着在ROS上可以找到一个将modbus协议与ros标准通信方式进行转换的包(偷别人的)ROSwiki的官网直通车https://github.com/HumaRobotics/modbus

接下来开始详细教学:
首先创建一个工作空间:我的工作空间名字叫做catkin_ws
在这里插入图片描述
1. cd catkin_ws/src 进入工作空间src

200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第4张图片
2. git clone https://github.com/HumaRobotics/modbus.git 下载这个modbus与ros通讯协议的包(需要稍微等待一下)(可以先catkin_make一下下)(万能方法还是重启吧)(实在不行拜一拜)200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第5张图片
还是得拜一拜!!!!
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第6张图片
是的是这样子的,然后我们点进去看看·
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第7张图片
我是这个样的 然后继续进入modbus_这个文件夹了哦!!
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第8张图片
不废话继续进入scripts
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第9张图片
今天就那他开刀,不要问为什么,问就是他是客户端的节点,来我们点进去看看他的面纱
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第10张图片
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第11张图片
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第12张图片
我直接都截屏下来,认真看(没有我看不懂哈哈哈)当然不是用这些,我们只用里面的一些功能
我们来精简一下下!!!
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第13张图片
为了让你们少走弯路,心态不爆炸,我就来提醒你们一下下
#!/usr/bin/env python # -- coding: utf-8 -- (这两句一定要加不然报错,至于为什么下面讲解)

rosrun modbus modbus_client.py
File “/home/melodic/catkin_ws/src/modbus/modbus/scripts/modbus_client.py”, line 11
SyntaxError: Non-ASCII character ‘\xe4’ in file /home/melodic/catkin_ws/src/modbus/modbus/scripts/modbus_client.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details(这个是我当时报的错误)

这个错误通常是由于Python文件中存在非ASCII字符,但没有指定编码方式导致的。您可以尝试在文件的第一行添加以下注释来指定编码方式:
#!/usr/bin/env python # -- coding: utf-8 --
这将告诉Python解释器使用UTF-8编码来解析文件中的字符。将这两行注释添加到你的modbus_client.py文件的顶部,然后再次运行该文件,看看是否解决了问题。(解决问题)

3. cd …回到工作空间就是有三个文件夹的地方就是src上面那个文件夹

4. catkin_make 编译一手(不知道对不对我就叫编译了)
接下来附图
1.200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第14张图片
好了我们来尝试运行一下
roscore 启动
roscore是ROS(Robot Operating System)系统中的一个重要组件,它实际上是ROS的主节点(master node)。roscore负责协调ROS系统中的各个节点(nodes)之间的通信,以及管理ROS系统中的参数服务器(parameter server)和ROS系统中的其他重要功能。

具体来说,当您启动ROS系统时,首先需要启动roscore节点。roscore节点会启动ROS系统中的主线程,并协调ROS系统中的各个节点之间的通信。在ROS系统中,每个节点都是一个独立的进程,它们可以运行在同一台计算机上,也可以运行在不同的计算机上。每个节点都可以发布(publish)和订阅(subscribe)ROS消息(ROS messages),以实现节点之间的通信。roscore节点会管理ROS消息的发布和订阅,以及ROS系统中的参数服务器和其他重要功能。

在启动roscore节点后,您可以启动其他节点,并使用ROS消息来进行节点之间的通信。例如,您可以启动一个ROS节点来控制机器人的运动,另一个节点来处理机器人的感知数据,以及一个节点来控制机器人的图像处理。这些节点可以使用ROS消息来进行通信,以实现机器人的自主运动和控制。

总之,roscore是ROS系统中的一个重要组件,它负责协调ROS系统中的各个节点之间的通信,并管理ROS系统中的参数服务器和其他重要功能。在启动ROS系统时,首先需要启动roscore节点,以确保ROS系统的正常运行。

rosrun modbus modbus_client.py 启动节点
运行方法
roscore
rosrun modbus modbus_client.py
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第15张图片
第一次运行rosrun modbus modbus_client.py 的时候出现了问题是因为没有source ~/catkin_ws/devel/setup.bash
为什么要输入这句命令呢?
source ~/catkin_ws/devel/setup.bash 这个命令会将你的终端环境配置为能够使用 catkin workspace 中的 ROS 软件包。它会将一些 ROS 环境变量添加到你的终端环境中,例如 ROS_PACKAGE_PATH 和 ROS_MASTER_URI,以便你可以使用 roscd、roslaunch 和 rosrun 等 ROS 命令。如果你没有运行这个命令,你就无法使用 catkin workspace 中的 ROS 软件包。
好了我总结一下还可能遇到的问题。

1.
melodic@melodic:~/catkin_ws$ rosrun modbus modbus_client.py
Traceback (most recent call last):
File “/home/melodic/catkin_ws/src/modbus/modbus/scripts/modbus_client.py”, line 4, in
from modbus.modbus_wrapper_client import ModbusWrapperClient
ImportError: No module named modbus.modbus_wrapper_client

解决方法
这个错误通常是因为Python无法找到所需的模块。请确认您已经正确安装了modbus软件包并使用catkin_make编译成功。如果您已经正确安装了modbus软件包,但是仍然遇到此错误,请尝试source一下您的ROS环境变量,例如:
source /opt/ros/melodic/setup.bash
然后再次运行rosrun modbus modbus_client.py。

2
rosrun modbus modbus_client.py
[rospack] Error: package ‘modbus’ not found

解决方法
这个错误提示表明ROS无法找到名为modbus的软件包。这可能是因为您没有正确安装modbus软件包或者ROS无法找到该软件包。您可以尝试以下步骤来解决这个问题:
确认您已经正确安装了modbus软件包。您可以使用以下命令来检查:
rospack find modbus
如果您没有安装该软件包,您可以使用以下命令来安装:
sudo apt-get install ros--modbus
其中是您正在使用的ROS发行版名称,例如melodic或noetic。
确认您已经正确设置了ROS环境变量。您可以使用以下命令来检查:
echo $ROS_PACKAGE_PATH
如果您没有设置ROS环境变量,请使用以下命令来设置:
source /opt/ros//setup.bash
其中是您正在使用的ROS发行版名称,例如melodic或noetic。

3
melodic@melodic:~/catkin_ws$ sudo apt-get install ros-melodic-modbus
[sudo] melodic 的密码:
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
E: 无法定位软件包 ros-melodic-modbus

解决方法
可以尝试更新软件包源列表并重新安装软件包。可以使用以下命令更新软件包源列表:
sudo apt-get update
如果更新成功,然后再次尝试安装ros-melodic-modbus软件包:
sudo apt-get install ros-melodic-modbus
如果你仍然无法安装该软件包,请检查你的ROS源是否正确配置,并确保你的ROS版本是Melodic。

还有一种解决方法:
这个错误提示意味着你的系统上没有名为ros-melodic-modbus的软件包。你可以尝试通过以下命令搜索软件包:
apt-cache search ros-melodic-modbus
如果搜索结果为空,那么你需要手动安装modbus软件包。你可以通过以下命令安装:
sudo apt-get install libmodbus-dev

好啰嗦当让我为了让小白们也知道怎么搞,减少大家走弯路,毕竟本人就是小白,希望得到大佬的指点。

三、200smart PLC端配置(作为服务端)

接下来到了我擅长的区域,当然既然200smart可以当然只要是支持modbus_tcp协议的设备都ok啦。
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第16张图片
这里我对PLC 寄存器VB200开始后面的寄存器的位地址进行操作。
PLC这边的通讯程序简单吧!!!!,只需要调用一个库,然后分配一下库存储器就完事了。

四、虚拟机设置

因为我的连接是PLC作为主站,然后电脑上的虚拟机里面的ROS(从站)连接,所以虚拟机的一些网络设置是非常重要的。
首先要使用桥接 我这边PLC的地址是192.168.0.1
所以我的电脑网口用的是DHCP
虚拟机里面的设置是有线连接192.168.0.4
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第17张图片
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第18张图片
尝试ubuntu(linux)连接一手
ping 192.168.0.1
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第19张图片
好的成功

五、最终的连接

接下来就是正式的连接咯
目标:将图中画圈的地址传入4
服务端200smart PLC(ST20) 地址192.168.0.1 端口502
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第20张图片
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第21张图片
1.catkin_make
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第22张图片
2.source ~/catkin_ws/devel/setup.bash
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第23张图片
3.roscore200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第24张图片
4.rosrun modbus modbus_client.py
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第25张图片
可以看这里是显示连接成功了
接下来看看PLC端的数是不是改变了
200SMAET PLC (主站)连接ROS(系统)使用Modbus-TCP_第26张图片
好的就这样“顺利的成功了”
耗时两天(当然大多数时间都是在摸鱼)
但是还是有些bug
但是连上了

我看到有个问题我也一并回答了
在安装Modbus_ROS功能库时发生了E: 无法定位软件包 python-pymodbus、E: 无法定位软件包 python-twisted-conch,请问您用的什么源安装的这两个包啊
这个问题究极解决方法就是关机重启
或者吧

如果你在 Ubuntu 上安装 python-pymodbuspython-twisted-conch 时出现了 E: 无法定位软件包 的错误,可能是因为你的软件源配置不正确或者缺少相应的软件源。

你可以尝试使用以下命令更新软件源并安装这两个软件包:

sudo apt-get update
sudo apt-get install python-pymodbus python-twisted-conch

如果你仍然无法找到这两个软件包,可以尝试添加 universe 软件源并再次更新软件源:

sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install python-pymodbus python-twisted-conch
``
如果你使用的是非 Ubuntu 系统,可以尝试使用其他适合你系统的软件源或者手动安装这两个软件包。

# 总结

好嘞,第一步已经完成了,接下来开始优化这个通讯,我能实现读数字,写入数字,然后传入我的系统里面,然后就是编写cartographer的建图导航程序,作为一个电气工程学院的本科在读生,我会来搞ROS这个是我没有想到的,但是我会坚持把搞下去,以后教我儿子做小车(嘶----------鬼话连篇)坚持就是胜利!!!!!!!!!!!


加油!!!!奋斗的阿源

你可能感兴趣的:(ROS,linux,PLC,linux,python,前端)