====== MPINO STUDIO 2 Phase 2 · メモリを理解する ======
このページでは、**P・M・D・C・T・Rメモリの違い**、アドレス表記、メモリ領域設定、プロジェクトでの使用箇所、特殊ビットメモリを説明します。
{{ :ja-jp_products:mpino_studio2:memory-learning-path.svg?1000 |メモリ理解の順序 }}
> **スクリーンショットについて:** 画面は韓国語UIです。ボタンの位置、アイコン、ショートカットは同じです。
===== 1. PLC基本メモリ =====
Arduinoプログラムとは異なり、PLCではP・M・D・C・T・Rメモリを使用します。Arduinoコードでは、PLCメモリの割り当て後に残ったSRAMへ変数を割り当てることができます。
メモリは、プログラムの実行中に入力状態、内部条件、計算結果、タイマ値などを保存する領域です。MPINO Studio 2のラダーロジックとArduino Cコードは、このメモリを共有して使用できます。
基本アドレスは、**領域を表す文字 + 0から始まる番号**で表します。たとえば''M10''はM領域の11番目、''D0''はD領域の最初のアドレスです。
{{ :ja-jp_products:mpino_studio2:memory-overview.svg?1000 |P M D C T Rメモリ領域の比較 }}
^ 領域 ^ 単位 ^ 保存形式 ^ 値の範囲 ^
| ''P'' | BIT | ボードのデジタル入出力状態 | 0または1 |
| ''M'' | BIT | 内部BITメモリ | 0または1 |
| ''D'' | WORD | 符号付き内部WORDメモリ | -32,768 ~ 32,767 |
| ''C'' | WORD | カウンタ値(符号付き内部WORDメモリ) | -32,768 ~ 32,767 |
| ''T'' | WORD | タイマ現在値(符号付き内部WORDメモリ) | -32,768 ~ 32,767 |
| ''R'' | Floating Point(32ビット) | 内部Floating Pointメモリ(実数メモリ) | 約-3.4028235E38 ~ +3.4028235E38 |
==== Arduinoコードとラダーロジックのメモリ共有 ====
ラダーロジックとArduinoコードは、P・M・D・C・T・Rメモリの同じ保存領域を使用します。一方で書き込んだ値は、もう一方から同じアドレスで読み取れます。
{{ :ja-jp_products:mpino_studio2:memory-sharing.svg?1000 |Arduinoコードとラダーロジックが同じPLCメモリを共有する構造 }}
Arduinoコードでは、ラダーアドレスと同じ名前をそのまま使うか、配列形式で記述できます。どちらも同じメモリを参照します。
* ラダーの''M0'' ↔ Arduinoコードの''M0''または''M[0]''
* ラダーの''D0'' ↔ Arduinoコードの''D0''または''D[0]''
* ラダーの''R0'' ↔ Arduinoコードの''R0''または''R[0]''
void loop() {
M0 = true; // ラダーのM0ビット接点をON状態にします。
D0 = 120; // ラダーとArduinoコードでD0の整数値を共有します。
R0 = 23.5f; // ラダーとArduinoコードでR0の実数値を共有します。
ladderLoop(); // 上で保存した値を使ってラダーロジックを実行します。
}
ラダーロジックで変更した値は、''ladderLoop()''の実行後にArduinoコードから読み取れます。同じスキャン内の読み書き順序は、''loop()''内で''ladderLoop()''を呼び出す位置に従います。
> **入出力割り当ての注意:** P領域とボード機能に割り当てられたC領域は、ラダースキャン中に実際の入出力と同期します。これらの領域をArduinoコードと共有するときは、**設定 → ラダーピンマップ設定**でアドレスと入出力方向を先に確認してください。
> **Pアドレスの注意:** Pアドレスは**ボードのピン編集**で確認および変更できます。Pアドレスの入出力方向と物理端子は、プロジェクトで選択したボードの定義に従います。
> **R値の誤差に関する注意:** 32ビット実数は浮動小数点演算の制約により、''0.1 + 0.2''の結果が正確な''0.3''ではなく、約''0.30000001''として保存される場合があります。これはIEEE 754の32ビット浮動小数点を使用するコントローラで共通して考慮する特性です。
===== 2. メモリ領域 =====
MPINO-8A4R(T)-Sを選択したときの標準メモリ数は次のとおりです。
**設定 → メモリ領域設定**で、使用するメモリ数を変更できます。(ショートカット: ''Ctrl + Shift + M'')
{{ :products:mpino_studio2:memory-settings-modal.png?430 |図1. メモリ領域ごとの使用数と予想SRAM使用量を確認するメモリ領域設定画面 }}
^ 領域 ^ 標準数 ^ 標準アドレス範囲 ^
| ''P'' | 64 | ''P0'' ~ ''P63'' |
| ''M'' | 1,024 | ''M0'' ~ ''M1023'' |
| ''D'' | 200 | ''D0'' ~ ''D199'' |
| ''C'' | 100 | ''C0'' ~ ''C99'' |
| ''T'' | 128 | ''T0'' ~ ''T127'' |
| ''R'' | 50 | ''R0'' ~ ''R49'' |
**メモリ領域設定画面:** P・M・D・C・T・Rの入力欄を空欄にするとボードの標準値を使用します。値を入力すると、そのプロジェクトで使用する数が変更されます。画面下部では予想SRAM使用量と全SRAMを確認できます。
個数と最後のアドレスを混同しないでください。番号は0から始まるため、Dメモリ200個は''D0''から''D199''までです。
==== C領域とボードのピン割当 ====
MPINO-8A4R(T)-Sでは、''C0''~''C10''メモリにアナログ入力、NTC温度入力、PWMが接続されています。
割り当てるメモリは、**設定 → ラダーピンマップ設定**で変更できます。
> **アナログ・PWM出力の注意:** アナログ出力またはPWM出力にメモリを割り当てると、そのアドレスの値で出力されるため、Arduinoコードから同じ出力に''analogWrite''関連関数を使用できません。''analogWrite''関連関数を使用する場合は、**設定 → ラダーピンマップ設定**で対象出力の**使用**チェックを外してください。
{{ :ja-jp_products:mpino_studio2:memory-c-map-8a4r-s.svg?1000 |MPINO-8A4R(T)-SのCメモリとボードのピン割当 }}
^ Cアドレス ^ ボード機能 ^ MCUピン ^
| ''C0'' ~ ''C5'' | アナログ入力 | ''A0'' ~ ''A5'' |
| ''C6'' ~ ''C7'' | NTC温度入力 | ''A6'' ~ ''A7'' |
| ''C8'' ~ ''C10'' | PWM出力 | ''D21'' ~ ''D23'' |
| ''C11'' ~ ''C99'' | 上記機能に直接割り当てられていないC領域 | 使用目的を確認してから選択 |
> **重要:** このボードで''C0''~''C10''を一般的なカウンタアドレスにすると、同じアドレスを使用するボード機能とデータが重なる可能性があります。カウンタを割り当てる前に、**設定 → ラダーピンマップ設定**と**設定 → 使用したメモリ**を確認してください。
割り当てられるアドレスはボードごとに異なり、ユーザーが変更することもできます。**設定 → ラダーピンマップ設定**で確認してください。
===== 3. データ形式 =====
データ幅は、一度に読み書きするビット数です。扱える値の範囲とメモリ使用量が変わります。
{{ :ja-jp_products:mpino_studio2:memory-widths.svg?1000 |BIT BYTE WORD DWORDのサイズと値の範囲 }}
^ データ幅 ^ サイズ ^ 符号付き値の範囲 ^ 主な用途 ^
| BIT | 1ビット | 0または1 | 接点、コイル、ON/OFF状態 |
| BYTE | 8ビット | -128 ~ 127 | 小さい整数 |
| WORD | 16ビット | -32,768 ~ 32,767 | 一般的な整数、D・C・Tの基本値 |
| DWORD | 32ビット | -2,147,483,648 ~ 2,147,483,647 | WORD範囲を超える大きな整数 |
''R''も32ビットを使用しますが、DWORD整数ではなく**実数**を保存する別の領域です。どちらも32ビットという理由だけで、RメモリをDWORDアクセスと同じように扱わないでください。
幅を選ぶときは、現在値だけでなく計算後の最大値も確認します。1msごとに1日加算する値は86,400,000になり、WORD範囲を超えます。
===== 4. メモリアドレスの読み方 =====
メモリアドレスは、最も単純な形式から始め、必要な要素を一つずつ追加して読みます。
{{ :ja-jp_products:mpino_studio2:memory-addressing.svg?1000 |M0、D0、D0.1、WM1.2のメモリアドレス形式 }}
- ''M0'': M領域の0番BITアドレスです。
- ''D0'': D領域の0番WORDアドレスです。
- ''D0.1'': D0 WORD内の2番目のビットです。ビット番号は0から始まります。
- ''WM1.2'': M領域をWORDでまとめた''WM1''内の3番目のビットです。''M18''と同じビットを示します。
==== メモリ構造 ====
ビット、バイト、ワード、ダブルワード、実数のメモリ構造です。
{{ :ja-jp_products:mpino_studio2:memory-structure.svg?1000 |P MビットメモリとD C T WORDメモリをBYTE WORD DWORDとしてまとめる構造 }}
P・M領域では、個別のBITアドレスを8個、16個、32個ずつまとめ、BYTE・WORD・DWORDとして読みます。小さいアドレスが最下位ビットになるため、''WM0.0''は''M0''、''WM1.3''は''M19''と同じビットを示します。
D・C・T領域では、一つのアドレスが1 WORDです。連続する二つのWORDをまとめるとDWORDになり、''DD0''は''D0''と''D1''、''DD1''は''D2''と''D3''を結合します。CとTも''DC0''、''DT0''など同じ規則を使用します。
===== 5. プロジェクトで使用中のメモリを探す =====
メニューから**設定 → 使用したメモリ**を選択するか、''Ctrl+Shift+L''を押します。
{{ :products:mpino_studio2:memory-map-modal.png?800 |図2. 使用したメモリでアドレスと参照箇所を確認する画面 }}
アドレスを変更するときやメモリ領域を縮小するときは、先にこの画面を確認すると重複使用と範囲エラーを減らせます。
===== 6. 特殊ビットメモリ =====
''@''で始まる特殊ビットメモリは、MPINO Studio 2が状態を自動更新します。ラダーのビット接点で使用できます。
^ 形式 ^ 動作 ^ 例 ^
| ''@ON'' | 常時ON | ビット接点を常に真にする |
| ''@OFF'' | 常時OFF | ビット接点を常に偽にする |
| ''@'' | 指定した時間の境界を通過するたびに1回、1スキャンだけON | ''@100''は100msごとに1スキャンON |
| ''@F'' | 指定時間ON、同じ時間OFFを繰り返す | ''@F1000''は1秒ON、1秒OFFを繰り返す |
''@ON''と''@OFF''は大文字と小文字を区別しないため、''@on''と''@off''も使用できます。
{{ :ja-jp_products:mpino_studio2:special-memory-timing.svg?1000 |@100と@F1000特殊ビットメモリの時間動作比較 }}
''@100''は、プログラムのスキャンがちょうど100msの時刻に一致しなくても、境界を通過していれば1回ONになります。一定間隔で値を増やす処理や動作開始条件に使用できます。
''@F1000''は、状態を手動で反転するコードを書かなくても1秒間隔のON/OFF条件を作ります。
{{ :products:mpino_studio2:special-relay-example.png?420 |図3. ラダーセルに特殊ビットメモリを入力した例 }}
特殊ビットメモリには次の入力規則があります。
* ''@''と''@F''の時間単位はミリ秒(ms)です。
* かっこは使いません。''@F(1000)''ではなく''@F1000''と入力します。
* ビット接点だけで使用します。
* 出力コイルのアドレスには使用しません。
===== トラブルシューティング =====
^ 症状 ^ 確認する項目 ^
| 入力したアドレスが許可されません。 | 領域文字、アドレス範囲、B/W/D接頭辞への対応、''.n''ビットアクセスへの対応を順に確認します。 |
| メモリ領域設定を保存できません。 | 予想SRAM使用量が全SRAMを超え、赤色で表示されていないか確認します。 |
| 使用したメモリにアドレスが表示されません。 | 正しい領域タブとラダー・コードフィルタを選び、アドレスを入力して''Enter''を押します。 |
| Cカウンタ値が予想と異なります。 | MPINO-8A4R(T)-Sの''C0''~''C10''ボードピン割当との重複を先に確認します。 |
| ''@F1000''を入力できません。 | ビット接点を選択しているか、かっこを付けていないか確認します。 |
===== 関連文書 =====
* [[ja-jp_products:mpino_studio2:activity_bar|Phase 8・アクティビティバーとサイドパネル]]
* [[ja-jp_products:mpino_studio2:menus_settings|Phase 7・メニューと環境設定]]
* [[ja-jp_products:mpino_studio2:monitoring|Phase 6・シリアル・ラダーモニタリング]]
* [[:ja-jp_products:mpino_studio2:first_project|Phase 1 · 最初のプロジェクトを作る]]
* [[:ja-jp_products:mpino_studio2|MPINO STUDIO 2 ユーザーマニュアル]]
[[:ja-jp_products:mpino_studio2:first_project|← Phase 1 · 最初のプロジェクトを作る]] | [[:ja-jp_products:mpino_studio2|MPINO STUDIO 2 ユーザーマニュアルへ戻る]]