サンプルプログラム > Motion2 > Visual C++
オブジェクト
テキストボックス | ID | メンバ変数 |
ID番号 | IDC_ID | m_wID |
ラジオボタン | ID |
他軸の停止によるスタート | IDC_STARTMODE_0 |
内部同期信号によるスタート | IDC_STARTMODE_1 |
オープン
if( !UpdateData( TRUE ) ) {
return;
}
int nResult;
nResult = PmcmOpen( m_wID, "PMC-M2C-U" );
if( nResult == PMCM_RESULT_SUCCESS ) {
AfxMessageBox( "オープン成功", MB_OK | MB_ICONINFORMATION );
} else {
AfxMessageBox( "オープン失敗", MB_OK | MB_ICONSTOP );
}
各種設定
int nResult;
WORD wAxis;
char szResult[64];
COMPPMCM Comp[2];
CButton* pMode0 = NULL;
CButton* pMode1 = NULL;
wAxis = PMCM_AXIS_X + PMCM_AXIS_Y;
// センサ設定
// オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
// その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
//nResult = PmcmSetSensorConfig( m_wID, wAxis, PMCM_LOGIC, 0x3F );
//if( nResult != PMCM_RESULT_SUCCESS ) {
// wsprintf( szResult, "PmcmSetSensorConfig ERROR : 0x%X", nResult );
// AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
// return;
//}
// パルス出力モード設定
// 使用しているドライバに合致したパルス出力モードを選択してください
nResult = PmcmSetPulseConfig( m_wID, wAxis, PMCM_PULSE_OUT, 7 );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetPulseConfig ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
pMode0 = (CButton*)GetDlgItem( IDC_STARTMODE_0 );
pMode1 = (CButton*)GetDlgItem( IDC_STARTMODE_1 );
if( pMode0->GetCheck() ) {
// 他軸の停止によるスタート
// Y軸の停止によりX軸がスタートします
// X軸の起動条件を設定します(他軸の停止によるスタート)
nResult = PmcmSetSynchroConfig( m_wID, PMCM_AXIS_X, PMCM_SYNC_START_MODE, 3 );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetSynchroConfig ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
// X軸の他軸の停止によるスタート条件を設定します(Y軸の停止確認);
nResult = PmcmSetSynchroConfig( m_wID, PMCM_AXIS_X, PMCM_SYNC_START, PMCM_AXIS_Y );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetSynchroConfig ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
} else if( pMode1->GetCheck() ) {
// 内部同期信号によるスタート
// X軸の出力パルスカウンタが500になったらY軸がスタートします
// Y軸の起動条件を設定(内部同期信号によるスタート)
nResult = PmcmSetSynchroConfig( m_wID, PMCM_AXIS_Y, PMCM_SYNC_START_MODE, 2);
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetSynchroConfig ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
// Y軸の内部同期信号によるスタート条件の設定(X軸の内部同期信号でスタート)
nResult = PmcmSetSynchroConfig( m_wID, PMCM_AXIS_Y, PMCM_SYNC_SIG_START, 0);
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetSynchroConfig ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
// X軸の内部同期信号出力タイミングの設定(出力パルスコンパレータ条件成立時)
nResult = PmcmSetSynchroOut( m_wID, PMCM_AXIS_X, PMCM_SYNC_OUT_MODE, 1);
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetSynchroOut ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
// X軸のコンパレータの設定
Comp[0].wConfig = 1;
Comp[0].lCount = 500;
nResult = PmcmSetComparatorConfig( m_wID, PMCM_AXIS_X, PMCM_COMP_COUNTER, Comp );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetComparatorConfig ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
}
動作パラメータ設定
int nResult;
WORD wAxis;
MOTIONPMCM Motion[2];
char szResult[64];
wAxis = PMCM_AXIS_X + PMCM_AXIS_Y;
// X軸
Motion[0].wMoveMode = PMCM_PTP; // 動作モード
Motion[0].wStartMode = PMCM_CONST; // 起動モード
Motion[0].fSpeedRate = 1; // 速度倍率
Motion[0].wAccDecMode = PMCM_ACC_LINEAR; // 加減速モード
Motion[0].fLowSpeed = 500; // 起動時速度
Motion[0].fSpeed = 500; // 移動速度
Motion[0].wAccTime = 0; // 加速時間
Motion[0].wDecTime = 0; // 減速時間
Motion[0].fSAccSpeed = 0; // 加速S字区間
Motion[0].fSDecSpeed = 0; // 減速S字区間
Motion[0].lSlowdown = -1; // スローダウンポイント
Motion[0].lStep = 1000; // 移動パルス数,移動方向
Motion[0].bAbsolutePtp = 0; // 絶対座標指定
// Y軸
Motion[1].wMoveMode = PMCM_PTP; // 動作モード
Motion[1].wStartMode = PMCM_CONST; // 起動モード
Motion[1].fSpeedRate = 1; // 速度倍率
Motion[1].wAccDecMode = PMCM_ACC_LINEAR; // 加減速モード
Motion[1].fLowSpeed = 1000; // 起動時速度
Motion[1].fSpeed = 1000; // 移動速度
Motion[1].wAccTime = 0; // 加速時間
Motion[1].wDecTime = 0; // 減速時間
Motion[1].fSAccSpeed = 0; // 加速S字区間
Motion[1].fSDecSpeed = 0; // 減速S字区間
Motion[1].lSlowdown = -1; // スローダウンポイント
Motion[1].lStep = 1000; // 移動パルス数,移動方向
Motion[1].bAbsolutePtp = 0; // 絶対座標指定
// 動作パラメータ設定
nResult = PmcmSetMotion( m_wID, wAxis, Motion );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmSetMotion ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
動作開始
int nResult;
WORD wAxis;
char szResult[64];
CButton* pMode0 = NULL;
CButton* pMode1 = NULL;
pMode0 = (CButton*)GetDlgItem( IDC_STARTMODE_0 );
pMode1 = (CButton*)GetDlgItem( IDC_STARTMODE_1 );
if( pMode0->GetCheck() ) {
// 他軸の停止によるスタート
// X軸はY軸の停止を確認して動作しますので、Y軸を先に動作させます
// 同時に動作させてしまうと、その時点でY軸がまだ動作開始前で停止中のため、X軸が動作してしまいます
// 動作開始
nResult = PmcmStartMotion( m_wID, PMCM_AXIS_Y );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmStartMotion ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
// 動作開始
nResult = PmcmStartMotion( m_wID, PMCM_AXIS_X );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmStartMotion ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
} else if( pMode1->GetCheck() ) {
// 内部同期信号によるスタート
// 動作開始
wAxis = PMCM_AXIS_X + PMCM_AXIS_Y;
nResult = PmcmStartMotion( m_wID, wAxis );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmStartMotion ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
}
動作停止
int nResult;
WORD wAxis;
WORD wStopMode;
char szResult[64];
// 停止させる軸
wAxis = PMCM_AXIS_X + PMCM_AXIS_Y;
// 停止モード
wStopMode = PMCM_IMMEDIATE_STOP;
// 動作停止
nResult = PmcmStopMotion( m_wID, wAxis, wStopMode );
if( nResult != PMCM_RESULT_SUCCESS ) {
wsprintf( szResult, "PmcmStopMotion ERROR : 0x%X", nResult );
AfxMessageBox( szResult, MB_OK | MB_ICONSTOP );
return;
}
クローズ
BOOL bResult;
bResult = PmcmClose( m_wID );