===== CFHEADER 통신 동작원리 ====== PC프로그램 상에서 PC + CFHEADER + CFNET IO 시스템의 프로그램 동작 방식 과 모듈간의 메모리 통신 방식을 설명합니다. CFHEADER와 CFNET IO 모듈은 I²C를 통해 통신합니다. {{ :fieldio:cfnet:cfheaderoperation:cfnet_cfheader_io_modules_comm.png?nolink |}} * //**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)값 설정 ===== * 쓰기 : 출력 모듈의 상태를 제어 할 경우"[[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.DigitalOutputModule.Channel.State.html#ComfileTech_Cfnet_Cfheader_DigitalOutputModule_Channel_State|DigitalOutputModule.Channel.State]]" 속성값에 원하는 설정 값을 할당합니다. 이때, 설정 값은 PC 속성메모리에만 업데이트되며 전송되지는 않습니다.Cfheader.Sync()으로 메모리 전송시 동작합니다. * 읽기 : 입력 모듈의 상태를 읽을 경우"[[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.DigitalInputModule.Channel.html|DigitalInputModule.Channel.State]]" 속성값을 읽으면 됩니다. 이때, 속성값(Properties)을 읽기 전에 Cfheader.Sync()명령으로 CFHEADER 메모리를 업데이트해야 합니다. ===== 메모리 전송 : Cfheader.Sync() ===== [[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.Cfheader.Sync.html#ComfileTech_Cfnet_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}"); } 타이머를 사용한 폴링 방식이나 [[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.BackgroundSync.Synced.html|Synced]], [[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.DigitalInputModule.Channel.StateChanged.html|StateChanged]], [[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.AnalogInputModule.Channel.ConversionCompleted.html|ConversionCompleted]] 등의 이벤트처리 대신[[https://api.comfiletech.com/csharp/api/ComfileTech.Cfnet.Cfheader.BackgroundSync.html|BackgroundSync]]에서 I/O 모듈, 채널의 이벤트를 처리할 수 있습니다. BackgroundSync에서 발생하는 이벤트는 백그라운드 스레드의 컨텍스트에서 실행되므로, UI를 업데이트하려면 BeginInvoke나 InvokeAsync와 같은 기술을 사용하여 메인 UI 스레드에서 처리해 주어야 할 수 있습니다. [[..:index|CFHEADER]]