PC프로그램 상에서 PC + CFHEADER + CFNET IO 시스템의 프로그램 동작 방식 과 모듈간의 메모리 통신 방식을 설명합니다. CFHEADER와 CFNET IO 모듈은 I²C를 통해 통신합니다.
HOST PC의 속성메모리와 CFHEADER 메모리는 USB통신으로 메모리를 공유하는 방식입니다. [ PC 속성메모리 ⇔ CFHEADER 메모리 ]
Cfheader.Sync() 함수를 호출하면 PC 속성메모리가 → CFHEADER로 전송되고, CFHEADER 메모리가 → PC 속성메모리로 전송됩니다.
Cfheader.Sync() 는
PC 속성메모리를 CFHEADER에 USB 통신으로 송신하고, 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}"); }
메모 백그라운드 동기화 기능을 사용하면 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 스레드에서 처리해 주어야 할 수 있습니다.