ラダー図などPLC言語のリファレンス
Siemens、Rockwell、Beckhoff の各プロファイルがここで何に対応しているか、どんな前提を置いているか、メーカーのツールとどこが違うかをまとめています。
Siemens SCL
標準 S7-1500 · 最適化された FB ストレージ · SCL ではローカルの # タグ。
- 構造
- 型付きのインターフェース。代入、IF / ELSIF / ELSE、符号付き INT/DINT の CASE リスト、REGION / END_REGION に対応します。CASE の範囲指定はこのサブセットの対象外です。
- 式
- BOOL の論理演算、数値の計算、比較、かっこが使えます。INT、DINT、REAL、TIME が使えます。& も AND の意味です。ABS、LIMIT、MIN、MAX、ROUND、TRUNC は数値に使えます。REAL を INT や DINT に入れるときは ROUND か TRUNC を使います。TIA Portal は自動では変換しません。コメントは // から行末まで、(* ... *)、または、翻訳できるコメントには (/* ... */) です。
- 状態を持つ命令
- TON_TIME、TOF_TIME、TP_TIME、TONR_TIME タイマ。INT の PV/CV を持つ IEC_COUNTER.CTU、CTD_INT、CTUD_INT カウンタ。R_TRIG と F_TRIG。下の一覧にそれぞれ載っています。
- FOR ループと EXIT
- FOR counter := start TO end BY step DO … END_FOR; は、INT/DINT のカウンタ、両端を含む範囲、省略できる BY(初期値は +1)を使います。マイナスのステップも使えます。EXIT は、いちばん内側のループを抜けます。ループの本体の中では、カウンタ、「end」、BY の値を変えないでください。BY が 0 の場合は受け付けられません。
- 配列
- ブロックインターフェースで ARRAY[0..9] OF REAL を宣言し、#Samples[#Index] を読み書きします。BOOL、INT、DINT、REAL の要素に対応し、負の下限も使えます。
- PLC データ型と FB
- 名前付きの PLC データ型(テーブルまたは TYPE ドキュメント)と、Input、Output、InOut、Static、Temp を持つ再利用可能な FB。FB のインスタンスは Static で宣言し、#Instance(Input := …, Output => …) として呼び出します。
- 実行の制限
- 1次元配列: 1つの配列は最大256要素、1つのプログラムで展開後の格納値は最大1,024個です。各要素は監視タグとリプレイに表示されます。範囲外のインデックスはスキャンを止め、実際のインデックスと許される範囲を表示します。ループは、本体が空でも、スキャンあたり20,000演算の上限を共有します。これはアカデミーの制限です。
- このサブセットの対象外
- WHILE / REPEAT、べき乗演算子 **、その他の数学関数(SQRT、SIN など)、多次元配列、UDT やインスタンスの配列、匿名のネスト構造、配列全体のコピー、戻り値を持つ独自関数、ポインタアドレッシング、ネイティブのプロジェクトファイル。
タイマ、カウンタ、ラッチ
- TON
TON_TIME - オンディレイ。IN が PT の間オンだったら Q がオンになり、IN がオフになると Q もオフになります。
#Delay(IN := #Start, PT := T#2s);Siemensのページ - TOF
TOF_TIME - オフディレイ。IN と同時に Q がオンになり、IN がオフになったあとも PT の間オンのままです。
#RunOn(IN := #Start, PT := T#2s);Siemensのページ - TP
TP_TIME - パルス。IN の立ち上がりごとに、Q は PT の間オンになり、そのあと IN がどうなっても変わりません。パルスの途中の新しい立ち上がりは無視されます。
#Dose(IN := #Start, PT := T#2s);Siemensのページ - TONR
TONR_TIME - 積算タイマ。ET は IN がオンの時間を足し合わせ、IN がオフになっても保持します。Q は PT でオンになり、そのままです。R で ET と Q が消えます。
#RunTime(IN := #Running, R := #Clear, PT := T#1h);Siemensのページ - CTU
IEC_COUNTER - アップカウント。CU の立ち上がりごとに CV に1が加わります。CV が PV 以上のとき、Q がオンです。R で CV が 0 になります。
#Bottles.CTU(CU := #Sensor, R := #Clear, PV := 6);Siemensのページ - CTD
CTD_INT - ダウンカウント。LD で PV が CV に読み込まれます。CD の立ち上がりごとに1が引かれます。CV が 0 以下のとき、Q がオンです。
#Left(CD := #Sensor, LD := #Refill, PV := 12);Siemensのページ - CTUD
CTUD_INT - アップ/ダウンカウント。CU で1が加わり、CD で1が引かれ、同じスキャンで両方あると CV は変わりません。R で CV が 0 になり、LD で PV が読み込まれます。QU は PV 以上でオン、QD は 0 以下でオンです。
#Stock(CU := #In, CD := #Out, R := #Clear, LD := FALSE, PV := 10);Siemensのページ
SR、RS、否定コイルは、LAD と FBD のボックスです。SCL では、ラッチは IF で、反転したビットは NOT で書きます。
設備のデータをまとめ、テスト済みの制御ブロックを再利用する
- UDT は、関連する値のまとまりを表します。PumpStatus は運転状態と起動回数を持ちます。ロジックは実行しません。
- PumpControl には再利用できるロジックが入っています。DutyControl と StandbyControl は別々のインスタンスです。定義は共有しますが、Latch と WasRunning の値はそれぞれが持ちます。
- 入力は呼び出し時に渡します。Running は実行後に出力へコピーされます。Status は構造化された InOut で、そのポンプの状態タグを参照します。Status.Starts に書くと、呼び出し側のデータが更新されます。
- 呼び出しはどれもプログラムの順に実行されます。呼び出しを飛ばすと、そのインスタンスと出力の値は保持されます。呼び出しを囲む IF は停止命令ではありません。ポンプを止めるには、禁止または Stop の入力を渡してブロックを実行します。
PumpStatus は PLC データ型として、PumpControl は FB として宣言します。複数インスタンスの呼び出しのために、DutyControl/StandbyControl は Static で宣言します。SCL では、ローカルタグに # を付け、Input と InOut には :=、Output には => を使います。この最適化した学習用モデルでは、Temp のデータは呼び出しのたびにクリアされます。
TYPE
PumpStatus : STRUCT
Running : BOOL;
Starts : DINT;
END_STRUCT;
END_TYPE| 名前 | セクション | データ型 |
|---|---|---|
Start | 入力 | BOOL |
Stop | 入力 | BOOL |
Permit | 入力 | BOOL |
Fault | 入力 | BOOL |
Running | Output | BOOL |
Status | InOut | PumpStatus |
Latch | Static | BOOL |
WasRunning | Static | BOOL |
#Latch := (#Start OR #Latch) AND NOT #Stop AND #Permit AND NOT #Fault;
IF #Latch AND NOT #WasRunning THEN
#Status.Starts := #Status.Starts + 1;
END_IF;
#Status.Running := #Latch;
#Running := #Latch;
#WasRunning := #Latch;#DutyControl(Start := #Start, Stop := #Stop, Permit := #Permit, Fault := #Fault, Running => #PumpOn, Status := #DutyStatus);
#StandbyControl(Start := #StandbyStart, Stop := #Stop, Permit := #Permit, Fault := #StandbyFault, Running => #StandbyPump, Status := #StandbyStatus);ワークベンチで試す
どれでも SCL のミッションを開き、 PLC データ型 と ファンクションブロック タブを使います。次に、インスタンスを次の場所で宣言します: ブロックインターフェース.
- UDT とブロックの定義を確認し、続いて名前の違う 2 つのインスタンスを見ます。
- 一時停止中に、入力タブで Start を TRUE に上書きし、何スキャンか進めます。PumpOn はオンのままで、DutyStatus.Starts は 1 回だけ増えます。
- Start を離します。ラッチが運転ポンプを動かし続けます。待機ポンプを起動します。起動回数は別々に数えます。
- Fault を ON にします。運転ポンプはすぐに止まり、待機ポンプは動き続けます。Run 中に Stop を押すか、一時停止中に入力タブで Stop を TRUE に上書きします。どちらでも止まります。
- 記録されたスキャンを巻き戻し、呼び出し側の状態タグを、ブロック内部の状態と実行されたブロックの行と比べます。
シミュレーションの取り決め
- 固定 20 ms の仮想タスクです。再生速度や 3D のフレームレートは結果に影響しません。
- 各テストシナリオは、新しい状態のコントローラと設備から始まります。
- 編集すると実行が止まります。結果とリプレイは、テストしたプログラムの版に属します。
- REAL は 32 ビット精度です。対応していない整数オーバーフローは診断メッセージを出します。
- カウンタは INT の値を持ちます。ほかのカウンタ幅(SINT、DINT、符号なし型)と LTIME タイマは、ここでは実装されていません。
- FBD では、有効な NORM_X/SCALE_X の計算に対応しています。無効な範囲は診断メッセージを出して止まります。ネイティブの ENO やエラー結果は再現しません。
- チャートはアクティブな経路が1つで、ブールの N/S/R アクションを使います。ネイティブの時間付きアクション、並列経路、ラストスキャン/リセットのオプションは、このモデルの対象外です。
- 整数の割り算では小数部分が切り捨てられます。7 / 2 は 3 です。小数の比較はオペランドの精度で行います。REAL の値 0.1 は 0.1 と等しいと判定されます。小数の結果がほしい割り算には REAL のオペランドを使ってください。
- SCL は REAL#2.0 のような型付きの REAL 定数を受け付けます。型があいまいな浮動小数点の計算は、REAL タグに代入する前に S7-1500 の倍精度で行われます。
- 電源再投入時の保持、実際の I/O、ネットワークのタイミング、メーカーのファームウェアは、このモデルの対象外です。
元のドキュメントを読む
このアカデミーでは、範囲を絞ったサブセットを教えています。実機での検証には、該当するメーカーのソフトウェアでのコンパイルとテストが必要です。
面接の採点はこのブラウザ内で行われます。現在の対面形式はローカルの試作版で、安全なリモート評価サービスではありません。エクスポートファイルはベータ版で、TIA Portal V20 または Studio 5000 でのインポートと動作の確認が必要です。
基本的な動作は、Logix の公式マニュアル、S7-1200 マニュアル、S7-1200/1500 ガイドラインと照らし合わせて確認しています。Siemens の資料は V20 より前のものです。TwinCAT の動作は、Beckhoff の Tc2_Standard リファレンスページと TwinCAT 3 PLC マニュアルに従っています。この確認は、対象のコントローラでのテストの代わりにはなりません。特にチャートのタイミングと再利用ブロックは注意してください。
Siemens TIA Portal V20Studio 5000 v38Logix ファンクションブロック マニュアルLogix SFC マニュアルTwinCAT 3 PLC 言語TwinCAT Tc2_Standard TONTwinCAT Tc2_Standard CTU