今回の記事ではOMRON NX5からFTP ServerのFILE ListとFILEを取得するFBやプログラムを説明します。こちらはプログラムで使用したFBです。
- FTPGetFileList
- FTPGetFile
さ、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
記事で使用したFC・FB・構造体
最初に今回記事で使用するFC/FB/構造体を説明します。
Clear
Clear命令は、InOut(初期化するデータ)の値を初期化します。
その変数に初期値属性が指定されている場合は、その初期値が適用されます。初期値属性が指定されていない場合は、InOutのデータ型のデフォルト初期値が適用されます。

InOutが配列、配列要素、構造体、または構造体メンバーの場合、以下の処理が実行されます。
InOut | 処理 |
|---|---|
配列 | 配列内のすべての要素が初期化されます。 |
配列要素 | 指定された要素のみが初期化されます。 |
構造体 | 構造体内のすべてのメンバーが初期化されます。 |
構造体メンバー | 指定されたメンバーのみが初期化されます。 |
_sFTP_CONNECT_SVR
名前 | 意味 | 説明 | データ型 |
|---|---|---|---|
ConnectSvr | 接続FTPサーバー設定 | 接続するFTPサーバーの設定パラメータ | _sFTP_CONNECT_SVR |
Adr | アドレス | IPアドレスまたはホスト名*1 | STRING |
PortNo | ポート番号 | FTPサーバー制御接続のTCPポート番号 | UINT |
UserName | ユーザー名 | FTPサーバー上のユーザー名 | STRING |
Password | パスワード | FTPサーバーのパスワード | STRING |
_eFILE_SORT_ORDER
SortOrderのデータ型は列挙型_eFILE_SORT_ORDERです。列挙子の意味は以下の通りです:
列挙子 | 意味 |
|---|---|
_NAME_ASC | 名前の昇順 |
_NAME_DESC | 名前の降順 |
_DATE_ASC | 最終更新日時の昇順 |
_DATE_DESC | 最終更新日時の降順 |
_sFTP_FILE_DETAIL
ファイルの詳細はFileList[]に格納されます。情報が取得されたファイル数はStoredNumに格納されます。FileList[]のデータ型は構造体_sFTP_FILE_DETAILです。仕様は以下の通りです:
名前 | 意味 | 説明 | データ型 |
|---|---|---|---|
Name | ファイルまたはフォルダー名 | ファイルまたはフォルダー名 | STRING |
ModifiedDate | 最終更新日時 | ファイルまたはフォルダーの最終更新日時データ | DATE_AND_TIME |
Size | ファイルサイズ | ファイルサイズ*1 | ULINT |
ReadOnly | 読み取り専用属性 | ファイルまたはフォルダーの読み取り専用属性 TRUE: 読み取り専用 FALSE: 読み取り専用でない | BOOL |
Folder | フォルダー | TRUE: フォルダー<br>FALSE: フォルダーでない | BOOL |
_sFTP_RETRY_CFG
FTPサーバーとの接続処理は、接続が正常に確立される前に指定されたタイムアウト時間RetryCfg.TimeOutを超えるとタイムアウトして終了します。
FTPサーバーが接続を拒否した場合、タイムアウト時間に達する前に処理が終了します。
接続に失敗した後、指定されたリトライ間隔RetryInterval後に接続処理が再試行されます。
RetryCfg.RetryNumで指定されたリトライ回数以内にFTPサーバーとの接続が確立されない場合、命令実行エラーが発生します。
FTPサーバーへの接続が成功した後、ネットワーク上で問題が発生し、RetryCfg.TimeOutで指定された時間よりも長くファイル転送が中断された場合、タイムアウトが発生し、リトライ処理は実行されません。RetryCfgのデータ型は構造体_sFTP_RETRY_CFGです。
仕様は以下の通りです:
名前 | 意味 | 説明 | データ型 |
|---|---|---|---|
TimeOut | タイムアウト時間 | FTPサーバーへの接続のタイムアウト時間 | UINT |
RetryNum | リトライ回数 | 接続失敗時のリトライ回数 | UINT |
RetryInterval | リトライ間隔 | 接続失敗時のリトライ間隔 | UINT |
以下の図は、FTPクライアントがFTPサーバーへの接続処理を実行する際の、タイムアウト時間、リトライ回数、およびリトライ間隔の関係を示しています。

_sFTP_EXEC_OPTION
ExecOptionで指定された操作は、FTPサーバーからファイルをダウンロードする際に実行されます。ExecOptionのデータ型は構造体_sFTP_EXEC_OPTIONです。仕様は以下の通りです:
名前 | 意味 | 説明 | データ型 |
|---|---|---|---|
PassiveMode | パッシブモード指定 | TRUE: パッシブモード FALSE: アクティブモード | BOOL |
ASCIIMode | ASCIIモード指定 | TRUE: ASCIIモード FALSE: バイナリモード | BOOL |
FileRemove | 転送後のファイル削除指定*1 | TRUE: 転送後にファイルを削除する FALSE: 転送後にファイルを削除しない。 | BOOL |
OverWrite | 上書き指定 | TRUE: 転送先のファイルを上書きする。 FALSE: 転送先のファイルを上書きしない。 | BOOL |
Reserved | 予約 | システムによって予約されています。 | ARRAY[0..7] Of Byte |
FTPGetFileList
FTPGetFileList命令は、接続されたFTPサーバーConnectSvrの指定されたディレクトリSvrDirNameから、ファイルのリストとファイルの詳細を取得します。GetFileNumでリストするファイル数を指定します。SortOrderで取得したファイル情報をソートする順序を指定します。

項目 | 意味 | I/O | 説明 |
|---|---|---|---|
ConnectSvr | 接続FTPサーバー設定 | Input | 接続するFTPサーバーの設定パラメータ |
SvrDirName | FTPサーバーディレクトリ名 | Input | ファイルリストを取得するFTPサーバーディレクトリの名前 |
GetFileNum | リストするファイル数 | Input | リストするファイル数 |
SortOrder | ソート順 | Input | ファイルリストをソートする順序 |
ExecOption | FTP実行オプション | Input | FTP実行のオプション |
RetryCfg | 実行リトライ設定 | Input | 命令実行のリトライ設定 |
Cancel | キャンセル | Input | TRUE: 命令実行がキャンセルされる。<br>FALSE: 命令実行はキャンセルされない。 |
FileList[]配列 | ファイル詳細 | In-out | 取得したファイルリストの詳細 |
CommandCanceled | キャンセル完了 | Output | TRUE: キャンセルが完了した。 FALSE: キャンセルが完了していない。 |
StoredNum | リストで取得されたファイル数 | Output | 詳細が取得されたファイル数 |
FTPGetFile
FTPGetFile命令は、接続されたFTPサーバーConnectSvrの指定されたディレクトリSvrDirNameから、FileNameで指定されたファイルをSDメモリカード内のLocalDirNameで指定されたディレクトリにダウンロードします。
指定されたディレクトリLocalDirNameがSDメモリカードに存在しない場合は、新しいディレクトリが作成され、指定されたファイルがダウンロードされます。
FileNameにはワイルドカードを使用できます。これにより、一度に複数のファイルをダウンロードすることができます。ダウンロードの結果は、各ファイルについてGetFileResult[]に格納されます。ダウンロードするファイル数はGetNumに格納します。FileNameでワイルドカードを使用する場合は、ワイルドカードに一致する名前のファイル数を格納します。
実際に転送されたファイル数が異なる場合、GetFileResult[].TxErrorの値がTRUEに変わります。ダウンロード後にソースファイルを削除する際にエラーが発生した場合、GetFileResult[].RemoveErrorの値がTRUEに変わります。
ConnectSvrのデータ型は構造体_sFTP_CONNECT_SVRです。

項目 | 意味 | I/O | 説明 |
|---|---|---|---|
ConnectSvr | 接続FTPサーバー設定 | Input | 接続するFTPサーバーの設定パラメータ |
SvrDirName | FTPサーバーディレクトリ名 | Input | ファイルをダウンロードするFTPサーバーディレクトリの名前 |
LocalDirName | ローカルディレクトリ名 | Input | FTPサーバーからダウンロードしたファイルを保存するディレクトリの名前 |
FileName | ファイル名 | Input | ダウンロードするファイルの名前*5 |
ExecOption | FTP実行オプション | Input | FTP実行のオプション |
RetryCfg | 実行リトライ設定 | Input | 命令実行のリトライ設定 |
Cancel | キャンセル | Input | TRUE: 命令実行がキャンセルされる。<br>FALSE: 命令実行はキャンセルされない。 |
GetFileResult[]配列78*9 | ダウンロードファイル結果 | In-out | ダウンロードファイル結果 |
CommandCanceled | キャンセル完了 | Output | TRUE: キャンセルが完了した。<br>FALSE: キャンセルが完了していない。 |
GetNum | ダウンロードするファイル数 | Output | ダウンロードするファイル数 |
ファイル名指定でのワイルドカードの使用
FileNameでダウンロードするファイルの名前を指定する際に、ワイルドカードを使用できます。ワイルドカードとして、「*」と「?」を指定できます。
「*」は1文字以上の任意の文字を表します。「?」は1文字だけを表します。
├─ProductionData(指定ディレクトリ)
|
|---|
ワイルドカード指定の使用例を以下に示します。
ワイルドカード指定 | 指定されるファイル |
|---|---|
Report*.csv | Report01.csv |
Data?.csv | DataX.csv |
Data?.* | DataX.csv, DataY.txt |
Data | SensorData5.csv, SensorData25.csv, SensorData50.csv, (ArchiveFiles)*1 |
* | サブディレクトリを除くすべてのファイル |
. | サブディレクトリを除くすべてのファイル |
?.? | ファイルなし |
Result???.log | ResultC100.log |
Implementation1
Implementation1はFTPGetFileList FBを使用しFTP ServerのData Listを取得します。

OMRON 側
こちらはImplementation1のプログラム部分です。
- p00Init: 初期化関連のパラメータプログラム
- p00FTPGetFileList: FTPファイルリスト取得プログラム
この階層構造は、FTP関連の機能を管理するためのデータ構造を表しており、初期化処理(p00Init)とファイルリスト取得処理(p00FTPGetFileList)が含まれていることが分かります。

p00Init
p00InitはFTP Serverと接続するには必要なパラメータを初期化するプログラムです。

Rung01
このラングは、P_First_Run(初回実行フラグ、First Program Period Flag)をトリガーとして、FTP接続に必要な設定パラメータを構造体sFTP_CONNECT_SVRに書き込む処理を行っています。
設定される接続パラメータ:
- IPアドレス設定(MOVE命令)
- 入力: ‘192.168.250.100’
- 出力: =sFTP_CONNECT_SVR.Adr
- FTPサーバーのIPアドレスを設定します
- ポート番号設定(MOVE命令)
- 入力: 21
- 出力: =sFTP_CONNECT_SVR.PortNo
- FTP制御接続用のTCPポート番号(標準ポート21)を設定します
- ユーザー名設定(MOVE命令)
- 入力: ‘recomputer’
- 出力: =sFTP_CONNECT_SVR.UserName
- FTPサーバーへのログイン用ユーザー名を設定します
- パスワード設定(MOVE命令)
- 入力: ‘12345678’
- 出力: =sFTP_CONNECT_SVR.Password
- FTPサーバーへのログイン用パスワードを設定します
このプログラムは、プログラム起動時の初回実行フラグP_First_Runがオンのときに一度だけ実行され、FTPサーバーへの接続に必要な4つの基本パラメータ(IPアドレス、ポート番号、ユーザー名、パスワード)を設定します。これらのパラメータは構造体sFTP_CONNECT_SVRに格納され、後続のFTP通信命令(FTPGetFileListなど)で使用されます。最下部には「xFTPClientInit」という出力が準備されており、これらの設定完了後にFTPクライアントの初期化処理へ移行することを示唆しています。

Rung02
このラングは、FTP接続パラメータの設定値が正しいかどうかを検証する処理を行っています。
使用されているファンクションブロック:
- EQ命令(等号比較)
- In1: sFTP_CONNECT_SVR.PortNo(Connected F…) – 設定されたポート番号
- In2: UINT#0 – 比較値(0)
- EQAscii命令(分類または検証命令と推測)
- In1: sFTP_CONNECT_SVR.Adr(Connected F…) – 設定されたIPアドレス
- In2: (接続先は画像外)
出力: xConfigError – 設定エラーフラグ
動作説明:
このプログラムは、FTP接続設定の妥当性を検証します。まず、EQ命令でポート番号が0(未設定または無効値)であるかをチェックします。ポート番号が0の場合、または後続のEClassci命令でIPアドレスの検証に問題がある場合、xConfigError(設定エラーフラグ)がセットされます。
この検証処理により、無効な接続パラメータでFTP通信を試みることを防ぎ、後続の処理を安全に実行できるようにしています。ラング1で設定されたパラメータが正しいかどうかを確認する重要な品質保証機能となっています。

p00FTPGetFileList
こちらはFTP ServerからFile Listを取得するプログラムです。

Rung01
このラングは、xOperateがオンになった時に、FTPファイル詳細情報を格納する配列arrFTP_FILE_DETAILを初期化します。Clear命令により、配列内のすべての要素がそれぞれのデータ型のデフォルト値にリセットされます。
この初期化処理は、新しいFTPファイルリスト取得操作を開始する前に、前回の情報をクリアして、新しいデータを正しく格納できるようにするために実行されます。これにより、古いデータと新しいデータが混在することを防ぎ、データの整合性を保証します。

Rung02
このラングは、ラング1で初期化されたFTPファイル詳細情報配列に対して、実際にFTPサーバーからファイルリストを取得する処理を実行します。xOperateトリガーにより、指定されたFTPサーバー(sFTP_CONNECT_SVRで設定)の’/home/recomputer’ディレクトリから最大999個のファイル情報を取得し、arrFTP_FILE_DETAIL配列に格納します。
処理の進行状況はBusyフラグで、完了はDoneフラグで、エラー発生はErrorフラグとErrorIDで監視できます。実際に取得されたファイル数はuiFTPStoredNumに格納されるため、後続の処理でこの値を参照して取得したファイル情報を処理することができます。

Rung03
このラングでは、FTPファイルリスト取得処理の完了条件とエラー処理を制御しています。
fbFTPGetFileList.Done接点がONになると、FTPファイルリスト取得が正常に完了したことを示し、xOperateをセット(ON)します。また、fbFTPGetFileList.Error接点またはxConfigError接点のいずれかがONになった場合も、エラー発生を検知して同様にxOperateをセットします。
これにより、ファイルリスト取得処理が正常完了した場合でもエラーが発生した場合でも、次の処理ステップへ進むための信号を出力する仕組みとなっています。この制御ロジックにより、処理結果に関わらず後続の処理フローを継続できるようになっています。

結果
FBを実行すると、StoredNumに11の数字が出力されます。

Watch TableからarrsFTP_FILE_DETAILを確認すると、11個のFILEデータが格納されています。

Implementation2
Implementation2はFTPGetFileを使用しFTP Serverの指定FILEを取得します。

OMRON 側
こちらはImplementation2のプログラム部分です。

p01FTGetFile
こちらは実際FTP ServerからFILEをを取得するラダープログラムです。

Rung01
このラングでは、xOverwriteOptionsという論理入力信号を監視し、その状態に応じてFTP実行オプションの上書き設定を制御しています。入力接点が有効になると、sFTP_EXEC_OPTION.OverWriteパラメータに値が設定され、FTP転送時に既存ファイルの上書きが許可される仕組みとなっています。

Rung02
このラングでは、xFTPGetFile接点が立ち上がり(OFFからONへ変化)を検出すると、Clearファンクションブロックが実行され、FTPファイル取得操作の結果を格納するarrsGetFileResult配列をクリア(初期化)する役割を担っています。これにより、新しいFTP処理を開始する前に、前回の処理結果をリセットし、データの整合性を保つことができます。

Rung03
このラングでは、xFTPGetFile接点が立ち上がり(OFFからONへ変化)を検出すると、fbFTPGetFileファンクションブロックが実行され、FTPサーバーからファイルを取得する処理が開始されます。
入力パラメータ
- ConnectSvr:sFTP_CONNECT_SVRでFTP接続情報を指定
- SvrDirName:’/home/recomputer/data’でサーバー側のディレクトリを指定
- LocalDirName:’/data’でローカル保存先ディレクトリを指定
- FileName:strFileNameで取得対象のファイル名を指定
- ExecOption:sFTP_EXEC_OPTIONで実行オプション(上書き設定など)を指定
- RetryCfg:リトライ設定を指定
- Cancel:処理のキャンセル制御
出力パラメータ
- Done:処理完了信号
- Busy:xFTPGetFileBusyで処理実行中を示す
- CommandCanceled:コマンドキャンセル状態
- Error:xFTPGetFileErrorでエラー発生を通知
- ErrorID:uiFTPGetFileErrorIDでエラー識別番号を出力
- ErrorIDEx:uiFTPGetFileErrorExで拡張エラー情報を出力
- GetNum:uiFTPGetFileGetNumで取得ファイル数を出力
入出力パラメータ
- GetFileResult:arrsGetFileResultで取得結果の詳細情報を出力

Rung04
このラングでは、FTPファイル取得処理の完了条件とエラー処理を制御しています。
fbFTPGetFile.Done接点がONになると、FTPファイル取得が正常に完了したことを示し、xFTPGetFileをリセット(OFF)します。また、xFTPGetFileError接点またはxConfigError接点のいずれかがONになった場合も、エラー発生を検知して同様にxFTPGetFileをリセットします。
これにより、FTP処理が正常完了した場合でもエラーが発生した場合でも、トリガー信号を自動的にリセットすることで、次回の処理実行に備えた状態に戻す仕組みとなっています。この自己保持解除ロジックにより、連続的なファイル取得処理を安全かつ確実に実行できます。

結果
Controller→SD Memory Cardをクリックします。

この画面から直接OMRON NX CPUのMemory Cardに格納されたFILEを操作できます。

例えば操作したいFileを選択し→右クリック→Copyします。

またはFileの削除も可能です。

次はワイルドカードを使ってみましょう。下図の例では*.logを指定します。つまり.logが含まれているFile Nameを取得します。

Done!

arrsGetFileResult配列でも各Fileの状態を確認できます。

次はsys00?.logを取得します。つまりFTP Server内にsys00<任意の文字x1>.logのFILEのみ取得します。

Done!
