개발

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

워시기 2024. 11. 13. 15:02
반응형

앞서 많은 작업에 필요한 사전 작업을 다 한것 같습니다.

중간 중간에 여러 필요한 정보들이 있을때 또 말씀을 드리겠습니다.

 

일단 앞으로 작업을 정리하자면

1. 윈폼으로 코드 작성 장비 검색, 장비 등록

2. 제작한 윈폼으로 GPIB 통신 연결, 케이블 연결 방법, 장비 검색, 장비 등록, 1:1 통신으로 명령어 전송 및 쿼리,

3. 제작한 윈폼으로 장비 2대 연결하여 계측기 자동화 해보기

 

위와 같이 될 듯 합니다.

중간 중간에 여러 필요한 정보들이 있을때 또 말씀을 드리겠습니다.

 

이제 작업을 시작할것인데

각자의 스타일이 있듯이 제가 코드 작성하는 스타일이 있으니 참고만 부탁드려요.

처음 보시는 분은 그저 따라만 하시다가 익숙해지시면 본인이 원하는 스타일로 작성하시면 됩니다.

 

 

자~! 일단 디자인한 부분을 확인해보겠습니다.

엄청 이쁘거나 멋지진 않지만 그냥 목적에 충실한 디자인이라고 생각해 주세요~

차후에 된다면 더 이쁜 UI로도 만드는 내용으로 한번 블로그 작성하고 싶네요~

 

일단 저는 위의 프로그램은 GPIB 장비를 검색하고 등록하는 내용이라 그 부분에 포커스를 맞춰서 작업을 시작하겠습니다.

일단 저는 위의 프로그램을 2가지 방법으로 하도록 하겠습니다.

 

처음 해보시는 분들은 한번 전체적으로 돌아가는 법을 확인하면서 이해하는게 중요하니 UI에서 바로 접근하도록 할 것이고

두번째는 윈폼해보시는 분들은 다들 그렇게 하실텐데 UI와 로직을 분리하는 것입니다.

 

이게 중요한게 프로그램 한번만 만든다면 크게 상관이 없을텐데 프로그램 작업시 만들어놓은 로직들이 어디에 붙여도 동작이 되게 만들 수 있기 때문입니다.

 

물론 조금의 수정이 있을 수 있지만 윈폼으로 작업하여 나온 UI와 로직부분이 있을때 분리가 어느정도 잘 되어 있다면 윈폼의 로직을 WPF에 쓸 수 있고, MAUI로 만든 APP에도 사용하는등 C#이 사용되는 어느 플랫폼에도 가능합니다.

이 부분이 제가 C#을 사용하는 이유이기도 합니다.

앞에도 적어놨는데 예전에 윈폼으로 만든 프로그램을 안드로이드 버전으로 작업을 해야 했는데 로직부분만 들어내어서 MAUI APP을 만들었을때 그렇게 작업을 하니 정말 좋았었습니다.

 

현재는 Blazor도 공부하고 있는데 자바스크립트를 최대한 배제하고 그 부분을 C# 코드로 대체한다는 점이 많이 놀라고 흥미로웠습니다.

 

일단 이번에는 윈폼을 시작하신지 얼마 안된다는 가정으로 작업을 시작하겠습니다.

 

먼저 Visual Studio 에서 솔루션 탐색기에서 참조를 추가하겠습니다.

C:\Program Files (x86)\IVI Foundation\VISA\Microsoft.NET\Framework32\v2.0.50727\VISA.NET Shared Components 7.2.0

위의 위치에 있는 Visa를 추가하시면 됩니다. 추가하신 후 에러가 없는지 확인을 하시기 바랍니다.

 

이후 using 문을 사용하여 클래스에 추가할 준비를 합니다.

 

using Ivi.Visa를 추가합니다.

 

이제 Visa를 쓸 수 있습니다.

 

우선 각 메서드에서 공통으로 사용될 로그 업데이트에 관한 부분을 작성하도록 하겠습니다.

 

위와 같이 작성을 해줄려고 합니다. 

처음에 파라미터 입력부를 안만들었는데 각 메서드에서 사용자에게 보여줄 내용을 전달해야 하니 [ string msg ] 라는 파라미터를 만들고 로그의 표현방식은 [시간정보와 메세지]를 보여주도록 하였습니다.

뒤에 기입한 Enviroment.NewLine은 CR+LF 개행의 의미입니다.

아무래도 뒤에 꼬리물면서 나오면 많이 지저분해보일것 같아서 한줄 한줄 보여주게 하였습니다.

 

이후 로그창 삭제하는 [ Clear Log ] 버튼에 대한 메서드를 만들겠습니다.

 Textbox에 있는 기본 메서드인 Clear메서드를 호출하여 삭제하도록 하면 됩니다.

 

이제 Find버튼에 대한 내용을 작성하겠습니다.

이 부분이 이번 작업의 가장 핵심적인 부분이 될것 같습니다.

 

시퀀스를 설명드리자면 연결된 GPIB 리소스를 검색하면 주소값이 리턴됩니다.

이 주소값을 GlobalResourceManager를 통해 세션을 만들고 [ "*IDN?" ] SCPI 명령어를 전송하고 리턴되는 장비 정보값을 Datagridview도구에 표현하면 됩니다.

 

인덱스와 세션 정보를 입력할 딕셔너리

 

 

저는 위와 같이 작성하였습니다.

인덱스, 딕셔너리, DataGridView 각각 초기화를 진행하고 GlobalResourceManager를 통해 GPIB 장비만 검색을 하고 주소값을 통해 세션을 열어 [ "*IDN?" ] 명령어를 통해 장비의 정보를 받아와서 DataGridView 도구에 표현하고 인덱스와 세션 정보를 딕셔너리에 담았습니다.

장비 연결시 에러가 날 수 있으므로 Try~ Catch를 사용하여 런타임 오류에 대한 대비도 하였습니다.

 

위와 같은 결과를 확인할 수 있을것 입니다.

 

이제 Item 열에 별칭을 입력하여 별칭을 통해 장비를 제어하도록 합니다.

 

DataGridView 만들면 각 셀 수정이 기본값입니다.

저는 Item만 입력 및 수정 가능하게 하고 나머지값은 수정이 안되게 하기 위해 폼 초기화할때 0번, 2번, 3번 셀은 Readonly=true가 되도록 하였습니다.

 

위와 같이 설정하여 Item값만 입력이 가능해짐

프로그램을 띄우고 장비를 검색하면 DataGridView 도구에 행이 추가되고 검색 장비가 나타납니다.

Item 부분을 제외하고 나머지 셀은 사용자가 수정이 불가함을 확인할 수 있습니다.

 

위의 내용이 별칭 저장하는 부분의 기본적인 부분이 되겠습니다.

요게 기본이 될듯한데 프로그램 실행시 에러 요소가 보이네요.

1. 장비 검색이 안되었는데 Set 버튼을 누르면?

2. 장비 검색이 되고 이후 별칭을 입력 안하고 Set 버튼을 누르면?

 

제가 항상 느끼는 것인데 프로그램의 메인 흐름은 어찌 어찌하면 되는데 제일 중요한것은 예외처리입니다.

프로그램을 만들고 제작된 프로그램의 품질은 얼마나 꼼꼼하게 신경쓰냐에서 결정이 됩니다.

로직만드는것도 중요하지만 예외에 대한 처리가 제대로 되어 있지 않다면 결국 사용하지 못하게 될 프로그램일 뿐입니다.

Try Catch가 있어서 프로그램이 다운되는 일은 안생길텐데 품질적으로 위험이 있네요

 

여기에 좀더 꼼꼼하게 그물을 짜서 예외를 잡아보겠습니다.

 

Init메서드를 만들고 폼이 시작할때 호출하도록 하겠습니다.

기본적으로 Find 버튼 이후 장비 별칭을 기입해서 등록하는 구조인데 Set 버튼은 검색된 장비가 있을때만 실행을 해야 하므로 버튼은 시작시 비활성화가 되어야 합니다.

 

이후 검색을 통해 장비가 나타나면 Set 버튼이 활성화 되도록 합니다.

 

Find 버튼 클릭시 수행하는 코드에 장비 검색이 되면 Set버튼을 활성화하는 코드를 작성하였습니다.

 

위와 같이 동작함을 확인할 수 있습니다.

 

이제 Set 버튼에 대한 메서드를 위와 같이 작성하였습니다.

앞서 장비검색을 통해서 만들어진 딕셔너리의 카운트가 없으면 에러 메세지와 함께 메서드가 종료되고 이부분이 넘어가서 별칭을 기입하는 부분이 비워있을경우 에러 메세지와 함께 메서드가 종료되고 모든 조건이 문제가 없으면 별칭과 세션이 키와 밸류로 딕셔너리에 저장이 됩니다.

 

위와 같은 코드를 통해 장비를 검색하고 등록하는 절차가 어느정도 마무리 되었습니다.

 

이제 다음에는 해당 장비의 값을 저장하고 불러오고 그 값을 통해 장비를 제어하는 부분을 작성해보겠습니다.

긴글 읽어주셔서 감사합니다.

도움이 되시는 분이 계시면 참으로 감사하겠네요.

 

반응형

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

C#으로 하는 GPIB 통신 - 5 -  (5) 2024.11.14
CR(Carriage Return) LF(Line Feed)란?  (47) 2024.11.13
윈폼에서 디자이너 로드 오류 해결방법  (0) 2024.11.12
C#으로 하는 GPIB 통신 -3-  (4) 2024.11.11
C#으로 하는 GPIB 통신 -2-  (11) 2024.11.10