===== 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]]