===== CFNET-FS 이용한 디지털 입력모듈(CFDI) 사용 방법 =====
출력 모듈(CFDI)의 제어 파일은 아래에 설명된 digital-intput>>{module_address}의 0~7, channel >> 0~15 디렉터리의 state 파일(state.bin, state.txt)을 통해 제어됩니다.
//☞ "CFNET-FS 개발 환경 구성이 완료되지 않았다면, 아래 링크를 참고하여 먼저 설정을 진행해 주세요.//"
* [[modularpi:cfnet-fs:Setting:|Config 환경 설정 및 업데이트 (필수!!)]]
* [[modularpi:cfnet-fs:download_start:|CFNET-FS 다운로드 및 파일 시스템 생성]]
{{ :modularpi:cfnet-fs:digital_input:in_struc.png?nolink |}}
===== 0~7 디렉토리{module_address}=====
module_address의 모듈 주소(0~7)별 디렉터리에는, 16개 채널(포트)을 모두 제어할 수 있는 **state.bin** 와 **state.txt** 파일이 포함되어 있습니다.
* 각 디지털 출력모듈(CFDI)은 cfnet-fs 마운트 지점 아래에 있는 디렉터리로 표현됩니다.\\
* ''{mount-point}/digital-intput/{module_address}/''
$ tree -L 2 /tmp/cfnet-fs/digital-input/
/tmp/cfnet-fs/digital-input/
├── 0
│ ├── channel
│ ├── state.bin
│ └── state.txt
├── 1
│ ├── channel
│ ├── state.bin
│ └── state.txt
... 7
==== - 0~7 {module_address} 디렉토리의 'state' 파일====
다음과 같은 2개의 상태 파일이 존재합니다
* state.txt : 16개 채널 전체의 입력 상태를 1과 0으로 구성된 ASCII 문자열 형태로 표현됩니다. (각 비트는 하나의 입력 채널 상태를 나타냅니다.)
* state.bin : 16개 채널의 입력 상태를 16비트 부호 없는 정수(Unsigned Integer) 형식의 데이터로 표현됩니다.
디지털 입력 모듈의 입력 상태가 변화 시 state.txt, state.bin 상태 파일이 동시에 반영됩니다.\\
텍스트 파일(.txt)은 사용자 입력·표시에 적합하며, 바이너리 파일(.bin)은 연산 및 논리 처리가 필요한 경우에 적합합니다.
==== - C#, Python, C에서 코딩 방법 ====
CFNET-FS 파일 시스템을 이용하여 Shell Script, C#, Python, C 언어에서 디지털 입력모듈(CFDI)의 모든 채널(포트)상태를 읽는 방법을 보여줍니다.
* **"디지털 입력 모듈 Address 0 번의 모든 채널를 읽습니다. "**
* ''/tmp/cfnet-fs/digital-intput/0/state.txt''
* ''/tmp/cfnet-fs/digital-intput/0/state.bin''
=== Shell Script ===
$ cat /tmp/cfnet-fs/digital-input/0/state.txt
=== C# ===
const string DIGITAL_INPUT_0 = "/tmp/cfnet-fs/digital-input/0/state.txt";
string state = File.ReadAllText(DIGITAL_INPUT_0).Trim();
Console.WriteLine(state);
const string DIGITAL_INPUT_0 = "/tmp/cfnet-fs/digital-input/0/state.bin";
var bytes = File.ReadAllBytes(DIGITAL_INPUT_0);
var state = BitConverter.ToUInt16(bytes, 0);
Console.WriteLine(state);
=== Python ===
DIGITAL_INPUT_0 = "/tmp/cfnet-fs/digital-input/0/state.txt"
state = open(DIGITAL_OUTPUT_0).read().strip()
print(state)
DIGITAL_OUTPUT_0 = "/tmp/cfnet-fs/digital-input/0/state.bin"
with open(DIGITAL_INPUT_0, "rb") as f:
data = f.read(2)
state = (data[1] << 8) | data[0] # little-endian
print(state)
=== C ===
#include
#define DIGITAL_INPUT_0 "/tmp/cfnet-fs/digital-input/0/state.txt"
int main(void)
{
FILE *f = fopen(DIGITAL_INPUT_0, "r");
// 16 plus the null-terminating character
char buffer[17] = {0};
fgets(buffer, sizeof(buffer) - 1, f);
printf("%s\n", buffer);
fclose(f);
return 0;
}
#include
#define DIGITAL_INPUT_0"/tmp/cfnet-fs/digital-input/0/state.bin"
int main(void)
{
FILE *f = fopen(DIGITAL_INPUT_0, "rb");
uint16_t state;
fread(&state, sizeof(uint16_t), 1, f);
printf("%u\n", state);
fclose(f);
return 0;
}
===== channel » 0~15(채널) 디렉터리 ======
channel 하위 디렉터리 0~15에는 각각의 개별 채널(포트 0~15)에 대응되는 state.bin과 state.txt 파일이 있으며,
이 파일들을 통해 각 채널의 입력 상태를 읽을 수 있습니다.
* 각 디지털 입력 채널은 cfnet-fs 마운트 경로 아래에서 디렉터리 형태로 제공됩니다.
* ''{mount-point}/digital-intput/{module_address}/channel/{channel_address}/''
$ tree /tmp/cfnet-fs/digital-output/0/
/tmp/cfnet-fs/digital-intput/0/
├── channel
│ ├── 0
│ │ ├── state.bin
│ │ └── state.txt
│ ├── 1
│ │ ├── state.bin
│ │ └── state.txt
│ ... 15
==== - 0~7(channel) 디렉터리의 state 파일 =====
각 디지털 입력 채널에는 두 가지 상태 파일이 제공됩니다.
* state.txt : 디지털 입력 채널의 각 상태를 **ASCII 문자 1 또는 0**으로 표시합니다.
* state.bin 디지털 입력 채널의 각 상태를 단일 이진 바이트로 표시합니다.(0 : OFF , 1 : ON)
각 채널(입력 포트)의 상태 변화 시 state.txt, state.bin 상태 파일에 동시에 반영됩니다.\\
텍스트 파일(.txt)은 사용자 입력·표시에 적합하며, 바이너리 파일(.bin)은 연산 및 논리 처리가 필요한 경우에 적합합니다.
==== - C#, Python, C에서 코딩 방법 ====
CFNET-FS 파일 시스템을 이용하여 Shell Script, C#, Python, C 언어에서 디지털 입력모듈(CFDO)의 특정 채널(포트)의 상태를 읽어오는 방법을 보여줍니다.
* **"디지털 입력 모듈 Address 0 번의 3채널의 상태 값을 읽어옵니다."**
* ''tmp/cfnet-fs/digital-intput/0/channel/3/state.txt''
* ''tmp/cfnet-fs/digital-intput/0/channel/3/state.bin''
=== Shell Script ===
$ cat /tmp/cfnet-fs/digital-output/0/channel/3/state.txt
=== C# ===
const string DIGITAL_INPUT_0_CHANNEL_3 = "/tmp/cfnet-fs/digital-input/0/channel/3/state.txt";
string state = File.ReadAllText(DIGITAL_INPUT_0_CHANNEL_3).Trim();
Console.WriteLine(state);
const string DIGITAL_INPUT_0_CHANNEL_3 = "/tmp/cfnet-fs/digital-input/0/channel/3/state.bin";
var bytes = File.ReadAllBytes(DIGITAL_INPUT_0_CHANNEL_3);
var state = BitConverter.ToBoolean(bytes, 0);
Console.WriteLine(state);
=== Python ===
DIGITAL_INPUT_0_CHANNEL_3 = "/tmp/cfnet-fs/digital-input/0/channel/3/state.txt"
with open(DIGITAL_INPUT_0_CHANNEL_3) as f:
state = f.read().strip()
print(state)
DIGITAL_INPUT_0_CHANNEL_3 = "/tmp/cfnet-fs/digital-input/0/channel/3/state.bin"
with open(DIGITAL_INPUT_0_CHANNEL_3, "rb") as f:
bytes_data = f.read(1)
state = bool(bytes_data[0])
print(state)
=== C ===
#include
#define DIGITAL_INPUT_0_CHANNEL_3 "/tmp/cfnet-fs/digital-input/0/channel/3/state.txt"
int main(void)
{
FILE *f = fopen(DIGITAL_INPUT_0_CHANNEL_3, "r");
char buffer[3] = {0};
fgets(buffer, sizeof(buffer), f);
printf("%s", buffer);
fclose(f);
return 0;
}
#include
#define DIGITAL_INPUT_0_CHANNEL_3 "/tmp/cfnet-fs/digital-input/0/channel/3/state.bin"
int main(void)
{
FILE *f = fopen(DIGITAL_INPUT_0_CHANNEL_3, "rb");
unsigned char state;
fread(&state, sizeof(unsigned char), 1, f);
printf("%u\n", state);
fclose(f);
return 0;
}
[[..:index|CFNET-FS 개요]]