NI GPIB INSTALL이 잘 안될경우 & GPIB 관련 자료들...
혹시 하는 마음에...
인스톨시에는 램상주 프로그램 제거하시고....
CD에 있는 소프트 웨어 인스톨 후 Rebooting하시면 그다음은 순서에 따라서...
GPIB(General Purpose Interface Bus)
접속(Interfacing)
많은 경우에 있어서 스코프에 저장된 정보는 PC로 전송될 필요가 있다.
또다른 경우로서 오실로스코프가 PC로부터 조절될 필요성도 또한 발생하며 접속 기
능은 두 개의 장비가 통신할 수 있도록 해준다.
이는 오실로스코프가 통신용 하드웨어와 소프트웨어를 갖추어야 한다는 것을 의미하
며, 이러한 장치는 접속 장치(interface)라 불리운다. 접속장치는 일반적으로 두가
지 유형이 있다.
하나는 RS-232이고 다른 하나는 GPIB이다. GPIB는 범용 접속 버스(General Purpose
Interface Bus)를 나타내며, IEEE-488로도 알려져 있다.
이러한 통신 접속 장치는 대부분의 오실로스코프에서 추가 선택 사양에 속한다.
RS-232는 일반적으로 직렬 전송 장치로서 통신용으로는 PC의 모뎀에서 볼 수 있고,
연결장치로는 마우스, 프린터 등을 들 수 있다. PC에 연결된 개개의 장치는 각각
RS-232 접속장치를 필요로 한다.
이는 PC에 제한된 장비만이 연결된다는 것을 의미하며 때때로 오직 한 장비만 PC에
연결할 수 있다.
많은 소프트웨어 상품들은 직렬 통신 방법을 이용하는데 이는 PC에 적은 변화만을
주고 비교적 간단한 케이블을 사용한다는 이점 때문이다.
따라서 백업 등의 목적으로 파형을 저장하는데 일반적인 PC를 사용하도록 스코프에
소프트웨어를 공급하는 것은 간단한 일이다.
GPIB는 측정 시스템에서 사용하도록 설계되어진 병렬 버스로서 동시에 같은 버스에
여러 장비를 연결할 수 있다.
이 버스는 측정기가 시험 프로토콜을 내는 동안 어느 순간에라도 조정장치에 주의
를 요청할 수 있도록 하는 구조를 갖는 장치이다.
예를 들면 측정 에러가 발견되었을 때 이러한 버스를 조절하는 PC는 GPIB 조정기가
될 수 있으며 오늘날에는 GPIB 카드를 갖는 표준 PC가 사용된다.
GPIB 카드는 PC에서 기본 사양이 아니므로 추가되어질 필요가 있다.
GPIB 시스템의 소프트웨어는 일반적으로 하나의 단일 시스템에 다양한 장비들을 집
중시켜 완벽한 실험 환경을 만들어낸다.
GPIB 규격의 원천은 HP사의 삼선식 핸드세이크 방법에서 유래한다.
이 회사내의 규격을 IEC(International Electrotechnical Commission)와 IEEE
(Institute of Electrical and Electronics Engineers)에서 국제적 규격으로 정한
인터페이스 규격이다. GPIB가 가지고 있는 여러 장점 때문에 계측공업분야에서 널
리 활용되고 있다.
장점
- 기기의 증설이 쉽다.
- 커텍터 규격이 통일되어 있다.
- 접속할 기기의 전송속도를 가지지 않는다. (전송속도는 가장 느린 기기의 속도)
- 프로그램 작성에 필요한 커맨드 체계가 통일되어 있다.
- 전송속도가 빠르다. (max : 1M byte/sec)
단점
- 기능이 복잡하기 때문에 이해하기까지가 힘들다.
- 총 케이블 길이가 20m 이내이다.
- 기기의 증설대수는 15대까지 가능하다.
- 통신에 문제가 발생시 원인 규명이 어렵다.
핀 규격
커넥터 규격은 IEEE-488 규격(24핀) 과 IEC 규격(25핀) 이 있다. 국내 계측제어 장
치는 IEEE-488 규격을 사용하고 있다.
GPIB 핀 규격
데이터 라인(Data Line) - DIO 1∼8 까지 8개
데이터, 커맨드의 입출력 신호선. 보내지고 있는 정보가 데이터인가, 커맨드인가는
ATN 신호선 상태로 구별한다.
핸드세이크 라인(Handshake Line) - DAV, NRFD, NDAC
송수신을 바르게 수행하기 위한 핸드세이크를 사용할 때 이용되는 신호선이다. 만
약 10바이트의 데이터를 보낼 때는 10회의 핸드세이크를 행한다.
-- 사용 예 --
DC 5.000 : 기준전압 발생기에 DC범위로 5V 출력을 요구한다.
< NICOLET 오실로스코프 PRO 90 >
:WAVEFORM:DATA? 200,1,1 : 데이터를 측정하여 저장한다.
:BEEP : Beep 음을 낸다.
< FLUKE Multimeter 8842A >
F1R0S0T0Y1 : F1 - VCD (FUNTION COMMANDS)
R0 - Autorange On (RANGE COMMANDS)
S0 - Slow (READING RATE COMMANDS)
T0 - Internal Trigger mode (TRIGGER MODE COMMANDS)
Y1 - Enable Output Suffix (SUFFIX COMMANDS)
★ 메시지 종료부호( [CR] [LF] [EOI] ) 사용자가 입력하는 문자열에서는 생략되고
제공되는 함수에서 자동으로 입력된다.
프로그램 예제
아래의 두장비 간의 통신인 경우에 사용되는 프로그램을 소개한다.
- GPIB 보드(PCCARD) : NI사의 Model AT-GPIB Board
- Digital Multimeter(수신자) : FLUKE사의 8842A
#include
#include "decl.h"
char rd[512];
int brd0, dmm;
int x;
void main(void)
{
brd0 = ibfind("GPIB0"); // PC Board를 초기화하고 Handle값을 얻는다.
dmm = ibfind("I8842A"); // Multimeter를 초기화하고 Handle값을 얻는다.
ibclr(dmm); // Clear device
ibwrt(dmm,"F1R0S0TOY1",10); // Multimeter에 기능을 전송한다.
ibrd(dmm,rd); // 데이터를 얻어온다.
printf("%s\n",rd);
}
GPIB 에제들...
> Thread 를 이용해서 여러번 실험을 해 봤는데
> 혹시 필요하신 분이 있으실까 싶어서 간단한 예제를
> 하나 올립니다.(제가 요거하느라고 좀 닭질을 해서요 ^^)
>
> void CSeebeckDlg::OnStartButton()
> {
> // TODO: Add your control notification handler code here
> // CString temp;
> // temp.Format("current temperature is %f", ReadTem());
> // AfxMessageBox(temp, MB_YESNO|MB_ICONEXCLAMATION);
> SetTimer(1, 2000, NULL);
> UpdateData(TRUE);
> if ((m_StartTem>m_EndTem) && (m_Increase>0)) m_Increase=-m_Increase;
> UpdateData(FALSE);
>
> psavefile = fopen(m_Filename, "a");
> m_pThread = AfxBeginThread(ThreadFunc, (LPVOID)this);
> }
>
> 이 부분은 dialog based program 에서 start 버튼을 하나
> 만들고 눌렸을때 실험을 시작하는 부분인데요. 가장
> 중요한 곳은
> m_pThread=AfxBeginThread(ThreadFunc, (LPVOID)this);
> 이 부분입니다.
> AfxBeginThread 를 사용하는 예제를 여러 책에서 많이 찾아
> 실행해 봤는데 우선 컴파일이 제대로 안되더군요.
> ThreadFunc 이란넘이 무조건 static 이 되어야 하는 제약이
> 있어서 편법으로 다음과 같이 함수를 작성합니다.
>
> static UINT ThreadFunc(LPVOID pInstance) {
> ((CSeebeckDlg*)pInstance)->ThreadSeebeck();
> return 0;
> } // 요건 헤더화일에 넣으면 되고요.
>
> 그담에 ThreadSeebeck() 이란 함수가 실행이 되죠.
> 이넘은 static 일 필요가 없어지니까 programming 하기가
> 쉬워집니다.
>
> UINT CSeebeckDlg::ThreadSeebeck()
> {
> float temperature;
> int temp_int;
> char temp[80];
> if (m_Increase > 0) {
> for (temperature=m_StartTem; temperature<=m_EndTem; temperature +=
m_Increase) {
> sprintf(temp, "TEMP %f 10", temperature);
> Ibwrt(PPMS, temp);
> delay(600.);
> for (m_Current=2.5; m_Current<=24; m_Current+=2.5) {
> SetPower((float)m_Current);
> delay(10.);
> for (temp_int=0; temp_int<10; temp_int++) {
> m_DiffTem = ReadDiff();
> m_Thermovoltage = ReadVoltage();
> m_CurrentTem = ReadTem();
> fprintf(psavefile, "%f %f %f %f %f\n", m_DiffTem, m_Thermovoltage,
m_Current, m_CurrentTem, m_Current*m_Current*m_Resistance/1000000.);
> delay(1.);
> }
> }
> SetZero();
> }
> fclose(psavefile);
> } else if (m_Increase < 0)
> {
> for (temperature=m_StartTem; temperature<=m_EndTem; temperature +=
m_Increase) {
> sprintf(temp, "TEMP %f 10", temperature);
> Ibwrt(PPMS, temp);
> delay(600.);
> for (m_Current=2.5; m_Current<=24; m_Current+=2.5) {
> SetPower((float)m_Current);
> delay(10.);
> for (temp_int=0; temp_int<10; temp_int++) {
> m_DiffTem = ReadDiff();
> m_Thermovoltage = ReadVoltage();
> m_CurrentTem = ReadTem();
> fprintf(psavefile, "%f %f %f %f %f\n", m_DiffTem, m_Thermovoltage,
m_Current, m_CurrentTem, m_Current*m_Current*m_Resistance/1000000.);
> delay(1.);
> }
> }
> SetZero();
> }
> fclose(psavefile);
> } // else if
> SetZero();
> return 0;
> }
>
> 아마 Thread 를 써서 programming 해보신 분들이라면
> 요것때문에 닭질을 많이 하셨을 겁니다.
성능은 NI,가격은 IO-tech