XScript マニュアル · Chapter 3

制御フロー

XScript は ifforwhile に加えて switch/case/default 分岐もサポートします。 開き波括弧は常に次の行に置きます(プロジェクトのスタイル規則)。

条件文 if

xscript
if (IO["I_Start"] == ON)
{
    Log("start pressed");
}
else if (IO["I_Reset"] == ON)
{
    Log("reset pressed");
}
else
{
    // 待機状態
}

実践パターン

xscript
// センサ + フラグ + サーバ応答の複合条件
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# とは異なりカンマ区切りを使用します。

xscript
// 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

条件が真である間、繰り返します。装置の待機ループで頻出。

xscript
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現在の繰り返し文を終了
breakallネストしたすべての繰り返し文を一度に脱出
continue現在の繰り返しをスキップし、次の繰り返しへ
goto "STEP_名前"シーケンス内の別ステップへジャンプ
xscript
// 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 以下に保ちます。それ以上の場合は関数への分離を推奨します。