入社してからもう既に3ヶ月、先輩もちょっと色々やらせてくれてたのところで、ST言語に興味を持つことになりまして、任されたの小さいなプロジェクトもこっそりST言語を試すようになりました。(最もとCとかは凄く興味がありまして独学も何回もやりましたがいかにも実際に使う機会はなかなかなくていつもついつい忘れてしまう。)今回はこのプログに通じてST言語の基本とか仕事メモとかも書きたいと思います。よろしくお願いしますね。
ST言語はなんですか?
マニュアルによると…
ST言語の“ST”は“Structured Text(ストラクチャードテキスト)”の略で、日本語では「構造化テキスト」とも呼ばれます。C言語などに似た文法構造を持つ,テキスト形式のプログラム言語です。構文による条件判断や反復などの制御が記述できます。グラフィック言語(構造化ラダー /FBD)では表現しにくい複雑な処理をプログラミングする場合に適しています。
僕は最初にPLCを勉強し始めてた時は4年前ですね。あの時はずっとラダーでした。多分いまでもラダーのほうが主流だと思いますが、実際いまはシーメンスのPLCプログラミングを触るようになってから”構造化”という言葉は何回のMANUALの中に見えまして、そしてST言語と出会いました。”構造化”ってなんですか?簡単だというと、プログラミングを箱のなかに入れて、毎回をその部分のプログラミングを使うとその箱を呼び出せばいいってことです。いままでのプログラムは大体1から最後まで一気に書くのは普通ですが、これによって人間的なミスが犯しやすいのです。IOが打ち間違ったり使うのDM、ビットが被って変な動きになったり…構造化になると中身さえ決めれば、後はINPUT、OUTPUTを入れるだけです。
文の構成
では、まずは簡単なルールを説明したいと思います。下のプログラムをみてください。
[php]
/*This is a ST Example.
Now I am using Mitsubishi PLC to explain it.
*/
D10:=100;//the value in side D10 =100
M10:=TRUE;
[/php]
ーコメント
/*This is a comment*/
//This is a comment too!
ー代入文
:= は右辺の式の結果を左辺のラベルやデバイスに代入する機能を持ちます。
ですが、左辺と右辺のデータ型が同じにしないといけません。
ー;
[php]
M1:=FALSE;//OK!
M1 := FALSE;//OK!
M1 := //OK!
FALSE;
[/php]
文の終端は,必ず「;」(セミコロン)を付けます。
スペース,タブ,改行は,演算子やデータの間に挿入でもOKです。
簡単なAND、OR、LD…
これはラダーのプログラムです、STで書くことになると…
[php]
Y0:=X0;//Line0
Y1:=NOT X0//Line2
Y2:=X0 AND NOT X1//Line4
Y3:=X0 OR X1//Line7
Y4:=X0 OR NOT X1//Line10
OUT_T(X0,TC0,100);//Line13
OUT(TS0,Y010);//Lin18
OUT(TS0,Y014);//Lin18
[/php]
ここで特に説明したいのはタイマーの使え方です。Line13、Line18みるとTC0、TS0とはなんでしょう?実際にはそういう決まりルールがあります:
– 接点に使用するばあい : TS
– コイルに使用するばあい : TC
– 現在値に使用するばあい : TN
ですので、T0を使ってる時、コイルとして使われた時TC0になります。
設定として使われた時にTS0になります。
条件文
IF…ELSIF条件文
もしこの条件達成すれば中の文を実行するのことです。下のプログラム例をみてください。
[php]
IF X0 THEN
Y0:=TRUE;
ELSIF X1 THEN
Y1:=TRUE;
ELSIF X2 THEN
Y2:=TRUE;
END_IF;
[/php]
ーX0はオンになると、Y0がオンになります。
ーX0はオフになり、X1がオンになるとY1がオンになります。
ーX0はオフになり、X1もオフになり、X2がオンになるとY2がオンになります。
*注意してほしいのは、ここで一回セットされたのOUTPUTは別のプログラムでリセットしない限りずっとオンのままになります。
CASE条件文
CASE条件文の式の結果は整数値で返されます。この条件文は,例えば単一の整数値や複雑な式の結果の整数値によって,選択文を実行する場合に使用できます。整数式の値と一致する整数の選択値を持った文が実行され,一致するものがない場合は,ELSE文に続く文を実行します。
[php]
CASE D10 OF
1 : D20.0:=1;
2 : D20.1:=1;
3 : D20.2:=1;
ELSE
D20:=0
END_CASE;
[/php]
上にプログラムは、D10の値によって実行されるの文も違います。
D10値は1の場合はD20.0はオンになります。
D10値は2の場合はD20.1はオンになります。
D10値は3の場合はD20.2はオンになります。
D10値は1でもない2でもない3でもないの場合はD20は0にします。
演算子
*,/,+,-,<,>,=などなど…のことですね。
[php]
&amp;nbsp; D10:=D10*D20+D21/D22
&amp;nbsp; IF D10 &amp;gt; D23 THEN
&amp;nbsp; &amp;nbsp; &amp;nbsp; M10:=TRUE;
&amp;nbsp; END_IF;
[/php]
ラベルとデバイス
この記事の最後にラベルとデバイスに少し説明しますね。
データ型
デバイスのデータ型が指定されてない場合は、算術演算式などでデバイスのみ使用している場合は,ワード[符号付き]となります。もしデバイスのデータ型を指定したいの場合は:
ーD10:U ワード[符号なし]/ビット列[16ビット]
ーD10:UD ダブルワード[符号なし]/ビット列[32ビット]
ーD10:E 単精度実数
ラベルの種類
ラベルには、グローバルラベルとローカルラベルの2種類があります。
ーグローバルラベルはプログラムブロックとファンクションブロックで使うことができます。
ーローカルラベルは、宣言したプログラム部品の中でのみ使用できるラベルです。
では今回はここまでしますね!次はもっとST言語についてはなししますね!
コメント
最近codesysの勉強を始めて、google検索からこのサイトに
たどり着きました。
とても丁寧に書いてくださっているので参考になりました。
ありがとうございます。
ありがとうございます!
もしなにか不明点があれば遠慮なくコメントしてください。
こっちもCodesysの初心者なので、一緒に考えましょう。