티스토리 뷰

LabVIEW에서 DLL을 사용하기 위해서는 DLL에 대한 함수를 직접 호출하는 라이브러리 함수 호출 노드를 이용해야 합니다. 혹은 반입을 통해서 공유라이브러리를 불러와서 사용해야 합니다. 이에 대한 내용은 이전의 포스팅을 통해서 좀더 상세한 내용을 파악할 수 있습니다. 



이 글에서는 사용해서 하는 DLL에서 Callback 함수를 이용하고 있을 때 어떻게 사용해야 하는지 여부를 파악해보도록 하겠습니다. 이에 대한 내용을 확인하기 전에 Callback 함수가 무엇인지 한번 살펴볼까요?


1. Callback함수란? 콜백함수란?


콜백함수는 API 처럼 사용자가 직접 호출하는 함수가 아니라, 사용자는 호출할 함수를 등록한 뒤 이벤트와 같이 호출을 발생시켜야 하는 시점이 되었을 때 시스템이 호출을 하여 사용되는 함수를 말합니다.




NI-DAQmx의 Read 함수을 이용할 때도 Callback 함수를 등록하게되는데, 위의 그림을 Callback 함수의 등록을 나타내고 있습니다. 


그리고 Hardware에서 데이터가 충분히 수집이 되면 관련 이벤트가 발생이 되고 그 뒤에 코드상에서 Callback 함수(위의 경우 EveryNCallback 함수)가 호출이 됩니다. 정리를 하자면, Callback 함수는 시스템에서 호출이 될 함수를 등록하고, 호출의 결정을 개발자가 아닌 시스템에서 결정하여 호출되는 함수를 말합니다. 


2. DLL의 내부 Callback 함수를 LabVIEW에서 사용하기 


DLL에서 제공하는 Callback 함수를 LabVIEW에서 바로 호출할 수 있을까요? 안타깝게도 LabVIEW는 Callback 함수를 바로 호출하는 방법을 제공하지 않습니다


LabVIEW는 기본적으로 DLL의 Callback 함수를 사용하기 위한 Pointer를 전달하지 않습니다. 그러나 C 기반의 Wrapper DLL이 이러한 부분에 대한 해결책이 될 수 있습니다. C Wrapper DLL은 LabVIEW API와 DLL의 파라미터 사이의 인터페이스를 제공합니다.


첫 번째로 LabVIEW에서는 User Event를 생성하고, Event 구조에 등록해야 합니다. 이 이벤트는 Wrapper DLL에서 PostLVUserEvent를 호출하는 내역에 대한 이벤트를 등록하는 것 입니다. Wrapper DLL는 LabVIEW로 부터 Event와 관련된 Refnum을 획득하는데 이때 Call Library Function을 사용합니다. 그리고 C 함수를 호출하기 위한 Event Refum을 전달하는 myWrapperMethod를 구현합니다. 


myWrapperMethod 내부에서 PostLVUserEvent 함수는 ref(LabVIEW Event Refnum)과 Data(Pointer to Void)와 같은 2개의 파라미터를 받습니다. Data는 기존의 DLL로부 받는 어떠한 데이터 타입도 될 수 있는데, VI Callback 함수에 전달이 됩니다. DLL의 결과가 LabVIEW에서 호환하기 위해서 타입 캐스팅이 필요할지도 모릅니다.


Setup이 설정이 되면 DLL의 Callback 함수의 파라미터로 기존의 함수를 호출하고, Wrapper 함수에 포인터를 전달하기 위해서 코드를 구현합니다. 기존의 DLL이 콜백 함수 주소로 호출 스택의 포인터를 설정하게되면, 래퍼 함수 myWrapperMethod는 호출되고 PostLVUserEvent 통해 LabVIEW에서 지정된 사용자 이벤트를 트리거하게 됩니다. 


이는 Callback VI와 관련된 이벤트 케이스를 처리하게 되고, LabVIEW에 데이터 파라미터를 이용하여 관련 데이터를 전달합니다. 


위의 설명을 그림으로 나타내면 아래와 같습니다. 




즉, DLL의 Callback 함수를 사용하기 위해서는 DLL을 이용하는 추가적인 DLL을 만들고 이 DLL에서 PostLVUserEvent를 이용하여 LabVIEW의 사용자 이벤트를 활용하여 DLL의 Callback과 LabVIEW와의 연동이 가능합니다.


이 글에서는 간략히 LabVIEW에서 DLL의 Callback 함수 사용이 가능한지 여부를 파악해 보았습니다. 


결론은 LabVIEW에서는 바로 사용이 어렵다, 하지만 Wrapper DLL을 이용하면 가능하다 입니다. 다음 글에서는 이를 실질적으로 구현하는 방법에 대해서 알아보도록 하겠습니다. 


이 글이 도움이 되셨나요?

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



댓글