Ethcat读写相关接口应用

ethcat读写相关接口应用

1.新建项目并附加函数库

(1)在VS2017菜单“文件”→“新建”→ “项目”,启动创建项目向导。

image1

  1. 选择开发语言为“Visual C++”和程序类型“空项目”。
    image2

  2. 找到厂家提供的SDK库,路径如下(64位release库为例)。
    image3

    image4

函数库具体路径如下

image5

image6

  1. 复制【cnc_sdk】到项目目录。

image7

为了保证可以在VS调试器中运行,将相关平台的dll库复制到代码目录(如,项目名称为CncSdkDemo,则放在【{你的工程目录}\CncSdkDemo\CncSdkDemo】目录下),这里以64位平台为例

(将【{你的工程目录}\CncSdkDemo\CncSdkDemo\cnc_sdk\lib\x64】下的“CncApi.dll”和“CncApid.dll”复制到【{你的工程目录}\CncSdkDemo\CncSdkDemo\

image8

(5)进入项目的属性页面。

image9 在【VC++目录】选项中配置【包含目录】、【库目录】
image10 image11 image12 在【链接器】-【输入】中配置【附加依赖项】,需要用到CncApi.lib

image13 【确认】并【应用】
image14 2.编程

(1)【源文件】新建一个main.cpp
image15 image16 (2)查看函数手册,熟悉相关函数接口

image17 链接控制器

函数名 功能
connect 连接控制器

SDO、PDO状态监控。

函数名 功能
readSDO 读取SDO值
readPDO 读取PDO值

SDO、PDO设置接口。

函数名 功能
writeSDO 设置SDO值
writePDO 设置PDO值
  1. 进行SDO、PDO的读取和获取
    #include <iostream>
    #include <windows.h>
    #include "CncApi.h"
    
    
    int main()
    {
    
        weconcnc::CCommApi *pComm = new weconcnc::CCommApi();
        weconcnc::CProxyEntry *pEntry = new weconcnc::CProxyEntry(pComm);
        weconcnc::CProxyMotion *pMotion = pEntry->getProxyMotion();
        weconcnc::CProxyIO *pIo = pEntry->getProxyIO();
    
        weconcnc::WECONCNC_ERROR_E ret = weconcnc::WECONCNC_ERROR_SUCCESS;
    
        std::string sIp = "192.168.54.98";
        ret = pComm->connect(sIp, 9995);
        if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
            std::cout << "connect failed!" << std::endl; 
            return -1;
        }
    
        PDO_DATA_T stPdoData;
        stPdoData.nPdoType = 3;
        stPdoData.sData = 0x38;
        stPdoData.nAxis = 1;
        stPdoData.nIndex = 0x201e;
        stPdoData.nSubIndex = 0x38;
        ret = writePDO(stPdoData);
    
        if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
            std::cout << "write pdo failed!" << std::endl; 
            return -1;
        }
    
        PDO_DATA_T stRPdoData;
        ret = readPDO(stRPdoData);
    
        if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
            std::cout << "read pdo failed!" << std::endl; 
            return -1;
        }
        std::cout << "PDO type:" 
        << stRPdoData.nPdoType << "PDO type:" 
        << stRPdoData.sData << "PDO data:" 
        << stRPdoData.nAxis << "PDO axis:" 
        << stRPdoData.nIndex << "PDO indes:" 
        << stRPdoData.nSubIndex << "PDO subindex:" << std::endl;
    
        return 0;
    }
    
  2. 编译

image18

使用Waux.h中的接口实现方式

1.声明用到的头文件(Waux.h)和定义控制器连接

image19

  1. 链接控制器,获取链接句柄。
指令 说明
WAux_OpenCom 串口连接控制器
WAux_OpenEth 以太网连接控制器
WAux_OpenPci PCI 卡连接
WAux_FastOpen 与控制器建立连接,指定连接的等待时间.

(2)SDO、PDO状态监控。

函数名 功能
WAux_BusCmd_SDOReadAxis 读取SDO值
WAux_BusCmd_NodePdoRead 读取PDO值

(3)SDO、PDO设置接口。

函数名 功能
WAux_BusCmd_SDOWriteAxis 设置SDO值
WAux_BusCmd_NodePdoWrite 设置PDO值

2.进行SDO、PDO的读取和获取

#include "Waux.h"
#include <iostream>
#include <windows.h>
using namespace weconcnc;



void commandCheckHandler(const char *command, int ret)
{
    if (ret)//非0则失败
    {
        printf("%s fail!return code is %d\n", command, ret);
    }
}
int main()
{
    char *ip_addr = (char *)"127.0.0.1"; //控制器IP地址
    ZMC_HANDLE handle = NULL; //连接句柄
    int ret = WAux_OpenEth(ip_addr, &handle); //连接控制器
    if (ERR_SUCCESS != ret)
    {
        printf("控制器连接失败!\n");
        handle = NULL;
        Sleep(2000);
        return -1;
    }
    printf("控制器连接成功!\n");

    uint32_t inode = 0;
    uint32_t index = 0x6041;
    uint32_t subindex = 0;
    uint32_t type = 3;
    int value;

    PDO_DATA_T stRPdoData;

    ret = WAux_BusCmd_NodePdoWrite(handle,0, 0x6040, 0, 3, 15);

    if (0 != ret) {
        std::cout << "write pdo failed!" << std::endl;
        return -1;
    }

    ret = WAux_BusCmd_NodePdoRead(handle,0, 0x6041, 0, 3, &value); 

    if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
        std::cout << "read pdo failed!" << std::endl;
        return -1;
    }
    std::cout << "PDO type:"
        << stRPdoData.nPdoType << "PDO type:"
        << stRPdoData.sData << "PDO data:"
        << stRPdoData.nAxis << "PDO axis:"
        << stRPdoData.nIndex << "PDO indes:"
        << stRPdoData.nSubIndex << "PDO subindex:" << std::endl;

    return 0;
}