티스토리 뷰
VISA 잠금 설명 및 관련 이슈
VISA 통신은 GPIB, Serial, TCP, UDP와 같은 다양한 통신을 쉽게 처리할 수 있도록 해주는 최상단 API 입니다.
이번 Tech-Tip에서는 VISA 드라이버를 사용하면서 상대 장비에 대한 소유권을 결정하기 위해서 사용되는 잠금에 대한 부분을 설명을 드리도록 하겠습니다. 잠금 기능을 이용하면 디바이스나 리소스의 유일한 접근을 확보할 수 있습니다. 잠금상태가 되면 다른 어플리케이션 혹은 시스템에서 잠금 상태가 되어 있는 장비를 이용하지 못합니다.
NI-VISA에서 제공하는 잠금은 2가지 방식이 있습니다.
- Exclusive Lock : 이 잠금 방식은 단 하나의 시스템에서만 상대방 리소스를 사용하게끔 설정하는 방식입니다.
- Shared Lock : 이 잠금 방식은 잠금을 설정할 때 나오는 Shared Key를 이용하여 다수의 시스템에서 리소스에 접근을 할 수 있게 해줍니다.
잠금 상태에서 프로그램이 비정상적으로 동작을 하여 프로그램이 종료가 된 상태에는 잠금 방식이 해제가 되지 않기 때문에 에러가 발생할 수 있습니다. 잠금 방식은 잠금 해제(Unlock) 혹은 VISA 세션을 종료해야지 만이 자동적으로 잠금이 풀리게 됩니다.
잠금 기능은 LabVIEW, C, C# 모든 언어에서 기능을 제공하고 있습니다. 아래의 그림은 LabVIEW에서 제공하는 함수입니다. LabVIEW에서 잠금을 사용하기 위해서는 VISA Open 시 어떠한 잠금 방식을 사용할건지 결정을 할 수 있습니다. 관련 코드와 함수는 아래와 같습니다.
C언어에서도 마찬가지로 잠금 기능을 사용할 수 있습니다. C언어의 코드와 관련 함수 내역은 아래와 같습니다.
#include "visa.h"
#define MAX_CNT 200
int main(void)
{
ViStatus status;
ViSession defaultRM, instr;
ViUInt32 retCount;
ViChar buffer[MAX_CNT];
/* For checking errors */
/* Communication channels */
/* Return count from string I/O */
/* Buffer for string I/O */
/* Begin by initializing the system */
status = viOpenDefaultRM(&defaultRM);
if (status < VI_SUCCESS) {
/* Error Initializing VISA...exiting */
return -1;
}
/* Open communication with Serial Port 1 */
/* NOTE: For simplicity, we will not show error checking */
status = viOpen(defaultRM, "ASRL1::INSTR", VI_NULL, VI_NULL, &instr);
/* Set the timeout for message-based communication */
status = viSetAttribute(instr, VI_ATTR_TMO_VALUE, 5000);
/* Lock the serial port so that nothing else can use it */
status = viLock(instr, VI_EXCLUSIVE_LOCK, 5000, VI_NULL, VI_NULL);
/* Set serial port settings as needed */
/* Defaults = 9600 Baud, no parity, 8 data bits, 1 stop bit */
status = viSetAttribute(instr, VI_ATTR_ASRL_BAUD, 2400);
status = viSetAttribute(instr, VI_ATTR_ASRL_DATA_BITS, 7);
/* Set this attribute for binary transfers, skip it for this text example */
/* status = viSetAttribute(instr, VI_ATTR_ASRL_END_IN, 0); */
/* Ask the device for identification */
status = viWrite(instr, "*IDN?\n", 6, &retCount);
status = viRead(instr, buffer, MAX_CNT, &retCount);
/* Unlock the serial port before ending the program */
status = viUnlock(instr);
/* Your code should process the data */
/* Close down the system */
status = viClose(instr);
status = viClose(defaultRM);
return 0;
}
잠금 공유하기
잠금을 설명하는 상단에서 Shared Key를 이용하여 여러대의 시스템에서 잠금된 리소스를 사용할 수 있는 Shared Lock 방식이 있다고 설명을 드렸습니다. Shared Lock 방식을 이용하여 관련 함수를 호출하면 Shared Key를 할당 받을 수 있습니다.
VISA의 잠금 메커니즘은 쓰레드 방식이 아닌 세션 방식으로 이루어지기 때문에, 다중 쓰레드에서 동일한 세션을 공유하기 위해서는 리소스에 접근할 수 있는 공통적인 권한을 가지고 있어야 합니다. 하나의 리소스에 대한 하나의 세션은 다중 쓰레드 방식에서 사용할 수는 없지만, 리소스에 대해서 각 세션을 설정할 수 있는 상태라면 Shared Key를 이용하여 다중 접속이 가능합니다.
이를 위해서는 Shared Lock 방식을 이용해야 합니다. Shared Lock 함수를 기반으로 기능을 구현하게 되면 위에서 본 함수는 각 Shared Key를 출력하게 됩니다. 다른 시스템 혹은 쓰레드에서 이 리소스에 접근을 할 때 이 Shared Key를 이용하여 접근을 하게 되면 에러 없이 하나의 장비를 다수의 쓰레드에서 접근하여 공유할 수 있습니다. 좀더 상세한 내용은 NI-VISA Help의 아랫 부분을 참조하시기 바랍니다.
이 글에서는 VISA 함수의 잠금 방식에 대해서 알아보았습니다.
이 글이 도움이 되셨나요?
그렇다면 아래의 그림을 클릭해주세요.
'National Instruments > 통신' 카테고리의 다른 글
[NI-CAN] NI-CAN을 이용한 NI CAN Demobox와 통신하기 (0) | 2015.02.17 |
---|---|
NI-CAN과 NI-XNET의 차이 (2) | 2015.02.16 |
CAN 장비의 종단 저항 (3) | 2015.02.11 |
CAN(Controller Area Network) 통신 개요 (0) | 2015.02.11 |
RS-485 2선식 연결과 4선식 연결 방식 (RS485 4w to 2w) (0) | 2014.10.14 |