====== 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 ユーザーマニュアルへ戻る]]