コンテンツにスキップ

サンプルプログラム > アナログ入力 > AiEvent >

C#

開発環境の設定

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

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

  3. ソースファイルにusing ディレクティブを使ってYdxCsを宣言します。

using YdxCs;

コントロール

変数

private int id;

実行結果の表示

private void ResultShow(string title, int resultCode)
{
    string resultString;
    Ydx.CnvResultToString(resultCode, out resultString);
    switch (resultCode)
    {
        case 0:
        case Ydx.YDX_RESULT_AI_EXCEED_DATA_NUM:
        case Ydx.YDX_RESULT_AI_EXCEED_BUF_SIZ:
            MessageBox.Show(resultString, title, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            break;
        default:
            MessageBox.Show(resultString, title, MessageBoxButtons.OK, MessageBoxIcon.Hand);
            break;
    }
}

フォームロード

private void Form1_Load(object sender, EventArgs e)
{
    // ユニット識別スイッチ
    unitSwitchComboBox.ResetText();
    unitSwitchComboBox.Items.AddRange(new 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(new string[] { "AIO-64/4/1B-USC", "AIO-60/4/1B-USC" });
    modelNameComboBox.SelectedIndex = 0;

    // レンジ
    rangeTypeComboBox.ResetText();
    rangeTypeComboBox.Items.AddRange(new string[] { "-10 ~ +10V", "-5 ~ +5V" });
}

オープン

private void openButton_Click(object sender, EventArgs e)
{
    int result = Ydx.Open(unitSwitchComboBox.SelectedIndex, modelNameComboBox.Text, 0, out id);
    if (result != 0)
        ResultShow("YdxOpen", result);
    else
    {
        unitSwitchComboBox.Enabled = false;
        modelNameComboBox.Enabled = false;
        rangeTypeComboBox.SelectedIndexChanged -= new EventHandler(rangeTypeComboBox_SelectedIndexChanged);
        rangeTypeComboBox.SelectedIndex = 0;
        rangeTypeComboBox.SelectedIndexChanged += new EventHandler(rangeTypeComboBox_SelectedIndexChanged);
        ResultShow("オープン", result);
    }
}

レンジ切り替え

private void rangeTypeComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    int result = Ydx.AiSetRange(id, rangeTypeComboBox.SelectedIndex);
    if (result != 0)
        ResultShow("YdxAiSetRange", result);
}

入力開始

private void startButton_Click(object sender, EventArgs e)
{
    dataTextBox.ResetText();
    Application.DoEvents();

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

    // チャネルの設定
    const int CHANNEL_NUM = 6; // 6チャネルを有効にする
    for (int channel = 0; channel < CHANNEL_NUM; channel++)
    {
        result = Ydx.AiSetChannel(id, channel, 1);
        if (result != 0)
        {
            ResultShow("YdxAiSetChannel", result);
            return;
        }
    }

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

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

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

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

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

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

    // イベントオブジェクト作成
    AutoResetEvent hEvent = new AutoResetEvent(false);

    // イベントの設定
    result = Ydx.AiSetEvent(id,
        Ydx.YDX_EVENT_COMMUNICATE_ERR |
        Ydx.YDX_EVENT_HARDWARE_ERR |
        Ydx.YDX_EVENT_OVERRUN_ERR |
        Ydx.YDX_EVENT_SAMPLE_CLOCK_ERR |
        Ydx.YDX_EVENT_STOP,
        hEvent.Handle);
    if (result != 0)
    {
        ResultShow("YdxAiSetEvent", result);
        hEvent.Close();
        return;
    }

    // アナログ入力動作を開始
    result = Ydx.AiStart(id);
    if (result != 0)
    {
        ResultShow("YdxAiStart", result);
        hEvent.Close();
        return;
    }

    // イベント発生待ち
    hEvent.WaitOne();
    hEvent.Close();

    // ステータスの取得
    int factor, sampleCount, repeatCount;
    result = Ydx.AiGetEventStatus(id, out factor, out sampleCount, out repeatCount);
    if (result != 0)
    {
        ResultShow("YdxAiGetEventStatus", result);
        return;
    }

    if ((factor & Ydx.YDX_EVENT_COMMUNICATE_ERR) != 0)
    {
        MessageBox.Show("通信エラーが発生しました", "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
        return;
    }

    if ((factor & Ydx.YDX_EVENT_HARDWARE_ERR) != 0)
    {
        MessageBox.Show("ハードウェアエラーが発生しました", "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
        return;
    }

    if ((factor & Ydx.YDX_EVENT_OVERRUN_ERR) != 0)
    {
        MessageBox.Show("オーバランエラーが発生しました", "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
        return;
    }

    if ((factor & Ydx.YDX_EVENT_SAMPLE_CLOCK_ERR) != 0)
    {
        MessageBox.Show("サンプリングクロックエラーが発生しました", "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
        return;
    }

    // データの読み出し
    float[] data = new float[sampleCount * CHANNEL_NUM]; // データ個数は、サンプル数 * 有効チャネル数
    int sampleNum = sampleCount;
    result = Ydx.AiGetDataVolt(id, ref sampleNum, data);
    if (result != 0)
    {
        ResultShow("YdxAiGetDataVolt", result);
        if ((result != Ydx.YDX_RESULT_AI_EXCEED_DATA_NUM) && (result != Ydx.YDX_RESULT_AI_EXCEED_BUF_SIZ))
            return;
    }

    // 表示
    string txt = " ";
    for (int channel = 0; channel < CHANNEL_NUM; channel++)
    {
        txt += " CH" + channel.ToString();
    }

    txt += Environment.NewLine;
    for (int sampleIndex = 0; sampleIndex < sampleNum; sampleIndex++)
    {
        txt += (sampleIndex + 1).ToString().PadLeft(5) + " : ";
        for (int channel = 0; channel < CHANNEL_NUM; channel++)
        {
            txt += data[sampleIndex * CHANNEL_NUM + channel].ToString(" 0.000;-0.000").PadLeft(7) + "V ";
        }
        txt += Environment.NewLine;
    }

    dataTextBox.Text = txt;
}

クローズ

private void closeButton_Click(object sender, EventArgs e)
{
    unitSwitchComboBox.Enabled = true;
    modelNameComboBox.Enabled = true;
    int result = Ydx.Close(id);
    if (result != 0)
        ResultShow("YdxClose", result);
    else
        ResultShow("クローズ", result);
}

フォームクローズ

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    int result = Ydx.Close(id);
    if ((result != 0) && (result != Ydx.YDX_RESULT_NOT_OPEN))
    {
        ResultShow("YdxClose", result);
    }
}