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

C++/CLI

開発環境の設定

  1. YdxCLI.h をプロジェクトフォルダにコピーします。

  2. YdxCLI.h をプロジェクトに追加します。

  3. ソースファイルに YdxCLI.h をインクルードします。

  4. usingディレクティブを使ってYdxCLIを宣言します。

using namespace YdxCLI;  

コントロール

変数

int id;

実行結果の表示

private: System::Void ResultShow(String^ title, int resultCode)
{
    StringBuilder^ resultString = gcnew StringBuilder(256);
    YdxCnvResultToString(resultCode, resultString);
    switch (resultCode)
    {
    case 0:
    case YDX_RESULT_DI_EXCEED_DATA_NUM:
    case YDX_RESULT_DI_EXCEED_BUF_SIZ:
        MessageBox::Show(resultString->ToString(), title, MessageBoxButtons::OK, MessageBoxIcon::Asterisk);
        break;
    default:
        MessageBox::Show(resultString->ToString(), title, MessageBoxButtons::OK, MessageBoxIcon::Hand);
        break;
    }
}

フォームロード

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
    // ユニット識別スイッチ
    unitSwitchComboBox->ResetText();
    unitSwitchComboBox->Items->AddRange(gcnew array<String^> { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" });
    unitSwitchComboBox->SelectedIndex = 0;
    // 型名
    modelNameComboBox->ResetText();
    modelNameComboBox->Items->AddRange(gcnew array<String^> { "DIO-16/16C-USC", "DIO-16/16D-UBC", "DIO-16/16D-USC" });
    modelNameComboBox->SelectedIndex = 0;
}

オープン

private: System::Void openButton_Click(System::Object^ sender, System::EventArgs^ e)
{
    int getId;
    int result = YdxOpen(unitSwitchComboBox->SelectedIndex, modelNameComboBox->Text, 0, &getId);
    if(result != 0)
        ResultShow("YdxOpen", result);
    else
    {
        unitSwitchComboBox->Enabled = false;
        modelNameComboBox->Enabled = false;
        ResultShow("オープン", result);
        id = getId;
    }
}

入力開始

private: System::Void startButton_Click(System::Object^ sender, System::EventArgs^ e)
{
    dataTextBox->ResetText();
    Application::DoEvents();

    // データバッファの設定
    int result = YdxDiSetBuffer(id, 0); // FIFOバッファ
    if(result != 0)
    {
        ResultShow("YdxDiSetBuffer", result);
        return;
    }

    // サンプリングクロックの設定
    result = YdxDiSetClock(id, 0);  // 内部クロック
    if(result != 0)
    {
        ResultShow("YdxDiSetClock", result);
        return;
    }

    // 内部クロック周期の設定
    result = YdxDiSetClockInternal(id, 1000); // 1000μsec
    if(result != 0)
    {
        ResultShow("YdxDiSetClockInternal", result);
        return;
    }

    // サンプリング開始条件の設定
    result = YdxDiSetStartCondition(id, 0, 0);  // ソフトウェア
    if(result != 0)
    {
        ResultShow("YdxDiSetStartCondition", result);
        return;
    }

    // サンプリング停止条件の設定
    result = YdxDiSetStopCondition(id, 0, 0);   // サンプル数
    if(result != 0)
    {
        ResultShow("YdxDiSetStopCondition", result);
        return;
    }

    // サンプリング停止条件(サンプル数)の設定
    const int SAMPLE_NUM = 1000;    // 1000個
    result = YdxDiSetStopSampleNum(id, SAMPLE_NUM);
    if(result != 0)
    {
        ResultShow("YdxDiSetStopSampleNum", result);
        return;
    }

    // データをクリア
    result = YdxDiClearData(id);
    if(result != 0)
    {
        ResultShow("YdxDiClearData", result);
        return;
    }

    // デジタル入力動作を開始
    result = YdxDiStart(id);
    if(result != 0)
    {
        ResultShow("YdxDiStart", result);
        return;
    }

    // 動作終了待ち
    int status, sampleCount, repeatCount;
    //動作中ステータスがOFFになるまでポーリング
    do
    {
        //ステータスの取得
        result = YdxDiGetStatus(id, &status, &sampleCount, &repeatCount);
        if(result != 0)
        {
            ResultShow("YdxDiGetStatus", result);
            return;
        }

        statusTextBox->Text = status.ToString("X")->PadLeft(8, '0') + "h";
        sampleCountTextBox->Text = sampleCount.ToString();
        repeatCountTextBox->Text = repeatCount.ToString();
        Application::DoEvents();
        if((status & YDX_STATUS_COMMUNICATE_ERR) != 0)
        {
            MessageBox::Show("通信エラーが発生しました", "", MessageBoxButtons::OK, MessageBoxIcon::Hand);
            return;
        }
        if((status & YDX_STATUS_HARDWARE_ERR) != 0)
        {
            MessageBox::Show("ハードウェアエラーが発生しました", "", MessageBoxButtons::OK, MessageBoxIcon::Hand);
            return;
        }
        if((status & YDX_STATUS_OVERRUN_ERR) != 0)
        {
            MessageBox::Show("オーバランエラーが発生しました", "", MessageBoxButtons::OK, MessageBoxIcon::Hand);
            return;
        }
        if((status & YDX_STATUS_SAMPLE_CLOCK_ERR) != 0)
        {
            MessageBox::Show("サンプリングクロックエラーが発生しました", "", MessageBoxButtons::OK, MessageBoxIcon::Hand);
            return;
        }
    } while ((status & YDX_STATUS_BUSY) != 0);

    // データの読み出し
    int data[SAMPLE_NUM];
    result = YdxDiGetData(id, &sampleCount, data);
    if(result != 0)
    {
        ResultShow("YdxDiGetData", result);
        if((result != YDX_RESULT_DI_EXCEED_DATA_NUM) && (result != YDX_RESULT_DI_EXCEED_BUF_SIZ))
            return;
    }

    // 表示
    String^ txt = "";
    for (int sampleIndex = 0; sampleIndex < sampleCount; sampleIndex++)
    {
        txt += (sampleIndex + 1).ToString()->PadLeft(5) + " : ";
        // 2進数表記
        txt += Convert::ToString(data[sampleIndex] >> 16 & 0x0f, 2)->PadLeft(4, '0') + " ";
        txt += Convert::ToString(data[sampleIndex] >> 8 & 0x0f, 2)->PadLeft(4, '0') + " ";
        txt += Convert::ToString(data[sampleIndex] >> 4 & 0x0f, 2)->PadLeft(4, '0') + " ";
        txt += Convert::ToString(data[sampleIndex] & 0x0f, 2)->PadLeft(4, '0');
        // 16進数表記
        txt += " (" + data[sampleIndex].ToString("X")->PadLeft(4) + "h)";
        txt += Environment::NewLine;
    }

    dataTextBox->Text = txt;
}

クローズ

private: System::Void closeButton_Click(System::Object^ sender, System::EventArgs^ e)
{
    unitSwitchComboBox->Enabled = true;
    modelNameComboBox->Enabled = true;
    int result = YdxClose(id);
    if(result != 0)
        ResultShow("YdxClose", result);
    else
        ResultShow("クローズ", result);
}

フォームクローズ

private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e)
{
    int result = YdxClose(id);
    if((result != 0) && (result != YDX_RESULT_NOT_OPEN))
    {
        ResultShow("YdxClose", result);
    }
}