MP STUDIO 2 · メモリ · V1.3.0以降

MP STUDIO 2 · インデックスアドレス(ポインタ)

インデックスアドレスは、D100[D0]のように先頭アドレスからインデックスの値だけ離れたセルを、命令が読み書きできるようにする機能です(V1.3.0以降)。D0が3なら、その命令はD103を使います。インデックスの値を変えるだけで、レシピの設定値や記録バッファのように表の形で並んだデータを順に扱えます。

例を見る 書き方

例のプログラムをシミュレーションし、インデックスのセルに値と指したセルが一緒に表示されたMP STUDIO 2のウィンドウ全体

書き方 指せる領域 インデックス 対応バージョン
D100[D0] D・DD・C・DC・R D・Cワード・##名前 V1.3.0以降

このページの内容

書き方

インデックスアドレスの形は先頭アドレス[インデックス]です。*D0・&D100のようなC言語のポインタの形は使えません。

  1. ラダーで命令の値セル(例: MOVEのIN)を選択し、D100[D0]を入力します。ファンクションの挿入ウィンドウ(Ctrl+E)にMOVE D100[D0] D200のように1行で入力することもできます。
  2. 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 として書きました。」のように通知が表示されます。

図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)として読むため、負のインデックスで手前のセルを指すこともできます。指せる範囲はデータメモリで決めたその領域のサイズで、範囲を外れると範囲外と@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])を使えず、コンパイルされません。この欄には定数(数値)を書いてください。」

図2. タイマーのTIMERセルに書いて赤く表示されたインデックスアドレスと、インスペクターに表示された理由

範囲外と@IXERR

実行中に、インデックスが指した要素がその領域(データメモリで決めたサイズ)の外にある場合、機器は次のように動作します。

モニタリング・シミュレーション中は、@IXERRがオンになった瞬間に通知が表示され、機器が最後にスキップした命令の行も一緒に表示されます(タブが2つ以上ある場合はタブ名も一緒に表示)。ラダーに@IXERRの接点がなくても、通知は表示されます。

図3. シミュレーションでインデックスが範囲を外れた様子

@IXERRは自動ではオフにならない
@IXERRは、インデックスが範囲内に戻ってもオンのまま残ります。ラダーのRESETコイル(@IXERR)でオフにするか、モニタリング・シミュレーション中にデータテーブルで0を書き込んでオフにしてください。ほかの@システムビットと異なり、@IXERRには0を書き込めます。ダウンロードすると、オフの状態で始まります。

@IXERRは、ビット制御ファンクションのBSFT・BRST・BSETNが実行中に領域を外れたときや、TFLKの1周期がタイマーに収まらないときにもオンになります(V1.4.0以降)。インデックスアドレスを使っていないプログラムでは、@IXERRがラダー画面かデータテーブルにあるときにだけ通知が表示されるため、ラダーの@IXERRの接点で確認してください。

入力の補助

インデックス候補の一覧

セルの入力欄(接点の編集・ファンクションの引数のセル・ファンクションの挿入・ファンクションの編集ウィンドウ)にD100[まで入力すると、インデックスに使えるものだけが一覧で表示されます。インデックス候補 — このプログラムで使ったアドレスには、現在のタブで使ったアドレスのうちインデックスに使えるD・Cのワードアドレスと##名前のユーザーワードが、登録済みのシンボルにはそれらのアドレスのシンボルが、まとまりごとに8個まで表示されます。

図4. ファンクションの挿入ウィンドウにMOV D100[まで入力したときに表示されるインデックス候補

↑・↓で候補を選び、TabまたはEnterを押すと入力されます(選ばずにTabを押すと最初の候補)。マウスでクリックしても入力できます。選ぶと[の後ろだけが変わり、]が付きます(すでにある場合は付けません)。[の前がD・DD・C・DC・Rでない場合や、インデックスアドレスを受け付けないセルの場合は、通常の入力候補が表示されます。

シンボルで書く

先頭アドレスとインデックスには、シンボルを使えます。RECIPEがD100、IDXがD0のシンボルなら、セルにRECIPE[IDX]と入力してもD100[D0]として保存されます。表示 → シンボルを表示をオンにするとセルに「RECIPE[IDX]」と表示され、コメントは先頭アドレスのものが表示されます。シンボルテーブルに、インデックスアドレスの形をシンボルとして登録できません。

図5. シンボル表示をオンにしたラダーのRECIPE[IDX]セル

同じアドレスの強調表示と折り返し

カーソルをD0のセルに置くと、D0をインデックスに使うセルに点線の枠が表示され、カーソルをD100[D0]のセルに置くと、D100・D0のセルも一緒に強調表示されます。セルの中の長いアドレスは、[の前で折り返して表示します(DD1000 / [D10])。印刷も同じです。

モニタリングとシミュレーション

モニタリング・シミュレーション中は、インデックスのセルに値と現在指しているセルが一緒に表示されます。シミュレーションでも、範囲のチェックと@IXERR、通知の最後の行が機器と同じように動作します。シミュレーションされないファンクション(PUTなど)でも、範囲のチェックと@IXERRは動作します。

図6. シミュレーション中にインデックスのセルに表示された値と指したセル

表示 意味
「2000 (→D103)」 値と指したセルです。ダブルワードは「70000 (→DD102)」のように表示されます。
「— (→?)」(淡色の文字) その命令がまだ一度も実行されていないため、指したセルと値が分かりません(キャンバスとインスペクターにのみ表示)。
「範囲外(D0 = -200)」(赤い文字) 現在のインデックスが範囲外です。

キャンバスとインスペクターの現在値はその命令が最後に実行されたときに指したセルを、ウォッチカードとデータテーブルは現在のインデックスの値が指すセルを、同じ形で表示します。ラングがオフで命令が実行されない間にインデックスを変えると、両者が別のセルを示すことがあります。GMOVEのINのようなブロックのセルは、「(→D252)」のように先頭のセルだけを表示します。比較接点の通電は機器が実際に比較した結果で表示され、範囲外のセルやまだ実行されていないセルは偽です。インデックスの値が変わった直後は、値をもう一度読むまで、指したセルの表示が少し遅れます。

値の書き込み

インデックスのセルを選択してメモリへの値の書き込み(Alt+Enter)を開くと、アドレスに「D100[D0] → D103 に書き込みます」のように現在指しているセルが表示され、値はそのセルに書き込まれます。まだ一度も実行されていないセルには書き込めません。

図7. インデックスのセルから開いたメモリへの値の書き込みウィンドウ

データテーブル

データテーブルの行にD100[D0]を入れると、値が「2000 (→D103)」のように表示され、値を書き込むと現在指しているセルに書き込みます。インデックスが範囲外の場合や、指したセルがまだ分からない場合は、送信せずに理由を表示します。シンボル列には「RECIPE[IDX]」と表示され、その欄にRECIPE[D7]のように入力すると、アドレスがD100[D7]になります。

図8. インデックスアドレスの行があるデータテーブル

使用データ一覧

実行 → 使用データ一覧では、先頭の要素とインデックスレジスターが使用中のセルとして塗りつぶされ、先頭の要素からその領域の終わりまでは、インデックスが届くセルとして斜線が表示されます。インデックスが##名前のユーザーワードの場合、そのインデックスはこのウィンドウに表示されません。

図9. 使用データ一覧ウィンドウで、D100の後ろのインデックスが届くセル(D メモリ)

例

2つの例は、MPA-8A8R(T)の新規プロジェクト(データメモリは既定値)に順に作成し、シミュレーションで確認できます。

例1. レシピ番号で設定値を選ぶ

D100~D109にレシピ10個の設定値を置き、P0を押すたびに次のレシピの値をD200に転送する例です。

  1. 設定 → シンボルで、D100にRECIPE、D0にIDX、D200にNOW_SV、P0にNEXT_BTN、M0にIXERR_LAMPを登録します。
  2. 下のラングを作成します。
ラング 入力 ファンクション・コイル 動作
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セルに順に記録し、終わりに達すると最初から上書きする例です。

  1. 設定 → シンボルで、D10にTEMP、D1にPOS、D150にLOGを登録します。
  2. 例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を使ってください。

確認事項

関連文書

← MP STUDIO 2 ユーザーマニュアルに戻る