【C#.NET】設定値や規格値をCSVファイルから読み取り表示したいとき
CSVファイル用意
規格値や閾値、設定値を入れたCSVファイルを用意しておいて、
測定値や可変値から特定の値を読み込む。
サンプルとして、サーミスタの抵抗値(オーム)と温度(℃)との相関テーブルデータのCSVファイルを用意します。
仕組み概要図
データフロー図を簡単に示します。
画面のイメージは、サーミスタの抵抗値[Ω]を入れるテキストボックスを配置、温度[℃]を表示するテキストボックスを配置、変換実行ボタンを配置します。
処理の流れとしては、
①画面起動時にCSVファイルを読み込んでリストでテーブルの値を保持しておく。
②抵抗値[Ω]を入力。
③変換ボタンを押下する。
④温度[℃]が表示される。
です。
文章で書くと簡単ですね。。
ソースコードの紹介
まずは、ソリューションエクスプローラーを表示して、csvファイルを追加しましょう。
今回は、新しいフォルダを作成して、「table」フォルダ名に変更し、そのフォルダ中に「ValueTable.csv」ファイルを追加しました。
CSVファイルのプロパティで「出力ディレクトリにコピー」の設定で『常にコピーする』または、『新しい場合はコピーする』の設定にしておきます。
※この設定をしないと開始時にCSVファイルが読み込まれません。
それではソースコードです。
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace Temp_change { public partial class Form1 : Form { //リスト定義(保持用) private List<Convertclass> list_con = new List<Convertclass>(); public Form1() { InitializeComponent(); } /// <summary> /// 画面起動時処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Main_Load(object sender, EventArgs e) { //CSVファイル読み込み Res_temp_file_read(); } /// <summary> /// 抵抗-温度変換テーブル読込 /// </summary> public void Res_temp_file_read() { //テーブルCSVファイルパス string strcsv = csvpath.Text; StreamReader sr = new StreamReader(@strcsv); List<Convertclass> list_table = new List<Convertclass>(); int count = 0; //ヘッダー行飛ばす用のカウント //ファイル読み込み while (!sr.EndOfStream) { // ファイルから一行読み込む string line = sr.ReadLine(); // 読み込んだ一行をカンマ毎に分けて配列に格納する string[] values = line.Split(','); //ヘッダー行以外を読み込む if (count > 0) { Convertclass convert = new Convertclass { Tempvalue = double.Parse(values[0]), Resistancevalue = double.Parse(values[1]) }; list_table.Add(convert); } count++; } //閉じる sr.Close(); //テーブルリストデータ退避 list_con = list_table; } /// <summary> /// 変換btn押下処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Button1_Click(object sender, EventArgs e) { Convert_logic(); } /// <summary> /// 変換ロジック /// </summary> public void Convert_logic() { //サーミスタ抵抗値 double strResist = double.Parse(resistance_value.Text); //Listから近似値の検索 var result_ = list_con.Min(m => Math.Abs(m.Resistancevalue - strResist)); var result_temp = list_con.First(m => Math.Abs(m.Resistancevalue - strResist) == result_); //温度変換結果表示 convert_temp.Text = result_temp.Tempvalue.ToString(); } } /// 温度変換テーブル用クラス作成 /// </summary> public class Convertclass { //温度データ用 public double Tempvalue { get; set; } //抵抗値データ用 public double Resistancevalue { get; set; } } }
実行結果
抵抗値の近似値の温度を表示してくれるソースコードにしました。
- 抵抗値100000[Ω]の場合の温度25[℃]
- 抵抗値100087[Ω]の場合の温度25[℃]
- 抵抗値99927[Ω]の場合の温度25[℃]
- 抵抗値104952[Ω]の場合の温度24[℃]
結果からきちんと抵抗値から温度を推定できるようになりました。
毎回値を変えたいときに役立つ
PLCとのリアルタイム連携を用いることで、設備ラインで個片毎に設定値変えられるようになります。
個片毎に検査の閾値や規格値を変えたい場合にも役立ちます!CSVを変えるだけで管理も簡単に出来る。
PLCと連携する場合のデータフローは、
①画面起動時にCSVファイルを読み込んでリストでテーブルの値を保持しておく。または、変換時に毎回CSVファイルを読み込む。
②抵抗置[Ω]をPLCの特定のデバイス値を読み出して入力する。
③抵抗値が読み出されたら変換処理実行させる。
④抵抗値から温度[℃]が分かるので、その値をPLCの特定のデバイス値に書き出してあげる。
生産ラインでの実践で、個片の抵抗値が変わり、温度を確かめたい検査ラインでの活用が出来ます。
★★★
応用すれば、1個1個の検査で閾値や設定値を毎回変えてあげる検査に使えます。
★★★
PLCでのリアルタイム連携
こちらの記事でPCとPLCとの連携方法を解説しております。
【PLC】PCとリンクしてリアルタイムデータを読み書きして連携する