티스토리 뷰



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 함수의 잠금 방식에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.



댓글