#include "StdAfx.h" #include "CHMotorControls/MotorControl_Acs.h" #define STR_SIZE_ADDRESS 10 #define STR_ERR_MESSAGE 100 #define MEMORY_MAX_SIZE 512 CMotorControl_Acs::CMotorControl_Acs(int nIndex, DWORD dwPeriod, int nThreadCount) : CMotorControl(nIndex, dwPeriod, nThreadCount) { m_hAcsComm = ACSC_INVALID; } CMotorControl_Acs::~CMotorControl_Acs(void) { //AfxMessageBox(_T("CMotorControl_Acs")); Disconnect(); } int CMotorControl_Acs::Connect(const CMotorControlInfo* pControlInfo) { if (pControlInfo==NULL) return 0; // set motor control info m_ControlInfo = *pControlInfo; // initial handle m_hAcsComm = ACSC_INVALID; int nPort; char strIPAddress[50] = {0,}; nPort = ACSC_SOCKET_STREAM_PORT; USES_CONVERSION; sprintf_s(strIPAddress, "%s", m_ControlInfo.GetConnectionPort()); m_bConnected = FALSE; m_hAcsComm = acsc_OpenCommEthernetTCP(strIPAddress, nPort); if(m_hAcsComm == ACSC_INVALID) return 0; // alloc m_nAxisCount = 0; for (int nG_Idx=0; nG_IdxGetMotorAxisAddrCount(); } if (m_nAxisCount<1) { return -2; } if (m_pAxisStatus) delete [] m_pAxisStatus; m_pAxisStatus = new long[m_nAxisCount]; memset(m_pAxisStatus, 0, sizeof(long)*m_nAxisCount); if (m_pAxisPosition) delete [] m_pAxisPosition; m_pAxisPosition = new float[m_nAxisCount]; memset(m_pAxisPosition, -1, sizeof(float)*m_nAxisCount); if (m_pAxisStatusPrev) delete [] m_pAxisStatusPrev; m_pAxisStatusPrev = new long[m_nAxisCount]; memset(m_pAxisStatusPrev, 0, sizeof(long)*m_nAxisCount); if (m_pAxisPositionPrev) delete [] m_pAxisPositionPrev; m_pAxisPositionPrev = new float[m_nAxisCount]; memset(m_pAxisPositionPrev, -1, sizeof(float)*m_nAxisCount); if (m_pAxisStatusAddr) delete [] m_pAxisStatusAddr; m_pAxisStatusAddr = new long[m_nAxisCount]; if (m_pAxisPositionAddr) delete [] m_pAxisPositionAddr; m_pAxisPositionAddr = new long[m_nAxisCount]; int nAxisIndex = 0; for (int nG_Idx=0; nG_IdxGetMotorAxisAddrCount(); nA_Idx++) { CMotorAxisAddr *pANode = pGNode->GetMotorAxisAddr(nA_Idx); if (pANode==NULL) continue; m_pAxisPositionAddr[nAxisIndex] = pANode->m_nPositionAddr; m_pAxisStatusAddr[nAxisIndex] = pANode->m_nStatusAddr; nAxisIndex++; } } m_axisThetaStatus = 0; m_axisThetaPosition = 0.f; m_axisThetaStatusPrev = 0; m_axisThetaPositionPrev = -999.f; m_bConnected = TRUE; return 1; } void CMotorControl_Acs::Disconnect() { if(m_hAcsComm != ACSC_INVALID) { if (acsc_CloseComm(m_hAcsComm)) { m_hAcsComm = ACSC_INVALID; m_bConnected = FALSE; } } } // gantry BOOL CMotorControl_Acs::GantryManualGo( int nGantryIdx, const VectorDouble& vectorPos ) { UINT nManualAddr = GetGantryManualGoAddr(nGantryIdx); if (nManualAddr==MOTOR_ADDRESS_NONE) return FALSE; int nAxisCount = 0; for (int i=0; iGetMotorAxisAddrCount(); nAxisIdx++) { const CMotorAxisAddr* pAxisAddrInfo = pGantryAddrInfo->GetMotorAxisAddr(nAxisIdx); if (pAxisAddrInfo==NULL) continue; if (nAddress == pAxisAddrInfo->m_nMovePositionAddr) nCommonAddress = pAxisAddrInfo->m_nMovePositionCommonAddr<=0 ? 300 : pAxisAddrInfo->m_nMovePositionCommonAddr; } } sprintf_s(strAddress, "D%d", nCommonAddress); if (acsc_ReadReal(m_hAcsComm, -1, strAddress, nAddress, nAddress+nArrayCount, -1, -1, pValue, NULL)==0) { return FALSE; } for (int nIdx=0; nIdxGetMotorAxisAddrCount(); nAxisIdx++) { const CMotorAxisAddr* pAxisAddrInfo = pGantryAddrInfo->GetMotorAxisAddr(nAxisIdx); if (pAxisAddrInfo==NULL) continue; if (nAddress == pAxisAddrInfo->m_nMovePositionAddr) nCommonAddress = pAxisAddrInfo->m_nMovePositionCommonAddr<=0 ? 300 : pAxisAddrInfo->m_nMovePositionCommonAddr; } } sprintf_s(strAddress, "D%d", nCommonAddress); for (int nIdx=0; nIdx