TwinCAT3与ROS之间的ADS通信实现

TwinCAT3与ROS之间的ADS通信实现方法

摘要:
TwinCAT(The Windows Control and Automation Technology,基于Windows的控制和自动化技术)自动化软件是控制系统的核心部分。TwinCAT 软件系统可将任何一个基于PC 的系统转换为一个带多PLC[1]、NC、CNC 和机器人实时操作系统的实时控制系统。
TC3 ADS:TwinCAT自动化设备规范(ADS)是独立于介质的协议,用于读写数据以及在TwinCAT内进行指令传输。ADS路由可提供用于通讯链。ADS客户端在网络中可通过ADS与TwinCAT控制器连接。
TC3 PLC:TwinCAT PLC在一台CPU上采用IEC61131-3(第三版)国际标准实现一个或多个PLC。可以随时在线修改程序,所有变量都通过ADS用符号的方式提供,并可在合适的客户端中读写
ROS(Robot Operating System)机器人操作系统,用于编写机器人软件程序的一种具有高度灵活性的软件架构。
本文任务:本文实现了TwinCAT3(Win10系统)与ROS(Ubuntu16.04的kinetic版本)之间的ADS通信(通过网线连接),为后期跨平台通信奠定了基础。


[1]: PLC(Programmable Logic Controller)可编程逻辑控制器: 是一种具有微处理器的用于自动化控制的数字运算控制器,可以将控制指令随时载入内存进行储存与执行,在工业界广泛使用。


前期准备

硬件:一台装有Ubuntu16.04和ROS系统的笔记本,一台装有TwinCAT XAE Shell的笔记本,一根网线。


参考资料:
[1]倍福官方资料:https://github.com/Beckhoff/ADS 详细介绍了如何构建跨平台的ADS通信链路方法,核心是在TC Shell中设置Static Routes
[2]基于ROS的ADS通信:https://github.com/hslu-c2a/twincat_talker 提供了一个简单的例子,本文中复现其功能。

一、IP地址的修改

1. Ubuntu IP设置

首先确定网线已经连接,在系统的网络设置中找到该网络,修改其IP为:
Address: 192.168.0.1 Netmask: 255.255.255.0
在这里插入图片描述

2. Win10 IP设置

在网络和Internet设置中找到更改适配器选项,找到与ubuntu电脑连接的以太网,修改其IP为:
Address: 192.168.0.2 Netmask: 255.255.255.0
(这里要注意保持两台电脑处于同一网段,子网掩码相同)
在这里插入图片描述
到此,两台电脑已经实现网线联通,可以打开终端使用ping命令检查是否联通,在ubuntu的终端中输入:ping 192.168.0.2,同理,在windows中的cmd命令行中输入ping 192.168.0.1,检测是否通信通畅。

3. AMS Net ID 修改

找到win10电脑右下角的TwinCAT的小图标,如下图所示:
在这里插入图片描述
点开以后修改TwinCAT电脑的AMS Net Id 为 192.168.0.2.1.1(这里前四位建议设置为本地电脑的IP地址,最后两位均设置为1
在这里插入图片描述
设置完成后电脑会重启,耐心等待。

二、TwinCAT XAE Shell 设置

1.设置静态路由(Static Route)

打开Shell后找到右侧解决方案资源管理器下SYSTEM->Routes,双击Routes后右侧弹出设置界面,选择Static Routes,点击左下角的Add。
在这里插入图片描述

此时弹出Add Route Dialog,点击左下角的Advanced Settings进入高级设置

在这里插入图片描述

在高级设置中设置ADS静态路由(也就是告诉win10系统如何找到ubuntu系统):

Route Name(Target): MyAdsClient
AMS Net Id: 192.168.0.1.1.1 #来自你的客户端(ubuntu系统)
Address: 192.168.0.1 # 使用与 TwinCAT 相连的另外一台电脑的IP
Transport Type: TCP/IP
IP Address

在这里插入图片描述
点击Add Route,然后点击Close,发现我们已经添加好了静态路由。

在这里插入图片描述

2. 重启TwinCAT3

最后我们运行PLC程序之前,需要重新启动TwinCAT3,只有重新启动才能连上,请大家一定要重启一次。

设置完以后程序就可以开始自动运行了,此时ROS节点运行就可以和TwinCAT 正常通信了。

三、 程序例程

1. PLC测试代码

在MAIN函数中写入测试代码,声明一个变量myFloatVAR(REAL类型)

PROGRAM MAIN
VAR
myFloatVAR : REAL;
END_VAR

2.ROS测试代码

代码参见https://github.com/hslu-c2a/twincat_talker

#include "AdsLib.h"
#include "AdsNotification.h"
#include "AdsVariable.h"
#include "ros/ros.h"

int main(int argc, char *argv[]) {
  // ROS node init
  ros::init(argc, argv, "tctalker");
  ros::NodeHandle n;

  ROS_INFO_STREAM("running good");

//设置windows的IP
  static const AmsNetId remoteNetId{192, 168, 0, 2, 1,1};
  static const char remoteIpV4[] = "192.168.0.2";

  AdsDevice route{remoteIpV4, remoteNetId,AMSPORT_R0_PLC_TC3};

  AdsVariable<double> variable_to_write{route, "MAIN.myFloatVAR"};

  ros::Rate loop_rate(0.1);

  while (ros::ok()) {
    variable_to_write = 12.0; //修改程序代码
    ROS_INFO_STREAM("changed variable on sps");
    ros::spinOnce();
    loop_rate.sleep();
  }

  return 0;
  }

3.程序测试

在Ubuntu中运行:rosrun twincat_talker tctalker, 可以发现成功联通。
在PLC中重新登录到本地会发现,myFloatVAR被修改为12,通信测试成功。
参数修改成功

猜你喜欢

转载自blog.csdn.net/hujiawei_SJTU/article/details/108858938