XScript マニュアル · Chapter 3
制御フロー
XScript は if・for・while に加えて 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 以下に保ちます。それ以上の場合は関数への分離を推奨します。