Device Programming Guide for P20

Similar documents
<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

The Pocket Guide to TCP/IP Sockets: C Version

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

The Pocket Guide to TCP/IP Sockets: C Version

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

P4S-341 User Manual > 주요특징 주요특징 자체개발한 PHPoC 인터프리터탑재 USB 를이용한간편한개발환경제공 10/100Mbit 이더넷지원 22 개의디지털 I/O 포트및 6 개의아날로그입력포트제공 2 개의 UART 포트를제공 4 개의하드웨어타이머를제공

API 매뉴얼

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

ADP-2480

개요

API 매뉴얼

2 Mitsubishi FX Series Computer Link MITSUBISHI FX SERIES COMPUTER LINK 시스템구성 시스템설정 사용예 사용예 사용예

2009년 상반기 사업계획

SBR-100S User Manual

Microsoft Word - src.doc

1 1. INTRODUCTION 2 2. DOWNLOAD Windows Desktop & Server Max OS X, Linux, Windows CE 2 3. API REFERENCE CAN_OpenVcp CAN_Op

운영체제실습_명령어

PHPoC vs PHP > 개요 개요 PHPoC 는솔내시스템 이자체개발한프로그래밍언어입니다. 당사의모든 PHPoC 제품들의펌웨어에는 PHPoC 인터프리터가내장되어있습니다. PHPoC 는범용스크립트언어인 PHP 를기반으로제작되었습니다. PHPoC 는매우간단하여 C 언어등

Microsoft Word _whitepaper_latency_throughput_v1.0.1_for_

(SW3704) Gingerbread Source Build & Working Guide

The Pocket Guide to TCP/IP Sockets: C Version

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

T100MD+

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

게시판 스팸 실시간 차단 시스템

OSTSen-PIR100 사용자설명서 Ver 1.1 Onsystech OSTSen-PIR100 V1.1 1 of 8 Onsystech

hd1300_k_v1r2_Final_.PDF

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

네트워크 설정

PowerPoint 프레젠테이션

BY-FDP-4-70.hwp

USB-AIO11 API

Microsoft PowerPoint - 04-UDP Programming.ppt

OSTSen-MOS100 사용자설명서 Ver 1.1 Onsystech OSTSen-MOS100 Ver of 8 Onsystech

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - es-arduino-lecture-03

설계란 무엇인가?

슬라이드 제목 없음

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

OSTSen-THL100 사용자설명서 Ver 1.1 Onsystech OSTSen-THL100 Ver1.1 1 of 8 Onsystech

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 :

adfasdfasfdasfasfadf

1217 WebTrafMon II

(MHT-SB112\273\347\276\347\274\255.hwp)

-. Data Field 의, 개수, data 등으로구성되며, 각 에따라구성이달라집니다. -. Data 모든 의 data는 2byte로구성됩니다. Data Type는 Integer, Float형에따라다르게처리됩니다. ( 부호가없는 data 0~65535 까지부호가있는

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft Word - PEB08_USER_GUIDE.doc

ATmega128

untitled

Microsoft PowerPoint - Chapter 8_USART Serial Communication

SRC PLUS 제어기 MANUAL

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

CANTUS Evaluation Board Ap. Note

Mango220 Android How to compile and Transfer image to Target

DSP_MON 프로그램 메뉴얼

Microsoft Word - Armjtag_문서1.doc

슬라이드 1

슬라이드 1


2주차: 입출력 제어 복습

CAN-fly Quick Manual

Microsoft Word - How to make a ZigBee Network_kr

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

1) 인증서만들기 ssl]# cat > // 설명 : 발급받은인증서 / 개인키파일을한파일로저장합니다. ( 저장방법 : cat [ 개인키

USB2CAN USB2CAN-UART USB2CAN-FIFO API Reference Manual Copyright NTREXLAB

PowerPoint Template

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

1. 제품규격및특징 구분 규격및특징 입력전압 DC 12~30V 모터구동방식 Bipolar 방식 최대모터전류 Max 3.0A 초기설정정지전류 :4(0.46A), 구동전류 :18(1.75A) 분주비 0(x256), 1(x128), 2(x64), 3(x32), 4(x16),

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.

슬라이드 1

vi 사용법

Sena Device Server Serial/IP TM Version

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft Word - LKP-RTD 사용자 설명서

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

. PC PC 3 [ ] [ ], [ ] [ ] [ ] 3 [ ] [ ], 4 [ ] [ ], 4 [Internet Protocol Version 4 (TCP/IPv4)] 5 [ ] 6 [ IP (O)], [ DNS (B)] 7 [ ] 한국어 -

Microsoft PowerPoint - T1 ERS (Elevator Reservation System)SASD2.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

PowerPoint Template

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

Microsoft PowerPoint - 03-TCP Programming.ppt

Microsoft PowerPoint - additional01.ppt [호환 모드]

Visual Basic 반복문

일반적인 네트워크의 구성은 다음과 같다

중간고사

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

C 언어 프로그래밊 과제 풀이

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

Microsoft PowerPoint 세션.ppt

IoT FND8 7-SEGMENT api

PowerPoint 프레젠테이션

Transcription:

PHPoC Device Programming Guide for P20 Version 1.2 솔내시스템 PHPoC 포럼 : http://www.phpoc.com/kr 홈페이지 : http://www.sollae.co.kr

목차 개요...- 4-1.1 디바이스...- 4-1.2 디바이스파일의위치...- 4-1.3 디바이스종류...- 5-1.4 디바이스사용절차...- 5-1.4.1 디바이스열기...- 5-1.4.2 디바이스사용...- 5-1.4.3 디바이스닫기...- 5 - 디지털 I/O...- 6-2.1 개요...- 6-2.2 사용절차...- 6-2.3 디지털 I/O 열기...- 6-2.4 디지털 I/O 설정...- 7-2.4.1 설정가능한디지털 I/O 종류...- 7-2.5 디지털 I/O 사용...- 8-2.5.1 디지털 I/O 상태읽기...- 8-2.5.2 디지털 I/O에값쓰기...- 9-2.5.3 릴레이제어하기... - 10 - UART... - 11-3.1 사용절차... - 11-3.2 UART 열기... - 11-3.3 UART 설정... - 11-3.3.1 설정가능한 UART 항목... - 12-3.3.2 시리얼통신방식설정... - 13-3.4 UART 상태정보확인... - 14-3.4.1 확인가능한 UART 상태정보... - 14-3.4.2 송신버퍼에남아있는데이터크기... - 15-3.4.3 수신데이터크기... - 15-3.4.4 수신버퍼여유공간... - 16-3.5 UART 사용... - 17-3.5.1 데이터수신... - 17-3.5.2 데이터송신... - 18 - NET... - 19-4.1 사용절차... - 19-4.2 NET 열기... - 19-4.3 NET 상태정보확인... - 20 - - 1 - http://www.phpoc.com

4.3.1 확인가능한 NET 상태정보... - 20 - TCP... - 21-5.1 사용절차... - 21-5.2 TCP 열기... - 21-5.3 TCP 설정... - 22-5.3.1 설정가능한 TCP 항목... - 22-5.3.2 SSL사용... - 23-5.3.3 TELNET서버사용... - 24-5.3.4 SSH서버사용... - 25-5.3.5 웹소켓서버사용... - 26-5.4 TCP 접속... - 27-5.4.1 TCP클라이언트 ( 능동접속 )... - 27-5.4.2 TCP서버 ( 수동접속 )... - 27-5.5 TCP 상태정보확인... - 28-5.5.1 확인가능한 TCP 상태정보... - 28-5.5.2 TCP세션상태... - 29-5.5.3 송신버퍼에남아있는데이터크기... - 29-5.5.4 수신데이터크기... - 30-5.5.5 수신버퍼여유공간... - 30-5.6 TCP 데이터통신... - 31-5.6.1 TCP 데이터수신... - 31-5.6.2 TCP 데이터송신... - 32 - UDP... - 33-6.1 사용절차... - 33-6.2 UDP 열기... - 33-6.3 UDP 바인딩... - 34-6.4 UDP 설정... - 34-6.4.1 설정가능한 UDP 항목... - 34-6.5 UDP 상태정보확인... - 35-6.5.1 확인가능한 UDP 상태정보... - 35-6.5.2 수신데이터크기확인... - 35-6.6 UDP 데이터통신... - 36-6.6.1 데이터수신... - 36-6.6.2 데이터송신... - 37 - ST... - 38-7.1 사용절차... - 38-7.2 ST 열기... - 38-7.3 ST 설정및사용... - 38-7.3.1 공통명령어... - 39 - - 2 - http://www.phpoc.com

7.3.2 프리모드... - 41-7.3.3 프리모드사용예... - 43-7.3.4 토글출력모드... - 44-7.3.5 토글출력모드사용예... - 48-7.3.6 펄스출력모드... - 50-7.3.7 펄스출력모드사용예... - 53-7.3.8 PWM출력모드... - 55-7.3.9 PWM출력모드사용예... - 57-7.3.10 트리거... - 58 - 부록 : 디바이스관련함수... - 59 - 부록 : 디바이스정보... - 60-9.1 제품별디바이스개수... - 60-9.2 제품별디바이스파일경로... - 60-9.2.1 UART... - 60-9.2.2 NET... - 60-9.2.3 TCP... - 60-9.2.4 UDP... - 61-9.2.5 I/O... - 61-9.2.6 ST... - 64-9.2.7 ENV 및사용자메모리... - 64 - 부록 : 펌웨어사양및제한사항... - 65-10.1 펌웨어별적용제품... - 65-10.2 펌웨어사양... - 65-10.3 제한사항... - 66 - 부록 : pid_ioctl 명령어인덱스... - 67 - 문서변경이력... - 69 - - 3 - http://www.phpoc.com

개요 1.1 디바이스 PHPoC가제공하는하드웨어장치또는소프트웨어기능을디바이스라고합니다. 모든디바이스들은특수한파일형태로제공되며일반적인파일입 / 출력과같은방식으로사용할수있습니다. PHPoC의파일시스템구조는아래그림과같습니다. 그림 1-1 PHPoC 의파일시스템구조 1.2 디바이스파일의위치 PHPoC에서제공하는모든디바이스파일들은 root 디렉터리안에있는 mmap(memory map) 이라는디렉터리에위치합니다. 따라서특정디바이스는다음과같은경로를사용하여접근해야합니다. /mmap/ 디바이스이름 사용자가 PHPoC로업로드하는모든파일들은파일시스템의최상위디렉터리인 root 디렉터리에위치하게됩니다. PHPoC에서사용자가접근할수있는디렉터리로는 root와 /mmap이있습니다. 사용자는파일시스템에임의로디렉터리를만들거나삭제할수없습니다. - 4 - http://www.phpoc.com

1.3 디바이스종류 PHPoC는다음과같은디바이스를제공합니다. 구분디바이스이름하드웨어디지털I/O( 입 / 출력 ), UART( 시리얼 ), NET( 네트워크 ) 소프트웨어 TCP, UDP, ST( 타이머 ) 표 1-1 디바이스종류제공되는디바이스들의개수는제품또는펌웨어버전에따라서달라질수있습니다. 제품별디바이스에관한자세한내용은부록을참조하시기바랍니다. 1.4 디바이스사용절차 일반적인디바이스사용법은다음과같습니다. 그림 1-2 디바이스사용절차 1.4.1 디바이스열기 pid_open함수를이용하여각디바이스를열수있습니다. 이함수는 pid(peripheral ID) 라는정수값을반환하는데이값은해당디바이스에접근할수있는고유번호로사용됩니다. 1.4.2 디바이스사용 디바이스를성공적으로연다음에는반환된 pid 가가리키는디바이스를사용할수 있습니다. 1.4.3 디바이스닫기 디바이스의사용이끝나서더이상필요하지않으면해당 pid 가가리키는디바이스를 pid_close 함수를이용해닫습니다. 디바이스에따라서 pid_close 함수가필요하지않을수있습니다. - 5 - http://www.phpoc.com

디지털 I/O 2.1 개요 디지털 I/O는디지털입력을감시하거나출력을제어하는용도로사용할수있습니다. 또한제품의각종상태를나타내기위한 LED로연결하거나시리얼통신종류를설정할때에도사용됩니다. 디지털 I/O의구조모든디지털 I/O의상태는 HIGH( 또는 1), LOW( 또는 0) 의두가지상태값을가집니다. 따라서각각의포트는다음과같이하나의비트로맵핑되어표현됩니다. 그림 2-1 디지털 I/O 맵핑예 2.2 사용절차 일반적인디지털 I/O 사용절차는다음과같습니다. 그림 2-2 디지털 I/O 사용절차 2.3 디지털 I/O 열기 디지털 I/O 를열기위해서는 pid_open 함수를사용합니다. $pid = pid_open("/mmap/io3"); // 3 번디지털 I/O 열기 LED 를포함한제품별디지털 I/O 에관한자세한내용은부록을참조하시기 바랍니다. - 6 - http://www.phpoc.com

2.4 디지털 I/O 설정 디지털 I/O를사용하기전에반드시어떤용도로사용할것인지를설정해야합니다. 설정을위해서는 pid_ioctl함수의 set명령을사용합니다. pid_ioctl($pid, "set N1[-N2] mode TYPE"); N1과 N2는설정할디지털 I/O의포트번호의범위를나타냅니다. 단일포트를설정하는경우에는 N2를생략할수있습니다. 설정가능한 TYPE은다음과같습니다. 2.4.1 설정가능한디지털 I/O 종류 TYPE in out led_sys 설명 디지털입력 - 디지털출력 low high led_net0_act / led_net1_act led_net0_link / led_net1_link led_net0_rx / led_net1_rx led_net0_tx / led_net1_tx 디지털출력 : 초기값 LOW 디지털출력 : 초기값 HIGH 시스템상태 LED NET(net0 - 유선, net1 - 무선 ) 링크활성화 LED: - NET 이네트워크에정상적으로연결된경우 LOW - 네트워크데이터를송신또는수신하는순간 HIGH NET 링크 LED: 네트워크연결시 LOW NET 수신 LED: 네트워크로부터데이터를수신하는순간 LOW NET 송신 LED: 네트워크로데이터를송신하는순간 LOW 표 2-1 설정가능한디지털 I/O 종류 LED 가인터페이스되어있는제품들은위포트들을물리적인 LED 로맵핑할수 있습니다. 물리적인 LED 는포트상태가 LOW 이면켜지고 (ON) HIGH 이면 꺼집니다 (OFF). 자세한내용은해당제품의회로도를참조하시기바랍니다. 디지털 I/O종류설정예 $pid = pid_open("/mmap/io3"); // 3번디지털 I/O 열기 pid_ioctl($pid, "set 0 mode out"); // 0번출력 (out) 포트로설정 pid_ioctl($pid, "set 1-2 mode out high"); // 1~2번출력 (in) 포트로설정 : HIGH pid_ioctl($pid, "set 3 mode led_net0_link"); // 3번 NET 링크LED로설정 pid_ioctl($pid, "set 12 mode led_net0_rx"); // 12번 NET 수신 LED로설정 pid_ioctl($pid, "set 13 mode led_net0_tx"); // 13번 NET 송신 LED로설정 - 7 - http://www.phpoc.com

2.5 디지털 I/O 사용 2.5.1 디지털 I/O 상태읽기 디지털 I/O 상태를읽을때에는 pid_read함수를사용하여모든포트의상태를한번에읽거나, pid_ioctl함수의 get명령을사용해단일포트정보를읽습니다. 단일포트정보의경우에는입 / 출력상태뿐만아니라설정유형까지읽을수있습니다. pid_read($pid, VALUE); // 모든포트상태읽기 (16 bits 단위 ) pid_ioctl($pid, "get N ITEM); // 단일포트정보읽기 (1 bit 단위 ) 단일포트정보읽기에서사용가능한 ITEM은다음과같습니다. ITEM mode 설명 해당포트의설정유형을 문자열형태로반환 입 / 출력핀 : "in", "out", "led_xxx" 등 ST 출력으로사용중인핀 : "st_out" input output 해당입력포트의상태를정수형태로반환 (0: LOW, 1: HIGH) 해당출력포트의상태를정수형태로반환 (0: LOW, 1: HIGH) 모든포트상태읽기예 표 2-2 단일포트정보읽기에서사용가능한 ITEM 아래예제는 3 번 IO 의포트들을입력포트로설정한후그상태값을읽어서출력합니다. $value = 0; $pid = pid_open("/mmap/io3"); // 3번디지털 I/O 열기 pid_ioctl($pid, "set 0-3 mode in"); // 0~3번입력설정 pid_read($pid, $value); // 디지털 I/O 상태읽기 (16bits 단위 ) printf("0x%x\r\n", $value); // 출력결과예 : 0xf00f 단일포트정보읽기예 아래예제는 3 번 IO 의 0 번포트를기본상태가 HIGH 인출력포트로설정하고설정유형 및출력상태를읽어서출력합니다. $pid = pid_open("/mmap/io3"); // 디지털 I/O 열기 pid_ioctl($pid, "set 0 mode out high"); // 0번포트출력설정 (HIGH) $mode = pid_ioctl($pid, "get 0 mode"); // 0번포트설정유형확인 $output = pid_ioctl($pid, "get 0 output"); // 0번포트출력상태확인 printf("%s, %d\r\n", $mode, $output); // 출력결과 : out, 1 pid_ioctl 의 get 명령으로단일포트의상태를읽을때해당포트의유형이 입력포트인경우에는 "get N input" 을, 출력포트인경우에는 "get N output" 을 사용해야합니다. - 8 - http://www.phpoc.com

2.5.2 디지털 I/O 에값쓰기 디지털 I/O에값을출력하기위해서는 pid_write함수를사용하여모든포트에한번에출력하거나, pid_ioctl함수의 set명령을사용해단일포트로출력합니다. pid_write($pid, VALUE); // 모든포트출력 (16 bits 단위 ) pid_ioctl($pid, "set N output TYPE"); // 단일포트출력 (1 bit 단위 ) 모든포트출력예아래예제는 3번 IO의모든포트를출력포트로설정한후임의의값을쓰고, 다시디지털 I/O의상태를읽어출력하는예제입니다. $value = 0; $pid = pid_open("/mmap/io3"); // 3번디지털 I/O 열기 pid_ioctl($pid, "set 0-7 mode out"); // 디지털 I/O 0~7번출력설정 pid_read($pid, $value); // 디지털 I/O 상태읽기 pid_write($pid, ($value & 0xff00) 0x0055); // 0x0055 출력 pid_read($pid, $value); // 디지털 I/O 상태읽기 printf("0x%0x\r\n", $value); // 출력결과예 : 0x0055 단일포트출력예아래예제는 3번 IO의 0번포트를기본상태가 LOW인출력포트로설정하고 HIGH를출력한후입 / 출력상태를읽어서출력합니다. $pid = pid_open("/mmap/io3"); // 3번디지털 I/O 열기 pid_ioctl($pid, "set 0 mode out low"); // 0번포트출력설정 (LOW) pid_ioctl($pid, "set 0 output high"); // 0번포트에 HIGH 출력 $output = pid_ioctl($pid, "get 0 output"); // 0번포트출력상태확인 printf("%d\r\n", $output); // 출력결과 : 1 출력제한설정예아래예제는 0번포트에출력제한을설정한경우와그렇지않은경우에 HIGH 출력의적용여부를비교하는예제입니다. $pid = pid_open("/mmap/io3"); // 디지털 I/O 열기 pid_ioctl($pid, "set 0 mode out low"); // 0번포트출력설정 (LOW) pid_ioctl($pid, "set 0 lock"); // 0번포트출력제한설정 pid_ioctl($pid, "set 0 output high"); // 0번포트에 HIGH 출력 $output1 = pid_ioctl($pid, "get 0 output"); // 0번포트출력상태확인 pid_ioctl($pid, "set 0 unlock"); // 0번포트출력제한해제 pid_ioctl($pid, "set 0 output high"); // 0번포트에 HIGH 출력 $output2 = pid_ioctl($pid, "get 0 output"); // 0번포트출력상태확인 printf("%d, %d\r\n", $output1, $output2); // 출력결과 : 0, 1-9 - http://www.phpoc.com

2.5.3 릴레이제어하기 디지털출력포트가릴레이로연결된외장형제품들이있습니다. 릴레이제어예아래예제는릴레이포트를매초마다 0번부터순서대로 ON한다음모든포트를 ON/OFF하는예제입니다. $pid = pid_open("/mmap/io4"); // 4번디지털 I/O( 릴레이 ) 열기 pid_ioctl($pid, "set 7 mode out"); // 7번 ( 릴레이활성 ) 을출력으로설정 pid_ioctl($pid, "set 8-11 mode out"); // 8 ~ 11번설정 ( 릴레이포트 0 ~ 3번 ) pid_write($pid, 0x0100); // 릴레이포트 0번 ON sleep(1); pid_write($pid, 0x0200); // 릴레이포트 1번 ON sleep(1); pid_write($pid, 0x0400); // 릴레이포트 2번 ON sleep(1); pid_write($pid, 0x0800); // 릴레이포트 3번 ON sleep(1); pid_write($pid, 0x0f00); // 릴레이포트 0 ~ 3번모두 ON sleep(1); pid_write($pid, 0x0000); // 릴레이포트 0 ~ 3번모두 OFF 위예제는릴레이포트가없는제품의경우에는사용할수없습니다. - 10 - http://www.phpoc.com

UART UART(Universal Asynchronous Receiver and Transmitter) 는가장널리사용되고있는 시리얼통신방식입니다. 3.1 사용절차 일반적인 UART 사용절차는다음과같습니다. 그림 3-1 UART 사용절차 3.2 UART 열기 UART 를열기위해서는 pid_open 함수를사용합니다. $pid = pid_open("/mmap/uart0"); // 0 번 UART 열기 제품별 UART 에관한자세한내용은부록을참조하시기바랍니다. 3.3 UART 설정 UART를사용하기전에반드시설정이필요합니다. 통신속도 (baud rate), 데이터비트 (data bit), 정지비트 (stop bit), 패리티 (parity) 등의설정항목이있으며, 설정을위해서는 pid_ioctl함수의 set명령을사용합니다. pid_ioctl($pid, "set ITEM VALUE"); ITEM은설정할항목을, VALUE는항목에설정할값을의미합니다. - 11 - http://www.phpoc.com

3.3.1 설정가능한 UART 항목 ITEM VALUE 설명 baud 예 ) 9600 통신속도 [bps], 2400 ~ 230400 parity 0 패리티사용안함 1 EVEN( 짝수패리티 ) 2 ODD( 홀수패리티 ) 3 MARK( 패리티비트항상 1) 4 SPACE( 패리티비트항상 0) 8 데이터비트 8 data 7 데이터비트 7( 이때반드시패리티를사용해야함 ) 1 정지비트 1 stop 2 정지비트 2 flowctrl 0 흐름제어사용안함 1 RTS/CTS 흐름제어사용 2 Xon/Xoff 흐름제어사용 3 TxDE 흐름제어사용 (RS485) 표 3-1 설정가능한 UART 항목 UART 설정예 $pid = pid_open("/mmap/uart0"); // 0번 UART 열기 pid_ioctl($pid, "set baud 9600"); // 통신속도 9600 bps pid_ioctl($pid, "set parity 0"); // 패리티사용안함 pid_ioctl($pid, "set data 8"); // 데이터비트 8 pid_ioctl($pid, "set stop 1"); // 정지비트 1 pid_ioctl($pid, "set flowctrl 0"); // 흐름제어사용안함 - 12 - http://www.phpoc.com

3.3.2 시리얼통신방식설정 UART는제품에따라 RS232뿐만아니라 RS422이나 RS485로도확장이가능합니다. 시리얼통신방식을설정하기위해서는 TxDE 및관련입 / 출력핀을알맞게설정해야합니다. 다음예제는 0번 UART의시리얼통신방식을변경하는방법을안내하는예제입니다. $pid = pid_open("/mmap/uart0"); // 0번 UART 열기 pid_ioctl($pid, "set baud 9600"); // 통신속도 9600 bps pid_ioctl($pid, "set parity 0"); // 패리티사용안함 pid_ioctl($pid, "set data 8"); // 데이터비트 8 pid_ioctl($pid, "set stop 1"); // 정지비트 1 pid_ioctl($pid, "set flowctrl 3"); // TxDE 흐름제어사용 $pid_mode = pid_open("/mmap/io4"); // UART모드설정포트열기 pid_ioctl($pid_mode, "set 0-3 mode out"); // UART모드설정핀초기화 pid_write($pid_mode, 0x05); // RS232 설정 //pid_write($pid_mode, 0x02); // RS422 설정 ( 주석해제 ) //pid_write($pid_mode, 0x0c); // RS485 설정 ( 주석해제 ) pid_close($pid_mode); 위예제는 "/mmap/io4" 의 0-3 번비트가시리얼통신방식을설정하는용도로 맵핑된경우를가정하였습니다. 통신방식설정을위한맵핑경로및설정값은제품에 따라다를수있으니제품별디바이스관련정보를확인하시기바랍니다. 제품별디지털 I/O 관련정보는부록을참조하시기바랍니다. - 13 - http://www.phpoc.com

3.4 UART 상태정보확인 pid_ioctl 함수의 get 명령어로 UART 의각종상태를확인할수있습니다. $return = pid_ioctl($pid, "get ITEM"); 3.4.1 확인가능한 UART 상태정보 ITEM 설명 반환값 반환형식 baud 통신속도 [bps] 예 ) 9600 정수 parity 패리티 0 / 1 / 2 / 3 / 4 정수 data 데이터비트 [bit] 8 / 7 정수 stop 정지비트 [bit] 1 / 2 정수 flowctrl 흐름제어 0 / 1 / 2 / 3 정수 txbuf 송신버퍼크기 [Byte] 예 ) 1024 정수 txfree 송신버퍼여유공간 [Byte] 예 ) 1024 정수 rxbuf 수신버퍼크기 [Byte] 예 ) 1024 정수 rxlen 수신데이터크기 [Byte] 예 ) 10 정수 표 3-2 확인가능한 UART 상태정보 UART 상태정보확인예 UART의현재설정값은다음과같이확인할수있습니다. $pid = pid_open("/mmap/uart0"); // 0번 UART 열기 $baud = pid_ioctl($pid, "get baud"); // 통신속도 $parity = pid_ioctl($pid, "get parity"); // 패리티 $data = pid_ioctl($pid, "get data"); // 데이터비트 $stop = pid_ioctl($pid, "get stop"); // 정지비트 $flowctrl = pid_ioctl($pid, "get flowctrl"); // 흐름제어 echo "baud = $baud\r\n"; // 출력예 : baud = 9600 echo "parity = $parity\r\n"; // 출력예 : parity = 0 echo "data = $data\r\n"; // 출력예 : data = 8 echo "stop = $stop\r\n"; // 출력예 : stop = 1 echo "flowctrl = $flowctrl\r\n"; // 출력예 : flowctrl = 0-14 - http://www.phpoc.com

3.4.2 송신버퍼에남아있는데이터크기 UART 의송신버퍼에남아있는데이터크기는다음과같이계산할수있습니다. 송신버퍼에남아있는데이터크기 = 송신버퍼크기 - 송신버퍼여유공간 사용예 이예제는 0 번 UART 에 10 바이트를전송하고, 송신버퍼에남아있는데이터크기를 계산하여출력합니다. $txlen = -1; $data = "0123456789"; $pid = pid_open("/mmap/uart0"); pid_ioctl($pid, "set baud 9600"); pid_ioctl($pid, "set parity 0"); // 0 번 UART 열기 // 통신속도 9600 bps // 패리티사용안함 pid_ioctl($pid, "set data 8"); // 데이터비트 8 pid_ioctl($pid, "set stop 1"); // 정지비트 1 pid_ioctl($pid, "set flowctrl 0"); pid_write($pid, $data); while($txlen) { $txbuf = pid_ioctl($pid, "get txbuf"); // 흐름제어사용안함 // UART 에데이터 ($data) 송신 // 송신버퍼크기확인 $txfree = pid_ioctl($pid, "get txfree"); // 송신버퍼여유공간확인 $txlen = $txbuf - $txfree; echo "tx len = $txlen\r\n"; usleep(1000); } pid_close($pid); // 송신버퍼에남아있는데이터크기계산 // 송신버퍼에남아있는데이터크기출력 3.4.3 수신데이터크기 UART 가수신한데이터크기는다음과같이확인할수있습니다. $rxlen = pid_ioctl($pid, "get rxlen[ $string]"); 특정문자 ( 열 ) 까지수신한데이터크기확인하기 rxlen명령어뒤에특정문자열 ($string) 을입력하면 pid_ioctl함수는해당문자열이들어오기전까지는 0을반환하다가해당문자열이들어오면그문자열까지의수신데이터크기를반환합니다. - 15 - http://www.phpoc.com

3.4.4 수신버퍼여유공간 UART 의수신버퍼여유공간은다음과같이계산할수있습니다. 수신버퍼여유공간 = 수신버퍼크기 - 수신데이터크기 사용예이예제는 0번 UART의수신버퍼의여유공간을계산하여출력합니다. $rdata = ""; $pid = pid_open("/mmap/uart0"); // 0번시리얼포트열기 pid_ioctl($pid, "set baud 9600"); // 통신속도 9600 bps pid_ioctl($pid, "set parity 0"); // 패리티사용안함 pid_ioctl($pid, "set data 8"); // 데이터비트 8 pid_ioctl($pid, "set stop 1"); // 정지비트 1 pid_ioctl($pid, "set flowctrl 0"); // 흐름제어사용안함 $rxbuf = pid_ioctl($pid, "get rxbuf"); // 수신버퍼크기확인 $rxlen = pid_ioctl($pid, "get rxlen"); // 수신데이터크기확인 $rxfree = $rxbuf - $rxlen; echo "rxfree = $rxfree\r\n"; pid_close($pid); // 수신버퍼여유공간계산 // 수신버퍼여유공간출력 - 16 - http://www.phpoc.com

3.5 UART 사용 3.5.1 데이터수신 시리얼포트로부터들어온데이터는수신버퍼에저장됩니다. 이수신버퍼에저장된값을 pid_read 함수로읽어서데이터를수신합니다. pid_read 함수는다음과같이사용합니다. 그림 3-2 UART 데이터수신 pid_read($pid, $var[, $len]); $var 는읽은값을저장할변수이고, $len 은읽을바이트수를의미합니다. 사용예 이예제는약 1 초마다 UART 로수신되는데이터를확인하여출력합니다. $rdata = ""; $pid = pid_open("/mmap/uart0"); pid_ioctl($pid, "set baud 9600"); pid_ioctl($pid, "set parity 0"); // 0 번 UART 열기 // 통신속도 9600bps // 패리티사용안함 pid_ioctl($pid, "set data 8"); // 데이터비트 8 pid_ioctl($pid, "set stop 1"); // 정지비트 1 $rxbuf = pid_ioctl($pid, "get rxbuf"); while(1) { $rxlen = pid_ioctl($pid, "get rxlen"); $rx_free = $rxbuf - $rxlen; echo "$rx_free / $rxbuf\r\n"; // 수신버퍼크기확인 // 수신데이터크기확인 // 버퍼여유공간확인 $len = pid_read($pid, $rdata, $rxlen); // 데이터읽기 echo "len = $len / "; echo "rdata = $rdata\r\n"; sleep(1); } pid_close($pid); // 수신버퍼여유공간 / 크기출력 // 읽은데이터크기출력 // 읽은데이터출력 - 17 - http://www.phpoc.com

3.5.2 데이터송신 pid_write 함수를이용해쓰기한데이터는송신버퍼에저장되었다가 UART 를통해외부로 송신됩니다. pid_write 함수는다음과같이사용합니다. 그림 3-3 UART 데이터송신 pid_write($pid, $var[, $wlen]); $var는쓸데이터가저장된변수이고, $wlen은쓸바이트수입니다. 사용예이예제는약 1초마다송신버퍼의여유공간을확인하여 UART로데이터를출력합니다. $sdata = "0123456789"; $pid = pid_open("/mmap/uart0"); pid_ioctl($pid, "set baud 9600"); $txbuf = pid_ioctl($pid, "get txbuf"); while(1) { // 0 번시리얼포트열기 // 통신속도 9600bps // 송신버퍼크기확인 $txfree = pid_ioctl($pid, "get txfree"); // 송신버퍼여유공간확인 echo "txfree = $txfree\r\n"; // 송신버퍼여유공간출력 $len = pid_write($pid, $sdata, $txfree); // 데이터쓰기 echo "len = $len\r\n"; sleep(1); } pid_close($pid); // 쓰기한데이터크기출력 위코드에서 pid_write 함수의세번째인수는쓰기할데이터의크기를의미합니다. 쓰기 데이터크기가송신버퍼의여유공간보다크면데이터가유실될수있습니다. 따라서항상 버퍼여유공간을확인한후그값또는그이하의값으로쓰기데이터크기를설정하시기 바랍니다. - 18 - http://www.phpoc.com

NET NET 는물리적인유 / 무선네트워크인터페이스입니다. 4.1 사용절차 일반적인 NET 사용절차는다음과같습니다. 그림 4-1 NET 사용절차 4.2 NET 열기 NET 를열기위해서는 pid_open 함수를사용합니다. $pid = pid_open("/mmap/net0"); // 0 번 NET 열기 제품별 NET 에관한자세한내용은부록을참조하시기바랍니다. - 19 - http://www.phpoc.com

4.3 NET 상태정보확인 pid_ioctl 함수의 get 명령어를이용하여 NET 의상태정보를확인할수있습니다. $return = pid_ioctl($pid, "get ITEM"); ITEM 은확인가능한상태정보의이름입니다. 4.3.1 확인가능한 NET 상태정보 ITEM 설명 반환값 반환형식 hwaddr MAC주소 예 ) 00:30:f9:00:00:01 문자열 ipaddr 설정된 IP주소 예 ) 10.1.0.1 문자열 netmask 서브넷마스크 예 ) 255.0.0.0 문자열 gwaddr 게이트웨이주소 예 ) 10.1.0.254 문자열 nsaddr 네임서버주소 예 ) 10.1.0.254 문자열 10M이더넷 10BASET 문자열 100M이더넷 100BASET 문자열 mode speed 무선랜사용불가 ""( 빈문자열 ) 문자열 무선랜인프라스트럭처 INFRA 문자열 무선랜애드혹 IBSS 문자열 무선랜 Soft AP AP 문자열 유선랜속도 [Mbps] 0 / 10 / 100 정수 무선랜속도 [100Kbps] 0 / 10 / 20 / 55 / 110 / 60 / 90 / 120 / 180 / 240 / 360 / 480 / 540 표 4-1 확인가능한 NET 상태정보 정수 NET 상태정보확인예 이예제는 NET 의각상태정보를확인하여출력합니다. $pid = pid_open("/mmap/net0"); echo pid_ioctl($pid, "get hwaddr"), "\r\n"; echo pid_ioctl($pid, "get ipaddr"), "\r\n"; echo pid_ioctl($pid, "get netmask"), "\r\n"; echo pid_ioctl($pid, "get gwaddr"), "\r\n"; echo pid_ioctl($pid, "get nsaddr"), "\r\n"; echo pid_ioctl($pid, "get mode"), "\r\n"; echo pid_ioctl($pid, "get speed"), "\r\n"; pid_close($pid); // 0번 NET 열기 // MAC주소확인 // IP주소확인 // 서브넷마크스확인 // 게이트웨이주소확인 // 네임서버주소확인 // 이더넷방식확인 // 이더넷속도확인 // 네트워크포트닫기 - 20 - http://www.phpoc.com

TCP TCP 는네트워크상에서데이터를전송할때사용하는프로토콜로 UDP 와더불어 오늘날의인터넷에서사용되는 TCP/IP 프로토콜중전송을담당하는핵심적인프로토콜 입니다. TCP 는접속과정이있으며데이터의신뢰성을보장하는특징이있습니다. 5.1 사용절차 일반적인 TCP 사용절차는다음과같습니다. 그림 5-1 TCP 사용절차 디바이스를 TCP 서버로동작시키고자하는경우에는바인딩과정을생략할수 없습니다. 5.2 TCP 열기 TCP 를열기위해서는 pid_open 함수를사용합니다. $pid = pid_open("/mmap/tcp0"); // 0 번 TCP 열기 제품별 TCP 에관한자세한내용은부록을참조하시기바랍니다. - 21 - http://www.phpoc.com

5.3 TCP 설정 TCP를사용하기전에설정이필요한경우가있습니다. 특히 SSL, SSH, TELNET 또는웹소켓을사용하기위해서는 pid_ioctl함수의 set명령을이용하여반드시접속전에설정을먼저해주어야합니다. pid_ioctl($pid, "set ITEM VALUE"); ITEM은설정항목을, VALUE는항목에대한값을나타냅니다. 5.3.1 설정가능한 TCP 항목 ITEM VALUE 설명 nodelay 0 TCP Nagle 알고리즘사용 1 TCP Nagle 알고리즘사용안함 ssl SSL 사용 api ssh SSH 서버사용 telnet TELNET 서버사용 ws 웹소켓 (Web Socket) 서버사용 ssl method ssl3_client SSL클라이언트 (SSL 3.0) tls1_client SSL클라이언트 (TLS 1.0) ssl3_server SSL서버 (SSL 3.0) tls1_server SSL서버 (TLS 1.0) ssh auth accept SSH 인증허용 reject SSH 인증거부 path PATH 웹소켓 URI의경로설정 0 웹소켓데이터형식 : 텍스트 (text) mode ws 1 웹소켓데이터형식 : 바이너리 (binary) proto PROTOCOL 웹소켓통신에서사용할프로토콜 origin ADDR 접근을허용할호스트의주소설정 표 5-1 설정가능한 TCP 항목 TCP Nagle 알고리즘은데이터를전송할때세그먼트의수를최소한으로줄여전송효율 높이기위한기능으로약간의지연시간이동반됩니다. 주의 : "set api" 명령으로설정하는항목들은 TCP0 ~ 3 에서만사용이가능합니다. 또한특정 TCP 의 api 모드가설정되면해당 TCP 는제품이리부팅되기전까지다른 api 모드로사용할수없습니다. - 22 - http://www.phpoc.com

5.3.2 SSL 사용 PHPoC 는 "set api ssl" 명령을이용해 SSL 서버또는클라이언트로동작시킬수있습니다. 다음은 SSL 서버설정예입니다. SSL 서버설정예 $port = 1470; $pid = pid_open("/mmap/tcp0"); pid_ioctl($pid, "set api ssl"); // 포트번호 // 0 번 TCP 열기 // SSL 사용 pid_ioctl($pid, "set ssl method tls1_server"); // SSL 서버 (TLS 1.0) 설정 pid_bind($pid, "", $port); pid_listen($pid); // 바인딩 // TCP 수동접속대기 do $state = pid_ioctl($pid, "get state"); while(($state!= SSL_CLOSED) && ($state!= SSL_CONNECTED)); if($state == SSL_CONNECTED) { echo "Connection has been established!\r\n"; } pid_close($pid); // TCP 접속종료 PHPoC 를 SSL 서버로사용할때제품에인증서가저장되어있어야합니다. 인증서는 PHPoC Debugger 를통해생성하거나저장할수있습니다. 다음예제는 PHPoC 를 SSL 클라이언트로설정하는예입니다. SSL 클라이언트설정예 $addr = "10.1.0.2"; $port = 1470; $pid = pid_open("/mmap/tcp0"); pid_ioctl($pid, "set api ssl"); pid_ioctl($pid, "set ssl method tls1_client"); pid_connect($pid, $addr, $port); // 서버 IP 주소 // 포트번호 // 0 번 TCP 열기 // SSL 사용 // SSL 서버 (TLS 1.0) 설정 // TCP 능동접속시도 do $state = pid_ioctl($pid, "get state"); while(($state!= SSL_CLOSED) && ($state!= SSL_CONNECTED)); if($state == SSL_CONNECTED) { echo "Connection has been established!\r\n"; } pid_close($pid); // TCP 접속종료 PHPoC 의메모리사용량이늘어나면 SSL 통신을위한메모리공간이확보되지못해 SSL 동작이원활하지않거나불가능할수있습니다. - 23 - http://www.phpoc.com

5.3.3 TELNET 서버사용 PHPoC 를 "set api telnet" 명령을이용해 TELNET 서버로동작시킬수있습니다. 다음은 TELNET 서버설정예입니다. TELNET 서버설정예 $port = 23; $pid = pid_open("/mmap/tcp0"); pid_ioctl($pid, "set api telnet"); pid_bind($pid, "", $port); pid_listen($pid); // 포트번호 // 0 번 TCP 열기 // TELNET 사용 // 바인딩 // TCP 수동접속대기 do $state = pid_ioctl($pid, "get state"); while(($state!= TCP_CLOSED) && ($state!= TCP_CONNECTED)); if($state == TCP_CONNECTED) { pid_send($pid, "Welcome to PHPoC TELNET server\r\n"); echo "Connection has been established!\r\n"; } pid_close($pid); // TCP 접속종료 위예제에서 PHPoC 는 23 번포트로접속을대기하다가 TELNET 클라이언트가접속하면 환영메시지를송신하고접속을종료합니다. - 24 - http://www.phpoc.com

5.3.4 SSH 서버사용 PHPoC를 "set api ssh" 명령을이용해 SSH 서버로동작시킬수있습니다. 다음은 SSH 서버설정예입니다. SSH 서버설정예 $port = 22; // 포트번호 $pid = pid_open("/mmap/tcp0"); pid_ioctl($pid, "set api ssh"); pid_bind($pid, "", $port); pid_listen($pid); // 0 번 TCP 열기 // SSH 사용 // 바인딩 // TCP 수동접속대기 while(1) { $state = pid_ioctl($pid, "get state"); if($state == SSH_AUTH) { $username = pid_ioctl($pid, "get ssh username"); $password = pid_ioctl($pid, "get ssh password"); echo "$username / $password\r\n"; pid_ioctl($pid, "set ssh auth accept"); } if($state == SSH_CONNECTED) { pid_send($pid, "Welcome to PHPoC SSH server\r\n"); echo "Connection has been established!\r\n"; pid_close($pid); break; } } 위예제에서 PHPoC 는 22 번포트로접속을대기하다가 SSH 클라이언트가접속하면 사용자이름과암호를출력하여인증을허용합니다. 그리고는환영메시지를송신하고 접속을종료합니다. SSH 의사용자아이디및암호확인과정은 PHPoC 스크립트에서처리해야합니다. - 25 - http://www.phpoc.com

5.3.5 웹소켓서버사용 PHPoC를 "set api ws" 명령을이용해웹소켓서버로동작시킬수있습니다. 다음은웹소켓서버설정예입니다. 웹소켓서버설정예이예제는웹소켓이접속되고클라이언트로부터데이터를수신하면수신한데이터를출력한뒤응답횟수를송신합니다. $pid = pid_open("/mmap/tcp0"); // 0번 TCP 열기 pid_ioctl($pid, "set api ws"); // 웹소켓설정 pid_ioctl($pid, "set ws path test"); // URI 경로 : /test pid_ioctl($pid, "set ws mode 0"); // 전송모드 : 텍스트 pid_ioctl($pid, "set ws origin 10.1.0.1"); // 접근허용호스트 : 10.1.0.1 pid_ioctl($pid, "set ws proto myproto"); // 프로토콜 : myproto pid_bind($pid, "", 0); // 바인딩 : 기본포트 (80) $rwbuf = ""; $count = 1; while(1) { if(pid_ioctl($pid, "get state") == TCP_CLOSED) pid_listen($pid); // TCP 접속대기 $rlen = pid_ioctl($pid, "get rxlen"); if($rlen) { pid_recv($pid, $rwbuf); echo "$rwbuf\r\n"; pid_send($pid, "echo reply $count"); $count++; } } pid_close($pid); // 데이터송신 웹소켓서버와제품기본웹서버기능 (index.php) 을활용하면보다더효율적인웹인터페이스를구현할수있습니다. 웹소켓을사용하기위해서는반드시웹소켓을지원하는웹브라우저를사용하시기바랍니다. - 26 - http://www.phpoc.com

5.4 TCP 접속 5.4.1 TCP 클라이언트 ( 능동접속 ) 능동접속은접속을대기하고있는 TCP서버로접속을시도하는것을의미하며능동접속호스트를 TCP클라이언트라고합니다. 능동접속을위해서는 pid_connect함수를사용해야합니다. pid_connect($pid, $addr, $port); 여기서 $addr 은접속할 TCP 서버의 IP 주소를, $port 는 TCP 포트번호를의미합니다. TCP 클라이언트사용예 $pid = pid_open("/mmap/tcp0"); $addr = "10.1.0.2"; $port = 1470; pid_connect($pid, $addr, $port); sleep(25); pid_close($pid); // 0번 TCP 열기 // 서버 IP주소 // TCP포트 // TCP능동접속시도 5.4.2 TCP 서버 ( 수동접속 ) 수동접속은 TCP클라이언트의접속을대기하고있는것을의미하며수동접속호스트를 TCP서버라고합니다. 수동접속을위해서는 pid_bind함수와 pid_listen함수를사용해야합니다. pid_bind($pid, "", $port); pid_listen($pid[, $backlog]); 여기서 $port 는접속을대기할 TCP 포트번호를의미합니다. TCP 서버사용예 $pid = pid_open("/mmap/tcp0"); $port = 1470; pid_bind($pid, "", $port); pid_listen($pid); sleep(25); pid_close($pid); // 0번 TCP 열기 // TCP포트 // 바인딩 // TCP수동접속대기 - 27 - http://www.phpoc.com

5.5 TCP 상태정보확인 pid_ioctl 함수의 get 명령어로 TCP 의각종상태를확인할수있습니다. $return = pid_ioctl($pid, "get ITEM"); 5.5.1 확인가능한 TCP 상태정보 ITEM 설명 반환값 반환형식 state TCP 세션상태 - 접속끊김 TCP_CLOSED 정수 TCP 세션상태 - 접속완료 TCP_CONNECTED 정수 TCP 세션상태 - 접속대기 TCP_LISTEN 정수 SSL 세션상태 - 접속끊김 SSL_CLOSED 정수 SSL 세션상태 - 접속완료 SSL_CONNECTED 정수 SSL 세션상태 - 접속대기 SSL_LISTEN 정수 SSH 세션상태 - 접속끊김 SSH_CLOSED 정수 SSH 세션상태 - 접속완료 SSH_CONNECTED 정수 SSH 세션상태 - 접속대기 SSH_LISTEN 정수 SSH 세션상태 - 인증완료 SSH_AUTH 정수 srcaddr 장치의로컬 IP주소 예 ) 192.168.0.1 문자열 srcport 장치의로컬 TCP 포트번호 예 ) 1470 정수 dstaddr TCP통신상대방의 IP주소 예 ) 192.168.0.2 문자열 dstport TCP통신상대방의포트번호 예 ) 1470 정수 txbuf 송신버퍼크기 [Byte] 예 ) 1152 정수 txfree 송신버퍼여유공간 [Byte] 예 ) 1152 정수 rxbuf 수신버퍼크기 [Byte] 예 ) 1068 정수 rxlen 수신데이터량 [Byte] 예 ) 200 정수 ssh username SSH 아이디 예 ) user 문자열 ssh password SSH 비밀번호 예 ) password 문자열 표 5-2 확인가능한 TCP 상태정보 - 28 - http://www.phpoc.com

5.5.2 TCP 세션상태 TCP는접속과정이후에데이터통신을하므로 TCP세션의상태를확인하는것은매우중요합니다. 상태값은접속이되지않았거나이미끊긴상태를나타내는 TCP_CLOSED, 접속이완료된상태인 TCP_CONNECTED, TCP서버로서접속을대기하고있는상태인 TCP_LISTEN의세가지입니다. SSL과 SSH도마찬가지로접속안됨, 접속완료및접속대기의세가지상태가있으며 SSH는인증 (SSH_AUTH) 상태가하나더있습니다. 모든세션의상태는다음과같이확인할수있습니다. $state = pid_ioctl($pid, "get state"); TCP, SSL 또는 SSH접속을시도하는중이거나종료하는중일때세션의상태정보를확인하는경우위표에나온값들이외의값들이반환될수있습니다. 이값들은펌웨어내부적으로만사용되는상수이며향후변경의소지가있으므로사용자는프로그래밍에사용하지마십시오. 5.5.3 송신버퍼에남아있는데이터크기 TCP 송신버퍼에남아있는데이터크기는다음과같이계산할수있습니다. 송신버퍼에남아있는데이터크기 = 송신버퍼크기 - 송신버퍼여유공간 사용예 이예제는 TCP 접속후 8 바이트를전송하고 TCP 송신버퍼에남아있는데이터크기를 계산하여출력합니다. $tx_len = -1; $pid = pid_open("/mmap/tcp0"); do { // 0 번 TCP 열기 pid_connect($pid, "10.1.0.2", 1470); // TCP 능동접속 usleep(500000); } while(pid_ioctl($pid, "get state")!= TCP_CONNECTED); pid_send($pid, "01234567"); // 8 바이트전송 while($tx_len && (pid_ioctl($pid, "get state") == TCP_CONNECTED)) { } $txbuf = pid_ioctl($pid, "get txbuf"); // 송신버퍼크기확인 $txfree = pid_ioctl($pid, "get txfree"); // 송신버퍼여유공간확인 $tx_len = $txbuf - $txfree; echo "tx len = $tx_len\r\n"; usleep(10000); pid_close($pid); // 송신버퍼에남아있는데이터크기확인 // 송신버퍼에남아있는데이터크기출력 // TCP 종료 - 29 - http://www.phpoc.com

5.5.4 수신데이터크기 TCP 에서수신한데이터크기는다음과같이확인할수있습니다. $rxlen = pid_ioctl($pid, "get rxlen[ $string]"); 특정문자 ( 열 ) 까지수신한데이터크기확인하기 rxlen명령어뒤에특정문자열 ($string) 을입력하면 pid_ioctl함수는해당문자열이들어오기전까지는 0을반환하다가해당문자열이들어오면그문자열까지의수신데이터크기를반환합니다. 5.5.5 수신버퍼여유공간 TCP 수신버퍼여유공간은다음과같이계산할수있습니다. 수신버퍼여유공간 = 수신버퍼크기 - 수신데이터크기 사용예 이예제는 TCP 접속후수신버퍼의여유공간을계산하여출력합니다. $rx_free = 1068; $pid = pid_open("/mmap/tcp0"); do { // 0 번 TCP 열기 pid_connect($pid, "10.1.0.2", 1470); // TCP 능동접속 usleep(500000); } while(pid_ioctl($pid, "get state")!= TCP_CONNECTED); while(($rx_free > 500) && (pid_ioctl($pid, "get state") == TCP_CONNECTED)) { } $rxbuf = pid_ioctl($pid, "get rxbuf"); $rxlen = pid_ioctl($pid, "get rxlen"); $rx_free = $rxbuf - $rxlen; echo "rx free = $rx_free\r\n"; sleep(1); pid_close($pid); // 수신버퍼크기확인 // 수신데이터크기확인 // 수신버퍼여유공간확인 // 수신버퍼여유공간출력 // TCP 종료 - 30 - http://www.phpoc.com

5.6 TCP 데이터통신 5.6.1 TCP 데이터수신 네트워크로부터들어온 TCP 데이터는수신버퍼에저장됩니다. 이수신버퍼에저장된 값을 pid_recv 함수로읽습니다. pid_recv 함수는다음과같이사용합니다. 그림 5-2 TCP 데이터수신 pid_recv($pid, $value[, $len]); 사용예 이예제는매초마다 TCP 로수신되는데이터를확인하고출력합니다. $rdata = ""; $pid = pid_open("/mmap/tcp0"); pid_connect($pid, "10.1.0.2", 1470); do { sleep(1); $state = pid_ioctl($pid, "get state"); $rxlen = pid_ioctl($pid, "get rxlen"); // 0 번 TCP 열기 // TCP 접속 // TCP 세션상태확인 // 수신데이터크기확인 $rlen = pid_recv($pid, $rdata, $rxlen); // 데이터읽기 echo "rlen = $rlen / "; echo "rdata = $rdata\r\n"; if($rlen) $rdata = ""; } while($state == TCP_CONNECTED); pid_close($pid); // 읽은데이터크기출력 // 읽은데이터출력 // 수신버퍼초기화 - 31 - http://www.phpoc.com

5.6.2 TCP 데이터송신 pid_send 함수를이용해송신한데이터는송신버퍼에저장되었다가네트워크로 전송됩니다. pid_send 함수는다음과같이사용합니다. 그림 5-3 TCP 데이터송신 pid_send($pid, $value[, $len]); 사용예 이예제는송신버퍼의여유공간을확인하여 TCP 로데이터를송신합니다. $sdata = "0123456789"; $pid = pid_open("/mmap/tcp0"); pid_connect($pid, "10.1.0.2", 1470); do { sleep(1); $state = pid_ioctl($pid, "get state"); $txfree = pid_ioctl($pid, "get txfree"); // 0 번 TCP 열기 // TCP 접속 // TCP 세션상태확인 // 버퍼여유공간확인 $tx_len = pid_send($pid, $sdata, $txfree); // 데이터송신 echo "tx len = $tx_len\r\n"; } while($state == TCP_CONNECTED); pid_close($pid); // 송신한데이터크기출력 위코드에서 pid_send 함수의세번째인수는송신할데이터의크기를의미합니다. 송신 데이터크기가송신버퍼의여유공간보다크면데이터가유실될수있습니다. 따라서항상 버퍼여유공간을확인한후그값또는그이하로쓰기데이터크기를설정하는것을 권장합니다. - 32 - http://www.phpoc.com

UDP UDP 는 TCP 와달리접속과정이없어데이터의신뢰성이보장되지않지만, 프로토콜 헤더가단순하고속도가빠르다는특징이있습니다. 6.1 사용절차 일반적인 UDP 사용절차는다음과같습니다. 그림 6-1 UDP 사용절차 UDP 데이터를송신만하거나 UDP 설정을하지않는경우에는바인딩과정을생략할 수있습니다. 6.2 UDP 열기 UDP 를열기위해서는 pid_open 함수를사용합니다. $pid = pid_open("/mmap/udp0"); // 0 번 UDP 열기 제품별 UDP 에관한자세한내용은부록을참조하시기바랍니다. - 33 - http://www.phpoc.com

6.3 UDP 바인딩 UDP데이터를수신하거나 pid_ioctl함수로수신 IP주소또는포트번호를설정하기위해서는 pid_bind함수를사용하는바인딩과정이필요합니다. $pid = pid_bind($pid, $addr, $port); $addr은바인딩할 IP주소이고 $port는바인딩할 UDP포트번호입니다. 바인딩할 IP주소에빈문자열 ("") 을설정하면현재 PHPoC에설정된 IP주소로자동설정됩니다. 바인딩할 IP 주소는빈문자열 ("") 이외의값을설정할수없습니다. UDP 바인딩예 $pid = pid_open("/mmap/udp0"); $port = 1470; pid_bind($pid, "", $port); // 0 번 UDP 열기 // UDP 포트번호 // 바인딩 6.4 UDP 설정 UDP를사용하기전에수신 IP주소와 UDP포트번호를미리설정할수있습니다. 이설정을해놓으면 pid_sendto함수로데이터를송신할때 4번째와 5번째인자를생략할수있습니다. 설정을위해서는 pid_ioctl함수의 set명령을사용합니다. pid_ioctl($pid, "set ITEM VALUE"); ITEM 은설정항목을, VALUE 는항목에대한값을나타냅니다. 6.4.1 설정가능한 UDP 항목 ITEM VALUE 설명 dstaddr 예 ) 10.1.0.2 UDP통신상대방의 IP주소 dstport 예 ) 1470 UDP통신상대방의포트번호 표 6-1 설정가능한 UDP 항목 UDP 설정예 $pid = pid_open("/mmap/udp0"); pid_bind($pid, "", 1470); pid_ioctl($pid, "set dstaddr 10.1.0.2"); pid_ioctl($pid, "set dstport 1470"); // 0번 UDP 열기 // 바인딩 // 통신상대방 IP주소설정 // 통신상대방포트번호설정 - 34 - http://www.phpoc.com

6.5 UDP 상태정보확인 pid_ioctl 함수의 get 명령어로 UDP 의각종상태를확인할수있습니다. $return = pid_ioctl($pid, "get ITEM"); 6.5.1 확인가능한 UDP 상태정보 ITEM 설명 반환값 반환형식 srcaddr UDP통신 - 송신 IP주소 예 ) 192.168.0.1 문자열 srcport UDP통신 - 송신포트번호 예 ) 1470 정수 dstaddr UDP통신 - 수신 IP주소 예 ) 192.168.0.2 문자열 dstport UDP통신 - 수신포트번호 예 ) 1470 정수 rxlen 수신데이터량 [Byte] 예 ) 200 정수 표 6-2 확인가능한 UDP 상태정보 6.5.2 수신데이터크기확인 UDP 수신데이터크기는 pid_ioctl 함수의 "get rxlen" 로확인할수있습니다. $rxlen = pid_ioctl($pid, "get rxlen"); 사용예 이예제는 PHPoC 장치가 UDP 수신데이터크기를반복적으로확인하다가수신데이터가 있으면데이터크기를콘솔로출력하고스크립트를종료합니다. $rbuf = ""; $pid = pid_open("/mmap/udp0"); pid_bind($pid, "", 1470); do { $rxlen = pid_ioctl($pid, "get rxlen"); if($rxlen) { // 0 번 UDP 열기 // 바인딩 // 수신데이터크기확인 pid_recvfrom($pid, $rbuf, $rxlen); // 데이터수신 echo "$rxlen bytes\r\n"; } usleep(100000); }while($rxlen == 0); pid_close($pid); // 수신데이터크기출력 // 수신데이터가없는동안반복 - 35 - http://www.phpoc.com

6.6 UDP 데이터통신 6.6.1 데이터수신 UDP 데이터를수신하기위해서는 pid_recvfrom 함수를사용합니다. UDP 수신버퍼는 2 개 이며, 다음과같이동작합니다. 제품별 UDP 수신버퍼의크기는부록을참조하시기바랍니다. 네트워크로부터데이터수신 수신버퍼에저장된데이터읽기 그림 6-2 네트워크로부터데이터수신 pid_recvfrom 함수를호출하면수신버퍼에저장된데이터를읽고, 버퍼를비웁니다. 그림 6-3 수신버퍼에저장된데이터읽기 수신버퍼에저장된데이터의크기보다작은길이만큼읽은경우 수신버퍼에읽고남은데이터는버퍼를비움과동시에유실됩니다. 그림 6-4 수신버퍼에읽고남은데이터가있을경우 - 36 - http://www.phpoc.com

두개의수신버퍼에모두데이터가있는경우두개의수신버퍼에모두데이터가있는경우수신버퍼가비워지기전까지는다음에들어오는데이터가모두유실됩니다. 따라서항상수신버퍼를확인하여데이터가있으면바로데이터를읽도록프로그래밍하는것을권장합니다. 그림 6-5 두개의수신버퍼에모두데이터가있는경우 사용예이예제는 UDP 수신데이터크기를계속확인하여수신데이터가있으면데이터를출력합니다. $rbuf = ""; $pid = pid_open("/mmap/udp0"); pid_bind($pid, "", 1470); do { }while(1) $rxlen = pid_ioctl($pid, "get rxlen"); if($rxlen) { pid_recvfrom($pid, $rbuf, $rxlen); echo "$rbuf\r\n"; } usleep(100000); // 0번 UDP 열기 // 바인딩 // 수신데이터크기확인 // 데이터수신 // 수신데이터출력 // 무한루프 6.6.2 데이터송신 UDP 데이터를송신하기위해서는 pid_sendto 함수를사용합니다. UDP 데이터송신예 $sdata = "01234567"; $pid = pid_open("/mmap/udp0"); // 0번 UDP 열기 $slen = pid_sendto($pid, $sdata, 8, 0, "10.1.0.2", 1470); // 데이터송신 echo "slen = $slen\r\n"; // 송신한데이터크기출력 pid_close($pid); - 37 - http://www.phpoc.com

ST PHPoC 는소프트웨어타이머디바이스 ST 를제공합니다. 7.1 사용절차 일반적인 ST 사용절차는다음과같습니다. 그림 7-1 ST 사용절차 7.2 ST 열기 ST 를열기위해서는 pid_open 함수를사용합니다. $pid = pid_open("/mmap/st0"); // 0 번 ST 열기 제품별제공되는 ST 에대한정보는부록을참조하시기바랍니다. 7.3 ST 설정및사용 ST 를설정하거나사용하기위해서는 pid_ioctl 함수를사용해야합니다. ST 는사용형태에 따라다음 4 가지동작모드를제공합니다. 모드프리모드펄스출력모드토글출력모드 PWM출력모드 설명일반적인카운터모드특정핀으로펄스신호를출력하기위한모드특정핀으로토글신호를출력하기위한모드무한펄스출력모드표 7-1 ST 동작모드 - 38 - http://www.phpoc.com

7.3.1 공통명령어 다음명령어들은모드와상관없이공통적으로사용됩니다. 명령어 하위명령어 설명 free 모드설정 : 프리모드 mode pulse 모드설정 : 펄스출력모드 output toggle 모드설정 : 토글출력모드 set pwm 모드설정 : PWM출력모드 sec 단위설정 : 초 div ms 단위설정 : 밀리초 us 단위설정 : 마이크로초 reset - 초기화 get state 상태읽기 start - 시작 stop - 정지표 7-2 공통명령어 모드설정 ST는일반적인카운터모드인프리모드와신호를출력하는출력모드를지원합니다. 출력모드에는 토글출력모드, 펄스출력모드 및 PWM출력모드가 있습니다. PWM출력모드는출력횟수가무한대인펄스출력모드입니다. 모드설정초기값은프리모드이며, 각각의모드설정방법은다음과같습니다. 구분프리모드펄스출력모드토글출력모드 PWM출력모드 문법 pid_ioctl($pid, "set mode free"); pid_ioctl($pid, "set mode output pulse"); pid_ioctl($pid, "set mode output toggle"); pid_ioctl($pid, "set mode output pwm"); 표 7-3 모드설정 단위설정 ST 의단위는다음세가지로설정할수있습니다. 초기값은밀리초입니다. 구분초밀리초마이크로초 문법 pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set div ms"); pid_ioctl($pid, "set div us""); 표 7-4 단위설정 - 39 - http://www.phpoc.com

초기화 "reset" 명령어는 ST 의동작을그즉시중단하고초기화합니다. 구분 초기화 문법 pid_ioctl($pid, "reset"); 표 7-5 초기화 상태읽기 "get state" 명령어는 ST 의상태를읽는명령어입니다. 구분 상태읽기 문법 pid_ioctl($pid, "get state"); 표 7-6 상태읽기 이명령어에의한반환값은다음과같습니다. 반환값 상태 0 정지 1 ~ 5 동작중 표 7-7 상태읽기반환값 시작 ST 를시작시키기위해서는 "start" 명령을사용합니다. 구분 시작 문법 pid_ioctl($pid, "start"); 표 7-8 시작 정지 ST 를정지시키기위해서는 "stop" 명령을사용합니다. 출력모드에서 ST 를정지시키면 출력핀의상태는정지시점의상태를유지합니다. 구분 정지 문법 pid_ioctl($pid, "stop"); 표 7-9 정지 - 40 - http://www.phpoc.com

7.3.2 프리모드 프리모드는 ST 를일반적인카운터로동작시키는모드입니다. 그림 7-2 프리모드블록도 프리모드에서사용가능한 pid_ioctl함수의명령어는다음과같습니다. 명령어 하위명령어 설명 mode free 모드설정 : 프리모드 sec 단위설정 : 초 div ms 단위설정 : 밀리초 set us 단위설정 : 마이크로초 dir up 업카운터로설정 down 다운카운터로설정 count [T] 다운카운터초기값을 [T] 로설정 reset - 초기화 get count 카운트값읽기 state 상태읽기 start - 시작 stop - 정지표 7-10 프리모드명령어 카운터종류설정 ST의카운터종류는업카운터또는다운카운터로설정할수있습니다. 초기값은 업카운터입니다. 구분 업카운터 (UP) 다운카운터 (DOWN) 문법 pid_ioctl($pid, "set dir up"); pid_ioctl($pid, "set dir down"); 표 7-11 카운터종류설정 - 41 - http://www.phpoc.com

카운트값설정 프리모드에서는다운카운터로설정했을때카운터의초기값을설정합니다. 카운트 설정방법은다음과같습니다. 구분 프리모드 문법 pid_ioctl($pid, "set count T"); 표 7-12 카운트설정 만약업카운터일때 T를설정하면해당값은반영되지않습니다. 즉, 업카운터일때타이머초기값은항상 0입니다. 다운카운터에서설정가능한 T의범위는다음과같습니다. 구분 T 설정범위프리모드 0 ~ (2의 64제곱 - 1) 표 7-13 설정가능한카운트값의범위 카운트값읽기 "get count" 명령어는 ST의현재카운트값을읽는명령어입니다. 구분 프리모드 문법 pid_ioctl($pid, "get count"); 표 7-14 카운트읽기 - 42 - http://www.phpoc.com

7.3.3 프리모드사용예 프리모드에서의 ST값은 pid_ioctl함수의 "get count" 명령으로읽을수있으며이값은타이머가가동된시점부터값을읽는시점까지소요된시간을의미합니다. $tick = pid_ioctl($pid, "get count"); 업카운터 이예제는 ST 를업카운터로설정하고약 1 초마다 ST 값을읽어와출력합니다. $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set mode free"); pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set dir up"); pid_ioctl($pid, "start"); for($i=0; $i<10; $i++) { // 0 번 ST 열기 // 프리모드설정 // 단위설정 : 초 // 업카운터설정 // ST 시작 $value = pid_ioctl($pid, "get count"); // 카운트값읽기 echo "$value\r\n"; sleep(1); } pid_close($pid); 다운카운터 // 카운트값출력 이예제는 ST 를다운카운터로설정하고초기값을 10 초로하여약 1 초마다 ST 값을 읽어와출력합니다. $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set mode free"); pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set dir down"); pid_ioctl($pid, "set count 10"); pid_ioctl($pid, "start"); for($i = 0; $i < 10; $i++) { // 0 번 ST 열기 // 프리모드설정 // 단위설정 : 초 // 다운카운터설정 // 카운트값을 10 으로초기화 // ST 시작 $value = pid_ioctl($pid, "get count"); // 카운트값읽기 echo "$value\r\n"; sleep(1); } pid_close($pid); // 카운트값출력 - 43 - http://www.phpoc.com

7.3.4 토글출력모드 토글출력모드는지정된핀으로토글신호를출력하는모드입니다. 그림 7-3 토글출력모드블록도 토글출력모드에서사용가능한명령어는다음과같습니다. 명령어 하위명령어 설명 mode output toggle 모드설정 : 토글출력모드 sec 단위설정 : 초 div ms 단위설정 : 밀리초 us 단위설정 : 마이크로초 low LOW 출력 high HIGH 출력 output dev io3/io4 #pin 출력핀설정 : io3/io4의 #pin set 0 정상 ( 비반전 ) 출력 invert 1 반전출력 count [T1] [T8] 출력타이밍설정 delay [D] 출력지연시간설정 repc [N] 출력횟수설정 trigger from st# 트리거대상설정 : st0 ~ st7 php 트리거대상설정 : 없음 reset - 초기화 get state 상태읽기 repc 남은출력횟수읽기 start - 시작 stop - 정지표 7-15 토글출력모드명령어 - 44 - http://www.phpoc.com

출력설정 ST 의출력설정은다음과같은항목들이있습니다. 구분출력핀 HIGH출력 LOW출력반전출력 문법 pid_ioctl($pid, "set output dev io3 0"); // io3의 0번핀 pid_ioctl($pid, "set output high"); pid_ioctl($pid, "set output low"); pid_ioctl($pid, "set output invert 0"); // 정상출력 pid_ioctl($pid, "set output invert 1"); // 반전출력표 7-16 출력설정 모든출력명령은명령어실행과동시에출력핀에반영됩니다. 지연시간설정출력모드에서는출력전지연시간을줄수있습니다. 지연시간설정단위는 "set div" 명령에의한단위가사용됩니다. 지연시간설정방법은다음과같습니다. 구분 지연시간 문법 pid_ioctl($pid, "set delay D"); 표 7-17 지연시간설정 반복횟수설정출력모드에서는출력신호의반복횟수를설정할수있습니다. 설정가능한 N의범위는 0 ~ 1,000,000,000(10억 ) 입니다. 기본값은 0이며 0은최대반복횟수인 10억을의미합니다. 구분 반복횟수 문법 pid_ioctl($pid, "set repc N"); 표 7-18 반복횟수설정 카운트값설정카운트값설정은출력타이밍을조정하기위해사용합니다. 토글출력모드에서는카운트값을최소 1개에서최대 8개까지설정할수있습니다. 설정방법은다음과같습니다. 구분 토글출력모드 문법 pid_ioctl($pid, "set count T1 T2 T8"); 표 7-19 카운트값설정 - 45 - http://www.phpoc.com

토글출력모드에서가능한카운트값의범위는다음과같습니다. 단위설정가능범위 (10μs ~ 30분 ) 마이크로초 10 ~ 1,800,000,000 밀리초 1 ~ 1,800,000 초 1 ~ 1,800 표 7-20 설정가능한카운트값의범위지연시간이 D이고카운트값을하나 (T1) 만설정할때의타이밍은다음과같습니다. 그림 7-4 토글출력모드에서 T1 타이밍 (LOW -> HIGH) 그림 7-5 토글출력모드에서 T1 타이밍 (HIGH -> LOW) - 46 - http://www.phpoc.com

토글출력모드에서카운트값을 2개이상설정하면이값들은출력시점마다순서대로사용됩니다. 만약반복횟수가설정한카운트값의수보다많으면다시첫번째값부터순서대로사용됩니다. 반복횟수가 4이고지연시간이 D일때 3개의값 (T1 ~ T3) 을설정하는경우의타이밍은다음과같습니다. 그림 7-6 토글출력모드에서 T1, T2 및 T3 타이밍 트리거설정트리거는 ST를출력모드로사용할때시작시점을동기화하기위해사용합니다. 이때 ST의시작시점은트리거대상과동기화되며트리거대상은또다른 ST만설정이가능합니다. ST의트리거설정방법은다음과같습니다. 구분 ST(st0/1 ) php 문법 pid_ioctl($pid, "set trigger from st0"); pid_ioctl($pid, "set trigger from php"); 표 7-21 트리거설정 ST의트리거설정기본값은 " 대상없음 (php)" 입니다. 남은출력횟수읽기 "get repc" 명령어는 ST의남은출력횟수를확인하는명령어입니다. 구분 남은출력횟수 문법 pid_ioctl($pid, "get repc"); 표 7-22 남은출력횟수읽기 - 47 - http://www.phpoc.com

7.3.5 토글출력모드사용예 토글출력모드는 ST 의출력신호를반전시키는모드입니다. 토글출력모드사용 $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set mode output toggle"); pid_ioctl($pid, "set output dev io3 0"); // 0 번 ST 열기 // 단위설정 : 초 // 토글출력모드설정 // 출력핀설정 : io3 의 0 번 pid_ioctl($pid, "set repc 1"); // 출력횟수설정 : 1 pid_ioctl($pid, "set count 1"); // 카운트값설정 : 1 pid_ioctl($pid, "start"); while(pid_ioctl($pid, "get state")); pid_close($pid); // ST 시작 toggle 모드에서의 "set count" 는 ST 의시작시점부터토글신호를내보내는시점까지의 시간을의미합니다. 위예제를실행했을때 ST 의출력결과는다음과같습니다. 그림 7-7 토글출력모드예 - 48 - http://www.phpoc.com

반복적토글출력모드 $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set mode output toggle"); pid_ioctl($pid, "set output dev io3 0"); // 0 번 ST 열기 // 단위설정 : 초 // 토글출력모드설정 // 출력핀설정 : io3 의 0 번핀 pid_ioctl($pid, "set repc 3"); // 출력횟수설정 : 3 pid_ioctl($pid, "set count 1 2 1"); // 카운트값설정 : 1, 2, 1 pid_ioctl($pid, "start"); while(pid_ioctl($pid, "get state")); pid_close($pid); // ST 시작 위예제에서는 "set repc" 명령어로토글출력횟수를 3 회로설정하고토글출력 타이밍을위해 "set count" 로 T1, T2 및 T3 를각각 1, 2 그리고 1 초로설정했습니다. 위예제를실행했을때 ST 출력결과는다음과같습니다. 그림 7-8 반복적토글출력모드 - 49 - http://www.phpoc.com

7.3.6 펄스출력모드 펄스출력모드는구형파 ( 펄스 ) 를출력하는모드입니다. 그림 7-9 펄스출력모드블록도 펄스출력모드에서사용가능한명령어는다음과같습니다. 명령어 하위명령어 설명 mode output pulse 모드설정 : 펄스출력모드 sec 단위설정 : 초 div ms 단위설정 : 밀리초 us 단위설정 : 마이크로초 low LOW 출력 high HIGH 출력 output dev io3/4 #pin 출력핀설정 : io3/4의 #pin set 0 정상 ( 비반전 ) 출력 invert 1 반전출력 count [T1] [T2] 출력타이밍설정 delay [D] 출력지연시간설정 repc [N] 출력횟수설정 trigger from st# 트리거대상설정 : st0 ~ st7 php 트리거대상설정 : 없음 reset - 초기화 get state 상태읽기 repc 남은출력횟수읽기 start - 시작 stop - 정지표 7-23 펄스출력모드명령어 - 50 - http://www.phpoc.com

출력설정 ST 의출력설정은출력모드에서사용이가능하며다음과같은항목들이있습니다. 구분출력핀 HIGH출력 LOW출력반전출력 문법 pid_ioctl($pid, "set output dev io3 0"); // io3의 0번핀 pid_ioctl($pid, "set output high"); pid_ioctl($pid, "set output low"); pid_ioctl($pid, "set output invert 1"); // 반전출력 pid_ioctl($pid, "set output invert 0"); // 정상출력표 7-24 출력설정 모든출력명령은명령어실행과동시에출력핀에반영됩니다. 지연시간설정출력모드에서는출력전지연시간을줄수있습니다. 지연시간설정단위는 "set div" 명령에의한단위가사용됩니다. 지연시간설정방법은다음과같습니다. 구분 지연시간 문법 pid_ioctl($pid, "set delay D"); 표 7-25 지연시간설정 반복횟수설정 출력모드에서는출력신호의반복횟수를설정할수있습니다. 설정가능한 N 의 범위는 0 ~ 10 억입니다. 기본값은 0 이며 0 은최대반복횟수인 10 억을의미합니다. 구분 반복횟수 문법 pid_ioctl($pid, "set repc N"); 표 7-26 반복횟수설정 - 51 - http://www.phpoc.com

카운트값설정 카운트값은출력타이밍을조정하기위해설정합니다. 펄스출력모드에서카운트값 설정방법은다음과같습니다. 구분 카운트설정 문법 pid_ioctl($pid, "set count T1 T2"); 표 7-27 카운트값설정 펄스출력모드에서설정가능한카운트값의범위는다음과같습니다. 단위 카운트값설정가능범위 (0 ~ 30분 ) 마이크로초 0, 10 ~ 1,800,000,000 밀리초 0 ~ 1,800,000 초 0 ~ 1,800 표 7-28 설정가능한카운트값의범위 펄스출력모드에서는 두 가지 카운트 값 (T1과 T2) 의 설정이 필요합니다. 펄스출력모드에서반복횟수가 2이고지연시간이 D일때 T1과 T2의타이밍은다음과 같습니다. 여기서 D는지연시간을의미합니다. 반복횟수읽기 그림 7-10 펄스출력모드 T1, T2 타이밍 "get repc" 명령어는 ST 의남은출력횟수를확인하는명령어입니다. 구분 남은출력횟수 문법 pid_ioctl($pid, "get repc"); 표 7-29 반복횟수읽기 - 52 - http://www.phpoc.com

7.3.7 펄스출력모드사용예 펄스출력모드사용 (HIGH 펄스 ) $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set mode output pulse"); pid_ioctl($pid, "set output dev io3 0"); // 0번 ST 열기 // 단위설정 : 초 // 펄스출력모드설정 // 출력핀설정 : io3의 0번 pid_ioctl($pid, "set count 1 2"); // 카운트값설정 : 1, 2 pid_ioctl($pid, "set repc 1"); // 출력횟수설정 : 1 pid_ioctl($pid, "start"); while(pid_ioctl($pid, "get state")); pid_close($pid); // ST 시작 펄스출력모드의출력은기본적으로 HIGH 펄스입니다. HIGH 상태를유지하는시간은 설정단위와 "set count" 로설정하는 T1 과 T2 에의해결정됩니다. 위예제를실행했을 때 ST 출력결과는다음과같습니다. 그림 7-11 펄스출력모드 (HIGH 펄스 ) - 53 - http://www.phpoc.com

펄스출력모드사용 (LOW 펄스 ) $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set div sec"); pid_ioctl($pid, "set mode output pulse"); pid_ioctl($pid, "set output dev io3 0"); // 0번 ST 열기 // 단위설정 : 초 // 펄스출력모드설정 // 출력핀설정 : io3의 0번 pid_ioctl($pid, "set count 1 2"); // 카운트값설정 : 1, 2 pid_ioctl($pid, "set output invert 1"); // 출력반전 pid_ioctl($pid, "set repc 1"); // 출력횟수설정 : 1 pid_ioctl($pid, "start"); while(pid_ioctl($pid, "get state")); pid_close($pid); // ST 시작 "set output invert 1" 명령을수행하면이후의출력이반전됩니다. 펄스출력도반전이 되므로위예제를실행했을때 ST 의출력결과는다음과같습니다. 그림 7-12 펄스출력모드 (LOW 펄스 ) - 54 - http://www.phpoc.com

7.3.8 PWM 출력모드 PWM 출력모드는반복횟수가무한한펄스출력모드입니다. 따라서반복횟수와카운트 설정을제외하고모든사용방법은펄스출력모드와동일합니다. 그림 7-13 PWM출력모드블록도 PWM출력모드에서사용가능한명령어는다음과같습니다. 명령어하위명령어설명 mode output pwm 모드설정 : PWM출력모드 sec 단위설정 : 초 div ms 단위설정 : 밀리초 us 단위설정 : 마이크로초 low LOW 출력 high HIGH 출력 set output dev io3/4 #pin 출력핀설정 : io3/4의 #pin 0 정상 ( 비반전 ) 출력 invert 1 반전출력 count [T1] [T2] 출력타이밍설정 delay [D] 출력지연시간설정 trigger from reset - 초기화 get state 상태읽기 start - 시작 stop - 정지표 7-30 PWM출력모드명령어 st# 트리거대상설정 : st0 ~ st7 php 트리거대상설정 : 없음 - 55 - http://www.phpoc.com

카운트값설정 카운트값은출력타이밍을조정하기위해설정합니다. PWM 출력모드에서는두개의 카운트값설정이필요합니다. 카운트값설정방법은다음과같습니다. 구분 카운트값설정 문법 pid_ioctl($pid, "set count T1 T2"); 표 7-31 카운트값설정 PWM출력모드에서설정가능한카운트값의범위는다음과같습니다. 단위설정가능한카운트값 (0 ~ 30분 ) 마이크로초 0, 10 ~ 1,800,000,000 밀리초 0 ~ 1,800,000 초 0 ~ 1,800 표 7-32 설정가능한카운트값의범위 PWM출력모드에서지연시간이 D일때 T1과 T2의타이밍은다음과같습니다. 여기서 D는지연시간을의미합니다. 그림 7-14 PWM 출력모드 - 56 - http://www.phpoc.com

7.3.9 PWM 출력모드사용예 PWM 출력모드사용예 $pid = pid_open("/mmap/st0"); pid_ioctl($pid, "set div sec"); // 0 번 ST 열기 // 단위설정 : 초 pid_ioctl($pid, "set mode output pwm"); // PWM출력모드설정 pid_ioctl($pid, "set output dev io3 0"); // 출력핀설정 : io3의 0번 pid_ioctl($pid, "set count 1 1"); // 카운트값설정 : 1, 1 pid_ioctl($pid, "start"); // ST 시작 sleep(10); pid_ioctl($pid, "stop"); // ST 정지 pid_close($pid); 위예제를실행했을때 ST의출력결과는다음과같습니다. 그림 7-15 PWM 출력모드예 - 57 - http://www.phpoc.com

7.3.10 트리거 트리거명령은 ST의출력시점을또다른 ST와동기화시키고자할때사용합니다. 아래 예제는 ST1의출력시점을 ST0와동기화시키는예입니다. 트리거사용예 $pid0 = pid_open("/mmap/st0"); // 0번 ST 열기 pid_ioctl($pid0, "set div sec"); // 단위설정 : 초 pid_ioctl($pid0, "set mode output pulse"); // 펄스출력모드설정 pid_ioctl($pid0, "set count 1 1"); // 카운트값설정 : 1, 1 pid_ioctl($pid0, "set repc 2"); // 출력횟수설정 : 2 pid_ioctl($pid0, "set output dev io3 0"); // 출력핀설정 : io3의 0번 $pid1 = pid_open("/mmap/st1"); // 1번 ST 열기 pid_ioctl($pid1, "set div sec"); // 단위설정 : 초 pid_ioctl($pid1, "set mode output pulse"); // 펄스출력모드설정 pid_ioctl($pid1, "set trigger from st0"); // 트리거대상 ST 지정 : st0 pid_ioctl($pid1, "set count 1 1"); // 카운트값설정 : 1, 1 pid_ioctl($pid1, "set repc 2"); // 출력횟수설정 : 2 pid_ioctl($pid1, "set output dev io3 1"); // 출력핀설정 : io3의 1번 pid_ioctl($pid1, "start"); pid_ioctl($pid0, "start"); // 1 번 ST 시작 // 0 번 ST 시작 while(pid_ioctl($pid1, "get state")); pid_close($pid0); pid_close($pid1); 위예제에서보는바와같이, 출력을동기화시킬 ST 는트리거의대상이되는 ST 보다 반드시먼저가동되어야합니다. ST 의트리거오차 ST 는트리거오차가존재합니다. ST 의트리거오차범위는다음과같습니다. 구분 오차범위 2 개의타이머사용시약 1 μs 8 개의타이머사용시약 4 μs 표 7-33 트리거오차 - 58 - http://www.phpoc.com

부록 : 디바이스관련함수 PHPoC 는다음과같은디바이스사용관련내부함수를제공합니다. 함수이름 pid_bind pid_close pid_connect pid_ioctl pid_listen pid_open pid_read pid_recv pid_recvfrom pid_send pid_sendto pid_write 사용법 pid_bind(pid[, IP, PORT]); pid_close(pid); pid_connect(pid, IP, PORT); pid_ioctl(pid, COMMAND); pid_listen(pid, [BACKLOG]); pid_open(pid[, FLAG]); pid_read(pid, BUF[, LEN]); pid_recv(pid, BUF[, LEN, FLAG]); pid_recvfrom(pid, BUF[, LEN, FLAG, IP, PORT]); pid_send(pid, BUF[, LEN, FLAG]); pid_sendto(pid, BUF[, LEN, FLAG, IP, PORT]); pid_write(pid, BUF[, LEN]); 표 8-1 PHPoC 의디바이스관련내부함수 각함수에대한자세한내용은 PHPoC Internal Functions 문서를참조하시기 바랍니다. - 59 - http://www.phpoc.com

부록 : 디바이스정보 9.1 제품별디바이스개수 구분 PBH-101 PBH-104 PBH-204 UART 1 4 1 NET 2 2 2 TCP 5 5 5 UDP 5 5 5 Digital Input 0 0 4 I/O Digital Output 0 0 4 Digital Output(LED) 8 8 8 ST 8 8 8 표 9-1 제품별디바이스수 9.2 제품별디바이스파일경로 9.2.1 UART 구분 PBH-101, PBH-204 PBH-104 9.2.2 NET 파일경로 /mmap/uart0 /mmap/uart0 /mmap/uart1 /mmap/uart2 /mmap/uart3 표 9-2 UART 구분파일경로비고 PBH-101, PBH-104, PBH-204 9.2.3 TCP /mmap/net0 /mmap/net1 표 9-3 NET 유선랜 무선랜 구분 PBH-101, PBH-104, PBH-204 파일경로 /mmap/tcp0 /mmap/tcp1 /mmap/tcp2 /mmap/tcp3 /mmap/tcp4 표 9-4 TCP - 60 - http://www.phpoc.com

9.2.4 UDP 구분 파일경로 /mmap/udp0 PBH-101, PBH-104, PBH-204 /mmap/udp1 /mmap/udp2 /mmap/udp3 /mmap/udp4 표 9-5 UDP 9.2.5 I/O PBH-101 구분 파일경로및맵핑정보 /mmap/io3 LED PBH-101 /mmap/io4 UART Mode ( 시리얼 통신방식 ) 통신방식별설정예 구분 값 SET RS485 SET 422 RE SET RS422 RS232 0x05 0 1 0 1 RS422 0x02 0 0 1 0 RS485 0x0c 1 1 0 0 SET RS232 표 9-6 PBH-101 디지털 I/O - 61 - http://www.phpoc.com

PBH-104 구분 파일경로및맵핑정보 /mmap/io3 LED /mmap/io4 PBH-104 UART Mode ( 시리얼 통신방식 ) 통신방식별설정예 구분 값 SET SET SET SET RS485 422 RE RS422 RS232 RS232 0x05 0 1 0 1 RS422 0x02 0 0 1 0 RS485 0x0c 1 1 0 0 포트별설정예 구분 일괄설정 UART0 UART1 UART2 UART3 RS232 0x5555 0x0005 0x0050 0x0500 0x5000 RS422 0x2222 0x0002 0x0020 0x0200 0x2000 RS485 0xCCCC 0x000C 0x00C0 0x0C00 0xC000 표 9-7 PBH-104 디지털 I/O - 62 - http://www.phpoc.com

PBH-204 구분 파일경로및맵핑정보 /mmap/io3 LED /mmap/io4 Digital Input (photocoupler) /mmap/io4 PBH-204 Digital Output (Relay) OE: 출력릴레이를 Enable / Disable 하기위한비트 - Enable: LOW(0), Disable: HIGH(1) /mmap/io4 UART Mode 통신방식별설정예 구분 값 SET SET SET SET RS485 422 RE RS422 RS232 RS232 0x05 0 1 0 1 RS422 0x02 0 0 1 0 RS485 0x0c 1 1 0 0 표 9-8 PBH-204 디지털 I/O - 63 - http://www.phpoc.com

9.2.6 ST 구분 PBH-101, PBH-104, PBH-204 파일경로 /mmap/st0 /mmap/st1 /mmap/st2 /mmap/st3 /mmap/st4 /mmap/st5 /mmap/st6 /mmap/st7 표 9-9 ST 9.2.7 ENV 및사용자메모리 구분파일경로크기 ( 바이트 ) PBH-101, PBH-104, PBH-204 System ENV /mmap/envs 1536 User ENV /mmap/envu 1536 /mmap/um0 64 User Memory /mmap/um1 64 /mmap/um2 64 /mmap/um3 64 표 9-10 ENV 및사용자메모리 - 64 - http://www.phpoc.com

부록 : 펌웨어사양및제한사항 10.1 펌웨어별적용제품 펌웨어 P20 적용제품 PBH-101, PBH-104, PBH-204 표 10-1 펌웨어별적용제품 10.2 펌웨어사양 항목 사양 (p20) 설명 ENVS 1,536 시스템 ENV 크기, byte ENVU 1,536 사용자 ENV 크기, byte WLAN 1 무선랜 EMAC 1 이더넷 UART 4 UART 개수 FLOAT 지원 부동소수점수 SSL 지원 SSL보안통신 PHP_MAX_NAME_SPACE 16 네임스페이스수 PHP_NAME_LEN 32 사용자식별자길이, byte PHP_MAX_USER_DEF_NAME 480 사용자식별자개수 PHP_LLSTR_BLK_SIZE 64 문자열블록크기, byte PHP_MAX_LLSTR_BLK 192 문자열블록개수 string buffer size 12K 문자열버퍼크기, byte PHP_MAX_STRING_LEN 1,536 문자열변수최대길이, byte PHP_INT_MAX 약 9.2*10 18 정수값의최대크기 EZFS_MAX_NAME_LEN 64 EZFS파일이름길이, byte TASK 2 태스크 (Task) TCP 5 TCP세션개수 UDP 5 UDP세션개수 TCP_RXBUF_SIZE 1,068 TCP 수신버퍼크기, byte TCP_TXBUF_SIZE 1,152 TCP 송신버퍼크기, byte PDB_TXBUF_SIZE 2,048 디버거송신버퍼크기, byte HTTP_TXBUF_SIZE 1,536 HTTP 송신버퍼크기, byte UART_RXBUF_SIZE 1,024 UART 수신버퍼크기, byte UDP_RXBUF_SIZE 512 UDP 수신버퍼크기, byte ST 8 소프트웨어타이머 표 10-2 펌웨어사양 - 65 - http://www.phpoc.com

10.3 제한사항 구분 제한사항 네임스페이스레벨 PHP_MAX_NAME_SPACE - 1 함수호출레벨 PHP_MAX_NAME_SPACE - 2 사용자식별자길이 PHP_NAME_LEN - 1 문자열변수최대길이 PHP_MAX_STRING_LEN - 2 배열오프셋최대크기 string length - 2 파일이름길이 EZFS_MAX_NAME_LEN - 1 system함수인수길이 PHP_LLSTR_BLK_SIZE - 1 pid_ioctl함수인수길이 PHP_LLSTR_BLK_SIZE - 1 sendto함수주소길이 PHP_LLSTR_BLK_SIZE - 1 str_replace함수 $needle & replace 길이 PHP_LLSTR_BLK_SIZE - 1 inet_pton함수주소길이 PHP_LLSTR_BLK_SIZE - 1 inet_ntop함수주소길이 PHP_LLSTR_BLK_SIZE - 1 explode함수구분자길이 PHP_LLSTR_BLK_SIZE - 1 최대 UDP 수신가능크기 UDP 수신버퍼크기 - 2 표 10-3 제한사항 - 66 - http://www.phpoc.com

부록 : pid_ioctl 명령어인덱스 디바이스명령어인자 / 값페이지 NET ST TCP UART get mode - 20 - get speed - 20 - get hwaddr - 20 - get ipaddr - 20 - get netmask - 20 - get gwaddr - 20 - get nsaddr - 20 - get count - 41 - get repc - 44 - get state - 39 - set div us/ms/sec - 39 - set mode free - 39 - set mode output toggle - 39 - set mode output pulse - 39 - set mode output pwm - 39 - set count (int) - 41 - set count (int1) [(int2) (int8)] - 44 - set count (int1) (int2) - 50 - set dir up/down - 41 - set repc (int) - 44 - set delay (int) - 44 - set output low/high - 44 - set output invert [0/1] - 44 - set output dev io3/4 (int) - 44 - set trigger from php/st0/st1 /st7-44 - reset - 39 - start - 39 - stop - 39 - get state - 28 - get rxlen - 28 - get rxbuf - 28 - get txfree - 28 - get txbuf - 28 - get dstport - 28 - get srcport - 28 - get dstaddr - 28 - get srcaddr - 28 - get ssh username - 28 - get ssh password - 28 - set nodelay 0/1-22 - set api telnet/ssl/ssh/ws - 22 - set ssl method ssl3_client/ssl3_server/tls1_client/tls1/server - 22 - set ssh auth accept/reject - 22 - set ws path/mode/proto/origin - 22 - get rxlen - 14 - get txfree - 14 - get rxbuf - 14 - get txbuf - 14 - get flowctrl - 14 - - 67 - http://www.phpoc.com

UDP IO3/4 get baud - 14 - get parity - 14 - get data - 14 - get stop - 14 - set baud (int) - 12 - set parity 0/1/2/3/4-12 - set data 7/8-12 - set stop 1/2-12 - set flowctrl 0/1/2/3-12 - get rxlen - 35 - get dstport - 35 - get srcport - 35 - get dstaddr - 35 - get srcaddr - 35 - set dstaddr (string) - 34 - set dstport (int) - 34 - get n mode - 8 - get n input/output - 8 - set n mode in/out/led_xx [low/high] - 7 - set n output low/high/toggle - 7 - set n lock/unlock - 7 - 표 11-1 pid_ioctl 명령어인덱스 - 68 - http://www.phpoc.com

문서변경이력 날짜 버전 변경내용 작성자 2014.09.23 1.0 최초작성 이인 2015.08.07 1.1 문서제목수정 : for P20 추가 이인 TCP API 추가 : TELNET, SSH, 웹소켓 ST 출력모드관련내용추가 부록개선 일부오류수정및표현개선 2015.11.03 1.2 일부오류수정및표현개선 이인 - 69 - http://www.phpoc.com