KR100396031B1 - 교환기 자동 진단방법 - Google Patents

교환기 자동 진단방법 Download PDF

Info

Publication number
KR100396031B1
KR100396031B1 KR10-2000-0087456A KR20000087456A KR100396031B1 KR 100396031 B1 KR100396031 B1 KR 100396031B1 KR 20000087456 A KR20000087456 A KR 20000087456A KR 100396031 B1 KR100396031 B1 KR 100396031B1
Authority
KR
South Korea
Prior art keywords
execution code
procedure
data
execution
message
Prior art date
Application number
KR10-2000-0087456A
Other languages
English (en)
Other versions
KR20020057181A (ko
Inventor
이광민
홍정기
박종주
Original Assignee
주식회사 하이닉스반도체
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 주식회사 하이닉스반도체 filed Critical 주식회사 하이닉스반도체
Priority to KR10-2000-0087456A priority Critical patent/KR100396031B1/ko
Publication of KR20020057181A publication Critical patent/KR20020057181A/ko
Application granted granted Critical
Publication of KR100396031B1 publication Critical patent/KR100396031B1/ko

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

본 발명은 교환기 시험 절차를 TDL(Test Description Language)에서 제시하는 문법에 맞춰 프로그램을 작성하고, 컴파일러(compiler)를 통해 번역하여 수행코드를 획득한 후 에뮬레이터(emulator)를 이용하여 교환기 시험을 자동으로 수행하도록 한 교환기 자동 진단방법에 관한 것으로서, 이러한 본 발명은, 시험자가 시험절차를 TDL(Test Description Language)문법에 맞춰 프로그램을 작성하여 입력한 상태에서, 자동 진단이 시작되면 컴파일러에서 수행코드를 획득하고 이를 파일로 만들어 에뮬레이터에 전송해주며, 상기 에뮬레이터에서 수행코드 파일을 읽어 패턴 정보, 수행코드, 프로시저 정보를 부분별로 저장하고, 수행코드만을 처리하는 런쓰레드(RunThread) 루틴을 실행시켜 교환기를 자동 진단한다.
또한, 진단 결과 수신 데이터가 메시지 출력 데이터일 경우에는 출력 메시지를 토큰(Token)별로 분류한 후 PRN(Printout Reference Number)을 추출하고, 추출한 PRN이 패턴 정보 영역에 존재하는지를 체크하고, 상기 추출한 PRN이 패턴 정보 영역에 존재할 경우에는 패턴 정보에 기록된 추출정보를 이용하여 데이터를 추출하며, 패턴 정보에 등록되어 있는 프로시저 ID를 추출하고, 대기중인 런쓰레드를 활성화시킨다.

Description

교환기 자동 진단방법{Method for diagnostic automatic in mobile switch center}
본 발명은 교환기(특히, 이동통신 교환기 : MSC) 자동 진단에 관한 것으로, 특히 교환기 시험 절차를 TDL(Test Description Language)에서 제시하는 문법에 맞춰 프로그램을 작성하고, 컴파일러(compiler)를 통해 번역하여 수행코드를 획득한 후 에뮬레이터(emulator)를 이용하여 교환기 시험을 자동으로 수행하도록 한 교환기 자동 진단방법에 관한 것이다.
상기에서 TDL은 시험절차, 즉 MMC(Man-Machine Communication) 명령어를 입력하고 출력 메시지를 분석하며 이를 가공하여 재처리될 수 있도록 고안된 언어로서, 출력 메시지로부터 추출 대상을 선언하는 PATTERN part, 전역변수와 프로시저의 prototype을 선언하는 GLOBAL part, MMC 명령어를 기술하는 MMC part, 수행문을 기술할 수 있는 EXECUTE part, Procedure Declaration part로 구성되어 있다.
또한 컴파일러는 고수준 언어로 기록된 프로그램을 어셈블러 언어 또는 기계어로 번역하는 프로그램을 말하며, 상기 고수준 언어로서는 PL/1, CHILL, COBOL, FORTRAN, ALGOL 등이 있다.
일반적으로 교환기(특히, 이동통신 교환기)에서 일반 기능들을 검증하기 위해서는 시험자가 직접 여러 단계에 걸쳐 MMC(Man-Machine Communication) 명령어를 입력하고 그 출력 메시지를 분석하여 교환기의 상태를 판단하였다.
따라서 확인 절차가 복잡하다는 문제가 있었으며, 또한 확인 절차가 단순한경우에는 동일한 절차를 여러 번 반복해야하므로 기능 검증에 많은 인력과 시간이 투자되는 단점이 있었다.
이에 본 발명은 상기와 같은 종래 교환기의 기능 검증시 발생하는 제반 문제점을 해결하기 위해서 제안된 것으로서,
본 발명의 목적은 교환기 시험 절차를 TDL(Test Description Language)에서 제시하는 문법에 맞춰 프로그램을 작성하고, 컴파일러(compiler)를 통해 번역하여 수행코드를 획득한 후 에뮬레이터(emulator)를 이용하여 교환기 시험을 자동으로 수행하도록 한 교환기 자동 진단방법을 제공하는 데 있다.
상기와 같은 목적을 달성하기 위한 본 발명은,
시험자가 시험절차를 TDL(Test Description Language) 문법에 맞춰 프로그램을 작성하고, 컴파일러를 통해 수행코드를 얻은 후 에뮬레이터를 이용하여 시험을 자동으로 수행함으로써, 기능 검증에 필요한 인적 및 시간적인 자원을 절약하도록 한다.
이를 위한 본 발명의 "교환기 자동 진단 방법"은,
시험자가 시험절차를 TDL(Test Description Language)문법에 맞춰 프로그램을 작성하여 입력한 상태에서, 자동 진단이 시작되면 컴파일러에서 수행코드를 획득하고 이를 파일로 만들어 에뮬레이터에 전송해주는 단계와;
상기 에뮬레이터에서 수행코드 파일을 읽어 패턴 정보, 수행코드, 프로시저 정보를 부분별로 저장하고, 수행코드만을 처리하는 런쓰레드(RunThread) 루틴을 실행시키는 단계와;
상기 런쓰레드 실행 후 수신 시그널이 교환기내 프로세서(ATMP)에서 클라이언트로 전송된 시그널(BatchMsgToClientSig)일 경우, 수신 데이터가 명령어 검사 결과 데이터인지를 체크하고, 그 결과 수신 데이터가 명령 체크 결과일 경우에는 명령어 검사 결과에 대응하는 동작을 수행시키는 단계와;
상기 수신 데이터가 명령어 검사 결과 데이터가 아닐 경우에는, 상기 수신 데이터가 메시지 출력 데이터인지를 판단하고, 그 판단 결과 메시지 출력 데이터일 경우에는 출력 메시지를 토큰(Token)별로 분류한 후 PRN(Printout Reference Number)을 추출하는 단계와;
상기 추출한 PRN이 패턴 정보 영역에 존재하는지를 체크하고, 상기 추출한 PRN이 패턴 정보 영역에 존재할 경우에는 패턴 정보에 기록된 추출정보를 이용하여 데이터를 추출하는 단계와;
상기 패턴 정보에 등록되어 있는 프로시저 ID를 추출하고, 대기중인 런쓰레드를 활성화시키는 단계를 실행하여, 교환기를 자동으로 진단한다.
도 1은 본 발명에 의한 교환기 자동 진단방법을 개념적으로 보인 개념도이고,
도 2는 본 발명에 의한 교환기 자동 진단방법을 보인 흐름도이고,
도 3은 도 3에서 "RunThread" 루틴의 상세 흐름을 보인 흐름도이고,
도 4는 도 3에서 분석된 수행코드가 JSR(Jump Sub Routine)일 경우 이를 처리하는 과정을 보인 흐름도이다.
<도면의 주요 부분에 대한 부호의 설명>
100 ..... 교환기 자동 진단부
110 ..... 시험절차 입력부
120 ..... TDL 번역부
130 ..... 에뮬레이터
200 ..... 교환기
210 ..... MMS(Man-Machine Subsystem)
이하 상기와 같은 기술적 사상에 따른 본 발명의 바람직한 실시 예를 첨부한 도면에 의거 상세히 설명하면 다음과 같다.
첨부한 도면 도 1은 교환기 자동 진단방법을 개념적으로 보인 개념도이다.
여기서 참조부호 100은 교환기의 기능을 자동으로 시험하기 위한 교환기 자동 진단부를 나타내고, 참조부호 200은 상기 교환기를 나타낸다.
여기서 교환기 자동 진단부(100)는 사용자가 TDL 문법에 맞추어 작성한 시험 절차 프로그램을 입력받는 시험절차 입력부(110)와, 상기 시험절차 입력부(110)에서 입력된 프로그램을 TDL 컴파일러로 번역하여 수행 코드를 획득하는 TDL 번역부(120)와, 상기 TDL 번역부(120)에서 획득한 수행코드에 따라 상기 교환기(200)를 자동으로 시험하는 에뮬레이터(130)를 포함한다.
또한 상기 교환기(200)는 상기 교환기 자동 진단부(100)와 데이터를 인터페이스하고 입력되는 명령어에 따라 각 블록의 기능을 시험한 후 그 결과 데이터를 상기 교환기 자동 진단부(100)에 전송해주는 MMS(Man-Machine Subsystem)(210)을 포함한다.
상기 도 1을 참조하여 본 발명의 개념을 간략히 설명하면, 먼저 사용자가 TDL 문법에 맞추어 시험절차 프로그램을 작성하고, 교환기 자동 진단부(100)내의 시험절차 입력부(110)에서 상기 사용자가 작성한 시험절차 프로그램을 입력받는다.
그런 후 TDL 번역부(120)에서 상기 입력받은 시험절차 프로그램을 번역하여 수행 코드를 획득한다.
여기서 TDL 번역부(120)에 의해 획득되는 수행 코드의 파일 구조는 아래의 [표1]과 같다.
수행코드 파일 구조
Pattern 정보
Instruction
Procedure 정보
Constant string 정보
상기 [표1]에서 패턴(Pattern) 정보는 패턴 Part에 정의된 내용들로 패턴을 추출해야 하는 메시지의 PRN(Printout Reference Number), 추출 형태, 추출 대상, 추출 후 불려질 프로시저의 id에 대한 정보를 나타낸다.
다음으로 Instruction은 실제 수행 코드를 나타내며, 프로시저 정보는 디폴트(Default) 라이브러리 정보, 프로그래머가 정의한 프로시저들의 이름, 프로시저 ID, 인스트럭션 시작 주소에 대한 정보를 나타내며, 상수 기호열(Constant string) 정보는 double quote(")사이에 존재하는 문자열들에 대한 정보를 나타낸다.
한편, 상기와 같은 수행 코드를 획득하면 에뮬레이터(130)는 교환기(200)내의 MMS(210)와 데이터 인터페이스를 통해 교환기(200)를 자동으로 시험하고, 그 결과 데이터를 분석하게 된다.
여기서 에뮬레이터(130)에서 실제 수행 코드를 이용하여 교환기(200)를 시험하고, 그 결과를 출력해주는 일 예는 다음과 같다.
예) 입출력 포트의 상태를 알아보기 위해 "DIS-IO-PORT;" 명령어를 입력하고 출력 메시지로부터 포트 번호와 상태를 추출하여 화면에 출력하는 내용이다.
시험파일의 내용
PATTERN {
PRN := MO501;
TYPE := FIELD, FIELDLN;
PROCEDURE := M0501_PROC;
FIELD := "LOC", "=", ptn_Loc;
FIELDLN := ("PORT", ptn_Port), ("STS", ptn_Sts);
}
EXECUTE {
ExeMmcCommand("DIS-IO-PORT;");
printf("\n Test End");
}
M0501_PROC : PROC()
DCL i INT;
DCL csLoc STRING;
DCL csPort, csSts STRING ARRAY[20];
GetPatternData(ptn_Loc, csLoc);
printf("\n Location = %s", csLoc);
DO FOR(i := 0; i < 20; i +:= 1)
IF GetPatternData(ptn_Port, csPort[i]) < 0 THEN
BREAK;
FI;
GetPatternData(ptn_Sts, csSts[i]);
%s", csPort[i}, csSts[i]);
OD;
END;
수행코드 파일의 내용
P P_START 0 /*PATTERN 정보*/
P P_PRN M0501
P P_TYPE 11
P P_PROCEDURE 0 LOC 0
P P_FIELD 0 = 0
P P_FIELD 0 ptn_Loc 1
P P_FIELDLN PORT ptn_Port
P P_FIELDLN STS ptn_Sts
P P_END
I 26 -1 0 11
L 0 1
I 2 32 0 13 /* ExeMmcCommand("DIS-IO-PORT;")에 대한 코드 */
I 1 1 0 13
I 27 0 0 13
I 30 0 0 13
I 2 45 0 15 /* printf("\nTest End"); */
I 1 1 0 15
I 27 1 0 15
I 26 -1 0 16
S 00
I 2 0 0 22
I 7 4 1 1
I 2 1 0 25 /* GetPatternData(ptn_Loc, csLoc); */
I 9 4 1 25
I 1 2 0 25
I 27 4 0 25
I 30 0 0 25
I 2 56 0 27 /* printf("\n Location = %s", csLoc); */
I 3 4 1 27
I 1 2 0 27
I 27 1 0 27
I 1 0 0 29
I 5 0 1 29
I 26 26 0 29 /* DO FOR */
I 26 0 0 29
I 26 0 0 29
I 26 26 0 29
I 3 0 1 29
I 1 20 0 29
I 17 0 0 29
I 25 23 0 29
I 26 24 0 29
L 25 31
I 1 1 0 29
I 38 19 0 29
I 5 0 1 29
/* 중략 */
... ... ...
... ... ...
F ExeMmcCommand 0 -1 /* Default library에 대한 정보 */
F printf 0 -1
.............
.............
F IsMsgCompleted 0 -1
F sleep 0 -1
F M0501_PROC 1 9 /* M0501_PROC에 대한 프로시저 정보 */
S 1 168
C 84 /* constsnt string에 대한 정보 */
0:ptn_Loc_0:ptn_Port_0:ptn_Sts_DIS_IO_PORT;_
Test End_
Location = %s_
%s_
다음으로 에뮬레이터(130)는 상기와 같은 수행 코드 파일을 읽어 각 부분별로 정보를 저장하고, 수행코드(instruction)만을 처리하는 RunThread를 시작시킨 후, RunThread와 MMS(210)로부터의 시그널을 기다린다. 상기 RunThread로부터의 명령어 수행요구를 수신하면 명령어를 교환기내 프로세서(ATMP)에서 클라이언트로 신호를 전송하기 위한 시그널(BatchMsgToClientSig)에 실어 MMS(210)로 보내고, 이에 대한 응답이 오면 대기중인 RunThread를 활성화시켜 다음 작업을 진행할 수 있도록 한다. 또한 상기 MMS(210)로부터 출력 메시지가 도착하면 출력 메시지를 토큰(Token : 문자열 구분자에 의해 분리된 문자열 하나)으로 분리하고, 이 메시지의 PRN(Printout Reference Number)을 추출, 패턴 정보에 등록된 PRN인지 검사하여 등록된 PRN일 경우 패턴 정보에 기록된 추출정보를 이용하여 데이터를 추출하고 불려질 프로시저 ID를 패턴 정보에서 꺼내 대기중인 RunThread를 활성화시킨다. 상기 RunThread가 모든 수행코드를 수행하고, ThreadEnd signal을 보내면 각 부분별로 할당했던 메모리를 해제한 뒤 종료한다.
도 2는 상기와 같은 에뮬레이터에서 자동 진단 과정을 보인 흐름도이다.
이에 도시된 바와 같이, 단계 S101에서는 수행코드 파일을 읽어 패턴 정보, 수행코드, 프로시저 정보를 부분별로 저장하고, 단계 S102에서는 수행코드만을 처리하는 런쓰레드(RunThread) 루틴을 실행시킨다.
단계 S103에서는 런쓰레드와 MMS(210)로부터의 시그널을 기다린다.
아울러 단계 S104에서는 수신 시그널이 BatchMsgToClientSig인지를 판단하고, 그 결과 수신 시그널이 BatchMsgToClientSig이 아닐 경우에는 단계 S114에서 수신 시그널이 런쓰레드로부터의 명령어 수행 요구인지를 판단한다.
그 결과 수신 데이터가 명령 수행 요구일 경우에는 단계 S115에서 명령어를 BatchMsgToClientSig에 실어 상기 MMS(210)로 전송하고, 그에 대한 응답이 오면 대기중인 런쓰레드를 활성화시켜 다음 작업을 진행할 수 있도록 한다.
또한 상기 수신 시그널이 명령 수행 요구가 아닐 경우에는, 단계 S116에서 수신 시그널이 런쓰레드 종료 데이터인지를 확인하고, 그 결과 수신 시그널이 런쓰레드 종료 데이터일 경우에는 단계 S117에서 각 부분별로 할당했던 메모리를 해제한 뒤 종료한다.
한편, 상기 단계 S104의 확인 결과 수신 시그널이 BatchMsgToClientSig일 경우, 단계 S105에서는 수신 데이터가 명령어 검사 결과 데이터인지를 체크하고, 그 결과 수신 데이터가 명령 체크 결과일 경우에는 단계 S106에서 명령어 검사 결과에 대응하는 동작을 수행한다.
이와는 달리 상기 수신 데이터가 명령어 검사 결과 데이터가 아닐 경우에는, 단계 S107에서 상기 수신 데이터가 메시지 출력 데이터인지를 판단한다. 그 결과 수신데이터가 메시지 출력 데이터일 경우에는 단계 S108에서 출력 메시지를 토큰(Token)별로 분류한 후 PRN(Printout Reference Number)을 추출한다.
그런 후 단계 S109에서는 상기 추출한 PRN이 패턴 정보 영역에 존재하는지를체크하고, 상기 체크결과 추출한 PRN이 패턴 정보 영역에 존재할 경우에는 단계 S110에서 패턴 정보에 기록된 추출정보를 이용하여 데이터를 추출한다.
아울러 단계 S111에서는 상기 패턴 정보에 등록되어 있는 프로시저 ID를 추출하고, 대기중인 런쓰레드를 활성화시킨다.
만약, 상기 추출한 PRN이 패턴 정보 영역에 존재하지 않을 경우에는 단계 S112로 이동하여 메시지 출력 완료 여부를 체킹하고, 그 결과 메시지 출력이 완료된 경우에는 단계 S113에서 MMC 전송 카운트를 감소시키고, 상기 시그널 입력 대기 단계인 S103으로 이동하게 된다.
한편, 시험자가 시험하고자 하는 내용들은 수행코드로 변환되어 수행코드화일내에 저장되었다가 에뮬레이터에 의해 InstTbl이라는 전역 변수에 할당된 후 RunThread에 의해 처리된다.
도 3은 상기 Runthread가 InstTbl에 들어 있는 수행코드 처리 과정을 보인 흐름도이다.
이에 도시된 바와 같이, 단계 S201에서 수행코드 포인터 및 MMC 전송 카운터를 초기화시키고, 단계 S202에서는 수행코드 포인터(IP)가 0보다 작은지를 체크한다.
그 결과 수행코드 포인터(IP)가 0보다 클 경우에는 단계 S203에서 MMC 전송 카운트값이 0보다 큰지를 확인한다. 상기 확인 결과 MMC 전송 카운트값이 0보다 작을 경우에는 단계 S204에서 에뮬레이터로 쓰레드 종료 메시지를 전송한다.
이와는 달리 상기 MMC 전송 카운트가 0보다 클 경우에는 단계 S205에서 출력 메시지를 대기하고, 단계 S206에서 수행코드 포인터를 저장하고, 단계 S207에서 프로시저 ID를 통해 해당 프로시저를 탐색한다.
그런 후 해당 프로시저가 탐색되거나 상기 단계 S202에서의 판단 결과 수행코드 포인터(IP)가 0보다 작을 경우에는 단계 S208에서 수행코드 포인터를 1증가시켜 다음 수행코드로 설정한다(Next IP).
그리고 단계 S209에서는 수행코드의 종류를 분석하고, 단계 S210에서는 상기 분석된 수행코드에 대응하는 쓰레드를 실행시켜 시험 루틴을 실행한다. 이후 수행코드에 대한 쓰레드가 종료되면, 단계 S211에서 수행코드 포인터를 다음 수행코드 포인터(Next IP)로 설정하고, 상기 단계 S202로 리턴한다.
한편, 상기 수행코드의 종류를 분석한 후, 그 수행코드가 JSR(Jump Sub Routine)일 경우 도 4와 같은 과정을 통해 JSR(Jump Sub Routine)을 처리한다.
이에 도시된 바와 같이, 단계 S301에서 수행코드가 MMC를 수행하기 위한 코드(ExeMmcCommand)인지를 체크한다. 상기 체크 결과 수행코드가 MMC를 수행하기 위한 코드(ExeMmcCommand)일 경우에는, 단계 S302에서 파리미터로 전달된 명령어 문자열을 에뮬레이터로 전송한다.
그리고 단계 S303에서는 에뮬레이터가 활성화될 때까지 대기한다.
이후 에뮬레이터가 명령어를 MMS(210)로 전송하고, 그 결과를 받아 런쓰레드를 활성화시키면, 단계 S304에서 전송한 명령어에 오류가 발생하였나를 체크한다. 그 결과 전송한 명령어에 오류가 발생하였으면 처음 단계로 리턴을 하고, 이와는 달리 전송한 명령어에 오류가 없으면, 단계 S305에서 명령어 전송 카운트를 1증가시키고, 단계 S306에서 출력 메시지가 수신되기를 기다린다.
아울러 단계 S307에서 수신 메시지가 도착하면 수행코드 포인터를 저장하고,단계 S308에서 프로시저 ID를 통해 해당 프로시저를 탐색한다. 그런 후 프로시저가 탐색되면 수행코드를 처리하도록 한다.
즉, 에뮬레이터가 수신한 출력 메시지를 토큰별로 분류하고 패턴 데이터를 추출한 뒤 런쓰레드를 활성화시키면, 런쓰레드는 현재 진행중인 수행코드 포인터를 저장하고, 에뮬레이터가 넘겨준 프로시저 ID를 통해 프로시저의 수행코드 시작주소를 수행코드 포인터에 할당하여 프로시저의 수행코드가 처리될 수 있도록 한다. 또한 프로시저가 리턴되면 저장된 수행코드 포인터를 인출하여 프로시저로 점프하기 이전의 작업이 계속 진행될 수 있도록 한다.
런쓰레드는 모든 수행코드가 처리되었더라도 도착할 출력 메시지가 있으면 종료하지 않고 대기하고 있다가 활성화되면 해당 메시지의 프로시저가 처리될 수 있도록 한다.
한편, 단계 S301의 결과 수행코드가 MMC를 수행하기 위한 코드(ExeMmcCommand)가 아닐 경우에는 단계 S309에서 수행코드가 다른 디폴트 라이브러리(LIB)인지를 체크하고, 그 결과 수행코드가 다른 디폴트 라이브러리일 경우에는 단계 S310에서 디폴트 라이브러리를 저장한다. 이와는 달리 수행코드가 다른 디폴트 라이브러리도 아닐 경우에는 단계 S311에서 수행코드 포인터를 저장하고, 처음 단계로 리턴을 한다.
상기 Runthread는 수행코드의 op-code에 부합하는 동작을 수행한다. 예를 들어, "nValue : = nValue + 10;"인 수행문이 있고, 이 문장이 다음과 같은 수행코드로 번역된다면 Runthread는 nValue의 변수 값에 10을 더해 그 값을 다시 nValue변수에 저장한다.
LDC 10 0 1 : 상수 10을 value stack에 push
LDV 10 20 1 : 블록 ID가 10인 프로시저의 베이스 어드레스에서 오프셋(offset)이 20인 곳의 변수 값을 value stack에 push.
ADD 0 0 1 : value stack에서 두 번 pop을 하여 그 값을 더한 후 value stack에 다시 push
STV 10 20 1 : value stack에서 pop하여 그 값을 블록 ID가 10인 프로시저의 베이스 어드레스에서 오프셋이 20인 곳에 저장.
상기 Runthread는 수행코드를 처리하는 동안 op-code가 JSR(Jump Sub Routine)이고, 프로시저 ID를 의미하는 operand1이 ExeMmcCommand이면 파라미터로 전달된 명령어 문자열을 에뮬레이터(130)에게 전송하고, 에뮬레이터(130)가 활성화시킬 때까지 대기한다.
에뮬레이터(130)가 명령어를 MMS(210)로 전송하고 그 결과를 받아 Runthread를 활성화시키면, Runthread는 전송한 명령어가 오류가 있었는지 확인하고 오류가 없었으면 출력 메시지가 올 때까지 대기한다.
이후 에뮬레이터가 수신한 출력 메시지를 토큰별로 분류하고, 패턴 데이터를 추출한 뒤 Runthread를 활성화시키면, 상기 Runthread는 현재 진행중인 수행코드 포인터를 저장하고, 에뮬레이터가 넘겨준 프로시저 ID를 통해 프로시저의 수행코드 시작주소를 수행코드 포인터에 할당하여 프로시저의 수행코드가 처리될 수 있도록 하고, 프로시저가 리턴되면 저장된 수행코드 포인터를 꺼내 프로시저로 점프하기전의 작업이 계속 진행될 수 있도록 한다.
상기 Runthread는 모든 수행코드가 처리되었더라도 도착할 출력 메시지가 있으면 종료하지 않고 대기하고 있다가 활성화되면 해당 메시지의 프로시저가 처리될 수 있도록 한다.
한편, TDL은 교환기의 기능 시험 절차(MMC 명령어를 입력하고 수행결과 메시지를 분석하여 그 결과에 따라 다음 단계의 테스트를 진행)를 프로그래밍할 수 있도록 고안된 언어로서 출력 메시지로부터 추출 대상을 선언하는 패턴부, 전역변수와 프로시저의 전형을 선언하는 글로벌(GLOBAL) 파트, MMC 명령어를 기술하는 MMC 파트, 수행문을 기술할 수 있는 EXECUTE부, 프로시저 선언부로 구성되어 있다.
여기서 패턴 부분은 어떤 메시지에서 어느 부분을 데이터로 추출할 것인지, 추출 후 어느 프로시저를 호출해야 하는 지를 선언하는 부분으로 문법은 다음과 같다.
<pattern_part> ::='PATTERN''{'
<ptn_type_dcl>
<ptn_prn_dcl>
[<ptn_procedure_dcl>]
{<ptn_field_dcl>}
[<ptn_fieldln_dcl>]
'}'
<ptn_type_dcl>
::='TYPE'':='(['FIELD']{'FIELD']{',''FIELDLN'}│'NONE')','
<ptn_prn_dcl> ::='PRN'':=' <prn>{','<prn>}','
<ptn_procedure_dcl> ::='PROCEDURE' ':='<ident>','
<ptn_field_dcl> ::='FIELD' ':=' (<string>│<ident>)
{',' (<string>│<ident>) }','
<ptn_fieldln_dcl> ::='FIELDLN' ':=' '('<string>',<ident>')'
{',' '('<string> ',' <ident>')'} ','
<prn> ::=('A'│'F'│'S'│'M'│'P')<digit><digit><digit><digit>
아울러 타입(TYPE)은, 추출 데이터들의 패턴 형태를 선언하는 부분으로, "FIELD", "FIELDLN", "NONE"을 선언할 수 있다. "FIELD"가 선언되어 있을 경우 이후에 FIELD Part가 나타날 수 있으며, "FIELDLN"이 선언되어 있을 경우 이후에 FIELDLN Part가 나타날 수 있다. "NONE"은 패턴에 의한 데이터 추출을 하지 않는다는 것을 의미한다. 다음은 선언 예 이다.
- TYPE := FIELD;
- TYPE := FIELD, FIELDLN;
- TYPE := FIELD, FIELDLN, FIELDLN;
- TYPE := NONE;
또한 PRN은 추출될 메시지의 출력(Print-out) 기준 넘버를 선언하는 부분이며, 선언 예는 다음과 같다.
- PRN := M0100;
- PRN := M0351, M0352;
- PRN := P0001;
또한, 프로시저는 해당 메시지(PRN에 선언)가 출력된 후 불리워질 프로시저를 선언하는 부분으로서, 다음과 같다.
PATTERN{
.......
PROCEDURE := M0353_PROC;
}
.....
M0353_PROC : PROC()
/* M0353 메시지에 대한 처리를 기술한다 */
END;
또한, 필드는 출력 메시지의 각 라인에서 특정 문자열들의 일부를 데이터로 추출하기 위해 선언하는 부분이다. 출력 메시지의 각 라인 중에 "RESULT = OK"에서 "OK"를 데이터로 추출하기 위해 필드를 선언한 예는 다음과 같다.(ptn_Result의 값은 GetPatternData()library를 이용하여 인출할 수 있다).
- FIELD := "RESULT", "=", ptn_Result;
또한 FIELDLN은 메시지를 컬럼(Column)단위로 나누었을 때 특정 문자열의 위치와 동일한 곳을 데이터로 추출하기 위해 패턴을 선언하는 부분이다.
다음은 밑줄친 부분을 데이터로 추출하기 위해 FIELDLN Part를 기술한 예이다.
MOKDONG_SSP 1999-03-04 14:34:37 THU ON rsh
M6610 DISPLAY SWITCH NETWORK LINK
ASSHWY CLIA-ACLIA-BTSW-A TSW-B LLIA-A LLIA-B
ASP0000 STD-BYACTIVEACTIVE STD-BY STD-BY ACTIVE
ASP0101 STD-BYACTIVESTD-BY ACTIVE STD-BY ACTIVE
ASP0202 STD-BYACTIVESTD-BY ACTIVE STD-BY ACTIVE
ASP0303 ACTIVESTD-BYACTIVE STD-BY ACTIVE STD-BY
ASP0404 STD-BYACTIVE****** ****** ****** ******
ASP0505 STD-BYACTIVE****** ****** ****** ******
ASP0606 STD-BYACTIVE****** ****** ****** ******
COMPLETED
- FIELDLN :=("ASS", ptn_AssNum),("CLIA-B", ptn_C:iaB);
이렇게 FIELDLN 파트를 기술했을 경우 "ASS"와 동일한 위치의 데이터는 ptn_AssNu에, "CLIA-B"와 동일한 위치의 데이터는 ptn_CliaB에 저장된다. "ASS", "CLIA-B"와 같이 데이터 추출의 기준점이 되는 문자열들이 여러 라인에 걸쳐 출력되면 라인 수만큼 타입 파트에 FIELDLN이 선언되어야 한다. 다음은 그 예이다.
MOKDONG_SSP 1999-03-04 14:34:37 THU ON rsh
Mxxxx FIELDLN SAMPLE DATA
Field_A Field_B Field_C Field_D
Field_E Field_F
Data_A1 Data_B1 Data_C1 Data_D1
Data_E1 Data_F1
Data_A2 Data_B2 Data_C2 Data_D2
Data_E2 Data_F2
COMPLETED
- TYPE := FIELDLN, FIELDLN;
- FIELDLN := ("Field_A", ptn_FieldA),("Field_F",ptn_FieldF);
"Field_A", "Field_F"가 2라인에 걸쳐 출력되었기 때문에 타입에 FIELDLN이 2번 나온 것을 볼 수 있다.
다음으로 문자열 구분자('', '\t', '\n', '=', '/')에 대해서 살펴보면, 출력 메시지는 문자열 구분자들에 의해 문자열들로 나뉘어 지고, 그 문자열들이 어떤 패턴과 일치되는지 분석된 후 데이터 저장 여부가 결정된다. 다음은 출력 내용별로 문자열들을 나열한 것이다.
- "RESULT=OK"
==> 문자열 : "RESULT","=","OK"
- "LOCATION=ASP00/SIDE=A"
==> 문자열 : "LOCATION", "=", "ASP00", "/", "SIDE", "=", "A"
- "RSLT=ASP00(SIDE:A)"
==> 문자열 : "RSLT", "=", "ASP00(SIDE:A)"
또한 GLOBAL 파트는 전역 상수, 전역 변수 및 프로시저의 Proto-type을 선언하는 부분으로서, 문법은 다음과 같다.
<global_part> ::= 'GLOBAL' '{'
{(<syn_dcl>│<var_dcl>│<procedure_def>)}
'}'
<syn_dcl> ::='SYN'<ident>':="<arithmetic_expression>';'
<var_dcl> ::='DCL'<ident>{','<ident>}<var_type>[<array_dcl>]','
<var_type> ::='INT'│'STRING'
<array_dcl> ::='ARRAY'{'['<arithmetic_expression>']'}1
<procedure_def>
::=<ident>',''PROC''('[<parameter_lists_def>]')'['('<var_type>')']','
<parameter_lists_def>::=<parameter_list> {','<parameter_list>}
<parameter_list> ::=[<ident>{','<ident>}]<var_type>['LOC']
여기서 SYN은 상수형 변수를 선언하는 부분이며 변수에 대입할 수 있는 값들은 정수, 문자열, 상수형 변수, 수식이다(수식에는 상수형 변수를 포함할 수 있다)
- SYNg_cnMaxAsp:=32;
- SYNg_cnMaxCmd:=100;
- SYNg_csDisIoPortCmd:="DIS-IO-PORT;";
- SYNg_cnMaxLoopCnt:=g_cnMaxAsp/16;
DCL은 변수를 선언하는 부분으로 변수에 integer 혹은 string type으로 선언될 수 있으며 최대 5차원까지의 어레이(array)로도 선언할 수 있다.
* integer type : -214783648 ~ 2147483647 구간의 정수 값
* string type : double quote(")로 둘러싸인 문자열 예) "word", "124",
* Array의 인덱스는 0부터 array size-1까지이다.
DCLg_nStartAspNo,g_nEndAspNo INT ;
DCLg_sCmdName STRING ARRAY[g_cnMaxAsp][g_cnMaxCmd];
그리고 프로그래머가 구현한 프로시저는 GLOBAL 부분에 파라미터 타입 및 리턴 타입을 GLOBAL 부분에 명시해야만 한다. 이때 파라미터의 이름은 생략 가능하며 리턴 값이 없을 경우 리턴 타입 역시 생략할 수 있다.
-AddString : PROC(first STRING, second STRING)(STRING);
-AddString : PROC(first, second STRING)(STRING);
-AddString : PROC(STRING, STRING)(STRING);
위의 문장들은 AddString 프로시저가 2개의 스트링 타입 파라미터를 받아서 스트링 타입의 값을 변환하는 프로시저임을 정의하는 동일한 문장이다.
또한, MMC Part는 수행 하고자 하는 MMC 명령어를 직접 기술하는 부분이다.
PATTERN{
.....
}
GLOBAL{
.....
}
DIS_IO_PORT; /*MMC part*/
DIS_PRCS_STS:HMP; /*MMCpart*/
또한, Execution Part는 수행문을 기술할 수 있는 부분으로, 문법은 다음과 같다.
<exec_part>::='EXXCUTE''{'
{<statements>}
다음은 예이다.
PATTERN{
.....
}
GLOBAL{
.....
}
(1) EXECUTE {
g_nStartAspNo:=0;
(2) DIS-IO-PORT;
(3) DIS-PRCS-STS:HMP;
(4) EXECUTE {
g_sCmdName[0][0]:="DIS_SN_STS:"+g_nStartAspNo;
g_sCmdName[0][1]:=","+g_nEndAspNo+",";
}
(4) 순으로 수행된다.
또한, Procedure Declaration Part는 프로시저를 선언하는 부분으로서, 문법은 다음과 같다.
<procedure_dcl> ::= <ident>
':''PROC''('[<parameter_lists_dcl>]')'['(<var_type>')']
{(<syn_dcl>│<var_dcl>)}
{<statements>}
'END'[<ident>]';'
<parameter_lists_dcl> ::=<parameter_list_dcl> {','<parameter_list_dcl>}
<parameter_list_dcl> ::=<ident>{','<ident>} <var_type> ['LOC']
예)
AddStrmstring:PROC(first STRING, second STRING)(STRING)
DCL sRetValueSTRING;
sRetValue :=first+second;
RETURN(sRetValue);
END AddString
프로시저의 파라미터 전달 방법으로 call by value와 call by reference를 사용할 수 있는 데, 파라미터 타입 뒤에 "LOC"를 선언할 경우 call by reference, 파라미터 타입만 존재할 경우 call by value를 의미한다.
* Call by value일 경우 실제 파라미터(actual parameter)의 값이 형식 파라미터(formal parameter)로 복사되므로 형식 파라미터가 변경되더라도 실제 파라미터는 변경되지 않는다.
EXECUTE{
g_nFirst:=10;
g_nSecond:=20;
SomeFunc(g_nFirst,g_nSecond);
printf("\n g_nFirst=%d,g_nSecond=%d",g_nFirst,g_nSecond);
}
SomeFunc:PROC(nFirst,nSecond INT)
nFirst:=30;
nSecond:=40;
printf("\n nFirst=%d,nSecond=%d',nFirst,nSecond);
END;
위의 수행결과는 다음과 같다.
nFirst=30, nSecond=40
g_nFirst=10, g_nSecond=20
* 기준호(Call by reference)일 경우 형식 파라미터는 실제 파라미터의 또 다른 이름으로써 형식 파라미터가 변경되면 실제 파라미터도 변경된다.
EXECUTE{
g_nFirst:=10;
g_nSecond:=20;
SomeFunc(g_nFirst,g_nSecond);
printf("\n g_nFirst=%d, g_nSecond=%d", g_nFirst, g_nSecond);
}
SomeFunc:PROC(nFirst, nSecond INT Loc)
nFirst:=30;
nSecond :=40;
printf("\n nFirst=%d, nSecond=%d", nFirst, nSecond);
END;
위의 수행결과는 다음과 같다.
nFirst=30, nSecond=40
g_nFirst=30, g_nSecond=40
다음으로 statement는 TDL에서 사용할 수 있는 수행문을 나타내며, 문법은 다음과 같다.
<statements> ::={<statement>}
<statement>
::=<assignment_st>│<call_st>│<loop_st>│<if_st>│<control_st>│<null_st>
<assignment_st>
::=<ident>{'['<expression>']'}<assign_operator><expression>';'
<assign_operator> ::=[('+'│'-'│'*'│'/'│'%')]':='
<call_st> ::=<ident>'('[<actual_para_lists>]')' ';'
<loop_st> ::=<do_for_loop>│<do_while_loop>
<if_st> ::='IF'<expression>'THEN'<statements>
{'ELSIF'<statements>}
{'ELSE'<statements>}
'FI' ';'
<control_st> ::=('BREAK'│'continue'│'RETURN'│'STOP')';'
<null_st> ::= ';'
<actual_para_lists> ::=<expression>{','<expression>}
<do_for_loop>
::='DO''FOR''('[<do_for_init>','[<expression>]','[<do_for_last>]')'<statements>
'OD' ';'
<do_while_loop> ::='DO' 'WHILE' '('<expression>')' <statements>
'OD'
<do_for_init> ::= <assignment_st>{','<assignment_st>}
<do_for_last> ::=<assignment_st>{','<assignment_st>}
<expression> ::=<algebra_exp>
<algebra_exp> ::=<relational_exp>('OR'│'AND')<relational_exp>│
'NOT'<relational_exp>│
<relational_exp>
<relational_exp> ::=<arithmetic_exp>('>'│'>='│'<'│'<='│'='│'/=')
<arithmetic_exp>│<airthmetic_exp>
<arithmetic_exp> ::= <value>('+'│'-'│'*'│'/'│'%')<value>│'-'<value>│
<value>
<value> ::= <ident>{'['<expression>']'}│
<digits>│
<string>│
<call_st>│
'('<expression>')'
여기서 Assignment 수행문은 변수에 값을 할당하는 것을 나타내며, 그 예는 다음과 같다.
- g_nStartAspNo:=10;
- g_sCmdName[0][1] := "DIS-SN-STS:1,10;"
- g_sCmdName[0][2] := AddString';'
- g_nStartAspNo+:= 10; ==> g_nStartAspNo := g_nStartAspNo+10;
- g_nEndAspNo%:=5; ==> g_nEndAspNo:= g_nEndAspNo%5;
Call 수행문은 프로시저를 호출하는 것을 나타내며, 그 예는 다음과 같다.
- AddString(g_sCmdName[0][0], g_sCmdName[0][1]);
- GetPatternData(ptn_AspNum, g_sCmdName[0][3]);
Loop 수행문은 주어진 구간을 반복하는 수행문으로 DO-FOR loop와 DO-WHILE loop가 있다.
DO-FOR Loop는 Loop에 들어가기 전에 초기화 과정을 처리하고 주어진 조건이 사실일 동안 Loop Body와 Last Action 부분을 반복한다.
nTotal:=0;
DO FOR((1)nIndx:=1; (2)nIndx<=10; (4)nIndx+:=1)
(3)nTotal+:=nIndx;
OD:
printf("\n Total=%d",nTotal);
(2) ....이다.
DO-WHILE loop는 주어진 조건이 진실일 경우 Loop body를 반복한다.
nTotal:=0;
nIndx :=1;
DO WHILE ((1) nIndx <=10)
(2) nTotal +:=nIndx;
(3) nIndx +:=1;
OD;
printf("\n Total = %d", nTotal);
(3) .....이다.
또한 IF 수행문은 조건에 따라 처리내용을 달리 하기 위한 수행문이다.
nEvenTotal := 0;
nOddTotal := 0;
DO FOR(nIndx :=1; nIndx<= 10; nIndx +:=1)
IF (1) nIndx %2 = 0 THEN
(2) nEvenTotal +:=nIndx;
ELSE
(3) nOddTotal +:=nIndx;
FI;
OD;
printf("\n Even Total=%d, Odd Total=%d", nEvenTotal, nOddTotal);
위의 예는 1부터 10까지 숫자에서 짝수, 홀수별로 합계를 구하는 코드로 nIndx를 2로 나눈 나머지가 0이면 (2)문장을 수행하고, 그렇지 않으면 (3)문장을 수행한다.
IF nSum < 50 THEN
sGrade := "F";
ELSIF nSum < 60 THEN/*50 <= nSum < 60*/
sGrade := "E";
ELSIF nSum < 70 THEN/*60 <= nSum < 70*/
sGrade := "D";
ELSIF nSum < 80 THEN/*70 <= nSum < 80*/
sGrade := "C";
ELSIF nSum < 90 THEN/*80 <= nSum < 90*/
sGrade := "B";
ELSIF /*nSum >= 90*/
sGrade := "A";
FI;
위의 예는 nSum의 값에 따라 sGrade를 구하는 코드이다.
다음으로 Control 수행문은 루프내에서 루프 외부 혹은 루프의 마지막 수행 부분으로 제어를 옮기거나 프로시저내에서 프로시저를 호출한 곳으로 제어를 옮기는 등 수행 위치를 제어하는 문장이다.
"BREAK"는 루프내에서 루프외부로 제어를 옮기는 제어문이다.
DO FOR(nIndx := 1; nIndx<=100; nIndx +:=1)
nTotal +:=nIndx;
IF nTotal > 100 THEN
BREAK; /*nTotal이 100보다 크면 루프를 벗어난다.*/
FI;
OD;
DO FOR(i:=0; i<10; i+:=1)
DO FOR(j:=0; j<10; j+:=1)
IF g_nInformTb[i][j] < 0 THEN
BREAK; /* g_nInformTb1[i][j]가 0보다 작으면 제어를 아래의 #지점으로 옮긴다.*/
FI;
OD;
# printf("\n j=%d",j);
IF j<10 THEN
BREAK; /*j가 10보다 작으면 제어를 @지점으로 옮긴다.*/
FI;
OD;
@ printf("\n i=%d", i);
"CONTINUE"는 루프의 마지막 수행 부분으로 제어를 옮기는 수행문으로 DO-FOR 루프일 경우 라스트 액션 파트로, DO-WHILE일 경우 컨디션 파트로 제어를 옮긴다.
DO FOR(i:=0; i<100; #i+;=1)
IF i %2 = 0 THEN
CONTINUE; /*i를 2로 나눈 나머지가 0일 경우 제어를 #으로 옮긴다. */
FI;
nTotal +:=i;
OD;
i:=0;
DO WHILE(@ i<100)
IF i %2 = 0 THEN
i+:=1;
CONTINUE; /*i를 2로 나눈 나머지가 0일 경우 제어를 #으로 옮긴다.*/
FI;
nTotal +:=i;
i+:=2;
OD;
"RETURN"은 프로시저내에서 프로시저를 호출한 곳으로 제어를 옮긴다.
EXECUTE{
g_nTotal1:=SumFunc(50);
g_nTotal2:=SumFunc(200); /*g_nTotal2는 -1을 갖게 된다*/
}
SomeFunc:PROC(nMax INT)(INT)
DCL indx INT;
DCL nTotal INT;
IF nMax>=100 THEN
RETURN-1;
FI;
nTotal :=0;
DO FOR(indx:=0;indx<nMax;indx+:=1)
nTotal+:=g_nArray[indx];
OD;
RETURN(nTotal)
END SomeFunc;
"STOP"은 모든 수행을 종료하는 수행문이다.
한편 TDL 수행문에서 사용할 수 있는 연산자는 다음과 같다.
대입연산자(:=)
논리연산자(AND, OR, NOT) : 여기서 AND는 피연산자 둘 다 참일 경우 참, 그렇지 않을 경우 거짓, OR은 피연산자 둘 다 거짓일 경우 거짓, 그렇지 않을 경우 참, NOT는 피연산자가 참이면 거짓, 피연산자가 거짓이면 참이 되는 것을 나타낸다.
관계연산자(>, >=, <, <=, =, /=) : 여기서 >연산자는 좌측 피연산자가 우측피연산자보다 크면 참, >=연산자는 좌측 피연산자가 우측 피연산자보다 크거나 같으면 참, <연산자는 좌측 피연산자가 우측 피연산자보다 작으면 참, <=연산자는 좌측 피연산자가 우측 피연산자보다 작거나 같으면 참, =연산자는 좌측 피연산자와 우측 피연산자가 같으면 참, /=연산자는 좌측 피연산자와 우측 피연산자가 같지 않으면 참을 나타낸다.
산술연산자(+,-,*,/,%) : 여기서 +연산자는 둘 다 INT 타입이면 더하기, 둘 다 STRING 타입이면 string 연결, 둘 중 하나만 STRING type이면 INT 타입을 문자열로 변환하여 연결하는 것을 나타낸다.
예)
12 +13 => 25
"This"+"is" => "This is"
123+"sample" => "123 sample"
"text"+456 => "text456"
12 + 13 + "book" => "25book"
아울러 -연산자는 피연산자가 둘일 경우 빼기, 하나일 경우 피연산자에 -1을 곱하는 것을 나타낸다.
예)
10 - 5 => 5
-(10+5) => -15
그리고 *연산자는 곱하기를 나타낸다.
예)
2*3 => 6
/연산자는 나누기(젯수를 0으로 할 경우 "Devide by zero"error 발생)를 나타낸다.
예)
2/3 => 0
4/3 => 1
2/0 => Devide by zero error
%연산자는 나머지를 나타낸다.
예)
2 % 3 => 2
4 % 3 => 1
3 % 3 => 0
여기서 *, /, % 연산자는 +, - 연산자보다 우선 순위가 높다.
아울러 각 연산자별 우선 순위는 괄호"()" > 산술연산자 > 관계연산자 > 논리연산자 > 대입연산자 순이다.
다음으로 TDL 라이브러리(Library)는 다음과 같다.
1) ExeMmcCommand(sCmdString STRING)(INT) : sCmdString(명령어 문자열)을 MMS(Man-Machine Subsystem)로 전송하여 실행될 수 있도록 한다. 전송 실패 및 sCmdString상에 에러가 존재하면 0보다 작은 값을 리턴한다.
예1)
ExeMmcCommand("DIS-PRCS-STS:HMP;");
예2)
g_csCmdString:="DID-PRCS-STS"+":"+"HMP;";
ExeMmcCommand(g_csCmdString);
2) printf(sFormatString STRING, *) : sFormatString을 이용하여 파라미터들을 포맷하고 이를 화면에 출력한다.
예)
g_csCmdString:="DIS-IO-PORT";
printf("\n This is a sample=%d, %s", 1234, g_csCmdString);
=> 화면에 "This is a sample = 1234, DIS-IO-PORT"가 출력된다.
3) sprintf(sMsgString STRINGLOC, sFormatString STRING, *) : sFormatString을 이용하여 파라미터들을 포맷하고 이를 sMsgStrinG에 할당한다.
예)
sSorStr:="HMP";
sprintf(g_csCmdString, "DIS-PRCS-STS:%s;",sSorStr);
=> g_csCmdString은 "DIS-PRCS-STS : HMP;"가 저장된다.
4) fprintf(sFileName STRING, sFormatString STRING, *)(INT) : sFormatString을 이용하여 파라미터들을 포맷하고 이를 sFileName이 가리키는 파일에 기록한다. 실패시 0보다 작은 값을 리턴한다.(문자열 안의 '\'문자는 특수 코드('\n', '\t',....)를 표현할 때 쓰인다. 따라서 디렉토리를 구분자인 "\'를 나타내기 위해서는 '\\' 로 표시해야 한다.
예)
fprintf("c:\\Temp\\MyResult.log","\n!!Error:%d", nErrorCode);
=> nErrorCode가 -1이면 "c:\Temp\MyResult.log"파일의 끝 라인에 "\!! Error : -1"이 추가된다.
5) GetPatternData(sPatternString PTNDATA, sData STRING LOC)(INT) : 메시지 출력 후 추출된 데이터중 sPatternString에 위치하는 데이터를 sData에 할당한다. 데이터가 없으면 0보다 작은 값을 리턴한다.
6) RewindPatternData(sPatternString PTNDATA) : 출력 메시지의 추출된 데이터 중에 sPatternString이 가리키는 데이터의 위치를 처음으로 되돌린다.
7) atoi(sMsgSTRING)(INT) : sMsG를 Integer로 변환하여 리턴한다.
예)
nValue := atoi("12345");
=> nValue에는 숫자 12345가 저장된다.
8) StrLength(sMsg STRING)(INT) : sMsg의 길이를 리턴한다.
예)
nLen:= StrLength("12345");
=> nLen에는 5가 저장된다.
9) StrRight(sMsg STRING, nLen INT)(STRING) : sMsg의 오른쪽에서 nLen 만큼의 문자를 리턴한다.
예)
sNum := StrRight("ASP01",2);
=> sNum에는 "01"이 저장된다.
10) StrLeft(sMsg STRING, nLen INT)(STRING) : sMsg의 왼쪽에서 nLen 만큼의 문자를 리턴한다.
예)
sPrc := StrLeft("HMP-A", 3);
=> sPrc에는 "HMP"가 저장된다.
11) StrMiddle(sSource STRING, nPos INT, nLen INT)(STRING) : sSource 문자열의 nPos 위치부터 nLen 만큼의 문자열을 리턴한다.
예)
sMiddle := StrMiddle("12345", 1, 2);
=> sMiddle에는 "12345"가 1위치부터 2개의 문자열인 "23"이 저장된다.
12) StrFind(sSource STRING, sTarget STRING)(INT) : sSource 문자열에 sTarget 문자열이 포함되어 있는지를 검색하여 그 위치를 리턴한다(문자열의 위치를 나타내는 값은 0부터 시작하며 sTarget 문자열이 없을 경우 -1이 리턴된다).
예)
nPos := StrFind("12345", "34");
=> nPos에는 "12345"에서 "34'의 첫 위치2가 저장된다.
13) GetPrn()(STRING) : 출력된 메시지의 Print-out Reference Number를 리턴한다. => GetPrn은 PATTERN에 선언한 프로시저가 호출되었을 때 사용해야만 한다.
14) WriteOutputMsg(sFileName STRING)(INT) : 출력된 메시지를 sFileName이 가리키는 file에 저장한다. 저장 실패시 0보다 작은 값을 리턴한다. => WriteOutputMsg는 PATTREN에 선언한 프로시저가 호출되었을 때 사용해야만 한다.
15) GetMmcFailCrn()(INT) : MMC Execution Fail 발생시(MMC를 처리하는 Application으로부터 응답이 없을 경우) 해당 명령어 번호를 리턴한다. 수행이 정상적일 경우 -1을 리턴한다.
16) MakePseudoMsg(nPrn INT) : nPrn에 해당하는 Pxxxx(xxxx는 nPrn) 메시지를 생성한다. 패턴 파트의 PRN 항목에 Pxxxx가 선언되어 있고 프로시저 항목에 프로시저의 이름이 선언되어 있으면 해당 프로시저가 불리워진다.
17) eprintf(sFormatStringSTRING,*) : sFormatString을 이용하여 파라미터들을 포맷하고 이를 에러 윈도우 화면에 출력한다 => 에러 윈도우는 eprintf 또는 OutputMsgToErr을 사용해야만 열린다.
예)
eprintf("\n!!ERROR Invalid ASP status =%d", rErrorCode);
18) OutputMsgToErr() : MMC 출력 메시지를 에러 윈도우 화면에 출력한다. => OutputMgToErR은 PATTERN에 선언한 프로시저가 호출되었을 때 사용해야만 한다.(에러 윈도우는 eprintf 또는 OutputMsgToErr을 사용해야만 열린다).
19) SetMmcWaitFlag(nFlag INT) :ExeMmcCommand()를 통해 MMC 명령어를 수행시킬 경우 수행결과의 대기 여부를 지정한다. nFlag가 0이 아니면 수행결과가 수신될 때까지 대기한다.(Default로 ExeMmcCommand()는 수행결과가 수신될 때까지 대기한다)
예)
EXECUTE{
/*DIS-IO-PORT;를 수행시키고 출력 메시지가 올 때까지 대기한다.*/
ExeMmcCommand("DIS-IO-PORT;");
SetMmcWaitFlag(FALSE);
/*이후부터 ExeMmcCommand()호출시 명령어 수행 결과 메시지를 기다리지 않는다.*/
ExeMmcCommand("DIS-PRC-STS;");/*수행만 시키고 바로 리턴된다.*/
}
20) GetToken(nLine INT, nNth INT, sString STRING LOC)(INT) : MMC 출력 메시지의 nLine의 nNtH 번째의 문자열을 sString에 할당하고 그 문자열의 길이를 리턴한다(Line은 1부터 시작하며 nLine 및 nNth의 위치에 해당하는 문자열이 존재하지 않으면 -1을 리턴한다).
21) GetMsgLineCount()(INT) : MMC 출력 메시지의 라인 수를 리턴한다 => GetMsgLineCount는 PATTERN에 선언한 프로시저가 호출되었을 때 사용해야만 한다.
예)
PATTERN{
PRN:=M6612;
TYPE:=NONE;
PROCEDURE:=RSLT_PROC;
}
.....
RSLT_PROC:PROC()
DCL sStr STRING;
DCL nLen,i INT;
DCL nLineCnt INT;
DO FOR(i:=1;i<=nLineCnt; i+:=1)
nLineCnt:=GetMsgLineCount();
nLen:=GetToKen(i,1,sStr);
printf("\n FIRST STRING =%s, LEN =%d", sStr, nLen);
OD;
END;
=> 출력 메시지의 각 라인에서 맨 처음 문자열을 출력한다.
22) IsMsgCompleted()(INT) : MMC 출력 메시지의 종결 여부를 리턴한다. 출력 메시지가 "COMPLETED"로 끝났을 경우 1이 리턴되며, "CONTINUED"로 끝났을 경우 0이 리턴된다. => IsMsgCompleted는 PATTREN에 선언한 프로시저가 호출되었을 때사용해야만 한다.
예)
PATTERN{
PRN:=M0100;
TYPE:=NONE;
PROCEDURE:=RSLT_PROC;
}
......
RSLT_PROC:PROC()
/*Other Processing*/
IF IsMsgCompleted() THEN
printf("Message = COMPLETED");
ELSE
printf("Message =CONTINUTED,");
FI;
END;
테스트 파일이 위와 같고 다음과 같은 메시지가 출력된다면 화면에는 메시지 = CONTINUED, Message = CONTINUED, Message=COMPLETED가 출력된다.
KTF_PCX 1990-01-07 09:21:10 SUN ON PORT 24
M0100 EXAMPLE OUTPUT MESSAGE
RESULT = NOK
CONTINUDE
KTF_PCX 1990-01-07 09:21:10 SUN ON PORT 24
M0100 EXAMPLE OUTPUT MESSAGE
RESULT = NOK
CONTINUED
KTF_PCX 1990-01-07 09:21:10 SUN ON PORT 24
M0100 EXAMPLE OUTPUT MESSAGE
RESULT = OK
COMPLETED
23) sleep(nSec INT)(INT) : 초 단위로 nSec 만큼 슬립(sleep)한다. 실패시 -1을 리턴한다.
예)
sleep(10); /*10초 동안 대기한다.*/
이상에서 상술한 본 발명 "교환기 자동 진단 방법"에 따르면, 교환기 시스템의 진단을 위해서 요구되는 다양한 종류의 반복 수행이 필요한 운용자 명령어(MMC)들을 자동화된 툴(Tool)에 의해 일괄 처리할 수 있는 이점이 있다.
또한 상기 일괄 처리된 결과를 자동으로 분석하여 불량 원인을 운용자에게제공해주는 이점도 있다.
또한 상기와 같은 이점들로 인해 시스템의 설치, 점검 및 안정화에 소요되는 인적, 시간적, 경제적 낭비를 최소화할 수 있는 이점이 있으며, 또한 교환기 시스템의 품질 향상을 도모해주는 이점도 있다.

Claims (7)

  1. 교환기의 자동 진단 방법에 있어서,
    시험자가 시험절차를 TDL(Test Description Language)문법에 맞춰 프로그램을 작성하여 입력한 상태에서, 자동 진단이 시작되면 컴파일러에서 수행코드를 획득하고 이를 파일로 만들어 에뮬레이터에 전송해주는 단계와;
    상기 에뮬레이터에서 수행코드 파일을 읽어 패턴 정보, 수행코드, 프로시저 정보를 부분별로 저장하고, 수행코드만을 처리하는 런쓰레드(RunThread) 루틴을 실행시키는 단계와;
    상기 런쓰레드 실행 후 수신 시그널이 교환기내 프로세서(ATMP)에서 클라이언트로 신호를 전송하기 위한 시그널(BatchMsgToClientSig)일 경우, 수신 데이터가 명령어 검사 결과 데이터인지를 체크하고, 그 결과 수신 데이터가 명령 체크 결과일 경우에는 명령어 검사 결과에 대응하는 동작을 수행시키는 단계와;
    상기 수신 데이터가 명령어 검사 결과 데이터가 아닐 경우에는, 상기 수신 데이터가 메시지 출력 데이터인지를 판단하고, 그 판단 결과 메시지 출력 데이터일 경우에는 출력 메시지를 토큰(Token)별로 분류한 후 PRN(Printout Reference Number)을 추출하는 단계와;
    상기 추출한 PRN이 패턴 정보 영역에 존재하는지를 체크하고, 상기 추출한 PRN이 패턴 정보 영역에 존재할 경우에는 패턴 정보에 기록된 추출정보를 이용하여 데이터를 추출하는 단계와;
    상기 패턴 정보에 등록되어 있는 프로시저 ID를 추출하고, 대기중인 런쓰레드를 활성화시키는 단계를 포함하여 이루어짐을 특징으로 하는 교환기 자동 진단방법.
  2. 제1항에 있어서, 상기 추출한 PRN이 패턴 정보 영역에 존재하지 않을 경우에는 메시지 출력 완료 여부를 체킹하는 단계와; 상기 체크 결과 메시지 출력이 완료된 경우에는 MMC 전송 카운트를 감소시키고, 시그널 입력 대기 상태로 전환하는 단계를 더 포함하여 이루어짐을 특징으로 하는 교환기 자동 진단방법.
  3. 제1항에 있어서, 상기 수신 시그널이 교환기내 프로세서(ATMP)에서 클라이언트로 신호를 전송하기 위한 시그널(BatchMsgToClientSig)이 아닐 경우에는, 수신 시그널이 런쓰레드로부터의 명령어 수행 요구인지를 판단하는 단계와; 그 판단 결과 수신 데이터가 명령 수행 요구일 경우에는 명령어를 상기 시그널(BatchMsgToClientSig)에 실어 MMS로 전송하고, 그에 대한 응답이 오면 대기중인 런쓰레드를 활성화시키는 단계와; 상기 수신 시그널이 명령 수행 요구가 아닐 경우에는, 수신 시그널이 런쓰레드 종료 데이터인지를 확인하고, 그 결과 수신 시그널이 런쓰레드 종료 데이터일 경우에는 각 부분별로 할당했던 메모리를 해제한 뒤 종료하는 단계를 더 포함하여 이루어짐을 특징으로 하는 교환기 자동 진단방법.
  4. 제1항에 있어서, 상기 실행되는 런쓰레드 루틴은,
    수행코드 포인터 및 MMC 전송 카운터를 초기화시키고, 대기 상태에서 수행코드 포인터(IP)가 0보다 작은지를 체크하는 단계와, 상기 수행코드 포인터를 체크한 결과 수행코드 포인터가 0보다 클 경우에는 MMC 전송 카운트값이 0보다 큰지를 확인하는 단계와, 상기 확인 결과 MMC 전송 카운트값이 0보다 작을 경우에는 에뮬레이터로 쓰레드 종료 메시지를 전송하는 단계와, 상기 MMC 전송 카운트가 0보다 클 경우에는 출력 메시지를 대기하는 단계와, 상기 출력 메시지가 수신되면 수행코드 포인터를 저장하고, 프로시저 ID를 통해 해당 프로시저를 탐색하는 단계와, 상기 해당 프로시저가 탐색되거나 상기 수행코드 포인터(IP)가 0보다 작을 경우에는 수행코드 포인터를 1증가시켜 다음 수행코드(Next IP)로 설정하는 단계와, 상기 수행코드의 종류를 분석하고, 그 분석된 수행코드에 대응하는 쓰레드를 실행시켜 시험 루틴을 실행하는 단계와, 수행코드에 대한 쓰레드가 종료되면, 수행코드 포인터를 다음 수행코드 포인터(Next IP)로 설정하고, 상기 수행코드 포인터를 검색하는 단계로 이동하는 단계로 이루어짐을 특징으로 하는 교환기 자동 진단방법.
  5. 제4항에 있어서, 상기 수행코드의 종류를 분석한 후, 그 수행코드가 서브 루틴 점프(JSR : Jump Sub Routine)일 경우,
    상기 수행코드가 MMC를 수행하기 위한 코드(ExeMmcCommand)인지를 체크하는 단계와, 상기 체크 결과 수행코드가 MMC를 수행하기 위한 코드(ExeMmcCommand)일 경우에는, 파라미터로 전달된 명령어 문자열을 에뮬레이터로 전송하는 단계와, 상기 에뮬레이터가 활성화될 때까지 대기하는 단계와, 전송한 명령어에 오류가 발생하였나를 체크하는 단계와, 상기 체크결과 전송한 명령어에 오류가 발생하였으면 처음 단계로 리턴을 하고, 전송한 명령어에 오류가 없으면, 명령어 전송 카운트를 1증가시키고, 출력 메시지가 수신되기를 기다리는 단계와, 수신 메시지가 도착하면 수행코드 포인터를 저장하는 단계와, 프로시저 ID를 통해 해당 프로시저를 탐색하는 단계와, 상기 프로시저가 탐색되면 수행코드를 처리하도록 제어하는 단계로 이루어짐을 특징으로 하는 교환기 자동 진단방법.
  6. 제5항에 있어서, 상기 수행코드를 검색한 결과 수행코드가 MMC를 수행하기 위한 코드(ExeMmcCommand)가 아닐 경우에는 수행코드가 다른 디폴트 라이브러리(LIB)인지를 체크하는 단계와, 상기 체크 결과 수행코드가 다른 디폴트 라이브러리일 경우에는 디폴트 라이브러리를 저장하는 단계와, 상기 수행코드가 다른 디폴트 라이브러리도 아닐 경우에는 수행코드 포인터를 저장하고 처음 단계로 이동하는 단계를 더 포함하여 이루어짐을 특징으로 하는 교환기 자동 진단방법.
  7. 제5항에 있어서, 상기 탐색된 프로시저에서 수행코드를 제어할 수 있도록 제어하는 단계는, 수신한 출력 메시지를 토큰별로 분류하고 패턴 데이터를 추출한 뒤 런쓰레드를 활성화시키는 단계와, 상기 활성화된 런쓰레드는 현재 진행중인 수행코드 포인터를 저장하고, 에뮬레이터가 넘겨준 프로시저 ID를 통해 프로시저의 수행코드 시작주소를 수행코드 포인터에 할당하여 프로시저의 수행코드가 처리될 수 있도록 제어하는 단계와, 상기 프로시저가 리턴되면 저장된 수행코드 포인터를 인출하여 프로시저로 점프하기 이전의 작업이 계속 진행될 수 있도록 제어하는 단계로 이루어짐을 특징으로 하는 교환기 자동 진단방법.
KR10-2000-0087456A 2000-12-30 2000-12-30 교환기 자동 진단방법 KR100396031B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR10-2000-0087456A KR100396031B1 (ko) 2000-12-30 2000-12-30 교환기 자동 진단방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR10-2000-0087456A KR100396031B1 (ko) 2000-12-30 2000-12-30 교환기 자동 진단방법

Publications (2)

Publication Number Publication Date
KR20020057181A KR20020057181A (ko) 2002-07-11
KR100396031B1 true KR100396031B1 (ko) 2003-08-27

Family

ID=27690304

Family Applications (1)

Application Number Title Priority Date Filing Date
KR10-2000-0087456A KR100396031B1 (ko) 2000-12-30 2000-12-30 교환기 자동 진단방법

Country Status (1)

Country Link
KR (1) KR100396031B1 (ko)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS61198951A (ja) * 1985-02-28 1986-09-03 Nec Corp 電話交換機の自動試験装置
JPH0662114A (ja) * 1992-08-10 1994-03-04 Fujitsu Ltd プロセッサ間診断処理方式
JPH06189353A (ja) * 1992-12-22 1994-07-08 Nec Corp 定刻起動周期プログラムコマンド制御方式
JPH1093561A (ja) * 1996-09-13 1998-04-10 Fujitsu Ltd データ伝送装置の試験システム
KR19990060636A (ko) * 1997-12-31 1999-07-26 윤종용 교환기의 상태 관리방법
KR20000046123A (ko) * 1998-12-31 2000-07-25 김영환 전전자 교환기의 메인 프로세서 성능 측정방법

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS61198951A (ja) * 1985-02-28 1986-09-03 Nec Corp 電話交換機の自動試験装置
JPH0662114A (ja) * 1992-08-10 1994-03-04 Fujitsu Ltd プロセッサ間診断処理方式
JPH06189353A (ja) * 1992-12-22 1994-07-08 Nec Corp 定刻起動周期プログラムコマンド制御方式
JPH1093561A (ja) * 1996-09-13 1998-04-10 Fujitsu Ltd データ伝送装置の試験システム
KR19990060636A (ko) * 1997-12-31 1999-07-26 윤종용 교환기의 상태 관리방법
KR20000046123A (ko) * 1998-12-31 2000-07-25 김영환 전전자 교환기의 메인 프로세서 성능 측정방법

Also Published As

Publication number Publication date
KR20020057181A (ko) 2002-07-11

Similar Documents

Publication Publication Date Title
US5339422A (en) System and method for jacketing cross-domain calls in a multi-code execution and debugging system within a multi-architecture environment
US5651111A (en) Method and apparatus for producing a software test system using complementary code to resolve external dependencies
US5774729A (en) Event handling in a high level programming language environment
US5764947A (en) System and method for automatically interfacing call conventions between two dissimilar program units
US7577874B2 (en) Interactive debug system for multiprocessor array
US5361352A (en) Method for debugging in a parallel computer system and system for the same
EP0595540A1 (en) Debugging/modifying of software in ROM
CN109542464B (zh) IoT设备脚本程序的开发部署***、方法及存储介质
JPH07230386A (ja) データ処理装置及び制御ルーチン呼出し方法
KR100396031B1 (ko) 교환기 자동 진단방법
CN111240728A (zh) 应用程序更新方法、装置、设备和存储介质
US20060174248A1 (en) Software tool for automatically protecting shared resources within software source code
WO2007074469A2 (en) Method and system for compiling a source code
JP3300090B2 (ja) 試験プログラム実行方法
JPH08305583A (ja) Cpuシミュレーション方法
US7318221B2 (en) Windows™ F-language interpreter
JPH096646A (ja) プログラムシミュレーション装置
JPH11134198A (ja) コンパイル処理装置、コンパイル処理方法、プログラム実行装置、プログラム実行方法及びプログラム記憶媒体
JPH0823861B2 (ja) 分散処理方法
EP1569099A2 (en) Process language for microprocessors with finite resources
KR100258095B1 (ko) 칠에서의 초기화되지 않은 이름의 발견방법
Byun et al. High-level chill debugging system in cross-development environments
Love ANSI C for programmers on UNIX systems
Marty et al. Implementation Guidelines
Barklund et al. Erlang 4.7. 3 Reference Manual DRAFT (0.7)

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20060807

Year of fee payment: 4

LAPS Lapse due to unpaid annual fee