#include "StdAfx.h" #include "CHMotorControls/MotorControl_PowerPmac.h" #include "PPmacDprRuntime.h" CMotorControl_PowerPmac::CMotorControl_PowerPmac(int nIndex, DWORD dwPeriod, int nThreadCount) : CMotorControl(nIndex, dwPeriod, nThreadCount) { m_uDeviceID = 0; } CMotorControl_PowerPmac::~CMotorControl_PowerPmac(void) { //AfxMessageBox(_T("CMotorControl_PowerPmac")); Disconnect(); } int CMotorControl_PowerPmac::Connect(const CMotorControlInfo* pControlInfo) { if (pControlInfo==NULL) return 0; // set motor control info m_ControlInfo = *pControlInfo; ClosePPmacDprRuntimeLink(); if (OpenPPmacDprRuntimeLink()==NULL) { return 0; } PPmacDprDisconnect(m_uDeviceID); PPmacDprClose(m_uDeviceID); m_bConnected = FALSE; DWORD dwipAddress = 0; TransformIP_CStringToDWORD(m_ControlInfo.GetConnectionPort(), dwipAddress); int nPortNo = 1025; m_uDeviceID = PPmacDprOpen(dwipAddress, nPortNo); if ( PPmacDprConnect(m_uDeviceID)!=PS_Ok ) { m_bConnected = FALSE; return -1; } m_bConnected = TRUE; // 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_PowerPmac::Disconnect() { if (m_bConnected) { PPmacDprDisconnect(m_uDeviceID); PPmacDprClose(m_uDeviceID); m_bConnected = FALSE; } ClosePPmacDprRuntimeLink(); } inline void CMotorControl_PowerPmac::SwapBytes(int nSizeType, void *pSource, int nSourceSize) { if (nSizeType==0 || (nSizeType%2)!=0) return; unsigned char temp; unsigned char* pSrcData = (unsigned char*)pSource; unsigned char* pSrc = NULL; unsigned char* pDst = NULL; int nLoopCount = nSizeType / 2; int nJumpSize = nSizeType - 1; for (int i=0; i