반응형
- 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 |