Ads In C++

Ads In C++


  • 依赖库
    TcAdsDll.lib,可以在TwinCAT 的安装目录下直接找到

    • 库目录:C:\TwinCAT\AdsApi\TcAdsDll\Lib(默认装C盘),需要加到项目配置属性->链接器->附加库目录中
    • 头文件路径:C:\TwinCAT\AdsApi\TcAdsDll\Include,需要加到项目配置属性->VC++目录->包含目录中
  • 示例
    这里读写监听示例主要针对单线程环境,如果需要在多线程环境下使用,需要使用相应的Ex结尾的API函数,函数名和参数均类似单线程的。

    • 建立Ads通讯链接
      	AmsAddr addr = AmsAddr{ AmsNetId{*,*,*,*,1,1}, 851 };
      	PAmsAddr pAddr = &addr;
      	AdsPortOpen();
      
    • 读取变量
      有两种方式读取:一种是先获取变量的句柄,然后通过句柄进行变量读写;另一种是先获取变量的地址信息,然后根据段地址(IndexGroup)和偏移地址(IndexOffset)进行读写。其读写过程类似,这里只对第一种方式进行简单描述,而主要拿第二种方式进行示例说明,因为后面还会讲到事件驱动的读取,其API函数接口只提供通过变量的段地址和偏移地址进行注册监听。
      	char iVarName[] = { "MAIN.iTest" };
      	char lrVarName[] = { "MAIN.lrTest" };
      	char sVarName[] = { "MAIN.sTestId" };
      	char arrVarName[] = { "MAIN.arrTests" };
      	char sCmdVarName[] = { "MAIN.sTest" };
      	AdsSymbolInfoByName ni; //PLC变量信息: 段地址,偏移地址,变量长度
      	INT16 iVal;
      	DOUBLE lrVal;
      	INT16 arrVals[32];
      	SCmd cmd;
      	char pStr[81];
      
      • 通过变量句柄读写
        	//通过变量名获取变量句柄
        	AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_HNDBYNAME, 0x0, sizeof(handle), &handle, sizeof(iVarName), iVarName);
        	//通过句柄读取变量
        	AdsSyncReadReq(pAddr, ADSIGRP_SYM_VALBYHND, handle, sizeof(iVal), &iVal);
        	//通过句柄写变量
        	AdsSyncWriteReq(pAddr, ADSIGRP_SYM_VALBYHND, handle, sizeof(iVal), &iVal);
        	//释放变量句柄
        	AdsSyncWriteReq(pAddr, ADSIGRP_SYM_RELEASEHND, 0, sizeof(handle), &handle);
        
      • 通过变量Group+Offset读写
        • 获取变量信息
          AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_INFOBYNAME, 0x0, sizeof(ni), &ni, sizeof(iVarName), iVarName);
          
        • 读取变量
          读取所有类型的变量流程都类似,先定义相应变量,然后将变量地址传进去,这里拿几个举例,其实没啥差别。(注意数组、字符串和结构体的定义要与PLC的定义对应)
          • 读取INT
            	AdsSyncReadReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &iVal);
            
          • 读取LREAL(读取ni的地方对应修改变量名参数)
            	AdsSyncReadReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &lrVal);
            
          • 读取字符串(读取ni的地方对应修改变量名参数,另外,这里PLC的字符串长度为默认的81,所以在上面也定义了个长度为81的字节数组)
            	AdsSyncReadReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &pStr);
            
          • 读取数组(读取ni的地方对应修改变量名参数)
            	AdsSyncReadReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &arrVals);
            
          • 读取结构体(读取ni的地方对应修改变量名参数)
            	AdsSyncReadReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &cmd);
            
        • 写变量
          • 写INT
            	AdsSyncWriteReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &iVal);
            
          • 写LREAL(读取ni的地方对应修改变量名参数)
            	AdsSyncWriteReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &lrVal);
            
          • 写字符串(读取ni的地方对应修改变量名参数,另外,这里PLC的字符串长度为默认的81,所以在上面也定义了个长度为81的字节数组)
            	pStr[2] = 'T';						
            	AdsSyncWriteReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &pStr);
            
          • 写数组(读取ni的地方对应修改变量名参数)
            	arrVals[0] = 100;
            	arrVals[31] = 100;
            	AdsSyncWriteReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &arrVals);
            
          • 写结构体(读取ni的地方对应修改变量名参数)
            	cmd.i = 99;
            	cmd.b = FALSE;
            	cmd.q = 3.21;
            	AdsSyncWriteReq(pAddr, ni.indexGroup, ni.indexOffset, ni.cbLength, &cmd);
            
        • 事件驱动读取
          • 回调函数
            	void __stdcall ChgCallback(AmsAddr* pAddr, AdsNotificationHeader* pNotification, ULONG hUser)
            	{
            		cout << pNotification->cbSampleSize << endl;
            		cout << *(INT16*)(pNotification->data) << endl;
            		cout << pNotification->hNotification << endl;
            		cout << pNotification->nTimeStamp << endl;
            		cout.flush();
            	}
            
          • 注册监听
            	attr.cbLength = sizeof(iVal);
            	attr.nCycleTime = 500;
            	attr.nMaxDelay = 0;
            	attr.nTransMode = ADSTRANS_SERVERONCHA;
            	PAdsNotificationFuncEx func;
            	ULONG nhandle;
            	
            	AdsSyncAddDeviceNotificationReq(pAddr, ni.indexGroup, ni.indexOffset, &attr, ChgCallback, 1, &nhandle); 
            

你可能感兴趣的:(C++,自动化,工控)