TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

ST入門ガイド:C開発者が陥りやすい落とし穴とは?

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へ“うまく移行する”ためのアドバイス

  • 思考を“制御ループ脳”に切り替える
  • メモリやポインタではなく「状態」に注目する
  • グローバル変数の存在に怯えず、可視性を理解する
  • IDEやシミュレータをフル活用する(勘では絶対に当たらない)

5. おわりに

C言語とSTは、文法が似ていても「設計思想がまったく異なる」世界です。
だからこそ、C経験者は最初のうちに「これCでは普通だけど、STでは地雷かも?」という視点を持つことが成功の鍵になります。

“知ってるつもり”が一番危ない。
だからこそ、この記事を通して「C的常識を捨てる力」を身につけましょう!


参考リンク