コンテンツにスキップ
サンプルプログラム > Motion2 >

Visual C++/CLI

オブジェクト

テキストボックス Name
ID番号 idTextBox
ラジオボタン Name
他軸の停止によるスタート startMode0
内部同期信号によるスタート startMode1

変数

unsigned short id;

オープン

int result;

id = Convert::ToUInt16(idTextBox->Text);
result = PmcmOpen(id, "PMC-M2C-U");
if (result == PMCM_RESULT_SUCCESS) {
    MessageBox::Show("オープン成功", "", MessageBoxButtons::OK, MessageBoxIcon::Information);
} else {
    MessageBox::Show("オープン失敗", "", MessageBoxButtons::OK, MessageBoxIcon::Error);
}

各種設定

int result;
unsigned short axis;
COMPPMCM comp[2];
String^ messageText;

axis = PMCM_AXIS_X + PMCM_AXIS_Y;

// センサ設定
// オンで検知するセンサを接続している場合や、リミットスイッチを接続していない場合はモーターが動作しません
// その場合は以下の関数を実行してセンサ設定を"オンで検知"に変更してください
//result = PmcmSetSensorConfig(id, axis, PMCM_LOGIC, 0x3F);
//if (result != PMCM_RESULT_SUCCESS) {
//    messageText = String::Format("PmcmSetSensorConfig ERROR : 0x{0:X}", result);
//    MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
//    return;
//}

// パルス出力モード設定
// 使用しているドライバに合致したパルス出力モードを選択してください
result = PmcmSetPulseConfig(id, axis, PMCM_PULSE_OUT, 7);
if (result != PMCM_RESULT_SUCCESS) {
    messageText = String::Format("PmcmSetPulseConfig ERROR : 0x{0:X}", result);
    MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
    return;
}

if (startMode0->Checked) {
    // 他軸の停止によるスタート
    // Y軸の停止によりX軸がスタートします

    // X軸の起動条件を設定します(他軸の停止によるスタート)
    result = PmcmSetSynchroConfig(id, PMCM_AXIS_X, PMCM_SYNC_START_MODE, 3);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmSetSynchroConfig ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }

    // X軸の他軸の停止によるスタート条件を設定します(Y軸の停止確認)
    result = PmcmSetSynchroConfig(id, PMCM_AXIS_X, PMCM_SYNC_START, PMCM_AXIS_Y);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmSetSynchroConfig ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }
} else if (startMode1->Checked) {
    // 内部同期信号によるスタート
    // X軸の出力パルスカウンタが500になったらY軸がスタートします

    // Y軸の起動条件を設定(内部同期信号によるスタート)
    result = PmcmSetSynchroConfig(id, PMCM_AXIS_Y, PMCM_SYNC_START_MODE, 2);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmSetSynchroConfig ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }

    // Y軸の内部同期信号によるスタート条件の設定(X軸の内部同期信号でスタート)
    result = PmcmSetSynchroConfig(id, PMCM_AXIS_Y, PMCM_SYNC_SIG_START, 0);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmSetSynchroConfig ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }

    // X軸の内部同期信号出力タイミングの設定(出力パルスコンパレータ条件成立時)
    result = PmcmSetSynchroOut(id, PMCM_AXIS_X, PMCM_SYNC_OUT_MODE, 1);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmSetSynchroOut ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }

    // X軸のコンパレータの設定
    comp[0].wConfig = 1;
    comp[0].lCount = 500;
    result = PmcmSetComparatorConfig(id, PMCM_AXIS_X, PMCM_COMP_COUNTER, comp);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmSetComparatorConfig ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }
}

動作パラメータ設定

int result;
unsigned short axis;
MOTIONPMCM motion[2];
String^ messageText;

axis = 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; // 絶対座標指定
// 動作パラメータ設定
result = PmcmSetMotion(id, axis, motion);
if (result != PMCM_RESULT_SUCCESS) {
    messageText = String::Format("PmcmSetMotion ERROR : 0x{0:X}", result);
    MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
    return;
}

動作開始

int result;
unsigned short axis;
String^ messageText;

if (startMode0->Checked) {
    // 他軸の停止によるスタート
    // X軸はY軸の停止を確認して動作しますので、Y軸を先に動作させます
    // 同時に動作させてしまうと、その時点でY軸がまだ動作開始前で停止中のため、X軸が動作してしまいます

    // 動作開始
    result = PmcmStartMotion(id, PMCM_AXIS_Y);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmStartMotion ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }
    // 動作開始
    result = PmcmStartMotion(id, PMCM_AXIS_X);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmStartMotion ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }
} else if (startMode1->Checked) {
    // 内部同期信号によるスタート

    // 動作開始
    axis = PMCM_AXIS_X + PMCM_AXIS_Y;
    result = PmcmStartMotion(id, axis);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmStartMotion ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }
}

動作停止

int result;
unsigned short axis;
unsigned short stopMode;
String^ messageText;

// 停止させる軸
axis = PMCM_AXIS_X + PMCM_AXIS_Y;

// 停止モード
stopMode = PMCM_IMMEDIATE_STOP;

// 動作停止
result = PmcmStopMotion(id, axis, stopMode);
if (result != PMCM_RESULT_SUCCESS) {
    messageText = String::Format("PmcmStopMotion ERROR : 0x{0:X}", result);
    MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
    return;
}

クローズ

bool result;

result = PmcmClose(id);