#include #include #include #include #include "ecat_io.h" #include #include #include #include #include using namespace std; void printSlaveInfo(short slaveNo) { printf("--------------------------- slave %-2d -----------------------------\n", slaveNo); EC_SLAVE_INFO info; short rtn = EC_GetSlaveInfo(&info, slaveNo); if (rtn == CMD_EXECUTE_SUCCEED) { printf(" vid: 0x%08x pid: 0x%08x rev: 0x%08x\n", info.VendorID, info.ProductCode, info.RevisionNo); printf("------------------------------------------------------------------\n"); printf(" DI: %-3d DO: %-3d AI: %-3d AO: %-3d\n", info.DiNum, info.DoNum, info.AiNum, info.AoNum); printf(" Module number: %d\n", info.ModuleNum); for (long k = 0; k < info.ModuleNum; ++k) { printf(" ID%d = 0x%08x\n", k, info.ModuleId[k]); } } else { printf("EC_GetSlaveInfo return error : %d\n", rtn); } printf("------------------------------------------------------------------\n"); } void main() { short rtn = 0; //打开设备 rtn = EC_Open(); if (rtn == CMD_EXECUTE_SUCCEED) { printf("Device opened\n"); } else { printf("Device open fail, return error : %d\n", rtn); Sleep(2000); return; } //获取版本号 char chVer[100] = {0}; rtn = EC_GetVersion(chVer, 100); if (rtn == CMD_EXECUTE_SUCCEED) { printf("Version: %s\n", chVer); } else { printf("Version: unknown, return error : %d\n", rtn); } printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); //获取当前文件夹下ENI路径 TCHAR szPath[MAX_PATH]; DWORD ret; ret = GetModuleFileName(NULL, szPath, MAX_PATH); if (!ret) { printf("GetModuleFileName fail (%d)\n", GetLastError()); Sleep(1000); return; } wstring strPath = std::wstring(szPath); int iPos = strPath.find_last_of(L"\\"); strPath = strPath.substr(0,iPos+1); strPath += L"eni.xml"; //UNICODE转ANSI int bufferlen = (int)::WideCharToMultiByte(CP_ACP,0,strPath.c_str(),strPath.length(),NULL,0,NULL,NULL); char* pBuffer = new char[bufferlen + 4]; if ( NULL == pBuffer ) { return; } int out_len = ::WideCharToMultiByte(CP_ACP,0,strPath.c_str(),strPath.length(),pBuffer,bufferlen+2,NULL,NULL); pBuffer[bufferlen] = '\0'; //加载ENI文件 rtn = EC_LoadEni(pBuffer); delete[] pBuffer; //获取从站资源 EC_RES rsScan; EC_RES rsOnline; rtn = EC_GetSlaveResource(&rsScan, &rsOnline); if (rtn == CMD_EXECUTE_SUCCEED) { printf(" Slave Scanned: %d\n", rsScan.SlaveNum); printf(" DI: %-3d DO: %-3d AI: %-3d AO: %-3d\n", rsScan.DiNum, rsScan.DoNum, rsScan.AiNum, rsScan.AoNum); printf(" Slave Online: %d\n", rsOnline.SlaveNum); printf(" DI: %-3d DO: %-3d AI: %-3d AO: %-3d\n", rsOnline.DiNum, rsOnline.DoNum, rsOnline.AiNum, rsOnline.AoNum); } else { printf("EC_GetSlaveResource fail, return error: %d\n", rtn); } for (long i = 0; i < rsScan.SlaveNum; ++i) { printSlaveInfo(i+1); } printf("Continue? (Y/N): "); char chGet = getchar(); if (chGet != 'Y' && chGet != 'y') { Sleep(200); return; } //连接从站 rtn = EC_ConnectECAT(); printf("LH_ConnectECAT() return: %d\n",rtn); //获取从站资源 rtn = EC_GetSlaveResource(&rsScan, &rsOnline); if (rtn == CMD_EXECUTE_SUCCEED) { printf(" Slave Scanned: %d\n", rsScan.SlaveNum); printf(" DI: %-3d DO: %-3d AI: %-3d AO: %-3d\n", rsScan.DiNum, rsScan.DoNum, rsScan.AiNum, rsScan.AoNum); printf(" Slave Online: %d\n", rsOnline.SlaveNum); printf(" DI: %-3d DO: %-3d AI: %-3d AO: %-3d\n", rsOnline.DiNum, rsOnline.DoNum, rsOnline.AiNum, rsOnline.AoNum); } else { printf("EC_GetSlaveResource fail, return error: %d\n", rtn); } for (long i = 0; i < rsScan.SlaveNum; ++i) { printSlaveInfo(i+1); } //PDO数据操作 // short sModuleNo = 5; // short sIndex = 0x60e0; // short sSubIndex = 0; // short sDataSize = 4; // unsigned long nData = 0; // rtn = EC_SetPdoData(1,sModuleNo,sIndex,sSubIndex,sDataSize,nData); // rtn = EC_GetPdoData(1,sModuleNo,sIndex,sSubIndex,sDataSize,&nData); //设置模拟输出 short chn = 1; short aoVal = 10000; rtn = EC_Set_Analog_Chn_Out(1, chn, &aoVal); //获取模拟输入 while(1) { for (long i = 0; i < rsScan.SlaveNum; ++i) { EC_SLAVE_INFO info; rtn = EC_GetSlaveInfo(&info, i+1); short val[16] = {0}; rtn = EC_Get_Analog_Chn_In(i+1, 1, val, (short)info.AiNum); if (rtn == CMD_EXECUTE_SUCCEED) { printf(" AI0: %-6d AI1: %-6d AI2: %-6d AI3: %-6d", val[0],val[1],val[2],val[3]); } } printf("\r"); Sleep(100); } //获取数字输入 while(1) { for (long i = 0; i < rsScan.SlaveNum; ++i) { EC_SLAVE_INFO info; rtn = EC_GetSlaveInfo(&info, i+1); short val = 0; for (long j = 0; j < info.DiNum; ++j) { short m = 0; rtn = EC_Get_Digital_Chn_In(i+1, j+1, m); if (rtn == CMD_EXECUTE_SUCCEED) { val |= (m << j); } } printf(" DI(%-02d): 0x%04x ", i, val); } printf("\r"); Sleep(100); } //设置数字输出 for (long i = 0; i < rsScan.SlaveNum; ++i) { EC_SLAVE_INFO info; rtn = EC_GetSlaveInfo(&info, i+1); for (long j = 0; j < info.DoNum; ++j) { rtn = EC_Set_Digital_Chn_Out(i+1, j+1, 1); Sleep(200); } for (long j = 0; j < info.DoNum; ++j) { rtn = EC_Set_Digital_Chn_Out(i+1, j+1, 0); Sleep(200); } } //获取数字输出 while(1) { for (long i = 0; i < rsScan.SlaveNum; ++i) { EC_SLAVE_INFO info; rtn = EC_GetSlaveInfo(&info, i+1); short val = 0; for (long j = 0; j < info.DoNum; ++j) { short m = 0; rtn = EC_Get_Digital_Chn_Out(i+1, j+1, m); if (rtn == CMD_EXECUTE_SUCCEED) { val |= (m << j); } } printf(" DO(%-02d): 0x%04x ", i, val); } printf("\r"); Sleep(100); } while(1) { long val = 0; for (long i = 0; i < rsScan.SlaveNum; ++i) { rtn = EC_Set_Digital_Port_Out(i+1, 1, val, 0xf); rtn = EC_Get_Digital_Port_Out(i+1, 1, val); printf(" DO(%-02d): 0x%08x ", i, val); } printf("\r"); Sleep(100); } while(1) { printf("Disconnect? (Y/N): "); chGet = getchar(); if (chGet != 'Y' && chGet != 'y') { printf("\n"); continue; } else { break; } } rtn = EC_DisconnectECAT(); printf("EC_DisconnectECAT() return: %d\n", rtn); rtn = EC_Close(); printf("EC_Close() return: %d\n", rtn); Sleep(3000); }