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()