コンテンツにスキップ

サンプルプログラム > デジタル出力 > DoPolling >

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_DI_EXCEED_DATA_NUM:
        case Ydx.YDX_RESULT_DI_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[] { "DIO-16/16C-USC", "DIO-16/16D-UBC", "DIO-16/16D-USC" });
    modelNameComboBox.SelectedIndex = 0;
}

オープン

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;
        ResultShow("オープン", result);
    }
}

出力開始

private void startButton_Click(object sender, EventArgs e)
{
    int result;

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

    // チャネルの設定
    for (int channel = 0; channel < 16; channel++)
    {
        result = Ydx.DoSetChannel(id, channel, 1);  // 高機能デジタル出力モード
        if(result != 0)
        {
            ResultShow("YdxDoSetChannel", result);
            return;
        }
    }

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

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

    // データの設定
    const int SAMPLE_NUM = 1000;    // サンプル数
    int[] data = new int[SAMPLE_NUM];
    for (int i = 0; i < SAMPLE_NUM; i++)
    {
        data[i] = i;
    }

    result = Ydx.DoSetData(id, SAMPLE_NUM, data);
    if(result != 0)
    {
        ResultShow("YdxDoSetData", result);
        return;
    }

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

    // サンプリング停止条件の設定
    result = Ydx.DoSetStopCondition(id, 0, 0);    // データ終了
    if(result != 0)
    {
        ResultShow("YdxDoSetStopCondition", result);
        return;
    }

    // デジタル出力動作を開始
    result = Ydx.DoStart(id);
    if(result != 0)
    {
        ResultShow("YdxDoStart", result);
        return;
    }

    // 動作終了待ち
    int status, sampleCount, repeatCount, notOutNum;
    //動作中ステータスがOFFになるまでポーリング
    do
    {
        Application.DoEvents();

        // ステータスの取得
        result = Ydx.DoGetStatus(id, out status, out sampleCount, out repeatCount, out notOutNum);
        if(result != 0)
        {
            ResultShow("YdxDoGetStatus", result);
            return;
        }

        statusTextBox.Text = status.ToString("X").PadLeft(8, '0') + "h";
        sampleCountTextBox.Text = sampleCount.ToString();
        repeatCountTextBox.Text = repeatCount.ToString();
        notOutNumTextBox.Text = notOutNum.ToString();

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

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

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

    ResultShow("出力", 0);
}

クローズ

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