控制器输入输出IO的应用案例

控制器输入输出IO的应用

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 连接控制器

IO配置相关接口。

函数名 功能
getInstance 该接口获取IO类对象单例

IO状态监控。

函数名 功能
getAD 读取AD引脚
getDA 读取DA引脚
getIoIn 读取单个IO输入
getIoOut 读取单个IO输出
getMultiIoOut 读取多个IO输出

IO设置接口。

函数名 功能
setDA 设置AD引脚
setIoOut 设置单个IO输出
  1. 进行IO输入输出读取和获取
    #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;
        }
    
        std::vector<int> vecIonum;
        std::vector<bool> vecValue;
        int32_t *piValue;
    
        for (int i = 0; i++; i <= 7) {
            vecIonum.push_back(i);
        }
        ret = pIo->getMultiIoIn(vecIonum, vecValue);
        if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
    
            return -1;
        }
    
        for (int i = 0; i++; i <= 7) {
                piValue[i] = vecValue[i];
        }
    
        std::string svalue = “true”;
    
        ret = pIo->setIoOut(4, svalue);
        if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
    
            return -1;
        }
    
        std::vector<int> vecIonum;
        std::vector<bool> vecValue;
        uint32_t * istate
    
        for (int i = 0; i++; i <= 7) {
            vecIonum.push_back(i);
        }
        ret = pIo->getMultiIoOut(vecIonum, vecValue);
        if (weconcnc::WECONCNC_ERROR_SUCCESS != ret) {
    
            return -1;
        }
    
        for (int i = 0; i++; i <= 7) {
            istate[i] = vecValue[i];
        }
    
        return 0;
    }
    
  2. 编译

image18

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

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

image19

  1. 链接控制器,获取链接句柄。
指令 说明
WAux_OpenCom 串口连接控制器
WAux_OpenEth 以太网连接控制器
WAux_OpenPci PCI 卡连接
WAux_FastOpen 与控制器建立连接,指定连接的等待时间.
  1. IO读写相关接口。
指令 说明
WAux_Direct_GetIn 读取单个IO输入
WAux_Direct_GetOp 读取单个IO输出
WAux_Direct_SetOp 设置单个IO输出
WAux_Direct_GetInMulti 读取多个IO输入
WAux_direct_GetOutMulti 读取多个IO输出

2.进行IO输入输出点的读取和获取

#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");
    int32_t GetValue[2]; //读取设置的值
    uint32_t uValue;
    ret = WAux_Direct_GetInMulti(handle, 0, 48, GetValue);

        commandCheckHandler("WAux_GetModbusIn", ret);
    for (int i = 0; i < 48; i++)
    {
        if (i % 10 == 0)
        {
            printf("\n");
        }
        printf("IN(%d) = %d ", i, (GetValue[(int)(i / 32)] & (0x1 << (i % 32))) >> (i % 32));
    }
    printf("\n**********************************************************************\n"
    );
    uValue = 1;
    ret = WAux_Direct_SetOp(handle, 1, uValue);
    commandCheckHandler("WAux_GetModbusOut", ret);
    ret = WAux_Direct_GetOutMulti(handle, 0, 7, &uValue);
    commandCheckHandler("WAux_GetModbusOut", ret);
    for (int i = 0; i <= 7; i++)
    {
        printf("OP(%d) = %d ", i, (uValue & (0x1 << i)) >> i);
    }
    printf("\n");
    Sleep(20000);
    ret = WAux_Close(handle); //关闭连接
    commandCheckHandler("WAux_Close", ret);//判断指令是否执行成功
    printf("connection closed!\n");
    handle = NULL;
    return 0;
}