こちらのシリーズではSysmac Studioの様々なFC・FBをプログラム例付きで解説します。今回はStackPushという関数を紹介します。
さ、FAを楽しもう。
前書き
いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。
技術は独り占めせず、届けるもの
私たちは工場の生産技術や制御に関する技術情報を、ブログや動画などで無料公開しています。「知識は誰でもアクセスできるべき」という信念のもと、現場で役立つ具体的なノウハウやトラブル事例などを発信してきました。すべて無料で続けているのは、「知らなかったせいで困る人」を少しでも減らしたいからです。
また、もしあなたの現場で…
- 「このPLCとデバイスの組み合わせ、ちゃんと動くのかな?」
- 「EtherCAT通信でうまくいかない部分を検証してほしい」
- 「新しいリモートI/Oを試したいけど社内に検証環境がない」
など、困っている構成や試してみたいアイデアがあれば、ぜひお知らせください。機器の貸出や構成の共有が可能であれば、検証し、記事や動画で発信します(ご希望に応じて匿名対応も可能です)。
支援のかたち
現在、私達の活動はほぼ無償で続けており、記事や動画の制作には、時間と検証環境の整備が必要です。この活動を継続的にコンテンツを提供するためには、皆様の温かいご支援が大変重要です。
メンバーシップ(ラジオの応援)
Fullさんとのラジオをより充実させるための支援プランです。
https://note.com/fulhause/membership/join
Amazonギフトリスト
コンテンツ制作に必要な機材・書籍をリストにしています。
https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Patreon(ブログ・動画活動への応援)
月額での小さなご支援が、記事の執筆・検証環境の充実につながります。
https://www.patreon.com/user?u=84249391
Paypal
小さな支援が大きな力になります。
https://paypal.me/soup01threes?country.x=JP&locale.x=ja_JP
知ってたら助かること、届けたいだけです
あなたの応援が、知識の共有をもっと自由で持続可能なものにしてくれます。これからもどうぞよろしくお願いします。
soup01threes*gmail.com
技術はひとりじゃもったいない。
Reference Link
StackPush?
StackPushを使用することによって、関数が実行される度、InOutのパラメータの配列を1つ次のIndexにシフトし、ソフトされたIndexがInデータに上書きされます。
つまり、変化するデータを配列変数に順番に格納する機能を持つ便利な関数です。
StackPush 命令は、スタック配列 InOut[]に Num 個の要素が格納されていると仮定します。In(入力値)は次の要素InOut[Num]に書き込まれるような動きになります。そして、Numがインクリメントされる。
Size(スタック要素の数)には、スタックに使用するInOut[]要素の数を指定する。
変数
意味 | I/O | 説明 | 有効範囲 | |
In | 入力値 | Input | スタックに置く値、構造体、または構造体メンバー | データ型による |
Size | スタック要素数 | スタック配列の要素数 | ||
InOut[] (array) | スタック配列 | In-out | スタックとして機能する配列 | データ型による |
Num | 保存要素数 | スタックに格納されている要素数 | ||
Out | 戻り値 | Output | 常にTRUE | TRUE のみ |
注意点
- InとInOut[]の要素には同じデータ型を使用する。これらが異なると、構築エラーが発生する。
- 配列の要素がInOut[]に渡されると、渡された要素以下のすべての要素が処理される。
- InOut[]とNumの値は、Sizeの値が0であっても変化しない。
- Inに渡す入力パラメータには常に変数を使用する。定数を渡すとビルド・エラーが発生する。
- Inが列挙型の場合、列挙子を直接渡すことはできない。列挙子を直接渡すと、構築エラーが発生します。
- 戻り値 Out は、ST で使用される命令では使用されない。
- 以下の場合はエラーとなる。ENOはFALSEとなり、InOut[]は変化しない。
- Sizeの値が0ではなく、かつNumがSize以上である。
- Sizeの値がInOut[]の配列領域を超えている。
- 配列をパラメータとして渡す場合は、Indexを指定する必要があります。
Implementation
それでは実際にプログラムを作成していきましょう。
グローバル変数
最初にGlobal変数を定義します。今回の記事では300の実数配列を宣言します。
Data Type
StackPushは構造体にも作成可能なので、Data>Data Typesで構造体も定義していきます。
今回の記事ではmyStという構造体を宣言し、中に実数・BOOL・整数・配列などが入ってます。
Program
次はラダープログラムでStackPush関数を呼び出し、必要な変数を定義します。注意するのは関数に前に@マークをつけると関数の実行がEN信号立ち上げときのみです。
今回の記事では2つのStackPush関数を呼び出しました。
ネットワーク0は1つは実数配列の変数をパラメータとして渡し、ネットワーク1は構造体配列を渡すのケースになります。
Result
最初はネットワーク0のStackPush関数の動きを見てみましょう。
xPush 変数をFalse→TRUEにします。
StackPushの出力Numは現在”1”に変わりました。それは配列に現在1の値が格納されているからです。
配列の変数をみると、arrReadDataの0番Indexが現在rDataの値(5.5)が入ってました。
次あhrDataの現在値を変更します。
もう一度xPushをFalse→Trueにすると、Num=2になります。それはStackPushが二回実行され、InoutパラメータのarrReadData配列に2つの要素が格納されているからです。
arrReadData配列のIndex2は現在rDataの現在値に書き込まれました。
次はネットワーク1のStackPushも試してみます。InOutパラメータは構造体を渡しています。
arrstData配列のIndex0が先程の変数値に書き込まれました。
もう一回xPush2をFalse→TRUEにします。
Done!例えば構造体でも、StackPushにも機能してることがわかります。