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 以内。超过时建议拆分为函数。