Table of Contents

CFHEADER 통신 동작원리

PC프로그램 상에서 PC + CFHEADER + CFNET IO 시스템의 프로그램 동작 방식 과 모듈간의 메모리 통신 방식을 설명합니다. CFHEADER와 CFNET IO 모듈은 I²C를 통해 통신합니다.

프로그램 동작 방식

HOST PC의 속성메모리와 CFHEADER 메모리는 USB통신으로 메모리를 공유하는 방식입니다. [ PC 속성메모리 ⇔ CFHEADER 메모리 ]
Cfheader.Sync() 함수를 호출하면 PC 속성메모리가 → CFHEADER로 전송되고, CFHEADER 메모리가 → PC 속성메모리로 전송됩니다.

읽고 쓰기 : 속성(Properties)값 설정

메모리 전송 : Cfheader.Sync()

Cfheader.Sync() 는 PC 속성메모리를 CFHEADER에 USB 통신으로 송신하고, CFHEADER 메모리를 수신하여 PC 속성메모리를 업데이트하는 함수입니다.
이때 송수신은 동시에 이루어집니다.

  1. CFHEADER 모듈의 Open() 메서드를 호출하여 통신을 초기화해야 합니다.
  2. 업데이트 된 PC 속성메모리을 USB를 통해 CFHEADER 메모리로 전송합니다.
  3. CFHEADER 모듈은 수신된 PC 속성메모리값을 I²C를 통해 CFNET 모듈에 기록합니다.
  4. CFHEADER 모듈은 I²C를 통해 CFNET 모듈 상태를 CFHEADER 메모리 업데이트합니다.
  5. CFHEADER 모듈은 업데이트된 CFHEADER 메모리 USB를 통해 호스트 PC로 전송합니다.
  6. 호스트 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 스레드에서 처리해 주어야 할 수 있습니다.

CFHEADER