개발

C#으로 하는 GPIB 통신 -10-

워시기 2024. 11. 17. 12:19
반응형
  • JsonManager.cs       ( v )
  • DeviceInfo.cs           ( v )
  • CommManager.cs    ( v )
  • GpibManager.cs       ( v )
  • ControlManager.cs   ( v )
  • Form1.cs                  (    )

드디어 C#으로 하는 GPIB 통신의 마지막 포스팅입니다.

여기까지 읽어주신 분들께 감사드립니다.

 

이제 이 프로그램의 기능은 클래스에서 구현을 모두 하였고 UI와 연결을 하도록 하겠습니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Ivi.Visa;


namespace GPIB_Demo
{
    public partial class Form1 : Form
    {
        ControlManager controlManager;
        Dictionary<uint, DeviceInfo> deviceInfoDic;
        Dictionary<string, string> deviceInfoSetDic = new Dictionary<string, string>();
        Dictionary<string, IMessageBasedSession> deviceControlDic = new Dictionary<string, IMessageBasedSession>();

     
        public Form1()
        {
            InitializeComponent();
            Init();
            DataGridViewInit();
            LoadDeviceInfo();
        }
        //==========================================================
        //  초기화
        //==========================================================
        void Init()
        {
            Btn_Set.Enabled = false;

            controlManager = new ControlManager();
        }
        //==========================================================
        //  장비 데이타 로드
        //==========================================================
        void LoadDeviceInfo()
        {
            DataGridView_Item.Rows.Clear();

            try
            {
                deviceInfoDic = controlManager.FindDevice(ControlManager.LoadDeviceSet());

                if (deviceInfoDic.Count < 1)
                {
                    MessageBox.Show("GPIB 리소스 검색 오류", "리소스 검색 오류");
                    LogUpdate("장비 검색 실패");

                    return;
                }

                for (uint i = 1; i <= deviceInfoDic.Count; i++)
                {
                    DataGridView_Item.Rows.Add(i, deviceInfoDic[i].alias, deviceInfoDic[i].addr, deviceInfoDic[i].onlineStat, deviceInfoDic[i].info);
                }

                LogUpdate("장비 검색 완료");
                Btn_Set.Enabled = true;
            }
            catch (Exception es)
            {
                MessageBox.Show("GPIB 리소스 검색 오류", "리소스 검색 오류");
                LogUpdate("장비 검색 실패");
            }
        }
        //==========================================================
        // DataGridView 초기화
        //==========================================================
        void DataGridViewInit()
        {
            DataGridView_Item.Columns[0].ReadOnly = true;
            DataGridView_Item.Columns[2].ReadOnly = true;
            DataGridView_Item.Columns[3].ReadOnly = true;
            DataGridView_Item.Columns[4].ReadOnly = true;
        }
        //==========================================================
        // 장비 검색
        //==========================================================
        private void Btn_Find_Click(object sender, EventArgs e)
        {
            DataGridView_Item.Rows.Clear();

            try
            {
                deviceInfoDic = controlManager.FindDevice();

                if(deviceInfoDic.Count <1 )
                {
                    MessageBox.Show("GPIB 리소스 검색 오류", "리소스 검색 오류");
                    LogUpdate("장비 검색 실패");

                    return;
                }

                for (uint i = 1; i <= deviceInfoDic.Count; i++)
                {
                    DataGridView_Item.Rows.Add(i, "", deviceInfoDic[i].addr, deviceInfoDic[i].onlineStat, deviceInfoDic[i].info);
                }

                LogUpdate("장비 검색 완료");
                Btn_Set.Enabled = true;
            }
            catch(Exception es)
            {
                MessageBox.Show("GPIB 리소스 검색 오류", "리소스 검색 오류");
                LogUpdate("장비 검색 실패");
            }
        }
        //==========================================================
        // 장비를 별칭으로 연결
        //==========================================================
        private void Btn_Set_Click(object sender, EventArgs e)
        {
            bool isEmpty = false;
            deviceInfoSetDic.Clear();
            deviceControlDic.Clear();

            //----------------------------------------------------------
            // 검색된 장비 없을때 진행 안되도록
            //----------------------------------------------------------
            if (deviceInfoDic.Count < 1)
            {
                MessageBox.Show("장비 검색을 먼저 해주세요", "장비 등록 순서 오류");
                return;
            }
            //----------------------------------------------------------
            // 검색 장비에 별칭 입력 안했을때 진행 안되도록
            //----------------------------------------------------------
            for (int i = 0; i < DataGridView_Item.Rows.Count; i++)
            {
                if (DataGridView_Item.Rows[i].Cells[1].Value.ToString() == "")
                    isEmpty = true;
            }

            if (isEmpty)
            {

                MessageBox.Show("장비 별칭을 입력해주세요", "장비 별칭 등록 오류");
                return;
            }
            //==========================================================


            uint idx = 1;

            try
            {
                for (int i = 0; i < DataGridView_Item.Rows.Count; i++)
                {
                    uint.TryParse(DataGridView_Item.Rows[i].Cells[0].Value.ToString(), out idx);
                    deviceInfoSetDic.Add(DataGridView_Item.Rows[i].Cells[1].Value.ToString(), deviceInfoDic[idx].addr);

                    DataGridView_Item.Rows[i].Cells[1].Value.ToString();

                    deviceControlDic.Add(DataGridView_Item.Rows[i].Cells[1].Value.ToString(), deviceInfoDic[idx].session);

                    ControlManager.SaveDeviceSet(deviceInfoSetDic);
                    LogUpdate($"{DataGridView_Item.Rows[i].Cells[1].Value.ToString()} 장비 등록 완료");


                    Cbox_Device.Items.Add(DataGridView_Item.Rows[i].Cells[1].Value.ToString());
                }
            }
            catch (Exception es)
            {
                LogUpdate("장비 등록 실패");
            }
        }
        //==========================================================
        // 로그창 클리어
        //==========================================================
        private void Btn_ClearLog_Click(object sender, EventArgs e)
        {
            Tbox_Log.Clear();
        }
        //==========================================================
        // 로그창 업데이트
        //==========================================================
        void LogUpdate(string msg)
        {
            Tbox_Log.AppendText($"{DateTime.Now.ToString("yy-MM-dd hh:mm:ss")}  {msg}" + Environment.NewLine);
        }
        //==========================================================
        // 메세지창 업데이트
        //==========================================================
        void MsgLogUpdate(string msg, eMsgType eMsgType)
        {
            Tbox_GPIB_Msg.AppendText($"{DateTime.Now.ToString("yy-MM-dd hh:mm:ss")}  {eMsgType}: {msg}" + Environment.NewLine);
        }
        //==========================================================
        // 메세지 송신 버튼
        //==========================================================
        private void Btn_Send_Click(object sender, EventArgs e)
        {
            controlManager.SendMsg(Tbox_msg.Text, deviceControlDic[Cbox_Device.SelectedItem.ToString()]);
            MsgLogUpdate(Tbox_msg.Text, eMsgType.tx);
        }
        //==========================================================
        // 메세지 쿼리 버튼
        //==========================================================
        private void Btn_Query_Click(object sender, EventArgs e)
        {
            MsgLogUpdate(Tbox_msg.Text, eMsgType.tx);
            string  receivedMsg = controlManager.QueryMsg(Tbox_msg.Text, deviceControlDic[Cbox_Device.SelectedItem.ToString()]);
            MsgLogUpdate(receivedMsg, eMsgType.rx);
        }
        //==========================================================
        // 메세지창 클리어
        //==========================================================
        private void Btn_MsgLog_Clear_Click(object sender, EventArgs e)
        {
            Tbox_msg.Clear();
        }
    }
}

코드는 위와 같이 작성이 되었습니다.

 

  • Form1 생성시 Init, DataGridViewInit, LoadDeviceInfo 호출
  • Init메서드 Btn_Set 비활성화, ControlManager 인스턴스
  • LoadDeviceInfo 메서드 Json파일 읽어와서 DataGridView_Item에 표현, 로드 안될때는 에러메세지
  • DataGridViewInit메서드 DataGridView_Item에서 별칭 입력부 제외한 수정 안되도록 ReadOnly =true
  • Btn_Find_Click 메서드 Btn_Find 클릭시 장비 검색하여 정보를 DataGridView_Item에 표시
  • Btn_Set_Click 메서드 Btn_Set 클릭시 DataGirdView_Item의 별칭과 Addr값을 Json으로 저장하고 테스트 통신부 ComboBox인 Cbox_Device에 업데이트
  • Btn_ClearLog_Click메서드 로그창 로그 내용 삭제
  • LogUpdate 메서드 로그창에 업데이트
  • MsgLogUpdate 메서드 메시지 송, 수신 내용 업데이트
  • Btn_Send_Click 메서드 메세지 송신
  • Btn_Query_Click 메서드 메세지 쿼리
  • Btn_MsgLog_Clear_Click 메서드 송수신 메세지 로그 내용 삭제

 

이로써 기본적인 GPIB 통신프로그램을 만들어보았습니다.

여기서 더 나아가는 것은 주로 어플리케이션의 완성이 되는 기능들 추가가 될 것입니다.

 

예를들면 워드프로세서 같은 프로그램도 주 기능은 타이핑한 내용으로 자체 형식의 파일에 저장하는 것입니다.

부가적으로 여러가지 기능을 넣으면 어플리케이션으로 완성이 되는 것입니다.

 

C#으로 GPIB 접근이 생소하신 분들께 참고가 될 접근 방법을 알려주고자 포스팅을 한것입니다.

저 또한 C#으로 하는 GPIB에 대한 내용을 포스팅하면서 자료를 정리하고자 함입니다.

 

프로그램을 동작시켰습니다.

잘 동작되어서 기분이 좋네요~

 

여기까지 읽어주셔서 감사합니다.

다음 포스팅에서는 위의 프로그램으로 2개의 장비를 검색하고 제어하는 과정을 포스팅하도록 하겠습니다.

수고 많으셨습니다~

반응형

'개발' 카테고리의 다른 글

C#으로 하는 RS-232 -1-  (92) 2024.11.19
C#으로 하는 GPIB 통신 Fin  (97) 2024.11.18
C#으로 하는 GPIB 통신 -9-  (85) 2024.11.16
C#으로 하는 GPIB 통신 -8-  (6) 2024.11.16
C#으로 하는 GPIB 통신 -7-  (16) 2024.11.15