C++/CLI¶
開発環境の設定¶
-
YdxCLI.h をプロジェクトフォルダにコピーします。
-
YdxCLI.h をプロジェクトに追加します。
-
ソースファイルに YdxCLI.h をインクルードします。
-
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_AI_EXCEED_DATA_NUM:
case YDX_RESULT_AI_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^> { "AIO-64/4/1B-USC", "AIO-60/4/1B-USC" });
modelNameComboBox->SelectedIndex = 0;
// レンジ
rangeTypeComboBox->ResetText();
rangeTypeComboBox->Items->AddRange(gcnew array<String^> { "-10 ~ +10V", "-5 ~ +5V" });
}
オープン¶
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;
rangeTypeComboBox->SelectedIndexChanged -= gcnew EventHandler(this, &Form1::rangeTypeComboBox_SelectedIndexChanged);
rangeTypeComboBox->SelectedIndex = 0;
rangeTypeComboBox->SelectedIndexChanged += gcnew EventHandler(this,&Form1::rangeTypeComboBox_SelectedIndexChanged);
ResultShow("オープン", result);
id = getId;
}
}
レンジ切り替え¶
private: System::Void rangeTypeComboBox_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e)
{
int result = YdxAiSetRange(id, rangeTypeComboBox->SelectedIndex);
if (result != 0)
ResultShow("YdxAiSetRange", result);
}
入力開始¶
private: System::Void startButton_Click(System::Object^ sender, System::EventArgs^ e)
{
dataTextBox->ResetText();
Application::DoEvents();
// データバッファの設定
int result = YdxAiSetBuffer(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 = YdxAiSetChannel(id, channel, 1);
if (result != 0)
{
ResultShow("YdxAiSetChannel", result);
return;
}
}
// サンプリングクロックの設定
result = YdxAiSetClock(id, 0); // 内部クロック
if (result != 0)
{
ResultShow("YdxAiSetClock", result);
return;
}
// 内部クロック周期の設定
result = YdxAiSetClockInternal(id, 1000); // 1000μsec
if (result != 0)
{
ResultShow("YdxAiSetClockInternal", result);
return;
}
// サンプリング開始条件の設定
result = YdxAiSetStartCondition(id, 0, 0); // ソフトウェア
if (result != 0)
{
ResultShow("YdxAiSetStartCondition", result);
return;
}
// サンプリング停止条件の設定
result = YdxAiSetStopCondition(id, 0, 0); // サンプル数
if (result != 0)
{
ResultShow("YdxAiSetStopCondition", result);
return;
}
// サンプリング停止条件(サンプル数)の設定
const int SAMPLE_NUM = 1000; // 1000個
result = YdxAiSetStopSampleNum(id, SAMPLE_NUM);
if (result != 0)
{
ResultShow("YdxAiSetStopSampleNum", result);
return;
}
// データをクリア
result = YdxAiClearData(id);
if (result != 0)
{
ResultShow("YdxAiClearData", result);
return;
}
// アナログ入力動作を開始
result = YdxAiStart(id);
if (result != 0)
{
ResultShow("YdxAiStart", result);
return;
}
// 動作終了待ち
int status, sampleCount, repeatCount;
//動作中ステータスがOFFになるまでポーリング
do
{
//ステータスの取得
result = YdxAiGetStatus(id, &status, &sampleCount, &repeatCount);
if (result != 0)
{
ResultShow("YdxAiGetStatus", 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);
// データの読み出し
float data[SAMPLE_NUM * CHANNEL_NUM]; // データ個数は、サンプル数 * 有効チャネル数
int sampleNum = SAMPLE_NUM;
result = YdxAiGetDataVolt(id, &sampleNum, data);
if (result != 0)
{
ResultShow("YdxAiGetDataVolt", result);
if ((result != YDX_RESULT_AI_EXCEED_DATA_NUM) && (result != 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: 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);
}
}