1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 倍福Twincat 3.0软件与C++通讯问题(ADS通讯)

倍福Twincat 3.0软件与C++通讯问题(ADS通讯)

时间:2021-04-23 12:30:06

相关推荐

倍福Twincat 3.0软件与C++通讯问题(ADS通讯)

倍福Twincat 3.0软件与C++通讯问题

倍福公司所开发的Twincat 3.0软件是基于Visual studio开发环境的一款自动化软件,目前其与C++程序通讯的方式主要还是靠ADS-DLL接口进行数据和信息传递,作者在Visual C++上进行混合编程开发,通过TwinCAT路由器和C语言API函数实现混合编程。

倍福软件提供:

TcAdsDll.dll—动态链接库;

TcAdsDll.lib—使用TcAdsDll的函数库;

TcAdsApi.h—声明ADS功能的头文件;

TcAdsDef.h—声明结构和常数的头文件;

具体步骤如下:

1.首先启动Visual Studio ,创建一个新项目,我们选择Visual C++→MFC→MFC应用程序。输入项目名称并保存确定,后续可以选择基于对话框的程序类型。

2.之后添加链接库,方便各种函数的调用,打开项目属性→配置属性→链接器→常规→附加库目录→输入目录名称(C:\TwinCAT\AdsApi\TcAdsDll\x64\lib,这是安装Twincat的通讯库函数的默认路径)。

3.再依次添加:链接器→输入→附加依赖项,输入文件名“TcAdsDll.lib”,点击确定。

4.还需要将头文件进行声明,将C:\TwinCAT\AdsApi\TcAdsDll\Include目录下的 "TcAdsDef.h"和 "TcAdsAPI.h"先后声明在头文件MFCApplication3Dlg.h中(先声明TcAdsDef.h文件,不然编译报错)。

5.到此可以成功调用Twincat的ads通讯库的函数了,继续进行ADS通讯的初始化。

//声明全局变量long nErr;long nPort;AmsAddr Addr;PAmsAddr pAddr;//初始化内容:建立路由、获取NetID、设置PLC端口号pAddr = &Addr;nPort = AdsPortOpen();//如果是远程ADS则使用下面注释的两句确定AmsNetId,id填入远程控制器的ip//AmsNetId id = {192,168,1,1,1,1};//pAddr->netId = id;//如果是本地ADS通讯则使用下面两条语句确定AmsNetIdnErr = AdsGetLocalAddress(pAddr);if (nErr) cerr << "Error: AdsGetLocalAddress: " << nErr << '\n';//确定端口号pAddr->port = 851;

6.以本地ADS通讯为例,进行MFC程序和Twincat程序的变量传递,建立MFC程序调试界面如下图。

在写入按钮右侧编辑框链接int型变量Write,在读取按钮右侧编辑框链接int型变量Read(MFC的编程部分不进行赘述)。

在写入按钮上增加响应事件,代码如下:

UpdateData(TRUE);ULONGlHdlVar;char szVar[] = {"MAIN.Test" };//通过变量名通讯//得到句柄nErr = AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(lHdlVar),&lHdlVar, sizeof(szVar), szVar);//写入值nErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, 2, &Write);//释放句柄nErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(lHdlVar), &lHdlVar);

在读取按钮上增加响应事件,代码如下:

ULONGlHdlVar;char szVar[] = {"MAIN.Test" };//得到句柄nErr = AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(lHdlVar),&lHdlVar, sizeof(szVar), szVar);//读出值nErr = AdsSyncReadReq(pAddr, ADSIGRP_SYM_VALBYHND, lHdlVar, 2, &Read);//释放句柄nErr = AdsSyncWriteReq(pAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(lHdlVar), &lHdlVar);UpdateData(FALSE);

7.到此C++测试程序编写完成,新建一个PLC程序,MAIN函数内建立int型变量Test,然后下载到本地运行。有一点Twincat编程基础都应该会吧,也不再赘述了。

8.接下来我们验证通讯功能,在MFC程序界面上,输入100,并点击写入。可以看到PLC程序中变量Test已经变成100。

再点击读取,读出的值由0又变成100,测试成功。

本地两个程序之间成功互相传递int变量,以此类推,远程两台控制器的通讯,不同类型变量的通讯,都可以通过更改C++程序来进行实现。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。