XScript マニュアル · Chapter 51
SN オブジェクト — シリアル番号ルール管理
スクリプトでキーワード SN を通じてアクセス。ラベル印刷、MES 報告、トレーサビリティ等で使う 固定領域(Lot/Line)+ 可変領域(シーケンス) のシリアル番号を、ルール単位で登録・生成・管理します。
| 概念 | 説明 |
|---|---|
| ルール(rule) | 名前で識別。1 プロジェクトで複数を同時運用可 |
| フォーマット | [固定幅:タイプ:整列]&[フィールド::長さ]|[可変領域] 形式 — 例:`[12:0:Left]&[Lot::6] |
| コンテキスト | 4 キー:LotNo · LineNo · WorkOrderNo · SubLot |
| 除外文字 | 既定 "1,0,D,I,O"(視覚的に紛らわしい文字を除外) |
一行サマリ —
SN.RegisterRule(...)登録 →SN.SetContext(...)Lot を埋める →SN.GenerateNext(...)で次のシリアル発行。
1) ルール登録 / 更新
名前 + フルフォーマット文字列で 1 行登録。
// フルフォーマット直接指定
SN.RegisterRule("prodA", "[12:0:Left]&[Lot::6]|[SN:SequencialDecimal:0:6]");
// 登録確認
if( SN.GetRule("prodA") == null )
{
LogError("rule register failed");
return false;
}同名ルールが存在する場合は 上書き されます — 既存のシーケンスカウンタは 保持されず、再初期化されます。
2) コンテキストを埋める
生成時にシリアルへ合成される外部値:
SN.SetContext("prodA", "LotNo", "LOT2026");
SN.SetContext("prodA", "LineNo", "L1");
SN.SetContext("prodA", "WorkOrderNo", "WO001");
SN.SetContext("prodA", "SubLot", "S01");有効キー:"LotNo", "SubLot", "LineNo", "WorkOrderNo"(他のキーは false 戻り)。
3) 次のシリアル発行
string sn = SN.GenerateNext("prodA");
if( sn == "" )
{
LogError("generate next failed");
return false;
}
Log($"new SN : {sn}");
// 例) "12LOT2026000001"GenerateNext 呼び出しで シーケンスカウンタが 1 増加 し、新しい値が返ります。
増加せず現在値だけ見る
string current = SN.Peek("prodA"); // 直近に発行した可変領域値カウンタの初期化
SN.ResetSequence("prodA"); // ルール定義は維持、可変領域だけリセット4) プレビュー / 一括生成
Preview — 状態は変えない
// ラベルデザイナ・検査画面のサンプル 5 個(実カウンタは増えない)
string[] samples = SN.Preview("prodA", 5);GenerateBatch — カウンタ増加 + 一括
// プリンタへ 100 枚一括発行
string[] batch;
if( SN.GenerateBatch("prodA", 100, batch) == false )
{
LogError("batch failed");
return false;
}
for(i, 0, batch.Length - 1)
{
PRINTER.PrintLabel(batch[i]);
}5) 除外文字(ExcludedChars)
可変領域で 使わない文字 をカンマ区切りで指定。
// 既定値(未設定の場合):"1,0,D,I,O"
string current = SN.GetExcludedChars("prodA");
Log($"excluded : {current}");
// 変更
SN.SetExcludedChars("prodA", "1,0,O");
// 除外なし
SN.SetExcludedChars("prodA", "");0/1 と紛らわしい I/O などの文字を除外すると、印字 / OCR の誤認識が大きく減ります。
6) ルール削除 / 一覧
// 登録済ルール名の配列
string[] names = SN.GetRuleNames();
for(i, 0, names.Length - 1) Log(names[i]);
// 単一削除
SN.RemoveRule("prodA");7) 永続化 — ファイル · プロジェクト保存 / 読込
ルール定義は JSON でシリアライズされます。可変領域カウンタは 永続化対象外 — 運用中はメモリにのみ保持されます。
// ファイル単位
SN.SaveToFile("D:/Backup/rules.json");
SN.LoadFromFile("D:/Backup/rules.json");
// プロジェクトディレクトリ既定パス(SerialRules.XDF)
SN.SaveToProject();
SN.LoadFromProject();LoadFromXxx は呼び出し前に マネージャを空にしてから 読み込みます。同名ルールを保存したい場合は事前にエクスポートしてください。
よく使うパターン
Lot 開始時 — Lot 登録後の最初のシリアル
FUNCTION OnLotStart(string lotNo, string subLot)
{
SN.SetContext("prodA", "LotNo", lotNo);
SN.SetContext("prodA", "SubLot", subLot);
SN.ResetSequence("prodA"); // 新しい Lot ならカウンタを最初から
string firstSn = SN.GenerateNext("prodA");
Data::CurrentSN = firstSn;
return true;
}新規プロジェクト初回起動で自動登録
FUNCTION OnInit()
{
if( SN.LoadFromProject() == false )
{
// ファイルがまだ無い — コードで既定ルール登録 → 保存
SN.RegisterRule("prodA", "[12:0:Left]&[Lot::6]|[SN:SequencialDecimal:0:6]");
SN.SetExcludedChars("prodA", "1,0,D,I,O");
SN.SaveToProject();
}
return true;
}プレビュー → ユーザ確認 → 実発行
string[] sample = SN.Preview("prodA", 3);
string msg = $"Sample: {sample[0]} / {sample[1]} / {sample[2]}\nProceed?";
if( ShowMessage(EB_YesNo, 0, msg) == ER_Yes )
{
string real = SN.GenerateNext("prodA");
// ... print or report
}関数一覧
| 分類 | 関数 |
|---|---|
| 登録 / 参照 | RegisterRule(name, fullFormat) · GetRule(name) · GetRuleNames() · RemoveRule(name) |
| コンテキスト | SetContext(name, key, value)(LotNo/SubLot/LineNo/WorkOrderNo) |
| 除外文字 | SetExcludedChars(name, chars) · GetExcludedChars(name) |
| 発行 | GenerateNext(name) · Peek(name) · ResetSequence(name) · Preview(name, count) · GenerateBatch(name, count, ref array) |
| 永続化 | SaveToFile(path) · LoadFromFile(path) · SaveToProject() · LoadFromProject() |