> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 商用プロトコルのシミュレーション

> 商用サイクラーや PyBaMM 実験文字列からバッテリーテストプロトコルをアップロードしてシミュレーションする

数日間にわたるバッテリーテストを開始した後で、使用したプロトコルが間違っていたことに気づいた経験はありませんか？バッテリーサイクラーシミュレータは、プロトコルファイルをアップロードして物理ベースのクイックシミュレーションを実行し、実際の実験を開始する前にその動作を検証することで、この問題を防ぎます。

バッテリーサイクラーシミュレータは[プロジェクト](/ja/core-concepts/projects-studies)内にあります。プロジェクトを開いてサイドバーで **Simulate → Protocol Simulator** を選択して開始してください。シミュレータはプロジェクト内から起動・実行し、そのプロジェクトのパラメータ化モデルを選択できます。アップロードしたプロトコルと Quick model は組織全体で共有されるため、単一のプロジェクトに限定されず、同じ組織内の他のプロジェクトからも引き続き利用できます。

## 仕組み

プロセスはシンプルです：プロトコルをアップロードし、セルモデルを設定して、シミュレーションを実行します。

1. **アップロード：** プロトコルファイルを生の形式（例：XML や JSON）でアップロードします。システムが形式を自動検出して解析します。
2. **設定：** セルモデルを選択します — 化学プリセットからその場で構築する **Quick model**、またはプロジェクトの完全な[パラメータ化モデル](/ja/build/parameterized-models)のいずれかです。
3. **シミュレーション：** シミュレーションを実行して結果を分析します。

## ステップ1：プロトコルファイルのアップロード

コンピュータからプロトコルファイルをアップロードして開始します。

現在サポートしているファイル形式：

* Arbin
* BioLogic (.mps, .bttest)
* Maccor (.xml, .csv)
* Neware
* Novonix (.pro2)
* PyBaMM 実験文字列 (.txt)

ファイルをアップロードすると、システムは即座に解析し、変換されたステップを表示します。

<Note>
  Gamry の `.dta` ファイルはプロトコルファイルではないため、ここにアップロード
  できません。Gamry 機器からの EIS 測定データをインポートするには、
  [`ionworksdata`](https://data.docs.ionworks.com/) ライブラリを使用してください。
  詳細は[データ形式](/ja/data/format#eis-and-impedance-data)を参照してください。
</Note>

### 必要な追加ファイル

一部のプロトコルは、カスタムドライブサイクル波形や再利用可能なサブルーチンなどの複雑なステップ用に外部ファイルを参照します。プロトコルがそのようなファイルを必要とする場合、シミュレータがそれを検出してアップロードを促します。

Arbin スケジュールの場合、`SubSchedule` ステップが参照する `.subsdx` サブスケジュールファイルもここに含まれます。各サブスケジュールは UCP の [`Subroutine`](/ja/simulate/universal-cycler-protocol#subroutines) ステップにマッピングされ、それ自体がさらに別のサブスケジュールを参照することもあります。それらのネストされた要件は、親ファイルを添付した時点で表面化するため、すべての依存関係が解決されるまで、添付ごとにアップロードプロンプトが1段階ずつ連鎖していきます。

## ステップ2：確認と設定

解析後、プロトコルを確認してシミュレーションを設定できます。

### プロトコルステップ

シミュレータは、タブでアクセス可能な3つの異なる形式で解析されたプロトコルを表示します：

* **Human-Readable：** プロトコル内のステップの簡略化された読みやすい要約。
* **UCP (YAML)：** [Universal Cycler Protocol](/ja/simulate/universal-cycler-protocol) 形式に変換された完全なプロトコル。実行される詳細な基盤構造を示します。
* **Raw：** アップロードしたファイルの生のテキスト内容。

### セル設定

意味のあるシミュレーションを実行するには、シミュレータにどのセルモデルを使用するかを指定する必要があります。2つのオプションがあります：

* **Quick model** — 化学プリセットといくつかの基本入力からその場でセルモデルを構築します。まだセルにフィットしたモデルがない場合の高速なサニティチェックに最適です。
* **プロジェクトのパラメータ化モデル** — 現在のプロジェクトから既存の[パラメータ化モデル](/ja/build/parameterized-models)を選択します。プロジェクトの他の場所で使用しているのと同じ物理ベースのモデルに対してプロトコルを実行したい場合に最適です。

#### Quick model

Quick model は、1つの RC ペアを持つ基盤となる[等価回路モデル（ECM）](/ja/build/models#ionworks-models)を、化学プリセットに合わせた OCV と抵抗パラメータで設定します。完全なパラメータ化モデルを先にフィッティングすることなく、代表的なセルに対してプロトコルを検証したい場合に使用してください。

* **Chemistry：** 事前設定されたオプションのリスト（例：`NMC/Graphite`、`LFP/Graphite`）からセルの化学を選択します。フルセルの化学（例：`NMC/Graphite`、`LFP/Graphite`）および Li メタルハーフセル（例：`NMC/Li metal`、`Graphite/Li metal`、`LFP/Li metal`）が利用可能です。これにより、モデルが使用する OCV 曲線、正極/負極の開回路電位、および抵抗値が決まります。
* **Cell capacity (Ah)：** セルの公称容量。ECM パラメータはこの容量に合わせてスケーリングされます。
* **Resistance scale (%)：** 選択した化学のデフォルト値に対するモデルの内部抵抗を調整します。デフォルトは `100%`（変更なし）です。例えば、抵抗を2倍にするには `200` に、半分にするには `50` に設定します。化学のデフォルトよりも高いまたは低いインピーダンスのセルを近似するのに便利です。
* **Initial SOC (%)：** シミュレーション開始時のセルの充電状態。
* **Temperature (°C)：** シミュレーションの周囲温度。

#### プロジェクトのパラメータ化モデル

現在のプロジェクトに既に[パラメータ化モデル](/ja/build/parameterized-models)がある場合は、Quick model を構築する代わりにモデルセレクターからそれを選択してください。シミュレータは、アップロードされたプロトコルをその完全なパラメータセットを持つモデルに対して実行するため、結果はプロジェクト内の他のシミュレーションと直接比較できます。モデルの上に Initial SOC と Temperature のみを指定する必要があります。

<Warning>
  セルモデルがプロトコルが設計されたセルと一致していることを注意深く確認してください。
  モデルの適合が悪い場合 — 化学、容量、または電圧範囲が間違っている場合 — シミュレーションが実行できないか、
  誤解を招く結果を生成する可能性があります。
</Warning>

### 高度な設定

**Advanced** セクションでは、実行時のシミュレーション動作を変更するオプションのルールを設定できます。

#### 終了条件

終了条件により、変数が目標値に達したときにシミュレーションを早期に停止できます。これは、限られたサイクル数や特定の時間のみをシミュレーションする必要がある長いサイクルプロトコルに便利です。

各条件は**変数**、**比較演算子**（`==`, `!=`, `>`, `<`, `>=`, `<=`）、および**値**を指定します。いずれかの条件が満たされるとシミュレーションが停止します。

変数ドロップダウンは2つのグループに整理されています：

* **Built-in** — プロトコルに関係なくシミュレーションエンジンが自動的に提供する変数
* **Protocol variables** — 解析されたプロトコルで定義・抽出された変数

##### Total time

**Total time** は、シミュレーションの累積経過時間を秒単位で追跡する組み込み変数です。プロトコル自体のステップロジックとは独立して、シミュレーションの実行時間を制限するために使用します。

**Total time** を選択すると、値フィールドの横に単位ピッカーが表示され、**秒**、**分**、**時間**、または**日**でしきい値を入力できます。値はシミュレーションエンジン用に自動的に秒に変換されます。

例えば、長いサイクルプロトコルを2時間後に停止するには、**Total time >= 2 hours** の終了条件を追加します。

<Note>
  プロトコルが `total_time` という名前の独自の変数を定義している場合、プロトコルの変数が優先され、組み込みの値は注入されません。
</Note>

##### Protocol variables

Protocol variables はアップロードされたプロトコルファイルから抽出されます。例えば、Arbin プロトコルを3サイクル後に停止するには、`PV_CHAN_Cycle_Index >= 4` の条件を追加できます。Arbin は各サイクルの開始時に `PV_CHAN_Cycle_Index` をインクリメントするため、インデックスが4に達するのは4番目のサイクルが開始されたときのみで、3つの完全なサイクルが既に完了していることを意味します。

終了条件がトリガーされると、理由が人間が読める形式でシミュレーションメトリクスに表示されます（例："Early termination reason: Total time >= 2 hours"）。

#### 変数コールバックルール

変数コールバックルールにより、条件に基づいてシミュレーション中にプロトコル変数を動的に更新できます。各ルールは条件（変数、演算子、値）と、条件が満たされたときに適用する変数更新のセットを指定します。

例えば、特定のサイクル数の後にC-rateを増加させるルールを作成できます：`PV_CHAN_Cycle_Index >= 3` のとき、`Current(A)` をより高い値に更新します。これにより、充電または放電パラメータがサイクル中の特定のポイントで変更される多段階プロトコルをシミュレーションできます。

## ステップ3：シミュレーションの実行と結果の分析

すべての設定が完了したら、**Run Simulation** をクリックします。シミュレータが設定されたセルモデルに対してプロトコルを実行します。

シミュレーションページの **Cancel** ボタンをクリックすることで、実行中のシミュレーションをいつでもキャンセルできます。これは、必要な結果が既に確認できる長時間実行プロトコルに便利です。

### シミュレーション結果

#### プロット

主な出力は、時間に対するシミュレーションデータのインタラクティブなプロットです。デフォルトでは **Voltage** と **Current** が表示されますが、表示する変数を正確に設定できます。

**Configure Plot** をクリックしてプロット設定ドロワーを開きます。**Time Series** の下で、利用可能な変数のオン/オフを切り替えます：

| 変数                        | 単位 | 説明               |
| ------------------------- | -- | ---------------- |
| Voltage                   | V  | セル端子電圧           |
| Current                   | A  | 印加電流             |
| Temperature               | °C | セル温度（利用可能な場合）    |
| Charge capacity           | Ah | 累積充電容量           |
| Discharge capacity        | Ah | 累積放電容量           |
| State of charge           | %  | セルの充電状態（利用可能な場合） |
| Step count                |    | 全体のステップインデックス    |
| Cycle count               |    | 現在のサイクル番号        |
| Step count (within cycle) |    | 現在のサイクル内のステップ番号  |

有効にした各変数は、共通の時間軸を共有して垂直に積み重ねた個別のサブプロットに表示されます。Charge capacity と Discharge capacity は比較しやすいように1つのサブプロットにグループ化されます。

<Tip>
  プロトコルが数値変数（例：C-rate、温度設定値）を定義している場合、これらも
  時系列としてプロットできます。**Configure Plot** ドロワーの **Additional Variables**
  ドロップダウンを使用して、任意の数値プロトコル変数を選択します。選択した変数は、
  組み込みの時系列とともに追加のサブプロットとして表示されます。
</Tip>

#### 主要メトリクス

プロットの下に、シミュレーションから計算された主要なパフォーマンス指標が表示されます：

* Total Time
* Charge Throughput (Ah)
* Energy Throughput (Wh)
* Early termination reason（終了条件がトリガーされた場合）
* Stop reason（プロトコルが最後まで実行されず、補助ステップで停止した場合に `Reached pause step` または `Reached end step` が設定されます）

#### フルスクリーンモード

プロットの右上隅にあるフルスクリーンアイコンをクリックして、画面全体に拡大します。フルスクリーンビューには同じ **Configure Plot** ボタンが含まれているため、フルスクリーンを離れることなく表示する変数を調整できます。

#### CSV ダウンロード

**Configure Plot** の隣にある **Download CSV** をクリックすると、シミュレーションの時系列全体を CSV ファイル（`simulation_data.csv`）としてエクスポートできます。プロットで特定の範囲にズームしている場合でも、ダウンロードには常にシミュレーション全体が含まれます。

ファイルには、シミュレーションで生成されたすべての時系列変数（Voltage、Current、Temperature、容量、Step count、Cycle count、追加のプロトコル変数）に加え、各時点に合わせて展開されたステップレベルの列が含まれます。シミュレーションを再実行することなく、Excel、pandas、MATLAB、または独自の解析ツールに結果を取り込むのに利用できます。

プロトコルをシミュレーションすることで、エラーを早期に発見し、実験設計を検証し、実際のテストに時間とリソースを投入する前に確信を持つことができます。

## 商用プロトコル間の違い

異なるプロトコル間の変換における課題の多くは、構文ではなく、同じステップシーケンスに従うロジックをサイクラーが定義する方法の根本的な違いにあります。

このセクションでは、Ionworks Universal Cycler Protocol と、サポートしているサイクラーのプロトコルとの実装の違いについて説明します。

### CCCV ステップ

ほとんどのサイクラーは CCCV ステップを、電圧を「limit」フィールドとする1つのステップとして定義します：

* Maccor: 電圧を「limit」とする定電流ステップを使用。Maccor は CC フェーズと CV フェーズを組み合わせたネイティブな単一ステップタイプ `Chg Func CCCV` / `Dis Func CCCV` もサポートしています（CV カットオフは電流リミットとして指定）。
* Neware: 電流と電圧の両方を「limit」として指定
* Novonix: 電流と電圧の両方をフィールドとして指定し、ステップタイプで CC（電圧はカットオフ）と CCCV（電圧に遷移して電流カットオフまでホールド）を区別

UCP では、最大のモジュール性のために、電圧カットオフ付きの CC と電流カットオフ付きの CV の2つのステップを持つ[ステップブロック](/ja/simulate/universal-cycler-protocol#step-blocks)を使用し、合計持続時間とその他の終了条件はステップブロックレベルで定義されます。Maccor の `Chg Func CCCV` / `Dis Func CCCV` ステップを解析する際、パーサーはこれを同等の2ステップ UCP ブロックに自動的に展開します。

### ヘッダーメタデータ

一部の形式（例：Novonix `.pro2`）には、トップレベルのヘッダーデータ（`Version`、`LastUpdated`、`Charger`）が含まれています。このメタデータは UCP では `header` の下に保存され、元の形式に戻す変換時に使用されます。

### 関数式

Maccor はステップの値と終了条件に関数式（例：`VAR1*0.5`）をサポートしています。これらは UCP では文字列として伝達され、ベンダー固有の構造（例：Maccor の「User Def」エンドエントリ）を使用してラウンドトリップされるため、別の形式に正確な同等物がない場合でも意味が保持されます。

### ネストされたループ

Do/Loop 構造を使用する形式（Maccor）では、ネストされたループに番号が付けられ（Do 1/Loop 1, Do 2/Loop 2, ...）、構造を反映します。UCP ではブロックの `repeat` でループを表現します。Maccor に戻す変換時には、ブロックのネスト深度から Do/Loop の番号付けが生成されます。

### Report/Record/Save data/Resolution

これは、サイクラーが出力時系列にデータを保存する頻度を定義するフィールドです。

* Maccor は「Report」フィールドを使用し、時間、電流、電圧、温度を許可
* Neware は「Record」フィールドを使用し、時間、電流、電圧を許可
* Novonix は `ConditionType: "Save data"` を持つ `StepConditions` エントリを使用し、`Δt`、`ΔV`、`ΔI` を許可
* UCP は「Resolution」フィールドを使用し、グローバルに設定して各ステップでオーバーライド可能で、現在は時間のみをサポート

### ループ

ループには2つの基本的なアプローチがあります：

1. **ネストされたステップ：** ループをネストされたステップを持つステップブロックとして定義し、`repeat` パラメータでループの繰り返し回数を指定します。これは Python のようなモダンなプログラミング言語でのループ定義に似た、より現代的なアプローチです。

以下のプロトコルがこのアプローチを使用しています：

* UCP（[ステップブロック](/ja/simulate/universal-cycler-protocol#step-blocks)を使用）
* Novonix（`TimesToLoop` 付きの `ChildProtocolStepList` を使用）

### サイクル番号のインクリメント

* Novonix は `StepType = 6` を使用してサイクルカウンターをインクリメントします。UCP ではこれが補助的な `Increment cycle number` ステップにマッピングされます。
* Arbin は組み込みの `PV_CHAN_Cycle_Index` 変数を使用して現在のサイクルを追跡します。この変数が `Set Variable(s)` ステップを介してインクリメントされると、UCP では `set_variable` アクションと `Increment cycle number` 補助ステップの両方にマッピングされます。

2. **Goto/状態マシン：** 「start loop」と「end loop」のような特殊ステップを定義します。これは Fortran のような古いプログラミング言語に似た、よりレガシーなアプローチです。

以下のプロトコルがこのアプローチを使用しています：

* Maccor（ループ開始に `Do` ステップ、ループ終了に `Loop` ステップを使用）
* Neware（指定された前のステップに一定回数ループバックする特殊なステップタイプを使用）
* Arbin（goto ターゲット付きの limit 条件を使用してステップ間をジャンプし、`Set Variable(s)` ステップでカウンターを管理）

### サイクルインデックス分岐（Arbin）

Arbin プロトコルは、異なるサイクルで異なるパラメータが適用されるサイクル依存の分岐を実装するために `PV_CHAN_Cycle_Index` を一般的に使用します。UCP に解析されると、このパターンは `set_variable` アクションと `goto` ターゲットを持つ[制御ステップ](/ja/simulate/universal-cycler-protocol#control-steps)を使用して表現されます。

### 時間変化する高度な式（Arbin）

Arbin スケジュールは、ステップの経過とともに値が変化する **高度な式**（`AF_*` 式）でステップを駆動できます。たとえば、固定された経過時間で極性を交互に切り替える `SIGN(...)` ベースのピースワイズ電流波形などです。Arbin では、これらの式は組み込みプロセス変数 `PV_CHAN_Step_Time` から経過ステップ時間を読み取ります。

このような式がステップの制御値として使用されると、パーサーは `PV_CHAN_Step_Time` を UCP のステップ時間変数 [`t`](/ja/simulate/universal-cycler-protocol#example-time-varying-control) に変換し、式をステップ値に直接インライン化するため、シミュレータはこれを時間の関数として評価します。Arbin の `SIGN(...)` 関数は UCP の [`sign()`](/ja/simulate/universal-cycler-protocol#dynamic-behavior-with-variables) ヘルパーにマッピングされます。

たとえば、「ステップの最初の30秒間は +1 A、次の30秒間は –1 A」に相当する Arbin の高度な式は、次の UCP ステップになります：

```yaml theme={null}
- SMC Sign Current Waveform:
    - Charge:
        mode: Current
        value: sign(30 - t) * 1.0
        duration: 60
```

注意すべき点：

* 波形は式自体に極性を持っているため、パーサーは符号をそのまま保持し、ステップ中に値が何度反転しても、ステップを公称 `Charge` 方向として報告します。
* 値はステップ内でセルをどちらの方向にも押し進める可能性があるため、動作範囲の両側に電圧カットオフを `ends` として設定できます。
* **終了** 方程式内に現れる `PV_CHAN_Step_Time` は依然として Duration 終了を意味し、別途処理されます。制御値の式内での使用のみが `t` にマッピングされます。
* ステップ時間に依存せず Arbin の `MV_UD*` ユーザー変数のみを参照する高度な式は、以前と同様にプロトコル開始時にスカラー UCP 変数としてシードされ続けます。

### 直前ステップの読み出し（Arbin）

Arbin スケジュールでは、`Set Variable(s)` ステップ内で `LS_CHAN_*`（「last step」）変数を読み取ることで、**直前ステップの終了時**のチャンネル値をログできます。たとえば、直前に完了した放電の放電容量をユーザー変数に取り込み、後段で利用できます：

```ini theme={null}
[Schedule_Step1]
m_szStepCtrlType=SetValue(s)
m_szCtrlValue=MV_UD1
m_szExtCtrlValue1=LS_CHAN_Discharge_Capacity
m_szLabel=Log Capacity
```

UCP に解析されると、`Set Variable(s)` ステップは [制御ステップ](/ja/simulate/universal-cycler-protocol#control-steps) になります。その `set_variable` アクションは直前ステップのデータに対して評価されるため、`LS_CHAN_*` はそのステップの最終値に解決されます：

```yaml theme={null}
- Log Capacity:
    - Control:
        set_variable:
          - name: MV_UD1
            eval: LastStepDischargeCapacity
```

サポートされている読み出しは次のとおりです：

* `LS_CHAN_Discharge_Capacity` → `LastStepDischargeCapacity`
* `LS_CHAN_Charge_Capacity` → `LastStepChargeCapacity`

充電と放電は区別されたまま扱われます。マッピングされる文脈変数は、正味の符号付き値ではなく、直前ステップの方向別容量を保持します。

注意すべき点：

* `LS_CHAN_*` は `Set Variable(s)` のソース式に**直接**指定した場合にのみ有効で、算術式内での使用（`LS_CHAN_Discharge_Capacity * 0.25`）も可能です。制御値、終了条件の方程式、または名前付き式の本体で使用することは — たとえその式を後で `Set Variable(s)` ステップが参照する場合であっても — 解析時に拒否されます。それらの場所では誤ったステップのデータに束縛されてしまうためです。
* エネルギー系のバリアント（`LS_CHAN_Discharge_Energy`、`LS_CHAN_Charge_Energy`）は認識されますが、現時点では拒否されます。シミュレートされるステップごとのデータは容量を保持しますがエネルギーは保持しません。該当する場合は容量の読み出しを使用するか、リクエストを提出してください。

### Power Simulation ドライブサイクル（Arbin）

Arbin スケジュールでは、**Power Simulation** 波形（ステップが参照する `.txt` プロファイル）でステップを駆動できます。2列目は電流（アンペア）ではなく電力（ワット）として解釈されます。これは既存の **Current Simulation** ステップタイプの電力モード版であり、いずれも UCP の [`Drive`](/ja/simulate/universal-cycler-protocol#drive-cycles) ステップに解析され、ステップの `mode` がそれに応じて設定されます：

* `Current Simulation` → `mode: Current` を持つ `Drive`（値はアンペア）
* `Power Simulation` → `mode: Power` を持つ `Drive`（値はワット）

参照される `.txt` 波形は、Current Simulation プロファイルとまったく同様に、スケジュールと一緒に **Additional Files** プロンプトからアップロードします。電圧のステップ制限はそのまま引き継がれ、`Drive` ステップ上の `ends` になります。

```yaml theme={null}
- Load Cycle:
    - Drive:
        mode: Power
        value: highway_power_profile.txt
        ends:
          - Voltage < input['Lower voltage cut-off [V]']
```

### 累積容量・エネルギーカウンタ（Arbin）

Arbin の `PV_CHAN_Discharge_Capacity`、`PV_CHAN_Charge_Capacity`、`PV_CHAN_Discharge_Energy`、`PV_CHAN_Charge_Energy` チャンネルは、明示的な `Set Variable(s)` リセットでゼロクリアされるまで、ステップをまたいで電荷およびエネルギーのスループットを累積します。Arbin プロトコルが UCP に解析される際、これら4つのカウンタは（正味の `Capacity` / `Energy` に集約されるのではなく）別々のランタイム変数として保持されるため、これらを比較する式が正しく評価されます。

カウンタの挙動：

* プロトコルの先頭で **0 にシード** されます。
* **各ステップの後に** そのステップの放電または充電スループットで **加算** されます。
* `Set Variable(s)` ステップのリセットマスクにカウンタが含まれる場合に **0 にリセット** されます。

これにより、プロトコルは **正味の** スループットで分岐できます。たとえば、正味容量が目標値を超えるまで充放電を交互に行うスケジュールは、`set_variable` 式や `VariableEnd` 条件で2つのカウンタの差を用いて記述できます：

```yaml theme={null}
- Log Net Capacity:
    - Control:
        set_variable:
          - name: VAR_NET_CAPACITY
            eval: PV_CHAN_Discharge_Capacity - PV_CHAN_Charge_Capacity
```

**容量カウンタ** がステップ制限の左辺に出現する場合（例：`Charge to PV_CHAN_Charge_Capacity >= MV_UD1`）、パーサはこれをステップごとの `Capacity` エンドに書き換えます。通常、プロトコルはそのようなステップの直前にカウンタをリセットするため、ステップ内でのカウンタの値はそのステップ自身のスループットに等しくなります。方向性のあるエネルギーカウンタは変数式の中では使用できますが、現時点ではステップ制限の左辺としてはサポートされていません。

<Note>
  ラウンドトリップは保持されます：UCP プロトコルを Arbin にエクスポートし直す際、`PV_CHAN_(Charge|Discharge)_(Capacity|Energy) = 0` の set-variable アクションは認識され、`Set Variable(s)` ステップのリセットマスクエントリとしてエンコードされます。
</Note>

### ドライブサイクル（BioLogic）

BioLogic の `.mps` プロトコルは、ドライブサイクル（例えば、駆動電流プロファイル）を適用するために **User Profile** ステップを使用します。波形は技術ブロックの後に **Urban Profile Table** として `.mps` ファイル自体に埋め込まれているため、追加のアップロードは必要ありません。UCP に解析されると、User Profile ステップは [`Drive`](/ja/simulate/universal-cycler-protocol#drive-cycles) ステップにマッピングされます。テーブルの時間カラムがステップの継続時間を定義し、値カラムが対応する制御モード（例：`Current`）でセルを駆動します。

複数のテクニックを含む `.mps` ファイルでは、内部 `Ns` インデックスを共有する複数の User Profile ステップが存在することがあります。各ドライブサイクルは `UP_tech<N>_step_<Ns>`（`<N>` はテクニック番号）という名前で識別されるため、異なるテクニック由来のサイクルがインポート時に衝突することはありません。

#### 埋め込みドライブサイクルの上書き

EC-Lab は各ドライブサイクル波形の **イベント圧縮** されたコピーを `.mps` ファイル内に埋め込みます。この圧縮波形はそのままシミュレーションに使用できますが、元のフル解像度の `.txt` プロファイルがあれば、シミュレーション前にそれを差し替えてより高い忠実度で実行できます。

ドライブサイクルを含む `.mps` をアップロードすると、**Additional Files** パネルに **Drive cycle waveforms (optional)** セクションが表示され、埋め込まれた各サイクルが名前付きで一覧されます。任意のスロットにファイルをドロップすると、そのサイクルがシミュレーション用に上書きされます。スロットを空のままにすると、埋め込み波形がそのまま使用されます。上書きはファイル名ではなくドライブサイクル名でマッチングされるため、各スロットには任意のファイルを添付できます。

### バッテリー容量決定（BioLogic）

EC-Lab の **Battery Capacity Determination (BCD)** テクニックは、固定された容量チェックシーケンス（最初の電圧境界に向かう CC レグ（`I1 sign` はデフォルトで充電のため、既定では `EM1`）、任意の CV ホールド、単一の休止（`tR`）、その後反対側の境界に向かう CC レグ（`I2 sign` はデフォルトで放電のため `EM2`））を実行し、対応する CC、CV、Rest ステップを含む UCP ステップブロックとしてインポートされます。各 CC レグの方向はその `I1 sign` / `I2 sign` フィールドに従うため、放電が先のシーケンスも同様にサポートされます。テクニックの両側（`Is1`/`N1` および `Is2`/`N2`）はいずれも `Set I/C` モードの `I`（`A`、`mA`、`µA` 単位の定電流）、`C / N`（ユーザー指定の `N` 除数から算出される C-rate）、`C x N`（`N` を掛けた C-rate）をサポートし、`tR` の休止時間は EC-Lab の `h:m:s` 文字列から解析されます（`0:00:0.0000` の継続時間は休止が無効であることを意味し、ブロックから取り除かれます）。

### EIS（BioLogic）

ポテンショスタティック（**PEIS**）とガルバノスタティック（**GEIS**）両方のインピーダンステクニックが認識され、テクニックの `ctrl2_val` / `ctrl3_val` フィールドにある周波数境界を使用して UCP の [`EIS`](/ja/simulate/universal-cycler-protocol#eis-steps) ステップに変換されます。両者は同じ UCP `EIS` ステップで表現され、サイクラーシミュレータが設定済みのセルモデルに対してインピーダンススイープを実行し、結果として Nyquist トレースを返します。

### 3 電極セルと 2 電極セル（BioLogic）

`Ewe` および `Ece` のステップ制限の解釈は、`.mps` ファイルヘッダーに設定された **Potential control** モードに依存します。

* `Ewe-Ece`（3 電極）: `Ewe` は作用電極（カソード）電位で、`CathodePotential` 終了条件にマッピングされます。`Ece` は対極（アノード）電位で、`AnodePotential` にマッピングされます。
* それ以外のモード（`Ewe`、`Ecell`、または未設定の 2 電極フルセル）: `Ewe` は端子電圧で、`Voltage` 終了条件にマッピングされます。`Ece` には端子電圧に対応する量がないため破棄されます。対極の安全ガードを端子電圧にマッピングすると、ステップ開始直後に発火する誤ったカットオフが生成されるためです。

2 電極の `.mps` を解析したのに想定していた電圧カットオフが付いていない場合は、ヘッダーの potential control が明示的に設定されているか確認してください。空欄のままだと 2 電極として扱われます。

### ループ回数（BioLogic）

EC-Lab の `Loop` テクニックは、追加の反復回数を `nt` に格納します（つまり `nt = 0` ではループ本体を 1 回実行し、`nt = 3` では 4 回実行します）。UCP の [`repeat`](/ja/simulate/universal-cycler-protocol#step-blocks) は **総** 実行回数を表すため、パーサーは BioLogic の `nt` を UCP の `repeat = nt + 1` に変換します。この変更前にインポートされたループは 1 回少なく実行されていました。修正後の回数を反映するには `.mps` を再インポートしてください。

## PyBaMM 実験文字列

[PyBaMM 実験文字列](https://docs.pybamm.org/en/latest/source/api/experiment/index.html)を含むプレーンテキストファイルをバッテリーサイクラーシミュレータに直接アップロードできます。システムは形式を自動検出し、ステップを UCP に変換します。リスト反復ブロックは `repeat` カウント付きの[ステップブロック](/ja/simulate/universal-cycler-protocol#step-blocks)にマッピングされます。

### 基本構文

プレーンステップの場合、ファイルの各行が単一の PyBaMM ステップ文字列です。サポートされるステップタイプは以下の通りです：

* `Charge at <value> <unit>` — 定電流、C-rate、または定電力充電
* `Discharge at <value> <unit>` — 定電流、C-rate、または定電力放電
* `Hold at <value> V` — 定電圧ホールド
* `Rest for <duration>` — 開回路休止期間

ステップには `until` で終了条件、`for` で持続時間制約を含めることができます：

```text theme={null}
Charge at 1C until 4.2V
Discharge at 0.5C for 1 hour
Hold at 4.2V until C/50
Rest for 10 minutes
```

### リスト反復

ステップのシーケンスを複数回繰り返すには、角括弧で囲んで `* N` で乗算します。これは Python のリスト反復構文と同等です。

```text theme={null}
["Charge at 1C until 4.2V", "Discharge at 1C until 2.5V"] * 100
```

これにより、ステップを100回複製するのではなく、`repeat: 100` の単一の反復ブロックが UCP に生成されます。反復ブロックとプレーンステップを混在させることができます：

```text theme={null}
Charge at 1C until 4.2V
Hold at 4.2V until C/50
["Discharge at 0.5C until 3.0V", "Rest for 10 minutes"] * 50
Rest for 1 hour
```

#### ネストされた反復

より複雑なプロトコル用に、反復ブロックをネストできます：

```text theme={null}
[["Charge at 1C until 4.2V", "Rest for 5 minutes"] * 2, "Discharge at 1C until 2.5V"] * 30
```

これにより、30回繰り返す外側ブロックが作成され、各反復で充電-休止ペアが2回実行された後、1回の放電が行われます。

#### サイクルグループ

リスト内で丸括弧を使用して、ステップのグループを**サイクル**としてマークします。これにより、各反復の最後に「Increment cycle number」ステップが自動的に挿入され、サイクルレベルのメトリクスが正しく追跡されます：

```text theme={null}
[("Charge at 1C until 4.2V", "Discharge at 1C until 2.5V")] * 100
```

<Note>
  タプルサイクルグループは常にリストの中にある必要があります。`[(...)] * N` を使用してください。`(...) * N` ではありません。
</Note>

#### マルチラインフォーマット

可読性のために、反復ブロックを複数行に分割できます：

```text theme={null}
[
    "Charge at 1C until 4.2V",
    "Hold at 4.2V until C/50",
    "Discharge at 1C until 2.5V",
] * 50
```
