文書の過去の版を表示しています。
MP STUDIO 2 · メモリ · V1.3.0以降
MP STUDIO 2 · インデックスアドレス(ポインタ)
インデックスアドレスは、D100[D0]のように先頭アドレスからインデックスの値だけ離れたセルを、命令が読み書きできるようにする機能です(V1.3.0以降)。D0が3なら、その命令はD103を使います。インデックスの値を変えるだけで、レシピの設定値や記録バッファのように表の形で並んだデータを順に扱えます。
| 書き方 | 指せる領域 | インデックス | 対応バージョン |
|---|---|---|---|
D100[D0] | D・DD・C・DC・R | D・Cワード・##名前 | V1.3.0以降 |
- 配列のように数える
インデックスは要素単位で数えます。DD・DCは、1要素が番号2つ分です。 - 範囲外はスキップ
指したセルが領域外なら、その命令だけをスキップして@IXERRをオンにします。ほかのメモリは上書きしません。 - 指したセルを表示
モニタリング・シミュレーション中は、インデックスのセルに「2000 (→D103)」のように値と指したセルが一緒に表示されます。 - 使わなければ従来どおり
インデックスアドレスを使わないプログラムは、メモリと実行時間が以前と変わりません。
このページの内容
書き方
インデックスアドレスの形は先頭アドレス[インデックス]です。*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 として書きました。」のように通知が表示されます。
指せる領域とインデックス
| 区分 | 使えるもの | 使えないもの |
|---|---|---|
| 先頭アドレス(指す領域) | 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)として読むため、負のインデックスで手前のセルを指すこともできます。指せる範囲はデータメモリで決めたその領域のサイズで、範囲を外れると範囲外と@IXERRで説明するとおりに動作します。
インデックスの値は、命令が始まるときに1回だけ読みます。同じ命令がインデックスを変えても、結果は最初に指したセルに書き込みます。たとえばDIV 7 2 D100[D0] D0は、余りをD0に書き込み、商は命令が始まったときにD0が指していたセルに書き込みます。
使える命令とセル
インデックスアドレスは、命令の値セルと比較接点に使えます。指したセルのアドレスをその位置に直接書いたときと同じように動作し、オレンジ色の警告も同じ条件で表示されます。
| 分類 | インデックスアドレスを使えるセル |
|---|---|
| Comparison | 比較ファンクションのIN1・IN2、接点のセルに書いた比較(例: D100[D0]>D9) |
| Conversion | H2D・D2H・INV・NEGのIN・OUT |
| Math | ADD・SUB・MUL・DIVのすべてのセル、INC・DEC、SCALEの6つのセル、FLOOR・SQRT |
| Counter | CTU・CTD・CTUDのSET VALUE、HCNT・ENCODER・ENMOV・HRST |
| Timer | TON・TOFF・TPL・TMON・TMRのSET VALUE |
| Word Logic | WAND・WOR・WXOR・SHL・SHR・SWAPのすべてのセル |
| Analog | ADC・ADC2・DACのすべてのセル、AFILTER、NTEMP・PTEMP、PWM・FPWM・FDPWM・NPWM・POFF・PSR、PIDのすべてのセル、PID_PWM(PORTを除く) |
| MOVE | MOVE・GMOVE・FMOVEのすべてのセル |
| Data Processing | MAX・MIN・SUM・AVE・MUX・ENCO・DECOのすべてのセル |
| Serialport | 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 (Character LCD) | CINI・CLOC・CSTR・CINT・CREAL・CHEX・CCLS・CCON・CCOF・CPUT・CGETのADR・値のセル(下の使えないセルを除く)、CSCRのPAGE |
| 7Segment | 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])を使えず、コンパイルされません。このセルには定数(数値)を書いてください。」 |
範囲外と@IXERR
実行中に、インデックスが指した要素がその領域(データメモリで決めたサイズ)の外にある場合、機器は次のように動作します。
- その命令だけをスキップします。ほかのメモリは上書きしません。
- その命令の出力(右側への信号)はオフになります。比較接点は偽になり、後ろのコイルがオフになります。
- システムビット
@IXERRがオンになります。タイマー・カウンターのSET VALUEは、ラングがオフでも範囲をチェックするため、そのときもオンになります。
モニタリング・シミュレーション中は、@IXERRがオンになった瞬間に通知が表示され、機器が最後にスキップした命令の行も一緒に表示されます(タブが2つ以上ある場合はタブ名も一緒に表示)。ラダーに@IXERRの接点がなくても、通知は表示されます。
- ① 範囲外のセル:
D0が-200のためD100より手前の領域外を指し、赤い「範囲外 (D0 = -200)」で表示されます。MOVEがスキップされるため、D200は前の値のままです。 - ②
@IXERRのラング:@IXERRがオンになり、後ろのコイルがオンになりました。 - ③ 通知: 「インデックスが範囲外になりました — @IXERR がオンになり、その命令はスキップされました。(最後: 0 行)」
@IXERRは自動ではオフにならない
@IXERRは、インデックスが範囲内に戻ってもオンのまま残ります。ラダーのRESETコイル(@IXERR)でオフにするか、モニタリング・シミュレーション中にデータテーブルで0を書き込んでオフにしてください。ほかの@システムビットと異なり、@IXERRには0を書き込めます。ダウンロードすると、オフの状態で始まります。
@IXERRは、ビット制御ファンクションのBSFT・BRST・BSETNが実行中に領域を外れたときや、TFLKの1周期がタイマーに収まらないときにもオンになります(V1.4.0以降)。インデックスアドレスを使っていないプログラムでは、@IXERRがラダー画面かデータテーブルにあるときにだけ通知が表示されるため、ラダーの@IXERRの接点で確認してください。
入力の補助
インデックス候補の一覧
セルの入力欄(接点の編集・ファンクションの引数のセル・ファンクションの挿入・ファンクションの修正ウィンドウ)にD100[まで入力すると、インデックスに使えるものだけが一覧で表示されます。インデックス候補 — このプログラムで使ったアドレスには、現在のタブで使ったアドレスのうちインデックスに使えるD・Cのワードアドレスと##名前のユーザーワードが、登録済みのシンボルにはそれらのアドレスのシンボルが、まとまりごとに8個まで表示されます。
↑・↓で候補を選び、TabまたはEnterを押すと入力されます(選ばずにTabを押すと最初の候補)。マウスでクリックしても入力できます。選ぶと[の後ろだけが変わり、]が付きます(すでにある場合は付けません)。[の前がD・DD・C・DC・Rでない場合や、インデックスアドレスを受け付けないセルの場合は、通常の入力候補が表示されます。
シンボルで書く
先頭アドレスとインデックスには、シンボルを使えます。RECIPEがD100、IDXがD0のシンボルなら、セルにRECIPE[IDX]と入力してもD100[D0]として保存されます。表示 → シンボルを表示をオンにするとセルに「RECIPE[IDX]」と表示され、コメントは先頭アドレスのものが表示されます。シンボルテーブルに、インデックスアドレスの形をシンボルとして登録できません。
同じアドレスの強調表示と折り返し
カーソルをD0のセルに置くと、D0をインデックスに使うセルに点線の枠が表示され、カーソルをD100[D0]のセルに置くと、D100・D0のセルも一緒に強調表示されます。セルの中の長いアドレスは、[の前で折り返して表示します(DD1000 / [D10])。印刷も同じです。
モニタリングとシミュレーション
モニタリング・シミュレーション中は、インデックスのセルに値と現在指しているセルが一緒に表示されます。シミュレーションでも、範囲のチェックと@IXERR、通知の最後の行が機器と同じように動作します。シミュレーションされないファンクション(PUTなど)でも、範囲のチェックと@IXERRは動作します。
- ① インデックスのセル: 「2000 (→D103)」のように、値と現在指しているセルが表示されます。
- ② インデックス
D0: インデックスレジスターの値(3)です。 - ③ 結果
D200:MOVEが転送した値(2000)です。
| 表示 | 意味 |
|---|---|
| 「2000 (→D103)」 | 値と指したセルです。ダブルワードは「70000 (→DD102)」のように表示されます。 |
| 「— (→?)」(淡色の文字) | その命令がまだ一度も実行されていないため、指したセルと値が分かりません(キャンバスとインスペクターにのみ表示)。 |
| 「範囲外 (D0 = -200)」(赤い文字) | 現在のインデックスが範囲外です。 |
キャンバスとインスペクターの現在値はその命令が最後に実行されたときに指したセルを、ウォッチカードとデータテーブルは現在のインデックスの値が指すセルを、同じ形で表示します。ラングがオフで命令が実行されない間にインデックスを変えると、両者が別のセルを示すことがあります。GMOVEのINのようなブロックのセルは、「(→D252)」のように先頭のセルだけを表示します。比較接点の通電は機器が実際に比較した結果で表示され、範囲外のセルやまだ実行されていないセルは偽です。インデックスの値が変わった直後は、値をもう一度読むまで、指したセルの表示が少し遅れます。
値の書き込み
インデックスのセルを選択してメモリへの値の書き込み(Alt+Enter)を開くと、アドレスに「D100[D0] → D103 に書き込みます」のように現在指しているセルが表示され、値はそのセルに書き込まれます。まだ一度も実行されていないセルには書き込めません。
データテーブル
データテーブルの行にD100[D0]を入れると、値が「2000 (→D103)」のように表示され、値を書き込むと現在指しているセルに書き込みます。インデックスが範囲外の場合や、指したセルがまだ分からない場合は、送信せずに理由を表示します。シンボル列には「RECIPE[IDX]」と表示され、その欄にRECIPE[D7]のように入力すると、アドレスがD100[D7]になります。
使用データ一覧
実行 → 使用データ一覧では、先頭の要素とインデックスレジスターが使用中のセルとして塗りつぶされ、先頭の要素からその領域の終わりまでは、インデックスが届くセルとして斜線が表示されます。インデックスが##名前のユーザーワードの場合、そのインデックスはこのウィンドウに表示されません。
- ① 使用中のセル: 先頭の要素(図では
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秒です。タイマー基準を1 msに変えたプロジェクトでは、@1000を使ってください。
確認事項
- インデックスアドレスはユーザーメモリ(USER)を使います。異なるインデックスアドレス1つごとに6バイト(同じアドレスを複数のセルで使う場合は1回だけ)と、プログラム全体で2バイトが必要です。足りない場合はコンパイルエラーのメッセージの末尾に「(うちインデックスアドレス N 個が隠しセル M バイトを使います)」が付くので、設定 → データメモリのUSERを増やしてください。
- インデックスのセルごとに、実行時間が少し長くなります。
- インデックスアドレスは、ラダーのセルとデータテーブルで使えます。Modbus 機器テーブルのバインドと、CLCD 画面エディタの値フィールドには使えません。
- セルの文字が
[で始まる場合は、インデックスアドレスではなくブックマークとして読みます。 - プロジェクトファイル(
.mpx)には、セルに書いたとおり(D100[D0])保存されます。


![図1. MOVEのINにD100[3]を書いてD103に変わったセルと通知 図1. MOVEのINにD100[3]を書いてD103に変わったセルと通知](https://www.ilogics.net/docs/_media/ja-jp_products:mp_studio:ix-fold.png?w=900&tok=c98cbb)


![図5. シンボル表示をオンにしたラダーのRECIPE[IDX]セル 図5. シンボル表示をオンにしたラダーのRECIPE[IDX]セル](https://www.ilogics.net/docs/_media/ja-jp_products:mp_studio:ix-symbol.png?w=1000&tok=a09a5d)

