OMRON#FTP Server操作Part01_FTPGetFileList/FTPGetFileを使ってみよう

今回の記事では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

https://x.com/3threes2

技術はひとりじゃもったいない。

Reference Link

http://soup01.com/ja/category/omron%e3%82%aa%e3%83%a0%e3%83%ad%e3%83%b3/sysmac-studio-instruction-list/

記事で使用した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(指定ディレクトリ)
│ ├ Report01.csv
│ ├ Report02.txt
│ ├ DataX.csv
│ ├ DataY.txt
│ ├ ResultA1.log
│ ├ ResultB25.log
│ ├ ResultC100.log
│ ├ SensorData5.csv
│ ├ SensorData50.csv
│ │
│ └─ArchiveFiles(サブディレクトリ)
│ Backup_2024.csv
│ Backup_2025.csv

ワイルドカード指定の使用例を以下に示します。

ワイルドカード指定

指定されるファイル

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に書き込む処理を行っています。

設定される接続パラメータ:

  1. IPアドレス設定(MOVE命令)
    • 入力: ‘192.168.250.100’
    • 出力: =sFTP_CONNECT_SVR.Adr
    • FTPサーバーのIPアドレスを設定します
  2. ポート番号設定(MOVE命令)
    • 入力: 21
    • 出力: =sFTP_CONNECT_SVR.PortNo
    • FTP制御接続用のTCPポート番号(標準ポート21)を設定します
  3. ユーザー名設定(MOVE命令)
    • 入力: ‘recomputer’
    • 出力: =sFTP_CONNECT_SVR.UserName
    • FTPサーバーへのログイン用ユーザー名を設定します
  4. パスワード設定(MOVE命令)
    • 入力: ‘12345678’
    • 出力: =sFTP_CONNECT_SVR.Password
    • FTPサーバーへのログイン用パスワードを設定します

このプログラムは、プログラム起動時の初回実行フラグP_First_Runがオンのときに一度だけ実行され、FTPサーバーへの接続に必要な4つの基本パラメータ(IPアドレス、ポート番号、ユーザー名、パスワード)を設定します。これらのパラメータは構造体sFTP_CONNECT_SVRに格納され、後続のFTP通信命令(FTPGetFileListなど)で使用されます。最下部には「xFTPClientInit」という出力が準備されており、これらの設定完了後にFTPクライアントの初期化処理へ移行することを示唆しています。

Rung02

このラングは、FTP接続パラメータの設定値が正しいかどうかを検証する処理を行っています。

使用されているファンクションブロック:

  1. EQ命令(等号比較)
    • In1: sFTP_CONNECT_SVR.PortNo(Connected F…) – 設定されたポート番号
    • In2: UINT#0 – 比較値(0)
  2. 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!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする