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 이하로 유지. 그 이상이면 함수로 분리 권장.