こちらのシリーズではSysmac Studioの様々なFC・FBをプログラム例付きで解説します。今回はReadNbit_**・WriteNbit_**という関数を紹介します。
さ、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
説明
ReadNbit_**
ReadNbit_**命令は、In(読み取り元)のPos(読み取り位置)から上位Sizeビット分の値を読み取り、その値をOut(読み取り結果)に代入します。命令の名前は、InとOutのデータ型によって決まります。例えば、InとOutの両方がWORDデータの場合、命令の名前はReadNbit_WORDとなります。

以下の例は、InがBYTE#16#89、PosがUSINT#2、SizeがUSINT#4の場合のReadNbit_BYTE命令を示しています。

項目 | 意味 | I/O | 説明 |
|---|---|---|---|
In | 読み取り元 | Input | 読み取るビット列 |
Pos | 読み取り位置 | Input | 読み取るビット位置 |
Size | 読み取りサイズ | Input | 読み取るビット数 |
Out | 読み取り結果 | Output | 読み取り結果 |
WriteNbit_**
WriteNbit_**命令は、まずIn(読み取り元)の下位Sizeビット分の値を読み取ります。そして、その値をInOut(書き込み先)のPos(書き込み位置)に書き込みます。命令の名前は、InとOutのデータ型によって決まります。例えば、InとOutの両方がWORDデータの場合、命令の名前はWriteNbit_WORDとなります。

以下の例は、InがBYTE#16#89、PosがUSINT#2、SizeがUSINT#4の場合のWriteNbit_BYTE命令を示しています。

項目 | 意味 | I/O | 説明 |
|---|---|---|---|
In | 読み取り元 | InOutに書き込むビットを読み取るビット列 | |
Pos | 書き込み位置 | Input | 書き込むビット位置 |
Size | 書き込みサイズ | 書き込むビット数 | |
InOut | 書き込み先 | In-out | 書き込み結果 |
Out | 戻り値 | Output | 常にTRUE |
Implementation-1 ReadNbit_**
Rung0からEmptyボックスを追加し、Readを入力しましょう。
命令パレットには、ビット列からデータを読み取るための「ReadNbit」系の命令が一覧表示されています。具体的には:
- ReadNbit_BYTE: BYTEデータ型用のNビット読み取り命令
- ReadNbit_DWORD: DWORDデータ型用のNビット読み取り命令
- ReadNbit_LWORD: LWORDデータ型用のNビット読み取り命令
- ReadNbit_WORD: WORDデータ型用のNビット読み取り命令

このラダープログラムは、WORD型データから指定されたビット列を読み取るための処理です。
読み取り位置はmyReadPosで指定され、読み取るビット数はmyReadSizeで指定されます。命令は、myReadPosで指定された位置から上位myReadSizeビット分のデータを抽出し、その結果をmyReadWordResultに出力します。
この処理により、WORD型データ内の必要な部分のビット情報だけを効率的に取り出すことができます。

結果
プログラムのラング1は実行状態(緑色でハイライト表示)になっており、ReadNbit_WORD命令が正常に実行されたことを示しています。
実行時のパラメータと結果は以下の通りです:
- myReadWord(読み取り元)の値: (0000) – 16進数表記でWORD#16#0000
- myReadPos(読み取り位置)の値: (0) – 位置0から読み取り開始
- myReadSize(読み取るビット数)の値: (0) – 0ビット読み取り
- myReadWordResult(読み取り結果)の値: (0000) – 16進数表記でWORD#16#0000
この実行例では、読み取り元データが0x0000で、0ビットを読み取った結果、出力も0x0000となっています。緑色のラインは命令が正常に実行され、論理が有効(TRUE)であることを示しています。

この実行例では、0x0001のデータから位置0から1ビットを読み取った結果、最下位ビット(値1)が抽出され、結果として0x0001が出力されています。
実行時のパラメータと結果は以下の通りです:
- myReadWord(読み取り元)の値: (0001) – 16進数表記でWORD#16#0001
- myReadPos(読み取り位置)の値: (0) – 位置0から読み取り開始
- myReadSize(読み取るビット数)の値: (1) – 1ビット読み取り
- myReadWordResult(読み取り結果)の値: (0001) – 16進数表記でWORD#16#0001
オレンジ色の矢印は、この実行例で注目すべきポイントを示しています。左側の矢印はmyReadSizeが1に設定されていること、中央の矢印はmyReadWordが0x0001であること、右側の矢印は結果myReadWordResultが0x0001となったことを示しています。

この実行例では、0x0003(2進数で下位2ビットが11)のデータから、位置0から2ビットを読み取った結果、下位2ビット(値11、つまり3)が抽出され、結果として0x0003が出力されています。
実行時のパラメータと結果は以下の通りです:
- myReadWord(読み取り元)の値: (0003) – 16進数表記でWORD#16#0003(2進数で0000000000000011)
- myReadPos(読み取り位置)の値: (0) – 位置0から読み取り開始
- myReadSize(読み取るビット数)の値: (2) – 2ビット読み取り
- myReadWordResult(読み取り結果)の値: (0003) – 16進数表記でWORD#16#0003(2進数で0000000000000011)

この実行例では、0x0003(2進数で00000011)のデータから、位置1(ビット位置1)から上位2ビットを読み取っています。位置1から2ビットを読み取ると、ビット1とビット2が対象となり、その値は「01」となります。これを結果として出力すると0x0001(2進数で00000001)となります。
実行時のパラメータと結果は以下の通りです:
- myReadWord(読み取り元)の値: (0003) – 16進数表記でWORD#16#0003(2進数で0000000000000011)
- myReadPos(読み取り位置)の値: (1) – 位置1から読み取り開始(青色でハイライト)
- myReadSize(読み取るビット数)の値: (2) – 2ビット読み取り(青色でハイライト)
- myReadWordResult(読み取り結果)の値: (0001) – 16進数表記でWORD#16#0001(2進数で0000000000000001)

Implementation-2 WriteNbit_**
次はRung2でWriteNbit_WORDを使用してみます。

結果
この実行例では、Inから読み取った0x0000の下位0ビットを、InOutの位置0に書き込んでいます。0ビットの書き込みであるため、実質的にデータの変更は行われず、InOutは0x0000のままです。
実行時のパラメータと結果:
- In(読み取り元): myWriteWord = (0000) – 16進数表記でWORD#16#0000
- InOut(書き込み先): myWriteWord = (0000) – 16進数表記でWORD#16#0000
- Pos(書き込み位置): myWritePos = (0) – 位置0に書き込み
- Size(書き込みサイズ): myWriteSize = (0) – 0ビット書き込み

この実行例では、myWriteWordから読み取った0xFFFF(全ビットが1)の下位16ビットを、myWriteWord2の位置0から書き込んでいます。16ビット全体を書き込むため、myWriteWord2は0xFFFF(全ビットが1)となります。
実行時のパラメータと結果:
- In(読み取り元): myWriteWord = (FFFF) – 16進数表記でWORD#16#FFFF(2進数で1111111111111111)
- InOut(書き込み先): myWriteWord2 = (FFFF) – 入力時も出力時も16進数表記でWORD#16#FFFF
- Pos(書き込み位置): myWritePos = (0) – 位置0から書き込み
- Size(書き込みサイズ): myWriteSize = (16) – 16ビット書き込み

この実行例では、myWriteWordから読み取った0x0000(全ビットが0)の下位16ビットを、myWriteWord2の位置0から書き込んでいます。16ビット全体を書き込むため、myWriteWord2は0x0000(全ビットが0)となります。
実行時のパラメータと結果:
- In(読み取り元): myWriteWord = (0000) – 16進数表記でWORD#16#0000(2進数で0000000000000000)
- InOut(書き込み先): myWriteWord2 = (0000) – 入力時も出力時も16進数表記でWORD#16#0000
- Pos(書き込み位置): myWritePos = (0) – 位置0から書き込み
- Size(書き込みサイズ): myWriteSize = (16) – 16ビット書き込み

この実行例では、myWriteWordから読み取った0x0001の下位1ビット(値1)を、myWriteWord2の位置5に書き込んでいます。
実行時のパラメータと結果:
- In(読み取り元): myWriteWord = (0001) – 16進数表記でWORD#16#0001(2進数で0000000000000001)
- InOut(書き込み先): myWriteWord2 = (0020) – 16進数表記でWORD#16#0020(2進数で0000000000100000)
- Pos(書き込み位置): myWritePos = (5) – 位置5から書き込み
- Size(書き込みサイズ): myWriteSize = (1) – 1ビット書き込み
- ENO(戻り値): xWriteNBitReturn = (True) – TRUE
