控制器输入输出IO的应用案例
控制器输入输出IO的应用
1.新建项目并附加函数库
(1)在VS2017菜单“文件”→“新建”→ “项目”,启动创建项目向导。

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

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


函数库具体路径如下


- 复制【cnc_sdk】到项目目录。

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

(5)进入项目的属性页面。
在【VC++目录】选项中配置【包含目录】、【库目录】
在【链接器】-【输入】中配置【附加依赖项】,需要用到CncApi.lib
【确认】并【应用】
2.编程
(1)【源文件】新建一个main.cpp
(2)查看函数手册,熟悉相关函数接口
链接控制器
| 函数名 | 功能 |
| connect | 连接控制器 |
IO配置相关接口。
| 函数名 | 功能 |
| getInstance | 该接口获取IO类对象单例 |
IO状态监控。
| 函数名 | 功能 |
| getAD | 读取AD引脚 |
| getDA | 读取DA引脚 |
| getIoIn | 读取单个IO输入 |
| getIoOut | 读取单个IO输出 |
| getMultiIoOut | 读取多个IO输出 |
IO设置接口。
| 函数名 | 功能 |
| setDA | 设置AD引脚 |
| setIoOut | 设置单个IO输出 |
- 进行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; } - 编译

使用Waux.h中的接口实现方式
1.声明用到的头文件(Waux.h)和定义控制器连接

- 链接控制器,获取链接句柄。
| 指令 | 说明 |
| WAux_OpenCom | 串口连接控制器 |
| WAux_OpenEth | 以太网连接控制器 |
| WAux_OpenPci | PCI 卡连接 |
| WAux_FastOpen | 与控制器建立连接,指定连接的等待时间. |
- 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;
}