SiemensPLC#S7300_400_1200_1500 Pointerの使用方法(SCL編)

みんなさんおはようございます。最近はちょっと勉強心が高めになりましていろいろもためしくなりましてね、もし同じなこと別のPLC言語で書くのならどうになるでしょう?とか余計な発想ばかりしましたー笑。あとやっばり数学がもっと一から勉強しないとあかんわ!と思って微分、積分の優しい入門書も図書館借りて読んだりとか。

話はここまでにして、今度はSCLを使ってDB の中のデータをアクセスする方法を説明したいと思います。SCLはまたなんですか?いわゆる三菱のST言語のことですね。メーカーによって呼び方が違うの場合もありますので注意してくださいね。このリングには簡単なST言語の説明がありますのでもしはじめの方なら。

じゃ本題に入ります。まずは下のDB1をみてください。

222

32bit整数のARRAY[0…47]は二つありまして、BOOLのARRAY[0..47]は一つがあります。ここで目にしてほしいのはOffsetの数字です。このOffsetはデバイスのアドレスなんですが、なぜDWORD1とDWORD2のOffsetが192.0の差があるでしょうか?

ー何度も言いましたが、シーメンスはBYTEでデバイスを計算するんのです。
ー1つの32bit整数でつまりBYTE数は4です。
ーARRAY[0…47]は47*4=188、つまり最後のDWORD1[47]のアドレスはDBD188になります、使ってるDBBはDBB188,DBB189,DBB190,DBB191です。
ーだから次のARRAY[0…47]のアドレスの始まりは192.0からになるのです。

Step1#FCを作ります。

2222

私はPoint2Dintという名前のFCを作ってそれぞれのINPUTとOUTPUTを設定しました。
ーindex        アクセスしたいDB番号です。
ーy               アクセスしたいデバイスです
ーMode        書き込みか、読み出しか。
ーDataInput   書き込みの時の値
ーResult         読み出しの時のデバイス値

Step#2.1 WORD_TO_BLOCK_DB

ここで使う命令はWORD_TO_BLOCK_DBという変換命令です。文字通りWordからDBへ変わるの命令ですね。下のCodeをみてください。

//Read 
IF NOT #Mode THEN
#Result:=WORD_TO_BLOCK_DB(#index).DD(#y);
ELSE
WORD_TO_BLOCK(#index).DD(#y):=#DataInput;

WORD_TO_BLOCK_DB(#index).DD(#y)
ここでみてほしいのはDD(#y)です。
もし#Index=1,y=4なら、読み込む/書き込むのデバイスがDB1.DBD4になります。
もし#Index=2,y=16なら、読み込む/書き込むのデバイスがDB2.DBD16になります。

では、もしDD(#y)ではなく、DW(#y)になったらどうになります?
もし#Index=1,y=4なら、読み込む/書き込むのデバイスがDB1.DBW4になります。
もし#Index=2,y=16なら、読み込む/書き込むのデバイスがDB2.DBW16になります。

Step2.2 WORD_TO_BLOCK_DB

ここで上のCodeと変わってWORD_TO_BLOCK_DB(#index).DX(#x,#y);になります。

//Read 
IF NOT #Mode THEN
#Result:=WORD_TO_BLOCK_DB(#index_bit).DX(#x_bit,#y_bit);
ELSE
WORD_TO_BLOCK(#index_bit).DX(#x_bit,#y_bit):=#Input;

DXだと今回アクセスするデバイスがBITになります。
もし#Index=1,x=5,y=4なら、読み込む/書き込むのデバイスがDB1.DBX5.4になります。
もし#Index=2,x=3,y=1なら、読み込む/書き込むのデバイスがDB2.DBX3.1になります。

Step#3 FCを呼び出し

2225

2226

最後はこれだけです。


For Loop でARRAYをアクセス

こうすることでプログラミングがもっと簡単で分かりやすくなります。下のビデオがFOR LOOPについて詳しく説明されています。

FOR #i := 0 TO 47 BY 1 DO
IF "DB1".DWORD1[#i] <> 0 THEN
//do some operation if not equal to zero
ELSE
//do some operation if equal to zero
END_IF;
END_FOR;

こうすることによって”DB1″.DWORD1[0]から “DB1”.DWORD1[47]までアクセスすることができます。

備考1-S71200,1500のPROJECTから作成されたDB最適化されたためOFFSETがありませんが、設定によって変わることもできます。

じゃ、またね!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする