이 블로그는 원래 cimetrix.com에 게시되었습니다.
장비의 구성 요소에 대한 복잡한 드라이버를 개발해야 하나요?CIMControlFrameworkTM 커뮤니케이터 프레임워크가 이를 어떻게 도와주는지 살펴보겠습니다.
CCF 커뮤니케이터 프레임워크란 무엇인가요?
커뮤니케이터 프레임워크는 CCF와 장치 간의 연결을 캡슐화함으로써 하드웨어와의 저수준 메시지 처리를 단순화합니다.
예를 들어, 제어 소프트웨어와 하드웨어 장치 간의 연결 방식을 살펴보자. ASCII 직렬 연결에는 TCP를 이용한 소켓 연결, 장치와의 다중 메시지 처리를 위한 멀티스레드 메커니즘, 명령과 해당 응답을 동기화하는 로직, 그리고 여러 다른 기능들이 필요하다. 이를 처음부터 개발하려면 상당한 작업량이 소요된다.
대안으로 CCF는 이러한 작업을 신속하게 수행할 수 있는 내장 ASCII 직렬 연결 클래스를 제공합니다. 이 클래스를 사용하면 컴포넌트에 대한 ASCII 직렬 연결을 간단히 생성할 수 있습니다.
커뮤니케이터 프레임워크의 구체적인 역할은 무엇입니까?
장비의 각 구성 요소 또는 장치는 지정된 기능을 수행하기 위한 일련의 명령과 응답을 제공합니다. 커뮤니케이터 프레임워크에는 이러한 명령을 처리하는 트랜잭션 클래스가 포함되어 있으며, 특정 장치에 대한 각 명령은 트랜잭션으로 구현됩니다.
로드포트에 대한 클램프(Clamp) 동작의 경우를 고려해 보자—관련 명령은 "LOCK"일 수 있다. 이제 CCF 개발자로서 로드포트 드라이버에서 이 명령을 구현하기 위한 우리의 작업이 무엇인지 살펴보자.
첫 번째 단계는 로드포트용 트랜잭션 클래스를 생성하는 것으로, 이는 기본 CCF 트랜잭션 클래스에서 상속받아야 합니다. 아래는 "Clamp" 트랜잭션을 생성하는 예시입니다.

이 예시에서 ClampTransaction 클래스는 Clamp 명령어를 속성으로 받아들입니다. 이 클래스의 기본 클래스에 속성으로 전달된 명령어는 ACSII 직렬 연결을 통해 장치로 전송됩니다.
다음 단계는 명령을 전송하고 장치로부터 응답을 수신하기 위한 Communicator 클래스를 구현하는 것입니다. 아래 샘플 코드를 참조하십시오.

CCF 제품에는 LoadPort 클래스가 포함됩니다. 여기서 우리는 트랜잭션을 수행하기 위해 ASCII 직렬 연결로 Communicator 클래스를 초기화합니다.

클램프 동작이 필요할 때 CCF는 클램핑을 수행하기 위해 LoadPort의 Clamp 함수를 호출합니다. 우리는 방금 초기화된 Communicator 객체를 사용하여 하드웨어에 명령을 전송합니다. 명령 전송이나 응답 수신에 대한 코드를 작성하지 않았다는 점에 유의하십시오. 이는 Communicator의 역할이기 때문입니다. 아래와 같이 Communicator 기본 클래스의 PerformTransaction 함수를 호출하여 하드웨어에 명령을 전송합니다.

믿거나 말거나… 그게 다입니다! 드라이버에서 아주 적은 줄의 코드로 장치에 명령을 보냈습니다. 자, 이제 장치의 응답은 어떻게 처리할까요? 한번 살펴보겠습니다.
각 장치는 해당 장치 제조업체에 따라 명령어 세트에 대해 서로 다른 응답을 구현합니다. 여기에는 확인 응답, 데이터 항목, 다양한 유형의 이벤트 등이 포함될 수 있습니다. 따라서 커뮤니케이터가 장치로부터 응답을 수신할 때마다, 응답을 파싱하기 위해 하위 클래스의 추상 메서드를 호출합니다. CCF 개발자로서 여러분은 응답의 유형을 판단하고, 트랜잭션이 성공적으로 완료되었는지 여부를 결정하며, 그 결과에 따라 커뮤니케이터에 어떻게 응답할지 결정해야 합니다.
아래 예시는 장치의 응답을 파싱하는 방법을 보여줍니다.

마지막으로, 하드웨어에서 발생하는 이벤트를 어떻게 처리할 수 있을까요? 위 코드에서 응답 유형이 이벤트임을 표시하는 방법을 확인할 수 있으며, 이 경우 해당 이벤트를 처리하기 위해 자식 클래스의 또 다른 추상 메서드를 호출합니다. CCF 개발자는 아래와 같이 자신의 코드에서 이를 처리할 수 있습니다.

그게 전부입니다. 위의 코드 조각들은 클램프 트랜잭션을 포함하는 기본 로드포트 드라이버의 예시를 제공합니다. 장치에 대한 추가 명령을 구현하려면 단순히 더 많은 트랜잭션을 추가하고 장비 컨트롤러에서 이를 호출하기만 하면 됩니다. 커뮤니케이터 프레임워크가 장치와의 나머지 통신을 처리할 것입니다.