Indirect Addressingはみんなもわかると思いますが、いわゆる三菱PLCの”Z”Indexのような指標アドレス指定とかオムロンの*D8000の”*”の間接アドレス指定のことです。今回はシーメンスのS7-300_400のIndirect Addressingについて紹介したいと思います。ですが…その前に、残念なお知らせがあります。シーメンスのS7-300_400にはLADDERでIndirect Addressingを扱うことができません。(ネットで色々調べてみましたけどTIAV13のSP2どうやらできるらしいけど、僕が使ってるのはTIAV13のSP1でございます…)え?どういうことです か?つまりですね。方法としては、
- プログラミングのネットワークの中にInLineのSTLプログラミング追加するか
- SCLで扱うのFCかFBを作ってプログラムすること
この2つしかありません。まぁ、まぁ、まぁまぁまぁ…新しいこと勉強していいじゃないか。
まずはSTL言語はなんですか?シーメンスはIL言語のことSTL言語と呼ぶのですが、ステートメントリストのことで、つまりインストラクション リスト(Instruction List)です。
従来ツールにあるニーモニックに相当する言語で、マイコンで言えばアセンブラのようなテキスト言語です。
アプリケーションの小型化や高速化に有効ですが、プログラミングの生産性やメンテナンス性に劣るため、使用する機会は減ってきていると思われます。図1の自己保持回路をILで記述すると図4のようになります。
From:http://monoist.atmarkit.co.jp/mn/articles/1312/10/news003_2.html
[php]
//Example of STL
LD 5//Load 5 to AC1
T MW202//Transfer to MW202
LD 20//Load 20 to AC1
T MW220//Transfer to MW220
[/php]
PointerとANY DATA TYPE
STLではPOINTERデータタイプを使ってIndirect Addressingの場所を指定します。PointerタイプはP#として宣言されて、この下の3つの形式として使用は可能です。
[php]
P#2.0//P#Byte Bit
P#M50.0//P#Area Byte Bit
P#DB19.DBX3.0 BYTE 14//P#Area Byte Bit Length
[/php]
もしIndirect Addressingを使ってDBをアクセスしたい時はまず使えたいDBを”開く”が必要でShared Data BlockとInstance Data Blockも同じで”OPN”という命令を使うんです。
マニュアルによると…
OPN <data block>は、共有データブロックまたはインスタンスデータブロックとしてデータブロックを開きます。どちらのブロックも、1 度に開ける数は 1 つです。
[php]
//Example
OPN DB10//Open DB10 as shared Data Block
L DBW20//Load DBWord 20 to ACC1
T MW200//Save it to MW200
OPN DI11//Open DB11 as Instance Data Block
L DBW50//Load DBWord 50 to ACC1
T MW202//Save it to MW202
[/php]
Indirect Addressingを扱うときには確実なDBを開くとそのDBのデータ長さは足りるかどうかは大事で、それらの命令を使って簡単で確認することができます:
[php]
//save the Shared DB that opened into ACCU1
L DBNO
//save the Length of Shared DB that Opened into ACCU1
L DBLG
//save the Instance DB that opened into ACCU1
L DINO
//save the Length of Instance DB that Opened into ACCU1
L DILG
//Example
OPN DB120
L DBLG
L MD30 // Devices that save the compare length
‘>’D // if the size of DB is Smaller than
JC ERR // jump to ERR
[/php]
Memory Indirect Addressing
まずはmemory indirect addressingについて紹介します。どっちかっというとちょっと三菱のZIndexの感じで間接にアクセスしたいデバイスを指定することができるんです。指定するデバイスはT、C、DB、DI、FBとFCの場合、Pointerはワード16ビットの形で。
[php]
L 20 //Load 20 to ACCU1 as a Pointer
T MW10//Save it to MW10
L T[MW10]//Load the current value of T20 to ACCU1
OPN DB[#DBPointer]
[/php]
指定するデバイスはI, Q, M, L, DB の場合、Pointerはダブルワード 32-bitビットの形です。
[php]
L P#0.5 //Load &amp;nbsp;0.5 into Pointer Value
T MD100//Transfer the pointer to MD100
A Q[MD 100]//Check Q0.5
= M[MD 100]//If ON, Assign M0.5 to ON
OPN DB10//Open DB10
P P#3.0//Load 3.0
T #Pointer//Transfer the pointer to Local variable #Pointer
L DBW[#Pointer]//Load DB10.DBW3
L 0 //Load 0
&amp;gt;D//Compare with 0
[/php]
もちろん2つのPOINERをプラスしたりマイナスしたりして新しいデバイス指定することもできますよ。
[php]
L P#1.0//Load the First Pointer value
L P#3.0//Load the second Pointer value
+D // Add this 2 pointer
T MD 0// Now the MD0 contains P#4.0.
[/php]
注意してほしいのはP#1.1+P#7.7するとPointerの値はP#9.0になるってことです。シーメンスではバイトで計算されてるのでつまりP#8.8は存在しません。
Address Registers
次紹介したいのはAddress Registersです。シーメンスにはAR1とAR2その2つのAddress Registersがありまして、AR1とAR2の使用方法は同じでそれによってもっと簡単にIndirect Addressingを扱うことできます。
[php]
LAR1 //Load AR1 With the Contents of ACC1&amp;nbsp;
LAR1 P#M100.0 //Load AR1 with a pointer Values
LAR1 MD30//Load AR1 With Pointer in MD30
LAR1 AR2//Load AR1 with the Contents of AR2
TAR1 //Transfer AR1 to ACC1
TAR1 MD30//Transfer AR1 to MD30
TAR1 AR2//Transfer AR1 to AR2
CAR//Exchanges AR1 and AR2
+AR1//Add ACC1 into AR1 and save into AR1
+AR1 P#200.0//Add the pointer constant to AR1 and save into AR1
[/php]
では実際どうやってAR1、AR2を使うのでしょうか?まずは下のFORMATをしっかり覚えておきましょう:
address identifier [address register, pointer]
Address Identifierは I, Q, M, L, DI or DB in bit, byte, word or ダブルwordでも大丈夫ですが、Pointerは必ず32BitのPointer形で定義してくださいね。
[php]
L P#M10.0//Load Pointer Value P#10.0
LAR1//Transfer to AR1
L W[AR1, P#0.0]//Load MW10
L W[AR1, P#2.0]//Load MW12
L P#M0.7//Load Pointer Value P#M0.7
LAR1//Transfer to AR1
L P#0.7//Load Pointer Value P#Q0.7
LAR2//Transfer to AR2
L M[AR1,P#1.0]//Load M1.7
= Q[AR1,P#0.1]//Assign to Q1.0
OPN DB100//Open DB100
L P#DBX0.0//Load Pointer Value
LAR1//Transfer to AR1
L #100//Load 100
T D[AR1,P#100.0]//Transfer to DB100.DBD100
[/php]
上のcodeはAR1とAR2を使って様々なアドレスをアクセスします。
Line4でMW12になるの理由はP#2.0だからです、AR1はM10.0、Poinerは2.0。結果としてはアクセスするMWはMW12になります。
Line9も同じの理由でAR1はP#0.7が入ってますので、AR1はM0.7、Pointerは1.0。結果としてはアクセスするMBitはM1.7になります。
Line15はDB100が開いてからAR1がDBX0.0でPointerが100.0。注意したいのはD[AR1,P#100.0]のその”D”です。それが”D”だからアクセスするのはDBD100になります。もし”W”になったらつまりW[AR1,P#100.0]の場合はDBW100になりますので気をつけってくださいね。
では今度はここまでしますね!よくわかりましたか?問題あればコメントしてくださいね。
*予告、次のPOSTは…
ーSiemensPLC#S7300_400 Pointerの使用方法(SCL編)
ーSiemensPLC#S7300_400 PointerをARRAYをアクセス方法(STL編)
ーSiemensPLC#S7300_400 PointerをARRAYをアクセス方法(SCL編)
それじゃ、またねー