⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfcjogdlg.cpp

📁 介绍控制器运动的例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
// Send the current Jog settings to the controller
  UpdateData();
  m_Cntl->SetFlag(799+(32*m_Axis),m_JLockoutON,true);         // Jog Lockout
  m_Cntl->SetFlag(798+(32*m_Axis),m_JLimitsON,true);          // Jog Limits Enabled
  m_Cntl->SetParmFloat(12334+(256*m_Axis),m_JogLimit2,true);  // Pos Limit
  m_Cntl->SetParmFloat(12335+(256*m_Axis),m_JogLimit1,true);  // Neg Limit
  m_Cntl->SetParmFloat(12349+(256*m_Axis),m_JogAcc,true);     // Jog Acc
  m_Cntl->SetParmFloat(12348+(256*m_Axis),m_JogVel,true);     // Jog Vel
  m_Cntl->SetParmFloat(12350+(256*m_Axis),m_JogDec,true);     // Jog Dec
  m_Cntl->SetParmFloat(12351+(256*m_Axis),m_JogJrk,true);     // Jog Jrk
}

void CMFCJogDlg::OnJogPos() 
{
  // Jog Forward
  m_Cntl->SetFlag(796 + (m_Axis * 32), true, true);
}

void CMFCJogDlg::OnJogNeg() 
{
  // Jog in Reverse
  m_Cntl->SetFlag(797 + (m_Axis* 32), true, true);
}

void CMFCJogDlg::OnJogStop() 
{
  // Jog Stop
  m_Cntl->SetFlag(796 + (m_Axis * 32), false, true);
  m_Cntl->SetFlag(797 + (m_Axis* 32), false, true);
}

void CMFCJogDlg::OnSelchangeCboMaster() 
{
  // When a different master is choosen, update the status
  UpdateData();

  if(m_Stat->GetIsOffline()) return;

  // initialize realtime status
  ostringstream led;
  led << _T("P") << 4112 + m_Master << _T(",P4272");
  if(m_masterMsgId) m_Stat->DelStatus(m_masterMsgId);
  m_masterMsgId = m_Stat->AddACRCustom(led.str().c_str());

  UpdateData(FALSE);
}

void CMFCJogDlg::OnSelchangeCboAxis() 
{
  // When a different axis is choosen, update the status and display of the initial jog settings
  UpdateData();

  ostringstream axis;
  axis << _T("AXIS") << m_Axis;
  m_CurrAxis = axis.str().c_str();

  if(m_Stat->GetIsOffline()) return;

  // initialize realtime status
  ostringstream led;
  led << _T("P") << 4360 + m_Axis << _T(",P") << 4120 + m_Axis << _T(",P") << 12297 + (256 * m_Axis) << _T(",P") <<  12295 + (256 * m_Axis);
  if(m_axisMsgId) m_Stat->DelStatus(m_axisMsgId);
  m_axisMsgId = m_Stat->AddACRCustom(led.str().c_str());

  // P4120 + Axis Number holds the jog flags
  SAFEARRAY* pSA1;
  long lBound1 = 0; 
  CComVariant vItem1;   // The CComVariant is found in the atlbase.h include file
  CComVariant vflags;   // it will clean up SAFEARRAY when it goes out of scope.
  long holdFlags = 0;

  // Get the value of the p_Parm, returned in a safearray
  ostringstream pFlag;
  pFlag << _T("P") << (4120 + m_Axis);
  vflags = m_Stat->GetACRCustom(pFlag.str().c_str());
  if(vflags.vt & VT_ARRAY){ 
    pSA1 = vflags.parray;
    SafeArrayGetElement(pSA1, &lBound1, &vItem1);
    if(vItem1.vt!=VT_EMPTY) 
      holdFlags = vItem1.lVal;
  }else
    holdFlags = 0;
  bitset<32> bitMask(holdFlags);
  m_JLimitsON = bitMask.at(30);
  m_JLockoutON = bitMask.at(31);

  SAFEARRAY* pSA2;
  long lBound2 = 0; 
  CComVariant vItem2;   // The CComVariant is found in the atlbase.h include file
  CComVariant vparms;   // it will clean up SAFEARRAY when it goes out of scope.
	
  // Get the value of the p_Parm, returned in a safearray
  ostringstream pParm;
  pParm << _T("P") << (12334 + (256 * m_Axis)) << _T(",");  // Pos Jog Limit
  pParm << _T("P") << (12335 + (256 * m_Axis)) << _T(",");  // Neg Jog Limit
  pParm << _T("P") << (12349 + (256 * m_Axis)) << _T(",");  // Jog Acc
  pParm << _T("P") << (12348 + (256 * m_Axis)) << _T(",");  // Jog Vel
  pParm << _T("P") << (12350 + (256 * m_Axis)) << _T(",");  // Jog Dec
  pParm << _T("P") << (12351 + (256 * m_Axis));             // Jog Jrk
  vparms = m_Stat->GetACRCustom(pParm.str().c_str());
  if(vparms.vt & VT_ARRAY){ 
    pSA2 = vparms.parray;
    SafeArrayGetElement(pSA2, &lBound2, &vItem2);
    if(vItem2.vt!=VT_EMPTY) 
      m_JogLimit2 = vItem2.fltVal;
    ++lBound2;
    SafeArrayGetElement(pSA2, &lBound2, &vItem2);
    if(vItem2.vt!=VT_EMPTY) 
      m_JogLimit1 = vItem2.fltVal;
    ++lBound2;
    SafeArrayGetElement(pSA2, &lBound2, &vItem2);
    if(vItem2.vt!=VT_EMPTY) 
      m_JogAcc = vItem2.fltVal;
    ++lBound2;
    SafeArrayGetElement(pSA2, &lBound2, &vItem2);
    if(vItem2.vt!=VT_EMPTY) 
      m_JogVel = vItem2.fltVal;
    ++lBound2;
    SafeArrayGetElement(pSA2, &lBound2, &vItem2);
    if(vItem2.vt!=VT_EMPTY) 
      m_JogDec = vItem2.fltVal;
    ++lBound2;
    SafeArrayGetElement(pSA2, &lBound2, &vItem2);
    if(vItem2.vt!=VT_EMPTY) 
      m_JogJrk = vItem2.fltVal;
  }else{
    m_JogLimit1 = 0;
    m_JogLimit2 = 0;
    m_JogAcc = 0;
    m_JogVel = 0;
    m_JogDec = 0;
    m_JogJrk = 0;
  }
  UpdateData(FALSE);

}

LONG CMFCJogDlg::OnUpdateStats(UINT,LONG xMsgid)
{

  // The StatusWaiting event will trigger when ever a status changes.  Check
  // which status request (for Master info or Axis info) generated the event
  // and then read that status request.  The status requests are set up at
  // connection time or when the dropdown listboxes specifying the master/axis
  // are changed.
  // NOTE: The radio buttons used to simulate LEDs show as "on" when they are 
  // set to the value zero, and "off" for non-zero values.
  SAFEARRAY* pSA1;
  long lBound1 = 0; 
  CComVariant vItem1;   // The CComVariant is found in the atlbase.h include file
  CComVariant vaxis;   // it will clean up SAFEARRAY when it goes out of scope.
  bitset<32> holdDriveFlags(0);
  bitset<32> holdJogFlags(0);

  // Check on the Axis Status
  // index 0 = P4360 + Axis Number
  // index 1 = P4120 + Axis Number
  // index 2 = P12297 + (Axis Number * 256)
  // index 3 = P12295 + (Axis Number * 256)
  if(xMsgid == m_axisMsgId){
    vaxis = m_Stat->GetStatus(m_axisMsgId);
    if(vaxis.vt & VT_ARRAY){ 
      pSA1 = vaxis.parray;
      SafeArrayGetElement(pSA1, &lBound1, &vItem1);
      if(vItem1.vt!=VT_EMPTY)
        holdDriveFlags = vItem1.lVal;
      ++lBound1;
      SafeArrayGetElement(pSA1, &lBound1, &vItem1);
      if(vItem1.vt!=VT_EMPTY)
        holdJogFlags = vItem1.lVal;
      ++lBound1;
      SafeArrayGetElement(pSA1, &lBound1, &vItem1);
      if(vItem1.vt!=VT_EMPTY) 
        m_JogOffset = vItem1.lVal;
      ++lBound1;
      SafeArrayGetElement(pSA1, &lBound1, &vItem1);
      if(vItem1.vt!=VT_EMPTY) 
        m_SetPoint = vItem1.lVal;
    }else{
      holdDriveFlags = 0;
      holdJogFlags =0;
    }
    m_Drive = !(holdDriveFlags.at(17));
    m_KAMR = !(holdDriveFlags.at(19));
    m_JActive = !(holdJogFlags.at(24));
    m_JSpeed = !(holdJogFlags.at(26));
    m_JStop = !(holdJogFlags.at(27));
  }

  SAFEARRAY* pSA2;
  long lBound2 = 0; 
  CComVariant vItem2;   // The CComVariant is found in the atlbase.h include file
  CComVariant vmaster;  // it will clean up SAFEARRAY when it goes out of scope.
  bitset<32> holdMotion(0);
  bitset<32> holdVolt24(0);

  // Check on the Master Status
  // index 0 = P4112 + Master Number
  // index 1 = P4272
  if(xMsgid == m_masterMsgId){
    vmaster = m_Stat->GetStatus(m_masterMsgId);
    if(vmaster.vt & VT_ARRAY){ 
      pSA2 = vmaster.parray;
      SafeArrayGetElement(pSA2, &lBound2, &vItem2);
      if(vItem2.vt!=VT_EMPTY) 
        holdMotion = vItem2.lVal;
      ++lBound2;
      SafeArrayGetElement(pSA2, &lBound2, &vItem2);
      if(vItem2.vt!=VT_EMPTY) 
        holdVolt24 = vItem2.lVal;
    }else{
      holdMotion = 0;
      holdVolt24 =0;
    }
    m_Motion = !(holdMotion.at(4));
    m_KAM = !(holdMotion.at(10));
    m_24vEnable = !(holdVolt24.at(13));
  }

  UpdateData(FALSE);

  return 0;
}

  // The radio buttons are used as a poor man's led, so make them read only.
void CMFCJogDlg::OnLed24venable() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedKam() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedMotion() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedKamr() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedDrive() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedJstop() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedJspeed() 
{
  UpdateData(FALSE);
}
void CMFCJogDlg::OnLedJactive() 
{
  UpdateData(FALSE);
}

// **ADDED** 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -