- JsonManager.cs ( v )
- DeviceInfo.cs ( v )
- CommManager.cs ( v )
- GpibManager.cs ( v )
- ControlManager.cs ( )
- Form1.cs ( )
안녕하세요~
이제 GPIB 통신 프로그램에서 GPIB 통신을 다루는 부분을 마무리 하고 UI과 연계해서 GPIB 통신을 제어하는 ControlManager 클래스를 작성하네요.
UI의 기능을 많이 정의하지 않다 보니 ControlManager 부분에 많은 메서드가 많이 사용되지는 않겠네요.
현재 작성하고 있는 프로그램의 기능이 단순하다 보니 그러한데
GPIB 통신 프로그램으로 기본적인 기능은 있으니 내용을 보시고 참고하셔서 확장해나가시면 되지 않을까 싶습니다.
물론 더 잘만드시는 분도 있을것이고 혹시 저에게 참고될만한 내용 있으시면 알려주시면 감사하겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Ivi.Visa;
namespace GPIB_Demo
{
public enum eMsgType
{
tx,
rx,
}
public class ControlManager
{
GpibManager gpibManager;
//==================================================
// 생성자
//==================================================
public ControlManager()
{
gpibManager = new GpibManager();
}
//==================================================
// 장비 검색
//==================================================
public Dictionary<uint, DeviceInfo> FindDevice()
{
return gpibManager.ConnectGetInfo();
}
//==================================================
// 메세지 송신
//==================================================
public void SendMsg(string msg, IMessageBasedSession session)
{
gpibManager.SendMsg(msg, session);
}
//==================================================
// 메세지 송신 및 수신
//==================================================
public string QueryMsg(string msg, IMessageBasedSession session)
{
return gpibManager.QueryMsg(msg, session);
}
//==================================================
// 설정값 저장
//==================================================
public static void SaveDeviceSet(Dictionary<string, string> deviceInfo)
{
JsonManager.MakeJsonFile(deviceInfo);
}
//==================================================
// 설정값 로드
//==================================================
public static Dictionary<string, string> LoadDeviceSet()
{
return JsonManager.GetJsonFile();
}
}
}
ControlManager는 위와 같이 작성하였습니다.
- 생성자, 객체 인스턴스시 GpibManager 인스턴스
- UI Find 버튼 누를때 GpibManager의 GetInfo호출하여 리턴값 UI로 전달
- UI의 통신 테스트 부분의 Send 버튼 누를때 GpibManager의 SendMsg 호출
- UI의 통신 테스트 부분의 Query 버튼 누를때 GpibManager의 QueryMsg 호출하여 리턴값 UI로 전달\
- 검색된 데이타의 별칭과 Addr을 Json으로 저장
- Addr.json 파일을 로드해서 별칭과 Addr을 불러오기
현재 클래스는 하위의 통신 인터페이스를 연결하고 정보를 얻고 데이타 송수신 위주로 구현되었습니다.
생성자에서 GpibManager 객체를 생성합니다.
현재 프로그램이 다양한 인터페이스 연결이 준비되어 있다면 CotrolManager생성시 더 다양한 인터페이스 관련 클래스를 연결할것 입니다.
UI에서 하는 일은 장비찾고, 해당 장비와 연결하여 통신하여 정보값을 확인하여 UI에 표현하고
별칭을 부여하여 저장하는 기능, 저장값 불러오기과 별칭장비별 테스트 송수신하는 기능입니다.
추가적으로 프로그램 시작시 저장된 JSON파일을 읽어와서 별칭과 주소값을 로드해서 연결되었는지 확인하는 시퀀스를 만들겠습니다.
처음에 만들어야지 생각만하다가 클래스 만들때 생각을 못하고 작성하였네요. 허허 ㅜㅜ
필요한 부분에 추가작업을 하도록 하겠습니다.
public class DeviceInfo
{
//==================================================
// 다수의 검색된 장비들의 데이타를 보관하기 위한 클래스
//==================================================
public DeviceInfo(IMessageBasedSession session, string addr, string info, string onlineStat)
{
this.session = session;
this.addr = addr;
this.info = info;
this.onlineStat = onlineStat;
}
public IMessageBasedSession session = null;
public string addr = string.Empty;
public string info = string.Empty;
public string onlineStat = string.Empty;
}
기존 DeviceInfo 클래스에 생성자와 변수에 OnlineStat이라고 변수를 추가하였습니다.
이제 DeviceInfo 클래스를 쓰는 부분을 수정해야 합니다.
혹시 VisualStudio 잘 안써보신 분이라면 참고가 될텐데요.
해당 변수명 메서드명 등 다른 클래스에서 참고가 되는 부분을 선택하고 우클릭하면 [모든 참조 찾기]가 나옵니다.
클릭을 하면 하단에 참조된 부분을 보여줍니다.
GpibManager에서 참조하고 있는것을 확인할 수 있습니다.
클릭하시면 바로 해당 클래스로 이동한것을 확인할 수 있습니다.
이제 요부분을 수정해야 합니다.
public Dictionary<uint, DeviceInfo> ConnectGetInfo()
{
uint index = 1;
//장비 검색시 세션 리스트내부 세션정보, Datagridview 초기화
deviceInfoDic.Clear();
try
{
List<string> deviceList = commManager.FindGpibRsc().ToList(); //GPIB 장비 검색
foreach (var item in deviceList)
{
IMessageBasedSession session = (IMessageBasedSession)GlobalResourceManager.Open(item); //앞에서 검색된 주소값을 통해 장비 정보 확인
session.FormattedIO.WriteLine("*IDN?");
string receivedData = session.FormattedIO.ReadLine();
DeviceInfo deviceInfo = new DeviceInfo(session, item, receivedData, receivedData.Length>0? "Online" : "Offline");
deviceInfoDic.Add(index, deviceInfo); //세션 정보를 클래스 리스트에 입력
index++;
}
}
catch (Exception es)
{
}
return deviceInfoDic;
}
위에 메서드의 장비 정보 입력 부분을 수정하였습니다.
삼항 연산자를 사용하여 장비 정보가 있으면 Online으로 나오게 하였습니다. 검색이 안되면 먼저 오류가 뜰텐데 저장된 설정 그래도 환경이 일치하면 바로 연결되어 정보가 나타날 것입니다.
그리고 같이 메서드명으로 파라미터만 다르게 하여 메서드를 추가 하였습니다.
혹시 객체지향을 처음 접근하시는 분이 계실까봐 적어두는데 이 방식을 오버로딩이라고 합니다.
C언어에서는 같은 이름의 함수가 오류가 날텐데 객체지향에서는 같은 메서드 이름으로 입력되는 파라미터만 다를경우 오보로딩이라고 합니다. 자바에서는 리턴값도 같아야 하는 것으로 알고 있습니다.
예를 들어
int Sum(int a, int b)
{
return a + b;
}
float Sum(float a, float b)
{
return a + b;
}
위와 같은 내용이 오버로딩이 되는 것입니다.
같은 메서드인데 파라미터가 달라서 상황에 따라 적절하게 사용이 가능하도록 만드는 것입니다.
그리하여 GpibManager 클래스의 코드가 변경이 되었습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ivi.Visa;
namespace GPIB_Demo
{
public class GpibManager
{
CommManager commManager;
Dictionary<uint, DeviceInfo> deviceInfoDic = new Dictionary<uint, DeviceInfo>();
public GpibManager()
{
commManager = new CommManager();
}
//==================================================
// 장비 연결하고 정보를 받아오는 메서드
//==================================================
public Dictionary<uint, DeviceInfo> ConnectGetInfo()
{
uint index = 1;
//장비 검색시 세션 리스트내부 세션정보, Datagridview 초기화
deviceInfoDic.Clear();
try
{
List<string> deviceList = commManager.FindGpibRsc().ToList(); //GPIB 장비 검색
foreach (var item in deviceList)
{
IMessageBasedSession session = (IMessageBasedSession)GlobalResourceManager.Open(item); //앞에서 검색된 주소값을 통해 장비 정보 확인
session.FormattedIO.WriteLine("*IDN?");
string receivedData = session.FormattedIO.ReadLine();
DeviceInfo deviceInfo = new DeviceInfo(session, item, receivedData, receivedData.Length>0? "Online" : "Offline");
deviceInfoDic.Add(index, deviceInfo); //세션 정보를 클래스 리스트에 입력
index++;
}
}
catch (Exception es)
{
}
return deviceInfoDic;
}
//==================================================
// 저장된 정보값을 기준으로 정보를 받아오는 메서드
//==================================================
public Dictionary<uint, DeviceInfo> ConnectGetInfo(Dictionary<string, string> saveValueDic)
{
uint index = 1;
//장비 검색시 세션 리스트내부 세션정보, Datagridview 초기화
deviceInfoDic.Clear();
try
{
foreach (var item in saveValueDic)
{
IMessageBasedSession session = (IMessageBasedSession)GlobalResourceManager.Open(item.Value); //주소값을 통해 장비 정보 확인
session.FormattedIO.WriteLine("*IDN?");
string receivedData = session.FormattedIO.ReadLine();
DeviceInfo deviceInfo = new DeviceInfo(session, item.Value, receivedData, receivedData.Length > 0 ? "Online" : "Offline", item.Key);
deviceInfoDic.Add(index, deviceInfo); //세션 정보를 클래스 리스트에 입력
index++;
}
}
catch (Exception es)
{
}
return deviceInfoDic;
}
//==================================================
// 송신 메서드
//==================================================
public void SendMsg(string msg, IMessageBasedSession session)
{
commManager.SendMsg(msg, session);
}
//==================================================
// 송수신 메서드
//==================================================
public string QueryMsg(string msg, IMessageBasedSession session)
{
return commManager.QueryMsg(msg, session);
}
}
}
위와 같이 저장된 JSON파일을 기준으로 바로 검색하여 나타날 수 있는 메서드를 추가하였습니다.
이제 UI에서 정의된 모든 기능은 다 만들어진것 같습니다.
다음 포스팅에서는 UI에 대한 코드를 작성하도록 하겠습니다.
여기까지 읽어 주셔서 감사합니다~
'개발' 카테고리의 다른 글
C#으로 하는 GPIB 통신 Fin (97) | 2024.11.18 |
---|---|
C#으로 하는 GPIB 통신 -10- (83) | 2024.11.17 |
C#으로 하는 GPIB 통신 -8- (6) | 2024.11.16 |
C#으로 하는 GPIB 통신 -7- (16) | 2024.11.15 |
C#으로 하는 GPIB 통신 -6- (13) | 2024.11.15 |