TwinCAT3+Linux ADS

发布这个博客的时候看见已经有Linux®-based real-time control with TwinCAT,大家如果有机会可以看看。本人没有测试过,还望大佬们去研究、测试。

简介

如果我们希望使用 ROS 的很多生态的情况下,使用 ADS 与 TwinCAT 进行通信时不可避免的。不管后续是否需要 TwinCAT3 用于 EtherCAT 开发,但是 ADS 的学习也是 TwinCAT 学习中绕不开的功能。

后续功能基于对 ADS 有理解了,最好先阅读相关文档:TwinCAT ADS

后续开发基于两个主机直连,Linux 端设置为 192.168.0.1,TwinCAT 端设置为 192.168.0.2,其本质是 socket

Linux 端

开源代码:Beckhoff/ADS

编译和使用

这里在官方教程中使用了 meson 和 ninja,但是我们就是安装个库,不整这么麻烦,直接使用 CMake 编就是

git clone https://github.com/Beckhoff/ADS.git
mkdir build && cd build
cmake ..
make
make install

完成后相关库会被放到 /usr/local 对于库来说是个好习惯,但是这个文件夹并不是我们默认的系统环境变量,最好在 /etc/profile 全局加一下,后续自己维护这个文件夹下面的东西就行。

export PATH=$PATH:/usr/local/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include

运行示例

在经过这个修改后,官方默认的 example 文件夹的文件就不能直接编译使用了,需要将头文件修改为

#include "ads/AdsLib.h"
#include "ads/AdsNotificationOOI.h"
#include "ads/AdsVariable.h"

当然,要是环境变量直接设到 ads 文件夹下也可以。这个最合理的方式还是后续把 ADS 的源码打包到 ROS 的包中。

这个示例中有几种常用的读取方式,这个后续在 TwinCAT 端的配置中可以看到。

TwinCAT 端

不要直接使用官方给的 PLC-TestProject,这个是在老版本的 TC3 上的项目,如果想和 example 下面的例程一起使用的话,最好的方法是自己新建一个工程,将 PLC 的 MAIN 文件中的程序复制到新项目中编译使用。

对于 TwinCAT 来说,其实每一个 TMC 上的变量都可以被暴露在 ADS 上。但是如果新建过官方的 ADS 示例项目的话我们会发现其实官方更多会选择将参数(全局变量)作为 ADS 的接口,而不会把内部的 Input 等链接口暴露在 ADS 上。这有一些 PLC 的 ST 语言的设计思路。

这个其实是一个关于软件设计方面的取舍,我们暂时先就于如何实现 ADS。

变量配置

对于我们 C++ 来说,我们需要的仅仅是勾选上 Create symbol,或者在参数界面,如:TwinCAT3 和 C++ 中勾选上 CS。变量就会暴露到 ADS 上。其是可读可写的。

然后让程序跑起来,在 TwinCAT 下打开 Target Browser,其端口,索引,子索引都会有显示,包括名字等。

官方明确说明,读取一个值和一个数组的时间是差不多相同的,但是读取两次就需要走两个包,建议使用数组传输较大数据。

路由配置

接下来需要新建我们的路由,在很多地方都可以添加静态路由,这里介绍在项目中 Routes 下选中静态路由,添加。输入名字,要连接 TwinCAT 的主机的 AmsNetId(与 IP 无关)和 IP,点击添加路由。

弹出的安全相关的窗口不要设置,下一步就行。然后你会发现回到了配置界面,后面也没有显示添加的路由,Close 掉就行,退出出去就能看见添加的路由了。然后重启一下 TwinCAT。

验证配置

最简单的方法就是在 linux 端输入 AdsTool 192.168.0.2 netid 如果配置成功,其会返回对应主机的 netid。至此所有配置结束,程序和 TwinCAT 应该能通信上了。

错误记录

间歇性警告 Warning: Port 0x2710 is out of range

Warning: Port 0x2710 is out of range
Warning: No response pending

Linux – Warning: Port 0x2710 is out of range, No Response Pending · Issue #87 · stlehmann/pyads

可能原因:

一个已知原因是,在 ADS 设备上,TwinCAT XAE 处于活动状态。

问题解决方案:

忽略警告或关闭目标 ADS 设备上的 TwinCAT XAE。PLC 程序仍应继续正常运行。

上一篇