This is an old revision of the document!
Table of Contents
CFHEADER 통신 동작원리
PC프로그램 상에서 PC + CFHEADER + CFNET IO 시스템의 프로그램 동작 방식 과 모듈간의 메모리 통신 방식을 설명합니다. CFHEADER와 CFNET IO 모듈은 I²C를 통해 통신합니다.
- PC 속성메모리 : 프로그램 작성시 Cfnet.Cfheader 라이브러리(API)에서 제공하는 속성값(Properties)
- CFHEADER 메모리 :CFHEADER + CFNET IO 모듈(입출력, 아날로그 데이터 등)의 상태값 메모리
프로그램 동작 방식
HOST PC의 속성메모리와 CFHEADER 메모리는 USB통신으로 메모리를 공유하는 방식입니다. [ PC 속성메모리 ⇔ CFHEADER 메모리 ]
Cfheader.Sync() 함수를 호출하면 PC 속성메모리가 → CFHEADER로 전송되고, CFHEADER 메모리가 → PC 속성메모리로 전송됩니다.
- PC → CFHEADER : 전송된 PC 속성메모리 값으로 CFNET IO 모듈을 제어합니다.
- CFHEADER → PC : 전송된 CFHEADER 메모리값으로 PC 속성메모리 값을 업데이트 합니다.
읽고 쓰기 : 속성(Properties)값 설정
- 쓰기 : 출력 모듈의 상태를 제어 할 경우“DigitalOutputModule.Channel.State” 속성값에 원하는 설정 값을 할당합니다. 이때, 설정 값은 PC 속성메모리에만 업데이트되며 전송되지는 않습니다.Cfheader.Sync()으로 메모리 전송시 동작합니다.
- 읽기 : 입력 모듈의 상태를 읽을 경우“DigitalInputModule.Channel.State” 속성값을 읽으면 됩니다. 이때, 속성값(Properties)을 읽기 전에 Cfheader.Sync()명령으로 CFHEADER 메모리를 업데이트해야 합니다.
메모리 전송 : Cfheader.Sync()
Cfheader.Sync() 는
PC 속성메모리를 CFHEADER에 USB 통신으로 송신하고, CFHEADER 메모리를 수신하여 PC 속성메모리를 업데이트하는 함수입니다.
이때 송수신은 동시에 이루어집니다.
- CFHEADER 모듈의 Open() 메서드를 호출하여 통신을 초기화해야 합니다.
- 업데이트 된 PC 속성메모리을 USB를 통해 CFHEADER 메모리로 전송합니다.
- CFHEADER 모듈은 수신된 PC 속성메모리값을 I²C를 통해 CFNET 모듈에 기록합니다.
- CFHEADER 모듈은 I²C를 통해 CFNET 모듈 상태를 CFHEADER 메모리 업데이트합니다.
- CFHEADER 모듈은 업데이트된 CFHEADER 메모리 USB를 통해 호스트 PC로 전송합니다.
- 호스트 PC는 수신받은 CFHEADER 메모리값으로 PC 속성메모리를 업데이트합니다.
PC 속성메모리 읽고/쓰기, Cfheader.Sync() 동작 예제 . ( CFHEADER [ADDR. 0] + CFDO-16N [ADDR. 0]+ CFDI-16B [ADDR. 0] )
using ComfileTech.Cfnet.Cfheader; // CFHEAD ADDR.0 var cfheader0 = Cfheader.Instances[0]; // CFDI ADDR.0 var Cfdi_0_ = cfheader0.DigitalInputModules[0]; // CFD0 ADDR.0, CH2 포트 var Cfdo_0_ch2 = cfheader0.DigitalOutputModules[0].Channels[2]; // USB 포트 활성화 cfheader0.Open(); while (true) { // PC 속성메모리 CFD0 0모듈의 CH2 속성값 ON 쓰기 Cfdo_0_ch2.State = true; Thread.Sleep(50); // PC 속성메모리 전송 및 CFHEADER 메모리 업데이트 cfheader0.Sync(); // PC 속성메모리 CFD0 0모듈의 CH2 속성값 OFF 쓰기 Cfdo_0_ch2.State = false; Thread.Sleep(50); // PC 속성메모리 전송 및 CFHEADER 메모리 업데이트 cfheader0.Sync(); //업데이트된 PC 속성메모리의 Cfdi_0_.State 읽기 Console.WriteLine($"CFIO : {Cfdi_0_.State:X}"); }
메모리 백그라운드 동기화 : BackgroundSync.Start()
메모 백그라운드 동기화 기능을 사용하면 Sync() 함수를 호출하지 않아도, 메인 스레드에서 자동으로 메모리를 공유할 수 있습니다.
스레드상에서 메모리 공유 통신 이 자동으로 이루어집니다.
이 방식은 그래픽 처리 애플리케이션에서 메모리를 효율적으로 공유하는 데 적합합니다.
using ComfileTech.Cfnet.Cfheader; // CFHEAD ADDR.0 var cfheader0 = Cfheader.Instances[0]; // CFDI ADDR.0 var Cfdi_0_ = cfheader0.DigitalInputModules[0]; // CFD0 ADDR.0, CH2 포트 var Cfdo_0_ch2 = cfheader0.DigitalOutputModules[0].Channels[2]; // USB 포트 활성화 cfheader0.Open(); // 메모리 백그라운드 동기화 시작 cfheader0.BackgroundSync.Start(); while (true) { // PC 속성메모리 CFD0 0모듈의 CH2 속성값 ON 쓰기 Cfdo_0_ch2.State = true; Thread.Sleep(50); // PC 속성메모리 CFD0 0모듈의 CH2 속성값 OFF 쓰기 Cfdo_0_ch2.State = false; Thread.Sleep(50); //업데이트된 PC 속성메모리의 Cfdi_0_.State 읽기 Console.WriteLine($"CFIO : {Cfdi_0_.State:X}"); }
타이머를 사용한 폴링 방식이나 Synced, StateChanged, ConversionCompleted 등의 이벤트처리 대신BackgroundSync에서 I/O 모듈, 채널의 이벤트를 처리할 수 있습니다. BackgroundSync에서 발생하는 이벤트는 백그라운드 스레드의 컨텍스트에서 실행되므로, UI를 업데이트하려면 BeginInvoke나 InvokeAsync와 같은 기술을 사용하여 메인 UI 스레드에서 처리해 주어야 할 수 있습니다.
