【C#.NET】設定値や規格値をCSVファイルから読み取り表示したいとき

C#.NET

ad2

【C#.NET】設定値や規格値をCSVファイルから読み取り表示したいとき

CSVファイル用意

規格値や閾値、設定値を入れたCSVファイルを用意しておいて、

測定値や可変値から特定の値を読み込む。

サンプルとして、サーミスタの抵抗値(オーム)と温度(℃)との相関テーブルデータのCSVファイルを用意します。

valuetable_sample_img01

仕組み概要図

データフロー図を簡単に示します。

valuetable_dataflow_img02

画面のイメージは、サーミスタの抵抗値[Ω]を入れるテキストボックスを配置、温度[℃]を表示するテキストボックスを配置、変換実行ボタンを配置します。

処理の流れとしては、

①画面起動時にCSVファイルを読み込んでリストでテーブルの値を保持しておく。

②抵抗値[Ω]を入力。

③変換ボタンを押下する。

④温度[℃]が表示される。

です。

文章で書くと簡単ですね。。

ソースコードの紹介

まずは、ソリューションエクスプローラーを表示して、csvファイルを追加しましょう。

今回は、新しいフォルダを作成して、「table」フォルダ名に変更し、そのフォルダ中に「ValueTable.csv」ファイルを追加しました。

valuetable_solution_folder

CSVファイルのプロパティで「出力ディレクトリにコピー」の設定で『常にコピーする』または、『新しい場合はコピーする』の設定にしておきます。

※この設定をしないと開始時にCSVファイルが読み込まれません。

valuetable_csvfile_setting

それではソースコードです。

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[℃]
ConvertTemp_sample1
  • 抵抗値100087[Ω]の場合の温度25[℃]
ConvertTemp_sample2
  • 抵抗値99927[Ω]の場合の温度25[℃]
ConvertTemp_sample3
  • 抵抗値104952[Ω]の場合の温度24[℃]
ConvertTemp_sample4

結果からきちんと抵抗値から温度を推定できるようになりました。

毎回値を変えたいときに役立つ

PLCとのリアルタイム連携を用いることで、設備ラインで個片毎に設定値変えられるようになります。

個片毎に検査の閾値や規格値を変えたい場合にも役立ちます!CSVを変えるだけで管理も簡単に出来る。

PLCと連携する場合のデータフローは、

①画面起動時にCSVファイルを読み込んでリストでテーブルの値を保持しておく。または、変換時に毎回CSVファイルを読み込む。

②抵抗置[Ω]をPLCの特定のデバイス値を読み出して入力する。

③抵抗値が読み出されたら変換処理実行させる。

④抵抗値から温度[℃]が分かるので、その値をPLCの特定のデバイス値に書き出してあげる。

 

生産ラインでの実践で、個片の抵抗値が変わり、温度を確かめたい検査ラインでの活用が出来ます。

★★★

応用すれば、1個1個の検査で閾値や設定値を毎回変えてあげる検査に使えます。

★★★

PLCでのリアルタイム連携

こちらの記事でPCとPLCとの連携方法を解説しております。

【PLC】キーエンスKV-7500で上位リンク通信でPCとPLCの通信を確立してデータを読み書きする方法

【PLC】PCとリンクしてリアルタイムデータを読み書きして連携する