XScript 매뉴얼 · Chapter 3
title: "제어 흐름 — if / for / while" chapter: 3 images:
- xscript-control-flow.png
제어 흐름
XScript 는 if · for · while 세 가지 제어 구문을 지원합니다. 여는 중괄호는
항상 다음 줄 에 둡니다 (프로젝트 스타일 규칙).
조건문 if
if (IO["I_Start"] == ON)
{
Log("start pressed");
}
else if (IO["I_Reset"] == ON)
{
Log("reset pressed");
}
else
{
// 대기 상태
}실전 패턴
// 센서 + 플래그 + 서버 응답의 복합 조건
if (SYS.IsRunning && SS.UseServerRetryCount == ON
&& Common::IsMeasureUnit(ErrorUnitIndex)
&& retries < maxRetries)
{
ret = Micom::Send(ErrorUnitIndex, "send_error_reply", "reply=retry", true);
}반복문 for
XScript 의 for 는 for(변수, 시작, 끝) 또는 for(변수, 시작, 끝, 증감) 형태로
C/C# 과 다르게 콤마 구분 을 사용합니다.
// i = 0..count-1 (증가)
for (i, 0, count - 1)
{
moduleName = $"Module{i+1}";
totalUnitCount += JSON.GetIntValue(jsonName, $"modules[{i}].category.unitCount");
}
// 역방향 반복 (step = -1)
for (i, count - 1, 0, -1)
{
DisplayList.Add(Data::ReorderNumbers[i]);
}반복문 while
조건이 참인 동안 반복. 장비 대기 루프에서 자주 사용.
int startTick = SYS.TickCount;
while (UnitData::IsSending[unitIndex - 1] == OFF)
{
Sleep(100);
if (SYS.GetElasped(startTick) > 2000)
{
LogError($"{unitName} IsSending ON Failed");
ShowError(EB_Reset, 1210, $"{unitName}:IsSending ON Failed");
return false;
}
}주의 :
while(true)무한 루프는 금지. 타임아웃·탈출 조건을 반드시 포함. 단순 대기는IO[name].Wait(true, ms)또는MOTOR[name].Wait(ms)API 사용을 우선.
흐름 제어 키워드
| 키워드 | 설명 |
|---|---|
return | 현재 함수/스텝 종료. return false 로 실패 전달 |
break | 현재 반복문 종료 |
continue | 현재 반복 건너뛰고 다음 반복 |
goto "STEP_이름" | 시퀀스 내 다른 스텝으로 점프 |
// break / continue 예
for (i, 0, SS.UnitCount - 1)
{
if (UnitData::UnitOrderNumber[i] == "")
{
continue; // 빈 유닛은 건너뛰기
}
if (SendUnitOrderItemStatus(i, status) == false)
{
result = false;
break; // 실패 시 중단
}
}공통 팁
- 여는 중괄호는 반드시 다음 줄 (프로젝트 규칙).
ShowError()이후에는 즉시return false.- 긴 조건식은 줄바꿈으로 가독성 확보, 필요하면 임시
bool변수로 분해. - 중첩 루프 깊이는 2 이하로 유지. 그 이상이면 함수로 분리 권장.