開発環境と変数宣言
CODESYS環境での効率的なコーディングには、ショートカットキーの活用が不可欠です。Shift + F2で自動変数宣言ダイアログを開き、F2で入力アシスタント(機能ブロック等の選択)を呼び出します。
変数の属性には以下の修飾子を使用します:
- CONSTANT: 読み取り専用の定数。
- RETAIN: 電源断時に値を保持(バックアップ)。
- PERSISTENT: 永続的な値保持(初期化リセットが必要な場合のみリセット)。
基本構文と演算子
ST言語における基本的な代入と論理演算の書式です。
(* 代入 *)
nValue := 10;
(* 型変換 *)
rPi := 3.14159;
nIntVal := REAL_TO_INT(rPi);
(* 条件分岐: IF文 *)
IF bCondition1 AND NOT bCondition2 THEN
bOutput := TRUE;
ELSE
bOutput := FALSE;
END_IF;
(* 多分岐: CASE文 *)
CASE nStep OF
0:
nState := 1;
1, 5:
nState := 2;
10..20:
nState := 3;
ELSE
nState := 99;
END_CASE;
ループ処理と繰り返し
反復処理にはFOR, WHILE, REPEAT文を使用します。必要に応じてEXIT(ループ脱出)やCONTINUE(次のループへ移行)を使用します。
(* FORループ: 配列の初期化など *)
FOR nIndex := 0 TO 100 BY 2 DO
arrData[nIndex] := nIndex;
END_FOR;
(* WHILEループ: 条件が真の間継続 *)
WHILE nCounter < 100 DO
nCounter := nCounter + 1;
END_WHILE;
IOアドレスとメモリ割付
PLCの物理メモリは以下の記述法で直接アクセスします。
- I: 入力エリア
- Q: 出力エリア
- M: メモリエリア
データ長の指定子:X(1bit), B(8bit/Byte), W(16bit/Word), D(32bit/DWord), L(64bit/LWord)。
(* 例:入力X0.0がONなら出力QX0.0をON *)
IF %IX0.0 THEN
%QX0.0 := TRUE;
END_IF;
(* 変数へのアドレス割付 *)
bRunLamp AT %QX0.0 : BOOL;
nAnalogVal AT %IW0 : INT;
データ型の一覧
ST言語で扱う主なデータ型とその範囲です。
整数型
- 符号付き: SINT(8bit), INT(16bit), DINT(32bit), LINT(64bit)
- 符号なし: USINT(8bit), UINT(16bit), UDINT(32bit), ULINT(64bit)
浮動小数点型
- REAL: 32bit単精度浮動小数点数。
- LREAL: 64bit倍精度浮動小数点数。
時間・日付型
- TIME: ミリ秒単位 (例: T#1h30m5s)。
- DATE: 日付 (例: D#2023-10-25)。
- DATE_AND_TIME (DT): 日付と時刻。
文字列型
- STRING: ASCII文字列 (1文字1バイト)。
- WSTRING: Unicode文字列 (1文字2バイト、日本語対応)。
特殊データ構造
配列
同一型のデータを連続して管理します。
arrBuffer : ARRAY[0..9] OF INT := [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
構造体 (STRUCT)
異なるデータ型をまとめて管理するユーザー定義型です。
TYPE ST_MotorParam :
STRUCT
nID : INT;
rSpeed : REAL;
bEnable : BOOL;
END_STRUCT
END_TYPE
列挙型 (ENUM)
変数が取りうる値を名前で定義します。
TYPE E_State :
(
eStop := 0,
eRun,
eError
);
END_TYPE
共用体 (UNION)
同じメモリ領域を異なるデータ型で共有します。型変換やビット操作に便利です。
TYPE U_DataConverter :
UNION
nWordVal : WORD;
byByteArr : ARRAY[0..1] OF BYTE;
END_UNION
END_TYPE
ポインタと参照
メモリのアドレスを扱うための機能です。
- ADR: 変数のアドレスを取得します。
- ^: ポインタが指すアドレスの中身(値)を参照します。
VAR
pnPtr : POINTER TO INT;
nSource : INT := 100;
nDest : INT;
END_VAR
pnPtr := ADR(nSource); (* アドレス取得 *)
nDest := pnPtr^; (* 値の参照 *)
タイマーとカウンター
標準機能ブロックを使用します。
- TON: オン遅延タイマー。
- TOF: オフ遅延タイマー。
- TP: パルスタイマー。
- CTU: アップカウンター。
(* TONの使用例 *)
fbTimer(IN := bStart, PT := T#5s, Q => bTimeOut, ET => tElapsedTime);
(* R_TRIG: 立ち上がりエッジ検出 *)
fbTrig(CLK := bInputSignal);
IF fbTrig.Q THEN
(* 1スキャンのみ実行される処理 *)
END_IF;