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

Visual C++/CLI

オブジェクト

テキストボックス Name
ID番号 idTextBox

変数

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;
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;
}

動作パラメータ設定

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

axis = PMCM_AXIS_X;

// CP動作パラメータ数
count = 3;

// 1回目
motion[0].wMoveMode = PMCM_PTP; // 動作モード
motion[0].wStartMode = PMCM_ACC_DEC; // 起動モード
motion[0].fSpeedRate = 1; // 速度倍率
motion[0].wAccDecMode = PMCM_ACC_LINEAR; // 加減速モード
motion[0].fLowSpeed = 100; // 起動時速度
motion[0].fSpeed = 500; // 移動速度
motion[0].wAccTime = 500; // 加速時間
motion[0].wDecTime = 500; // 減速時間
motion[0].fSAccSpeed = 0; // 加速S字区間
motion[0].fSDecSpeed = 0; // 減速S字区間
motion[0].lSlowdown = 0; // スローダウンポイント
motion[0].lStep = 1000; // 移動パルス数,移動方向
motion[0].bAbsolutePtp = 0; // 絶対座標指定
// 2回目
motion[1].wMoveMode = PMCM_PTP; // 動作モード
motion[1].wStartMode = PMCM_ACC_DEC; // 起動モード
motion[1].fSpeedRate = 1; // 速度倍率
motion[1].wAccDecMode = PMCM_ACC_LINEAR; // 加減速モード
motion[1].fLowSpeed = 500; // 起動時速度
motion[1].fSpeed = 1000; // 移動速度
motion[1].wAccTime = 500; // 加速時間
motion[1].wDecTime = 500; // 減速時間
motion[1].fSAccSpeed = 0; // 加速S字区間
motion[1].fSDecSpeed = 0; // 減速S字区間
motion[1].lSlowdown = -1; // スローダウンポイント
motion[1].lStep = 2000; // 移動パルス数,移動方向
motion[1].bAbsolutePtp = 0; // 絶対座標指定
// 3回目
motion[2].wMoveMode = PMCM_PTP; // 動作モード
motion[2].wStartMode = PMCM_CONST_DEC; // 起動モード
motion[2].fSpeedRate = 1; // 速度倍率
motion[2].wAccDecMode = PMCM_ACC_LINEAR; // 加減速モード
motion[2].fLowSpeed = 100; // 起動時速度
motion[2].fSpeed = 500; // 移動速度
motion[2].wAccTime = 0; // 加速時間
motion[2].wDecTime = 500; // 減速時間
motion[2].fSAccSpeed = 0; // 加速S字区間
motion[2].fSDecSpeed = 0; // 減速S字区間
motion[2].lSlowdown = -1; // スローダウンポイント
motion[2].lStep = 1500; // 移動パルス数,移動方向
motion[2].bAbsolutePtp = 0; // 絶対座標指定

// CPの空き取得
result = PmcmGetEmptyCp(id, axis, empty);
if (result != PMCM_RESULT_SUCCESS) {
    messageText = String::Format("PmcmGetEmptyCp ERROR : 0x{0:X}", result);
    MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
    return;
}
// CPの空き確認
if (empty[0] < count) {
    MessageBox::Show("CP空きなし", "", MessageBoxButtons::OK, MessageBoxIcon::Error);
    return;
}

// 動作パラメータ設定
result = PmcmSetMotionCp(id, axis, motion, count);
if (result != PMCM_RESULT_SUCCESS) {
    messageText = String::Format("PmcmSetMotionCp ERROR : 0x{0:X}", result);
    MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
    return;
}

動作開始

int result;
unsigned short axis;
String^ messageText;

// 動作させる軸
axis = PMCM_AXIS_X;

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

動作追加

// CP動作は96動作までしか設定できません
// それ以上の動作を設定したい場合は、動作中にCPの空きを確認し、空き数分の動作を開始します
int result;
unsigned short axis;
MOTIONPMCM motion[100];
unsigned short empty[2];
unsigned short count;
unsigned short remainCount;
unsigned short setCount;
int i;
String^ messageText;

axis = PMCM_AXIS_X;

// CP動作パラメータ数
count = 100;

for (i = 0; i < count; i++) {
    motion[i].wMoveMode = PMCM_PTP; // 動作モード
    motion[i].wStartMode = PMCM_CONST; // 起動モード
    motion[i].fSpeedRate = 1; // 速度倍率
    motion[i].wAccDecMode = PMCM_ACC_LINEAR; // 加減速モード
    motion[i].fLowSpeed = 1000; // 起動時速度
    motion[i].fSpeed = 1000; // 移動速度
    motion[i].wAccTime = 0; // 加速時間
    motion[i].wDecTime = 0; // 減速時間
    motion[i].fSAccSpeed = 0; // 加速S字区間
    motion[i].fSDecSpeed = 0; // 減速S字区間
    motion[i].lSlowdown = -1; // スローダウンポイント
    motion[i].lStep = 1000; // 移動パルス数,移動方向
    motion[i].bAbsolutePtp = 0; // 絶対座標指定
}

// 残り動作数
remainCount= count;

while (remainCount > 0) {
    // CPの空き取得
    result = PmcmGetEmptyCp(id, axis, empty);
    if (result != PMCM_RESULT_SUCCESS) {
        messageText = String::Format("PmcmGetEmptyCp ERROR : 0x{0:X}", result);
        MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
        return;
    }
    // CPの空きを確認し、設定動作数を決定する
    if (empty[0] == 0) { // CP空きなし
        setCount = 0;
    } else if (empty[0] < remainCount) { // CP空き < 残り動作数
        setCount = empty[0]; // CP空き分だけ設定する
    } else if (empty[0] >= remainCount) { // CP空き >= 残り動作数
        setCount = remainCount; // 残り動作数を設定する
    }

    if (setCount > 0) {
        // 動作パラメータ設定
        result = PmcmSetMotionCp(id, axis, &motion[count - remainCount], setCount);
        if (result != PMCM_RESULT_SUCCESS) {
            messageText = String::Format("PmcmSetMotionCp ERROR : 0x{0:X}", result);
            MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
            return;
        }
        // 動作開始
        result = PmcmStartMotionCp(id, axis);
        if (result != PMCM_RESULT_SUCCESS) {
            messageText = String::Format("PmcmStartMotionCp ERROR : 0x{0:X}", result);
            MessageBox::Show(messageText, "", MessageBoxButtons::OK, MessageBoxIcon::Error);
            return;
        }
    }
    // 残り動作数更新
    remainCount -= setCount;
}

動作停止

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);