テクセル

ST言語のメモ


三菱電機(株) PLC iQ-R におけるST(Structured Text)言語のメモです。

□ 変数のデータ型

変数のデータ型です。

データ型 内容 範囲
BOOL ビット true, false
INT ワード(符号付き) 16ビット -32768~32767
WORD ワード(符号なし) 16ビット 0~65535
DINT ダブルワード(符号付き) 32ビット -2147483648~2147483647
DWORD ダブルワード(符号なし) 32ビット 0~4294967295
REAL 単精度実数 32ビット -2128 ~ -2-126,0,2-126 ~ 2128
LREAL 倍精度実数 62ビット -21024 ~ -2-1022,0,2-1022 ~ 21024

□ 演算子

演算子及び優先順位です。

演算子 内容 優先順位
() 丸括弧式 1
ファンクション() ファンクション呼び出し式 2
- 符号の反転 3
NOT ビット型補数 3
** べき乗 4
* 乗算 5
/ 除算 5
MOD 剰余算 5
+ 加算 6
- 減算 6
<, >, <=, >= 比較 7
= 一致 8
<> 不一致 8
&, AND 論理積 9
XOR 排他的論理和 10
OR 論理和 11

代入文

代入文は、 := (コロンイコール) を使用します。

文の終端

文の終端は、 ; (セミコロン)を付けます。

コメント

単一行コメントは、 //、複数行コメントは、 (* *), /* */ となります。


ia1 := 23;      // 符号付きワードに代入
         

以下のプログラム例は、インラインST で確認しています。また、インラインSTボックスのラダーソフトによる実行条件は省略しています。

□ 数値演算例

以下の演算例で使用するラベル名及びデータ型です。GX Works3 のラベルで登録します。
数字先頭の H は、16進数値を表します。

ラベル名 データ型
bBool1 BOOL
bBool2 BOOL
ia1 INT
ia2 INT
iwa1 WORD
iwa2 WORD
ida1 DINT
ida2 DINT
idwa1 DWORD
idwa2 DWORD
ra1 REAL
ra2 REAL
lra1 LREAL
lra2 LREAL

1) bool


bBool1 := TRUE;         // bBool1 on, FALSE で off
bBool2 := bBool1;       // ビットの代入

bBool1 := 1;            // 数字 1 (TRUE) または 0 (FALSE) で代入

bBool2 := NOT bBool1;   //bBool1 の補数(反転)代入

bBool2 := bBool1 = FALSE;  // bBool1 = False の時 on
         

2) INT,WORD


// INT 符号付き
ia1 := -2;
ia2 := ia1 + 10;        // => 8

ia1 := -2;
ia2 := ia1 * (-2);      // => 4

ia1 := 9;
ia2 := ia1 / 2;         // => 4

ia1 := 9;
ia2 := ia1 MOD 2;       // => 1

// WORD 符号なし
iwa1 := 50000;
iwa1 := iwa1 + 10;      // => 50010

// -------
INC(TRUE, ia1);         //INT インクリメント +1
DEC(TRUE, ia2);         //INT デクリメント -1

INC_U(TRUE, iwa1);      //WORD インクリメント +1
DEC_U(TRUE, iwa2);      //WORD デクリメント -1

iwa2 := INT_TO_WORD(ia1);   // INT -> WORD 変換
ia2 := WORD_TO_INT(iwa2);   // WORD -> INT 変換

// 論理演算 AND, OR, XOR  WORDで可 INTでは不可
iwa1 := H00FF;
iwa2 := iwa1 AND H000F; // => 15(HF)

iwa1 := HF;
iwa2 := iwa1 OR HF0;    // => 255(HFF)

iwa1 := HF;
iwa2 := iwa1 XOR H5;    // => 10(HA)

// 論理演算 AND, OR, XOR  INT, WORD で可
ia1 := H00FF;
WAND(TRUE, ia1, HF, ia2);    // ia2 => 15(HF)

ia1 := HF;
WOR(TRUE, ia1, HF0, ia2);    // ia2 => 255(HF)

ia1 := HF;
WXOR(TRUE, ia1, H5, ia2);    // ia2 => 10(HA)
         

3) DINT,DWORD


// DINT 符号付き
ida1 := 3000000;
ida2 := ida1 + 100;     // => 3000100

ida1 := 3000000;
ida2 := ida1 - 3000001; // => -1

ida1 := 3000000;
ida2 := ida1 * 2;       // => 6000000

ida1 := 1000000;
ida2 := ida1 / 3;       // => 333333

ida1 := 1000000;
ida2 := ida1 MOD 3;     // => 1

// DWORD 符号なし
idwa1 := 3000000000;
idwa2 := idwa1 + 2;     // => 3000000002;

// -------
DINC(TRUE, ida1);      // DINT インクリメント +1
DDEC(TRUE, ida1);      // DINT デクリメント -1

DINC_U(TRUE, idwa1);   // DWORD インクリメント +1
DDEC_U(TRUE, idwa1);   // DWORD デクリメント -1

idwa1 := DINT_TO_DWORD(ida1);     // DINT -> DWORD 変換
ida1 := DWORD_TO_DINT(idwa1);     // DWORD -> DINT 変換

ia1 := DINT_TO_INT(ida1);         // DINT -> INT 変換 -32768~32767 の範囲外ではエラー
ida1 := INT_TO_DINT(ia1);         // INT -> DINT 変換

iwa1 := DWORD_TO_WORD(idwa1);     // DWORD -> WORD 変換 上位16ビットは、捨てられます
idwa1 := WORD_TO_DWORD(iwa1);     // WORD -> DWORD 変換

// 論理演算 AND, OR, XOR  DWORD で可、DINT では不可
idwa1 := HF000F;
idwa2 := idwa1 AND HF;            // idwa2 => 15(HF)

idwa1 := HF;
idwa2 := idwa1 OR HF000F;         // idwa2 => 983055(HF000F)

idwa1 := HF000F;
idwa2 := idwa1 XOR H50000;        // idwa2 => 655375(HA000F)

// 論理演算 AND, OR, XOR  DWORD, DINT で可
ida1 := HF000F;
DAND(TRUE, ida1, HF, ida2);       // => 15(F)

ida1 := HF;
DOR(TRUE, ida1, HF0000, ida2);    // => 983055(HF000F)

ida1 := HF000F;
DXOR(TRUE, ida1, H50000, ida2);   // => 655375(HA000F)
         

4) REAL,LREAL


ra1 := 3.14;
ra2 := ra1 + 2.1;            // => 5.24

ra1 := 3.14;
ra2 := ra1 - 3.10;           // => 0.04

ra1 := 3.14;
ra2 := ra1 * 2.0;            // => 6.28

ra1 := 3.14;
ra2 := ra1 / 2.0;            // => 1.57

lra1 := 1.4142;
lra2 := lra1 + 2.1;          // => 3.514

lra1 := 1.4142;
lra2 := lra1 - 3.10;         // => -1.686

lra1 := 1.4142;
lra2 := lra1 * 15.0;         // => 21.213

lra1 := 1.4142;
lra2 := lra1 / 2.0;          // => 0.7071

// 型変換
ida1 := 70000;
ra1 := DINT_TO_REAL(ida1);   // DINT -> REAL

ra2 := 70000.567;
ida2 := REAL_TO_DINT(ra2);   // REAL -> DINT => 70001 小数点第一位で四捨五入

ida1 := 70000;
lra1 := DINT_TO_LREAL(ida1); // DINT -> LREAL

lra2 := 70000.567;
ida2 := LREAL_TO_DINT(lra2); // LREAL -> DINT => 70001 小数点第一位で四捨五入
         

5) デバイスを使用

デバイスを使用する場合は、デバイスにデータ型を指定します。


M20 := true;            // BOOL 指定なし
D200 := 256;            // INT 何も指定しないと INT 型
D202:U := 40000;        // WORD 指定
D204:D := H20000;       // DINT 指定 D204,D205
D206:UD := HAAAAFFFF;   // DWORD 指定 D206,D207
D300:E := 3.14;         // REAL 指定 D300,D301
D310:ED := 1.4142;      // LREAL 指定 D310,D311,D312,D313

// ラベルとデバイスを混在
ida1 := 6; D208:D := 25;
D210:D := 5 * ida1 + D208:D;      // => 55

ra1 := 2.236;
D302:E := 1.5 * (ra1 - 2.0) ** 2 + 3.2;   // => 3.28354
         
計測制御監視システム