Beckhoff ADS (Automation DeviceSpecification)提供一个应用程序之间互相通信的接口,在TwinCAT3系统中,TwinCAT PLC,TwinCAT NC,TwinCAT CNC等被设计成虚拟的自动化设备,类似于实际的物理设备与设备之间通过基于TCP协议的路由来交换信息,参考下面的图示
ADS设备最重要的两个属性就是端口号和AdsAmsNetId
• AdsPortNr 指定通信的虚拟设备(ADS server),比如PLC,NC
• AdsAmsNetId 指定ADS路由器,是TCP IP地址的扩展。
以上参考某位前辈
例如控制器物理网卡ip为169.254.71.120,起对应的AdsAmsNetId169.254.71.120.1.1,设备如耦合器,ethercat接口驱动器网址为169.254.71.120.1.x,通过后面两位识别不同的设备。
这里可把ADS路由器看成虚拟的路由器,倍福的ipc各个网口内部都连接在此路由,也就是一台twincat控制器(pc)有一个amsNetID,任意一个网口都能通过虚拟路由连接到这个amsNetID上来控制其他硬件,只需在twincat的设备的地方选择某个网卡即可。(原来理解为amsNetID要与硬件相连接的网卡的4段ip地址一致,可以不必相同,amsNetID只是一个用于区分ethercat设备的虚拟ip地址)
带来的优势是当其他pc需要与控制器通讯时连接某个网卡上,把pc的ip地址设成同一网段,在控制器中添加该ip路由,使用ads通讯协议即可与控制器的amsNetID建立连接,从而与PLC、NC、CNC建立连接,极大方便工程应用。上位机不局限与某种语言,诸如c++、c#、Delphi等都可以与twincat plc建立连接,很方便读写操作。
不太方便的是使用非intel网卡无法安装twincat驱动,这样无法添加到ads路由表中。无法与工控机建立ads连接。
常用ads为异步通信
实例代码:
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TwinCAT.Ads;//twincat安装目录中有
using System.IO;
namespace HmiAdsTest
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
public static TcAdsClient tcAdsClient;//建立通讯
private int handle;
private void button1_Click(object sender, EventArgs e)
{
tcAdsClient = new TcAdsClient();//实例化
//tcAdsClient.Connect(851);//同一台机器上使用
tcAdsClient.Connect("169.254.71.120.1.1", 851);//amsNetID 851是twincat3 端口号
try
{
//handle = tcAdsClient.CreateVariableHandle("IOs.ConnectSucceed");
handle = tcAdsClient.CreateVariableHandle("IOs.Dog");
MainForm.VariableAssignment.ConnectSucceed = (bool)(tcAdsClient.ReadAny(handle, typeof(bool)));
tcAdsClient.DeleteVariableHandle(handle);
}
catch
{
MainForm.VariableAssignment.ConnectSucceed = false;
MessageBox.Show("未能连接网络");
}
if (MainForm.VariableAssignment.ConnectSucceed)
{
MessageBox.Show("成功连接网络");
button1.BackColor = Color.Green;
}
else { timerReadPeriod.Enabled = false; }
}
public class VariableAssignment
{
public static bool ConnectSucceed;
public static int AO_ProportionalValve2Dint;
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
handle = tcAdsClient.CreateVariableHandle("IOs.AO_ProportionalValve2Dint");
tcAdsClient.WriteAny(handle, (int)numericUpDown1.Value);
tcAdsClient.DeleteVariableHandle(handle);
}
}
}
测试界面
PLC变量定义,注意c#和PLC变量类型位数要匹配,如c#中int是32bit,twincat中dint是32位
注意:也可把控制器、设备、外部PC挂在同一个交换机上,带来的风险是控制器和设备数据量大时,外部pc无法与控制器建议ads通信。可靠的话twincat控制器至少有两个物理网口
关于ads通讯之前有些地方不太准确
如果用PC作为控制器(跑PLC和NC程序),则应使用intel型号网卡,支持型号请看以下链接
https://blog.csdn.net/x356982611/article/details/81450716
如果只是ADS通讯,非intel网卡也可以支持(前面写的不准确,此次修正)
当显示以下某个信息,可能是要升级一下系统补丁,仅对win7
这和网卡没关系,安装下面升级补丁
再提醒:
添加ads路由前要ping通,如果ping不通,查下网络连接
如果没有活动网络,查看网卡设置中,把不必要的驱动去掉
一般都能ping通