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