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,通信测试成功。