MP STUDIO 2 · メモリ · V1.3.0以降 ====== MP STUDIO 2 · インデックスアドレス(ポインタ) ====== インデックスアドレスは、''D100[D0]''のように先頭アドレスからインデックスの値だけ離れたセルを、命令が読み書きできるようにする機能です(V1.3.0以降)。''D0''が3なら、その命令は''D103''を使います。インデックスの値を変えるだけで、レシピの設定値や記録バッファのように表の形で並んだデータを順に扱えます。 [[#例|例を見る]] [[#書き方|書き方]] {{ :ja-jp_products:mp_studio:ix-hero.png?1600 |例のプログラムをシミュレーションし、インデックスのセルに値と指したセルが一緒に表示されたMP STUDIO 2のウィンドウ全体 }} ^ 書き方 ^ 指せる領域 ^ インデックス ^ 対応バージョン ^ | ''D100[D0]'' | D・DD・C・DC・R | D・Cワード・''##名前'' | V1.3.0以降 | * **配列のように数える**\\ インデックスは要素単位で数えます。''DD''・''DC''は、1要素が番号2つ分です。 * **範囲外はスキップ**\\ 指したセルが領域外なら、その命令だけをスキップして''@IXERR''をオンにします。ほかのメモリは上書きしません。 * **指したセルを表示**\\ モニタリング・シミュレーション中は、インデックスのセルに「2000 (→D103)」のように値と指したセルが一緒に表示されます。 * **使わなければ従来どおり**\\ インデックスアドレスを使わないプログラムは、メモリと実行時間が以前と変わりません。 **このページの内容** * [[#書き方|書き方]] * [[#指せる領域とインデックス|指せる領域とインデックス]] * [[#使える命令とセル|使える命令とセル]] * [[#使えないセル|使えないセル]] * [[#範囲外と_ixerr|範囲外と@IXERR]] * [[#入力の補助|入力の補助]] * [[#モニタリングとシミュレーション|モニタリングとシミュレーション]] * [[#例|例]] * [[#確認事項|確認事項]] ~~NOTOC~~ ===== 書き方 ===== インデックスアドレスの形は''先頭アドレス[インデックス]''です。''*D0''・''&D100''のようなC言語のポインタの形は使えません。 - ラダーで命令の値セル(例: ''MOVE''のIN)を選択し、''D100[D0]''を入力します。ファンクションの挿入ウィンドウ(''Ctrl+E'')に''MOVE D100[D0] D200''のように1行で入力することもできます。 - ''Enter''でセルを確定します。小文字と、括弧の内外の空白は、確定すると整形されます(''d100[ d0 ]'' → ''D100[D0]'')。 インデックスは、C言語の配列のように要素単位で数えます。''D''・''C''・''R''はインデックスの分だけ離れたセルを、1要素が番号2つ分を占める''DD''・''DC''はインデックスの2倍だけ離れたセルを指すため、要素どうしが重なりません。 ^ セルに書いたアドレス ^ インデックスの値 ^ 命令が使うセル ^ | ''D100[D0]'' | ''D0'' = 3 | ''D103'' | | ''C10[D1]'' | ''D1'' = 5 | ''C15'' | | ''DD100[D0]'' | ''D0'' = 1 | ''DD102''(''D102''・''D103'') | | ''R5[D0]'' | ''D0'' = 2 | ''R7'' | インデックスに数値を書くと、固定アドレスに変わります。''D100[3]''は''D103''に、''DD100[3]''は''DD106''に、''R5[2]''は''R7''に書き換えられ、「D100[3] を D103 として書きました。」のように通知が表示されます。 {{ :ja-jp_products:mp_studio:ix-fold.png?900 |図1. MOVEのINにD100[3]を書いてD103に変わったセルと通知 }} ===== 指せる領域とインデックス ===== ^ 区分 ^ 使えるもの ^ 使えないもの ^ | 先頭アドレス(指す領域) | ''D''ワード・''DD''ダブルワード・''C''ワード・''DC''ダブルワード・''R''実数 | ''P''・''M''・''T''・''BD''・''WM''・ユーザー変数など | | インデックス(括弧の中) | ''D''・''C''のワードアドレス、''##名前''のユーザーワード(例: ''D100[##IDX]'') | ''DD''・''DC''・''R''・''###名前''・''#名前'' | 入れ子の括弧(''D100[D0[D1]]'')とビット指定(''D100[D0].3'')は使えず、括弧の中にアドレスを2つ書くこともできません。使えないものを書いた場合や、先頭アドレスの番号が負の場合、インデックスがデータメモリの領域外の番号(例: ''D100[D9999]'')の場合は、セルが赤く表示され、コンパイルされません。 インデックスの値は符号付き16ビット(-32768~32767)として読むため、負のインデックスで手前のセルを指すこともできます。指せる範囲は[[:ja-jp_products:mp_studio:memory_symbols#データメモリ|データメモリ]]で決めたその領域のサイズで、範囲を外れると[[#範囲外と_ixerr|範囲外と@IXERR]]で説明するとおりに動作します。 インデックスの値は、命令が始まるときに1回だけ読みます。同じ命令がインデックスを変えても、結果は最初に指したセルに書き込みます。たとえば''DIV 7 2 D100[D0] D0''は、余りを''D0''に書き込み、商は命令が始まったときに''D0''が指していたセルに書き込みます。 ===== 使える命令とセル ===== インデックスアドレスは、命令の値セルと比較接点に使えます。指したセルのアドレスをその位置に直接書いたときと同じように動作し、オレンジ色の警告も同じ条件で表示されます。 ^ 分類 ^ インデックスアドレスを使えるセル ^ | 比較 | 比較ファンクションのIN1・IN2、接点のセルに書いた比較(例: ''D100[D0]>D9'') | | 変換 | ''H2D''・''D2H''・''INV''・''NEG''のIN・OUT | | 算術演算 | ''ADD''・''SUB''・''MUL''・''DIV''のすべてのセル、''INC''・''DEC''、''SCALE''の6つのセル、''FLOOR''・''SQRT'' | | カウンター | ''CTU''・''CTD''・''CTUD''のSET VALUE、''HCNT''・''ENCODER''・''ENMOV''・''HRST'' | | タイマー | ''TON''・''TOFF''・''TPL''・''TMON''・''TMR''のSET VALUE | | ワード論理 | ''WAND''・''WOR''・''WXOR''・''SHL''・''SHR''・''SWAP''のすべてのセル | | アナログ | ''ADC''・''ADC2''・''DAC''のすべてのセル、''AFILTER''、''NTEMP''・''PTEMP''、''PWM''・''FPWM''・''FDPWM''・''NPWM''・''POFF''・''PSR''、''PID''のすべてのセル、''PID_PWM''(PORTを除く) | | MOVE | ''MOVE''・''GMOVE''・''FMOVE''のすべてのセル | | データ処理 | ''MAX''・''MIN''・''SUM''・''AVE''・''MUX''・''ENCO''・''DECO''のすべてのセル | | シリアルポート | ''PUT''のCHANNEL・DATA・LENGTH、''GET''のCHANNEL・LENGTH・OUT、''PUT_LEN''・''GET_LEN''、''SERID''・''SERRATE''、''MNET''・''MNET_READ'' | | I2C | ''ISTA''のADDRESS、''IWR''、''IRD''のOUT、''ISR''、''IBR'' | | CLCD (キャラクター LCD) | ''CINI''・''CLOC''・''CSTR''・''CINT''・''CREAL''・''CHEX''・''CCLS''・''CCON''・''CCOF''・''CPUT''・''CGET''のADR・値のセル(下の使えないセルを除く)、''CSCR''のPAGE | | 7 セグ | ''FINT''のIN・POSITION・LENGTH・DOT、''FDATA''、''FSCR''のPAGE | | DS3231 (RTC) | ''DS3231_WR''・''DS3231_RD''のすべてのセル | ''GMOVE''・''FMOVE''・''MAX''・''MIN''・''SUM''・''AVE''・''MUX''・''PUT''・''GET''のように複数のセルを順に扱う命令では、インデックスアドレスが先頭のセルになります。 > **ブロック命令は終端のセルが領域外だと実行されない** > 先頭の要素から、その命令が届く終端のセルまでが領域内にある必要があります。届く範囲は、''GMOVE''・''FMOVE''・''MAX''などはN個の要素、''MUX''はN番目の要素、''PUT''・''GET''はLENGTHバイトです。たとえばD領域が''D0''~''D255''のとき、''D0''が152なら、''GMOVE D100[D0] D200 5''のINは''D252''~''D256''となり、範囲外です。''MUX''以外の命令は、Nが0のとき(''MAX''・''MIN''・''SUM''・''AVE''はNが0以下のとき)何もせず、範囲もチェックしません。''MUX''は、Nが0のとき先頭の要素を選びます。 ===== 使えないセル ===== 次のセルにインデックスアドレスを書くと、セルが赤く表示され、コンパイルされません。理由は、セルを選択するとインスペクターに、セルにマウスポインターを合わせるとツールチップに表示されます。 ^ 区分 ^ セル ^ 表示される理由 ^ | 固定アドレスだけを受け付けるセル | 接点・コイル・エッジのセル、タイマーのTIMER(''T0'')・カウンターのCOUNT(''C0'')、''CTU''のRESET・''CTD''のSET・''CTUD''のCU・CD・RESET、''JMP''・''JMPN''・''LABEL''、''ISTA''のREAD、''IRD''のACK、''CINI''のTYPE、''CPUT''のDEFINE、''CSTR''のSTRING、''CINT''・''CREAL''・''FINT''のZERO・SIGN、''CHEX''のZERO、''PID_PWM''のPORT | 「D100[D0] はインデックスアドレスのため、この欄には使えずコンパイルされません。インデックスアドレスは命令の値欄(例: MOV の IN・OUT)と比較接点にだけ使えます — この欄には D100 のような固定アドレスを書いてください。」 | | 定数だけを受け付けるセル | ''CSCR''のADR、''FSCR''のDSP、''MCS''・''MCSCLR''のNUM、''FINI''のCLK・DIO、''MBTRIG''・''UPTRIG''のNO、''CREAL''のDIGIT | 「CSCR の ADR 欄は定数しか受け付けないため、インデックスアドレス(D100[D0])を使えず、コンパイルされません。この欄には定数(数値)を書いてください。」 | {{ :ja-jp_products:mp_studio:ix-red-reason.png?1000 |図2. タイマーのTIMERセルに書いて赤く表示されたインデックスアドレスと、インスペクターに表示された理由 }} ===== 範囲外と@IXERR ===== 実行中に、インデックスが指した要素がその領域(データメモリで決めたサイズ)の外にある場合、機器は次のように動作します。 * その命令だけをスキップします。ほかのメモリは上書きしません。 * その命令の出力(右側への信号)はオフになります。比較接点は偽になり、後ろのコイルがオフになります。 * システムビット''@IXERR''がオンになります。タイマー・カウンターのSET VALUEは、ラングがオフでも範囲をチェックするため、そのときもオンになります。 モニタリング・シミュレーション中は、''@IXERR''がオンになった瞬間に通知が表示され、機器が最後にスキップした命令の行も一緒に表示されます(タブが2つ以上ある場合はタブ名も一緒に表示)。ラダーに''@IXERR''の接点がなくても、通知は表示されます。 {{ :ja-jp_products:mp_studio:ix-out-sim-marked.svg?1000 |図3. シミュレーションでインデックスが範囲を外れた様子 }} * **① 範囲外のセル:** ''D0''が-200のため''D100''より手前の領域外を指し、赤い「範囲外(D0 = -200)」で表示されます。''MOVE''がスキップされるため、''D200''は前の値のままです。 * **② ''@IXERR''のラング:** ''@IXERR''がオンになり、後ろのコイルがオンになりました。 * **③ 通知:** 「インデックスが範囲外になりました — @IXERR が ON になり、その命令はスキップされました。(最後: 0 行)」 > **@IXERRは自動ではオフにならない** > ''@IXERR''は、インデックスが範囲内に戻ってもオンのまま残ります。ラダーのRESETコイル(''@IXERR'')でオフにするか、モニタリング・シミュレーション中にデータテーブルで0を書き込んでオフにしてください。ほかの''@''システムビットと異なり、''@IXERR''には0を書き込めます。ダウンロードすると、オフの状態で始まります。 ''@IXERR''は、[[:ja-jp_products:mp_studio:bit_control|ビット制御ファンクション]]の''BSFT''・''BRST''・''BSETN''が実行中に領域を外れたときや、''TFLK''の1周期がタイマーに収まらないときにもオンになります(V1.4.0以降)。インデックスアドレスを使っていないプログラムでは、''@IXERR''がラダー画面かデータテーブルにあるときにだけ通知が表示されるため、ラダーの''@IXERR''の接点で確認してください。 ===== 入力の補助 ===== ==== インデックス候補の一覧 ==== セルの入力欄(接点の編集・ファンクションの引数のセル・ファンクションの挿入・ファンクションの編集ウィンドウ)に''D100[''まで入力すると、インデックスに使えるものだけが一覧で表示されます。**インデックス候補 — このプログラムで使ったアドレス**には、現在のタブで使ったアドレスのうちインデックスに使える''D''・''C''のワードアドレスと''##名前''のユーザーワードが、**登録済みのシンボル**にはそれらのアドレスのシンボルが、まとまりごとに8個まで表示されます。 {{ :ja-jp_products:mp_studio:ix-complete.png?470 |図4. ファンクションの挿入ウィンドウにMOV D100[まで入力したときに表示されるインデックス候補 }} ''↑''・''↓''で候補を選び、''Tab''または''Enter''を押すと入力されます(選ばずに''Tab''を押すと最初の候補)。マウスでクリックしても入力できます。選ぶと''[''の後ろだけが変わり、'']''が付きます(すでにある場合は付けません)。''[''の前が''D''・''DD''・''C''・''DC''・''R''でない場合や、インデックスアドレスを受け付けないセルの場合は、通常の入力候補が表示されます。 ==== シンボルで書く ==== 先頭アドレスとインデックスには、シンボルを使えます。''RECIPE''が''D100''、''IDX''が''D0''のシンボルなら、セルに''RECIPE[IDX]''と入力しても''D100[D0]''として保存されます。**表示 → シンボルを表示**をオンにするとセルに「RECIPE[IDX]」と表示され、コメントは先頭アドレスのものが表示されます。シンボルテーブルに、インデックスアドレスの形をシンボルとして登録できません。 {{ :ja-jp_products:mp_studio:ix-symbol.png?1000 |図5. シンボル表示をオンにしたラダーのRECIPE[IDX]セル }} ==== 同じアドレスの強調表示と折り返し ==== カーソルを''D0''のセルに置くと、''D0''をインデックスに使うセルに点線の枠が表示され、カーソルを''D100[D0]''のセルに置くと、''D100''・''D0''のセルも一緒に強調表示されます。セルの中の長いアドレスは、''[''の前で折り返して表示します(''DD1000'' / ''[D10]'')。印刷も同じです。 ===== モニタリングとシミュレーション ===== モニタリング・シミュレーション中は、インデックスのセルに値と現在指しているセルが一緒に表示されます。シミュレーションでも、範囲のチェックと''@IXERR''、通知の最後の行が機器と同じように動作します。シミュレーションされないファンクション(''PUT''など)でも、範囲のチェックと''@IXERR''は動作します。 {{ :ja-jp_products:mp_studio:ix-monitor-marked.svg?1000 |図6. シミュレーション中にインデックスのセルに表示された値と指したセル }} * **① インデックスのセル:** 「2000 (→D103)」のように、値と現在指しているセルが表示されます。 * **② インデックス''D0'':** インデックスレジスターの値(3)です。 * **③ 結果''D200'':** ''MOVE''が転送した値(2000)です。 ^ 表示 ^ 意味 ^ | 「2000 (→D103)」 | 値と指したセルです。ダブルワードは「70000 (→DD102)」のように表示されます。 | | 「— (→?)」(淡色の文字) | その命令がまだ一度も実行されていないため、指したセルと値が分かりません(キャンバスとインスペクターにのみ表示)。 | | 「範囲外(D0 = -200)」(赤い文字) | 現在のインデックスが範囲外です。 | キャンバスとインスペクターの**現在値**はその命令が最後に実行されたときに指したセルを、ウォッチカードとデータテーブルは現在のインデックスの値が指すセルを、同じ形で表示します。ラングがオフで命令が実行されない間にインデックスを変えると、両者が別のセルを示すことがあります。''GMOVE''のINのようなブロックのセルは、「(→D252)」のように先頭のセルだけを表示します。比較接点の通電は機器が実際に比較した結果で表示され、範囲外のセルやまだ実行されていないセルは偽です。インデックスの値が変わった直後は、値をもう一度読むまで、指したセルの表示が少し遅れます。 ==== 値の書き込み ==== インデックスのセルを選択して**メモリへの値の書き込み**(''Alt+Enter'')を開くと、**アドレス**に「D100[D0] → D103 に書き込みます」のように現在指しているセルが表示され、値はそのセルに書き込まれます。まだ一度も実行されていないセルには書き込めません。 {{ :ja-jp_products:mp_studio:ix-write.png?440 |図7. インデックスのセルから開いたメモリへの値の書き込みウィンドウ }} ==== データテーブル ==== データテーブルの行に''D100[D0]''を入れると、値が「2000 (→D103)」のように表示され、値を書き込むと現在指しているセルに書き込みます。インデックスが範囲外の場合や、指したセルがまだ分からない場合は、送信せずに理由を表示します。**シンボル**列には「RECIPE[IDX]」と表示され、その欄に''RECIPE[D7]''のように入力すると、アドレスが''D100[D7]''になります。 {{ :ja-jp_products:mp_studio:ix-datatable.png?780 |図8. インデックスアドレスの行があるデータテーブル }} ==== 使用データ一覧 ==== **実行 → 使用データ一覧**では、先頭の要素とインデックスレジスターが使用中のセルとして塗りつぶされ、先頭の要素からその領域の終わりまでは、インデックスが届くセルとして斜線が表示されます。インデックスが''##名前''のユーザーワードの場合、そのインデックスはこのウィンドウに表示されません。 {{ :ja-jp_products:mp_studio:ix-usedata-marked.svg?425 |図9. 使用データ一覧ウィンドウで、D100の後ろのインデックスが届くセル(D メモリ) }} * **① 使用中のセル:** 先頭の要素(図では''D100'')とインデックスレジスターが塗りつぶされます。 * **② 斜線:** インデックスが届くセルです。マウスポインターを合わせると、「D100[D0] はここまで届きます · インデックスが負なら手前のアドレスにも届きます」と表示されます。 * **③ 凡例:** **インデックスで参照できる範囲** ===== 例 ===== 2つの例は、''MPA-8A8R(T)''の新規プロジェクト(データメモリは既定値)に順に作成し、シミュレーションで確認できます。 ==== 例1. レシピ番号で設定値を選ぶ ==== ''D100''~''D109''にレシピ10個の設定値を置き、''P0''を押すたびに次のレシピの値を''D200''に転送する例です。 - **設定 → シンボル**で、''D100''にRECIPE、''D0''にIDX、''D200''にNOW_SV、''P0''にNEXT_BTN、''M0''にIXERR_LAMPを登録します。 - 下のラングを作成します。 ^ ラング ^ 入力 ^ ファンクション・コイル ^ 動作 ^ | 0 | ''@ON'' | ''MOVE D100[D0] D200'' | 選んだレシピの値を''D200''に転送します。 | | 1 | ''P0'' → 立ち上がりエッジ | ''INC D0'' | ''P0''を押すたびに次のレシピを選びます。 | | 2 | ''D0>=10''(比較接点) | ''MOVE 0 D0'' | 10番目を超えると最初のレシピに戻ります。 | | 3 | ''@IXERR'' | コイル''M0'' | インデックスが範囲を外れるとオンになります。 | **実行 → シミュレーション**を開始し、データテーブルで''D100''~''D104''に1200・1500・1800・2000・2500を書き込んでから、''P0''を3回オン・オフします。''D0''が3になると、ラング0のINのセルに「2000 (→D103)」と表示され、''D200''は2000になります(図6)。データテーブルで''D0''に-200を書き込むと、ラング0が範囲外になってスキップされ、''@IXERR''と''M0''がオンになります(図3)。''D0''を0に戻しても、''@IXERR''はオンのまま残ります。 ==== 例2. 測定値を順番に記録する ==== 1秒ごとに''D10''の値を''D150''~''D169''の20セルに順に記録し、終わりに達すると最初から上書きする例です。 - **設定 → シンボル**で、''D10''にTEMP、''D1''にPOS、''D150''にLOGを登録します。 - 例1のラングの後ろに、下のラングを作成します。 ^ ラング ^ 入力 ^ ファンクション ^ 動作 ^ | 4 | ''@100'' | ''MOVE D10 D150[D1]'' | 1秒ごとに、''D10''の値を''D150''から''D1''だけ離れたセルに書き込みます。 | | 5 | ''@100'' | ''INC D1'' | 次のセルに進みます。 | | 6 | ''D1>=20''(比較接点) | ''MOVE 0 D1'' | 20セルを使い切ると、最初のセルに戻ります。 | シミュレーション中にデータテーブルで''D10''に25を書き込んで数秒待つと、ラング4のOUTのセルに「25 (→D157)」のように現在記録しているセルが表示されます。**使用データ一覧**の**D メモリ**では、''D150''が使用中のセルとして、その後ろから領域の終わりまでがインデックスが届くセルとして表示されます。''@100''は、タイマー基準が10 msのときに1秒です。[[:ja-jp_products:mp_studio:menus_settings#タイマー基準|タイマー基準]]を1 msに変えたプロジェクトでは、''@1000''を使ってください。 ===== 確認事項 ===== * インデックスアドレスはユーザーメモリ(USER MEMORY)を使います。異なるインデックスアドレス1つごとに6バイト(同じアドレスを複数のセルで使う場合は1回だけ)と、プログラム全体で2バイトが必要です。足りない場合はコンパイルエラーのメッセージの末尾に「(うちインデックスアドレス N 個が内部用の隠し領域 M バイトを使います)」が付くので、**設定 → データメモリ**の**USER MEMORY**を増やしてください。 * インデックスのセルごとに、実行時間が少し長くなります。 * インデックスアドレスは、ラダーのセルとデータテーブルで使えます。Modbus 機器テーブルのバインドと、CLCD 画面エディタの値フィールドには使えません。 * セルの文字が''[''で始まる場合は、インデックスアドレスではなくブックマークとして読みます。 * プロジェクトファイル(''.mpx'')には、セルに書いたとおり(''D100[D0]'')保存されます。 ===== 関連文書 ===== * [[:ja-jp_products:mp_studio:memory_symbols|Phase 5 · メモリとシンボル]] * [[:ja-jp_products:mp_studio:ladder_editing|Phase 3 · ラダー編集]] * [[:ja-jp_products:mp_studio:functions|Phase 4 · ファンクション]] * [[:ja-jp_products:mp_studio:monitoring|Phase 7 · モニタリングとデータテーブル]] * [[:ja-jp_products:mp_studio:simulation|Phase 8 · シミュレーション]] [[:ja-jp_products:mp_studio|← MP STUDIO 2 ユーザーマニュアルに戻る]]