사용자 도구

사이트 도구

English

comfilehmi:hmieditor_function:index

문서의 이전 판입니다!


시스템 함수

ComfileHMI Editor에서 사용할 수 있는 함수들입니다. 수식의 일부로 사용할 수 있습니다. 또는 스크립트에서 사용할 수 있습니다.('이벤트와 액션'의 하위 카테고리 중에서 액션>스크립트)

1. HMI메모리

HMI메모리란 HMI기기 내부의 특정 메모리영역입니다. 휘발성이며, 전원이 꺼지면 지워집니다.

최초상태 번지는 0부터 1023까지 사용가능하며 0으로 채워져 있습니다. set_mem_size함수로 용량 확장이 가능합니다.

  • 예: set_mem_size(20000) - 20000개까지 사용가능하도록 확장시킴. 최대 1,000,000(백만)개까지 설정가능. 예를 들어 [이벤트와 액션>전역 이벤트>프로젝트 시작 시>액션>스크립트]에서 set_mem_size(5000) 라고 지정하면 프로젝트가 시작할 때 메모리를 5000개로 늘려 놓고 시작할 수 있습니다.
  • 확장후 데이터는 0으로 다시 채워집니다.

각 번지에 64비트 정수및 실수형 수치를 저장할 수 있습니다.

  • set_mem(번지,값) : HMI 메모리 특정번지에 값을 기록.
  • mem(번지) : HMI 메모리 특정번지에서 값을 읽어옴.

다음과 같이 연속된 번지에 계속 값을 기록할 수도 있습니다.

  • set_mem(번지,값1,값2,값3….)

2. 기본 수학함수

인수가 1개인 함수입니다.

  • sin : 사인
  • cos : 코사인
  • tan : 탄젠트
  • asin : 아크사인
  • acos : 아크코사인
  • atan : 아크탄젠트
  • sinh : 하이퍼블릭 사인
  • cosh : 하이퍼블릭 코사인
  • tanh : 하이퍼블릭 탄젠트
  • floor : 소수점 이하를 버린 정수값 리턴
  • ceil : 소수점 이하를 올린 정수값 리턴
  • exp : 익스포넨셜(exponential), 자연로그의 밑 e의 거듭제곱승 리턴.
  • log : 자연로그
  • log10 : 사용로그
  • fabs : 절대값. 항상 양수로 리턴.
  • sqrt : 제곱근

인수가 2개인 함수입니다.

  • pow(x,y) : x의 y제곱
  • fmod(x,y) : x를 y로 나눈 나머지

인수가 여러개인 함수입니다.

  • max(x,y,z,…) : 가장 큰 값
  • min(x,y,z,…) : 가장 작은 값
  • max_index(x,y,z,…) : 가장 큰 값의 인덱스(순번을 말하며 0부터 시작합니다.)
  • min_index(x,y,z,…) : 가장 작은 값의 인덱스(순번을 말하며 0부터 시작합니다.)
  • avg(x,y,z,…) : 평균값
  • stdev(x,y,z,…) : 표준편차값
  • scale(입력값, 입력 최소값, 입력 최대값, 출력 최소값, 출력 최대값)

3. 시스템 함수

시스템과 관련된 함수입니다.

인수가 없는 함수들입니다.

  • tick_count() : 기기가 부팅한 이후로 경과된 1000분의 1초 단위의 시간(ms)
  • touch_duration() : 마지막으로 터치를 누른 채로 현재까지 경과된 시간(ms). 만약 터치가 눌려져 있는 상태가 아니라면 -1.0을 반환.
  • action_group_repeat_index() : 사용자 액션그룹을 반복 실행할 경우 현재 반복된 순번(0부터 시작). 실행된 사용자 액션그룹에 소속된 액션 내부에서 이 함수를 호출하여 값을 얻습니다.
  • idle_seconds() : 현재까지 얼마나 오랫동안 터치 입력이 없었는지 나타내는 함수(초 단위)
  • idle_minutes() : (분 단위)
  • prev_screen_id() : 이전 화면 번호
  • screen_id() : 현재 화면 번호
  • timeout_result() : 가장 최근 통신의 결과 타임아웃이 발생했을 경우 1을 리턴. 발생하지 않았거나 통신내역이 없다면 0을 리턴.
  • timeout_count() : 프로젝트 실행후 현재까지의 타임아웃 총 발생횟수를 리턴.
  • reset_timeout_count() : 위 timeout_count()함수로 얻을 수 있는 횟수를 0으로 초기화 합니다.
  • cpu_usage() : 현재 시스템의 CPU 점유율을 백분율로 나타냅니다.
  • reboot_system() : 시스템을 재부팅합니다.
  • firmware_version() : 현재 펌웨어 버전을 반환합니다. 예를 들어 2.73일 경우 273을 반환합니다.
  • keypad_state() : 현재 동적 키패드가 띄워져 있는지 여부를 반환합니다. 띄워져 있을 경우 1, 그렇지 않으면 0을 반환합니다.
  • backlight_state() : 현재 백라이트가 켜져 있는지 여부를 반환합니다. 켜져 있을 경우 1, 그렇지 않으면 0을 반환합니다.
  • beep() : 비프음을 발생시킵니다.(버튼 터치할 경우 나는 터치음과 같은 음입니다). 음성을 지원하지 않는 모델일 경우는 부저음을 발생시킵니다.
  • exit_project() : 프로젝트를 종료하고 HMI 초기화면으로 전환합니다.(HMI의 우측 상단 모서리를 5번 누른 것과 같은 효과입니다)
  • keypad_value() : 가장 최근에 입력했던 키패드의 입력값을 반환합니다.
  • free_memory_bytes() : 현재 사용 가능한 시스템의 남은 메모리양(byte 단위)을 반환합니다.
  • status_monitoring_message() : 현재 상태 모니터링 출력 메세지를 반환합니다.
  • is_status_monitoring_enabled() : 현재 상태 모니터링이 활성화되어 있는지 조사합니다. 1을 리턴하면 활성화되어 있는 것이고 0을 리턴하면 비활성화되어 있는 것입니다.

인수가 있는 함수들입니다.

  • enable_status_monitoring(활성화 여부 =1) : 상태 모니터링을 활성화할지 비활성화할지 결정합니다. 런타임의 설정을 바꾸는 효과가 있으므로 재부팅해도 설정이 유지됩니다. 파라미터가 1일 경우 활성화시키고 0일 경우 비활성화시키며 생략시 기본값은 1입니다.
  • verify_developer_key(개발자 키) : HMI 기기에 등록된 개발자 키의 일치 여부를 조사하여 결과를 반환합니다. 검사 결과가 일치할 경우 1을, 불일치할 경우 0을 반환합니다. HMI의 [런타임 설정>개발자 키 등록] 메뉴를 통해 HMI기기에 개발자 키를 미리 등록해놓을 수 있습니다. 예를 들어 프로젝트 동작중에 중요한 화면 진입시에 verify_developer_key(1234)==0 일 경우 에러 표시 화면으로 이동하게끔 작화를 할 수 있습니다. 이 기능은 개발자가 자신이 지정한 특정 기기에서만 자신의 프로젝트가 동작하게끔 하고 싶을 때 유용하게 쓸 수 있습니다.
  • set_data_processing_period(처리 주기 ms) : HMI 기기의 데이터 처리 주기를 조정하여 결과적으로 CPU 점유율을 낮춥니다. 데이터 처리 주기란 화면 갱신이나 통신 처리를 제외한 다른 모든 처리를 하는 주기를 말하며(1/1000초 단위) 이벤트나 액션의 갯수가 많아져서 CPU점유율이 높아진 경우 이 함수를 유용하게 사용할 수 있습니다. 일반적으로 프로젝트 시작시에 한번만 호출하면 되며 상황에 따라서 유동적으로 부하를 조절하고 싶을 경우 프로젝트 중간에 사용할 수도 있습니다. CPU 점유율이 높더라도 개의치 않고 최대의 성능을 내고 싶을 경우 이 함수를 호출하지 않거나 파라미터를 0으로 주면 됩니다.
  • set_backlight_state(설정값) : 백라이트를 켜거나 끕니다. 설정값이 1일 경우 켜고 0일 경우 끕니다. <주의>이 함수를 사용하여 백라이트를 껐어도 화면을 터치할 경우 다시 켜집니다.
  • start_action_group(사용자 액션 그룹명) : 사용자 액션 그룹을 실행합니다. <주의> 이 함수의 실행은 뒤따르는 스크립트보다 실행 순서가 미루어집니다.
  • change_screen(화면 번호) : 주어진 화면 번호로 화면을 이동합니다.
  • write_byte(값) : 원격 스크립트 내에서만 동작하며 이더넷으로 특정 값 1개의 바이트(바이너리 데이터)를 클라이언트에게 응답합니다. 성공하면 1을, 실패하면 0을 반환합니다.
  • write_word(값) : 원격 스크립트 내에서만 동작하며 이더넷으로 특정 값 1개의 워드(2개의 바이트. 바이너리 데이터. 리틀 엔디안 방식)를 클라이언트에게 응답합니다. 성공하면 1을, 실패하면 0을 반환합니다.
  • write_dword(값) : 원격 스크립트 내에서만 동작하며 이더넷으로 특정 값 1개의 더블워드(4개의 바이트. 바이너리 데이터. 리틀 엔디안 방식)를 클라이언트에게 응답합니다. 성공하면 1을, 실패하면 0을 반환합니다.
  • write_text(문자열) : 원격 스크립트 내에서만 동작하며 이더넷으로 특정 텍스트(ASCII/UTF-8 인코딩)를 클라이언트에게 응답합니다. 성공하면 1을, 실패하면 0을 반환합니다.
  • write_file_contents(파일 경로) : 원격 스크립트 내에서만 동작하며 이더넷으로 특정 HMI 파일의 내용(바이너리 데이터 그대로 가공 없이)을 클라이언트에게 응답합니다. <주의> 최대 1MByte 까지만 보낼 수 있으며 초과되는 부분은 자동으로 잘려집니다. 성공하면 1을, 실패하면 0을 반환합니다.

4. 연산/비교함수

  • float_to_bytes(값,"변수명1","변수명2","변수명3","변수명4") : 특정 값을 float(32비트) 형식으로 변환한 후, 각각의 구성 바이트를 얻어냅니다. 변수명1은 최하위 바이트(리틀 엔디안 방식일 경우의 첫 바이트를 뜻함)이며 변수명4는 최상위 바이트를 뜻합니다. 변수명은 대소문자를 구분하며 반드시 따옴표로 감싸져야 합니다. 예) float_to_bytes(3.14+k,"a","b","c","d")
  • bytes_to_float("변수명1","변수명2","변수명3","변수명4") : 4개의 변수에 들어있는 각각의 바이트값으로부터 float 값을 얻어냅니다. 변수명1은 최하위 바이트(리틀 엔디안 방식일 경우의 첫 바이트를 뜻함)이며 변수명4는 최상위 바이트를 뜻합니다. 변수명은 대소문자를 구분하며 반드시 따옴표로 감싸져야 합니다. 예) float_to_bytes(3.14,"a","b","c","d");result=bytes_to_float("a","b","c","d") =⇒ result는 3.14의 값을 다시 갖게 됩니다.
  • bitwise_not(입력값) : 주어진 입력값에 대해 NOT 비트 연산을 하여 반환합니다.
  • select_if(조건식,값1,값2) : 조건식이 만족할 경우 값1을, 만족하지 않을 경우 값2를 반환합니다.
    (예) a = select_if(b == 0, c, d)
    b가 0일경우 c의 값을 a로 저장하고, 아닐경우 d의 값을 a에 저장합니다. (a,b,c,d는 모두 HMI변수 입니다.)
  • bit("변수명", 비트번호) : 특정 변수의 특정 비트가 켜졌으면 1, 꺼졌으면 0을 반환합니다. 변수명은 따옴표로 감싸져야 하며 비트번호는 가장 낮은 비트(LSB)가 0입니다. 비트 갯수는 32개까지 지원합니다.
    (예) bit_switch=bit("a",0)
  • set_bit("변수명", 비트번호, 비트 플래그 =1 ) : 특정 변수의 특정 비트를 켜거나 끕니다. 비트 플래그가 0이면 끄고 0이 아니면 켭니다. 변수명은 따옴표로 감싸져야하며 비트번호는 가장 낮은 비트(LSB)가 0입니다. 비트 플래그는 생략할 수 있으며 생략시 값은 1입니다. 비트 갯수는 32개까지 지원합니다.
    (예) set_bit("b",31,1);
  • toggle_bit("변수명", 비트번호 ) : 특정 변수의 특정 비트를 반대로 바꿉니다. 변수명은 따옴표로 감싸져야하며 비트번호는 가장 낮은 비트(LSB)가 0입니다. 비트 갯수는 32개까지 지원합니다.
    (예) toggle_bit("b",7);

5. 액션 파라미터 관련 함수

액션추가에서 <사용자 액션 그룹 실행>의 <고급옵션>을 활성화시키면 <액션 파라미터>와 <보조 액션 파라미터>라는 항목이 나옵니다.

여기에 어떤 숫자를 넣으면, 이 숫자를 다음 함수로 읽어올 수 있습니다.

  • action_param() : 사용자 액션그룹을 실행하는 시점에 세팅되는 임의의 값을 가져옵니다. 실행된 사용자 액션그룹에 소속된 액션 내부에서 이 함수를 호출하여 값을 얻습니다.
  • sub_action_param() : 사용자 액션그룹을 실행하는 시점에 세팅되는 보조 값을 가져옵니다. 실행된 사용자 액션그룹에 소속된 액션 내부에서 이 함수를 호출하여 값을 얻습니다.

6. RTC (리얼타임클록) 관련 함수

인수가 없고, 리턴값이 있는 함수들입니다.

  • year() : 현재 연도
  • month() : 현재 월
  • day() : 현재 일
  • day_of_week() : 현재 요일 (일요일=0, 월요일=1, 화요일=2, …)
  • hour() : 현재 시각
  • minute() : 현재 분
  • second() : 현재 초
  • rand() : 0~ 32767 (0x7fff) 사이의 난수를 얻습니다.

인수가 1개이고 리턴값이 없는 함수들입니다.

  • set_year(연도) : 연도를 세팅
  • set_month(월) : 월을 세팅
  • set_day(일) : 일을 세팅
  • set_hour(시) : 시를 세팅
  • set_minute(분) : 분을 세팅
  • set_second(초) : 초를 세팅
  • srand(seed) : rand() 함수에서 추후에 얻어질 값을 결정하기 위해 난수 체계를 초기화합니다. seed값에 따라 예측 가능한 시작값으로 난수 체계가 정해집니다. srand(tick_count()); 라고 하면 예측 불가능한 시작값으로 시작됩니다. rand() 함수를 호출하기 위해 이 함수를 필수적으로 호출해야 되는 것은 아닙니다.

인수가 2개 이상인 함수들입니다.

  • last_day_of_month(연도, 월) : 특정 연도의 특정 월의 마지막 날이 몇일인지 반환합니다.

7. 문자열 관련 함수

  • text_to_num(문자열) : 문자열을 넣으면 수치값을 반환.
    (예) "32.1"을 넣으면 32.1이 반환됨
  • text_hex_to_num(16진 문자열) : 16진 문자열을 넣으면 수치값을 반환.
    (예) "FF"를 넣으면 255가 반환됨
  • num_to_text_int(수치) : 수치값을 넣으면 정수형태의 텍스트를 반환
    (예) 32.1을 넣으면 "32"가 반환됨
  • num_to_text_int(수치,자리수) : 수치값을 넣으면 자리수가 고정된 정수형태의 텍스트를 반환
    (예) 32.1과 4를 넣으면 "0032"가 반환됨
  • num_to_text_hex(수치) : 수치값을 넣으면 16진수형태의 텍스트를 반환
    (예) 10.1을 넣으면 "A"가 반환됨
  • num_to_text_hex(수치,자리수) : 수치값을 넣으면 자리수가 고정된 16진수 형태의 텍스트를 반환
    (예) 10.1과 4를 넣으면 "000A"가 반환됨
  • num_to_text_dec(수치,소수자리수) : 수치값을 넣으면 특정 소수자리수를 가진 실수 텍스트를 반환
    (예) 10.3과 4를 넣으면 "10.3000"이 반환됨
  • find_text(대상 문자열,찾는 문자열) : 문자열 내에서 문자열을 찾습니다. 찾으면 0 이상의 찾은 위치값을 반환하고, 없으면 -1을 반환합니다.
    (예) find_text("abcde","cd") 는 2를 반환합니다.
  • replace_text("문자열 변수명", 찾는 문자열, 대체 문자열) : 특정 문자열 변수 값 내에서 특정 문자열을 다른 문자열로 변경합니다. 문자열 변수명은 반드시 따옴표로 감싸야 하고 '$' 기호는 생략합니다.
    (예) $var="I eat lunch.";replace_text("var","lunch","dinner")
  • text_size(문자열) : 문자열의 길이를 반환합니다. text_size("공정A") ←- 3을 반환합니다.
  • text_starts_with(대상 문자열, 찾는 문자열, 대소문자 무시 옵션) : 문자열이 특정 문자열로 시작하는지 검사합니다. 첫번째 파라미터 문자열이 두번째 파라미터 문자열로 시작한다면 1을 반환하고 그렇지 않으면 0을 반환합니다. 대소문자를 무시하려면 세번째 파라미터를 1로 지정하고 그렇지 않고 대소문자를 정확히 가려서 검사하려면 0으로 지정합니다. 세번째 인자는 생략할 수 있으며 생략시 기본값은 0(대소문자 구별)입니다.
    (예) text_starts_with("BREAKFAST","BREAK") - - - 1을 반환합니다.
    (예) text_starts_with("BREAKFAST","break",1) - - - 1을 반환합니다.
    (예) text_starts_with("BREAKFAST","break",0) - - - 0을 반환합니다.
  • text_ends_with(대상 문자열, 찾는 문자열, 대소문자 무시 옵션) : 문자열이 특정 문자열로 끝나는지 검사합니다. 첫번째 파라미터 문자열이 두번째 파라미터 문자열로 끝난다면 1을 반환하고 그렇지 않으면 0을 반환합니다. 대소문자를 무시하려면 세번째 파라미터를 1로 지정하고 그렇지 않고 대소문자를 정확히 가려서 검사하려면 0으로 지정합니다. 세번째 인자는 생략할 수 있으며 생략시 기본값은 0(대소문자 구별)입니다.
    (예) text_ends_with("LUNCH","CH") - - - 1을 반환합니다.
    (예) text_ends_with("LUNCH","ch",1) - - - 1을 반환합니다.
    (예) text_ends_with("LUNCH","ch",0) - - - 0을 반환합니다.
    (예) $suffix="CH";result=text_ends_with("LUNCH",$suffix);

8. 파일 관련 함수

  • file_to_text(파일 경로) : 파일 경로를 넣으면 그 파일에 현재 담겨 있는 내용을 문자열로 반환. 파일 내용이 FF FE 로 시작할 경우 유니코드로 자동 인식. 파라미터로 문자열 변수 사용 가능.
    (예) 스크립트에 다음과 같이 씁니다: $content=file_to_text("storage card\myfile.txt")
  • text_to_file(문자열, 파일 경로) : 문자열과 파일 경로를 넣으면 문자열의 내용을 파일에 기록함(유니코드 형식). 파라미터로 문자열 변수 사용 가능.
    (예) 스크립트에 다음과 같이 씁니다: text_to_file($content,"storage card\new.txt")
  • file_exists(파일 경로) : 파일 또는 폴더가 존재하는지 여부를 조사하여 결과값을 반환합니다. 존재하면 1, 그렇지 않으면 0을 반환합니다.
    (예1) file_exists("storage card\myfile.txt")==1
    (예2) SD카드가 꼽혀져 있는 지 조사하려면 file_exists("storage card")==1
  • file_size(파일 경로) : 파일 크기(바이트 수)를 조사하여 반환합니다.
    (예) file_size("storage card\myfile.txt")
  • delete_file(파일 경로) : 파일을 삭제합니다.
    (예) delete_file("storage card\myfile.txt")
  • rename_file(현재 파일 경로, 바꿀 파일 경로) : 파일 이름을 변경합니다.
    (예) rename_file("storage card\myfile.txt","storage card\newfile.txt")

9. 오브젝트 관련 함수

  • trendgraph_restart(트렌드 그래프의 오브젝트 심볼명) : 특정 심볼명을 가진 트렌드 그래프의 데이터 수집 동작을 시작시킵니다. 이미 진행중이던 경우는 수집했던 데이터를 모두 지우고 처음부터 시작합니다. 만약 백그라운드 동작이 활성화되지 않은 트렌드 그래프가 현재 화면에 존재하지 않는 경우는 시작시킬 수 없습니다. 심볼명은 중복될 수 있으며 해당 심볼명을 가진 모든 트렌드그래프에 적용됩니다.
    (예) trendgraph_restart("my_graph")
  • trendgraph_stop(트렌드 그래프의 오브젝트 심볼명,데이터 삭제 플래그 =0) : 특정 심볼명을 가진 트렌드 그래프의 데이터 수집 동작을 중지시킵니다. 두번째 파라미터가 0이 아닐 경우는 수집했던 데이터를 모두 지운 상태에서 멈추고, 0일 경우는 수집한 데이터를 그대로 보여주는 상태에서 멈춥니다. 이 파라미터는 생략할 수 있으며 생략할 경우 기본값은 0(데이터 삭제 안 함)입니다. 심볼명은 중복될 수 있으며 해당 심볼명을 가진 모든 트렌드그래프에 적용됩니다.
    (예1) trendgraph_stop("my_graph")
    (예2) trendgraph_stop("my_graph",1)

10. 프로토콜 관련 함수

  • set_modbus_word_write_always_multi(활성화 여부 플래그 =1) : Modbus 프로토콜 사용시 word의 갯수가 1개라도 내부적으로 펑션코드 6번(single word write)을 사용하지 않고 항상 16번(multi word write)으로 통일하여 사용하도록 설정합니다. 활성화 여부 플래그가 1일 경우 이 기능을 켜고 0일 경우 끕니다. 활성화 여부 플래그는 생략할 수 있으며 기본값은 1입니다(활성화함). 이 함수를 호출하기 전에 이 설정은 꺼져 있으며 재부팅 후 다시 꺼진 상태가 되므로 이 설정이 지속되게 하려면 프로젝트 시작시에 항상 이 함수를 호출해야 합니다.
    (예) set_modbus_word_write_always_multi()

11. Web API 관련 함수 (고급 기능, CHC/HDM-C070RL 또는 그 상위 모델에서만 지원)

다음 함수들은 반드시 HTTP 요청을 통해('script' 커맨드 사용) 실행되어져야 합니다.
(예) 192.168.0.99:9138/script/1234/a=3;vars_to_json("a") ←- 이와 같은 내용을 웹브라우저 주소창에 입력하거나 HMI의 [액션>'HTTP 요청'] 에서 실행하면 HMI 변수 'a'에 대한 내용을 응답으로 받을 수 있습니다. ('1234'는 원격제어 비밀번호가 1234일 경우의 예시이며 없을 경우 생략 가능.)

  • vars_to_json(변수명들) : HMI 변수값(또는 문자열 변수값)을 JSON 포맷으로 응답해줍니다. 대상 변수명은 문자열로 지정하며 여러개일 경우 '|'로 구분합니다.
    (예) vars_to_json("a|b|$c")
  • mem_to_json(HMI 메모리 시작번지, 번지 갯수, 소숫자리수 =6) : 연속된 번지에 대한 HMI 메모리 값을 JSON 포맷으로 응답해줍니다. 소숫자리수는 소숫자리가 있을 경우 최대 몇개의 자리까지 표시할지 결정하며, 생략 할 수 있습니다(기본값은 6)
    (예) mem_to_json(10,3) ←- HMI 메모리 10,11,12에 들어 있는 3개의 값을 응답해줌.
  • filenames_to_json(디렉터리 경로명) : 파라미터로 넘겨준 디렉터리 밑에 있는 모든 파일들의 이름 목록을 JSON 포맷으로 응답해줍니다. 대상 디렉터리 경로명은 문자열로 지정하며 여러개일 경우 '|'로 구분합니다.
    (예) filenames_to_json("storage card\logs|storage card\data1") ←- 'storage card\logs' 폴더와 'storage card\data1' 폴더 밑에 있는 모든 파일명 목록을 JSON 형식으로 응답합니다.
  • dirnames_to_json(디렉터리 경로명) : 위의 filenames_to_json 함수와 동작의 구조는 동일하나 응답값이 파일명 목록이 아닌 서브디렉터리명 목록입니다.

<주의> 웹브라우저 주소창에서 실행할 경우에는 경로 구분자로 '\'를 쓰지 않고 '/'를 써야 합니다. (예) "storage card/logs"
또한 '#'는 '%23'으로, '%'는 '%25'로 각각 치환하여 사용해야 합니다.

상위 페이지로 가기

comfilehmi/hmieditor_function/index.1626851968.txt.gz · 마지막으로 수정됨: 2021/07/21 16:19 저자 Comfile Technology