C言語開発者がST(Structured Text)に挑戦するときに知っておくべき5つの違い
1. はじめに
「Cで制御やってきたから、STも余裕でしょ?」
……と思ってST(Structured Text)に足を踏み入れたC言語経験者が、思わぬ落とし穴にはまるケースが多数あります。
STは確かにPascalライクで文法も優しげに見えますが、実際はPLC制御という“別文化”の上に成り立つ言語です。
この記事では、C開発者がSTに移行する際にハマりやすいポイントを5つに絞って、わかりやすく紹介します。
2. STとC、5つの根本的な違いと注意点
1. 「main関数」が存在しない – すべてが常時ループ
C言語では main()
から処理が始まり、明示的なループを記述します。
int main() { while (1) { control(); } }
しかしSTでは、タスクサイクルごとに関数ブロックが毎回呼ばれるのが前提。
(* PLCサイクルごとに実行される *) ControlMotor();
✅ 注意:制御は常時ループ前提。STで無限ループを書くとフリーズします!
2. 変数の寿命と初期化が違う
Cでは関数内のローカル変数は関数呼び出しごとに初期化されます。
void func() { int counter = 0; // 毎回0から counter++; }
STでは変数は初期化後も状態を保持するのが基本。
VAR counter : INT := 0; END_VAR counter := counter + 1; // 呼ばれるたびにインクリメント
✅ 注意:C感覚で「一時変数だし…」と思って使うと、値が残って事故る!
3. 条件分岐・論理演算の構文と評価がやや異なる
Cではif (a && b)
のような短絡評価が基本。
if (ptr != NULL && *ptr > 0) { ... }
STでも同様の構文がありますが、環境によっては短絡しない実装もあるため、注意。
IF ptr <> 0 AND ptr^ > 0 THEN ... END_IF;
✅ 注意:順序依存の条件分岐は慎重に書くべし。論理式は安全第一。
4. 標準ライブラリは存在しない(も同然)
C言語には豊富な標準関数があり、printf
, malloc
, time
など便利関数が揃っています。
STではそういったものは環境ごとの拡張に依存。
printf("Value: %d\n", val);
(* STでは独自のログ関数やデバイス設定が必要 *)
WriteLogMessage(STR := CONCAT('Value: ', INT_TO_STRING(val)));
✅ 注意:STでは「全部自作 or メーカー依存」の覚悟が必要。
5. デバッグの視点がリアルタイム制御にある
Cのデバッグは入力→処理→出力という直列的な考え方が基本です。
しかし、STではリアルタイムI/O、周期タスク、状態保持が中心となるため、タイミングバグや初期化忘れが致命的になります。
✅ 注意:STは「いつ・何回・どのタイミングで呼ばれるか」がすべて。シミュレータやトレース機能の活用が必須。
3. まとめ:C経験者がST開発で意識すべきこと
項目 | C言語的思考 | ST的思考 |
---|---|---|
実行タイミング | 明示的に書く | 周期ごとに自動実行 |
変数の寿命 | 関数単位 | PLCサイクルで保持 |
条件評価 | 安全な短絡 | 評価順序に注意 |
ライブラリ | 標準で充実 | 基本は手作り or ベンダ依存 |
デバッグ観点 | ロジック重視 | タイミング&状態重視 |
4. CからSTへ“うまく移行する”ためのアドバイス
5. おわりに
C言語とSTは、文法が似ていても「設計思想がまったく異なる」世界です。
だからこそ、C経験者は最初のうちに「これCでは普通だけど、STでは地雷かも?」という視点を持つことが成功の鍵になります。
“知ってるつもり”が一番危ない。
だからこそ、この記事を通して「C的常識を捨てる力」を身につけましょう!
参考リンク
- IEC 61131-3(STの標準仕様)
- CODESYS Documentation
- [ST入門資料(三菱、オムロン、Yokogawaなど各PLCベンダー)]
参考書籍