テクセル

PowerShellでPLCのデータベース操作 (三菱iQ-Rシリーズ)


powershellスクリプトで三菱電機(株) 製PLC(シーケンサ)iQ-Rシリーズ(RCPU)の内蔵データベースの操作を行います。 データベースへのアクセスは、ODBC から RCPU のEthernetポートを経由して RCPU 内のSDメモリカード内のデータベースに対して行います。内蔵データベースが使用できるCPUについては、三菱電機(株)ホームページ等を 参照して下さい。

1. 内蔵データベースアクセス用ドライバのダウンロード

ODBCドライバー及びデータベースサンプルを下記サイトからダウンロードします。
CPUユニット内蔵データベースアクセス用ドライバ (三菱電機(株))

以下の2ファイルをダウンロードします。

ダウンロード後、解凍し任意のフォルダに入れます。ODBCドライバは、32ビットと64ビット用があります。ここでは、 64ビットODBCドライバ「CPUModuleDatabaseAccessDriver-64bit-J.msi」をインストールします。

2. 内蔵データベースアクセス設定

ODBC経由でアクセス出来るように GX-Works3 で設定を行います

RCPU のIPアドレスの設定を行います。ナビゲーションウインドウのプロジェクトから[R**CPU]の[ユニットパラメータ]をマウスダブルクリックし設定シートを 表示します。[設定項目一覧]-[基本設定]-[自ノード設定]でIPアドレス設定を表示します。IPアドレス、サブネットマスクを設定します。

次に [設定項目一覧]-[応用設定]-[内蔵データベースアクセス設定] で 内蔵データベースアクセス設定欄を表示します。
「内蔵データベースアクセス使用有無」を「使用する」にします。ログイン名を「RCPU」(デフォルト)とします。 パスワードは、デフォルトの「RCPU」とします。(未設定の場合デフォルトが使用されます。)

3. データベースの作成

RCPU 内の SDメモリーカードにデータベースの作成を行います。パソコンのSDドライブにSDメモリカードを入れます。 エクスプローラでSDメモリカード内を表示します。
(SDメモリカード用ドライブがあるパソコンで行って下さい。)

ここでは、「DATABASE」フォルダを作成し、「DATABASE」フォルダ内にダウンロードした「my_db_01」フォルダをコピーします。
「my_db_01」フォルダ名を「RDB0」に変更します。
「RDB0」がデータベースとなります。

フォルダ「RDB0」内を表示します。フォルダ「RDB0」内に フォルダ「_lock」、「_trn」フォルダを作成します。

パソコンからSDメモリカードを抜き、RCPUに装着します。
参考:データベース及びテーブルの作成は、シーケンサ(PLC)の命令でも行えます。

4. ODBC データソースの作成

ODBC のデータソースを作成します。[コントロールパネル]-[管理ツール]の「ODBC データソース(64ビット)」マウスクリックで ODBC データソース アドミニスタレータ(64ビット)ダイアログを開きます。「追加」ボタンマウスクリックで 「MELSEC iQ-R CPU Module Database Driver」を選択し、「完了ボタン」をクリックします。データソース設定ダイアログが表示されます。

・データソース名
データソース名を入力します。ここでは「iQRDB」とします。
・サーバ名
RCPU のIPアドレスを設定します。
・ポート番号
61461 とします。変更不可
・データベース
SDメモリのデータベースを指定します。ここでは、「2:\DATABASE\RDB0」と入力します。 文字列先頭の「2」は、SDメモリを表します。
・ログイン名
ログイン名を設定します。
・パスワード
パスワードを設定します。

「テスト」ボタンで接続を確認します。「OK」ボタンでデータソース設定ダイアログを閉じます。

5. プログラム例

1) テーブルの作成

テーブルの作成を行います。


# iQ-R DB テーブル作成

Set-StrictMode -Version latest

$sCconStr = "DSN=iQRDB;uid=RCPU;pwd=RCPU;"

$odbcCon = New-Object System.Data.Odbc.OdbcConnection($sCconStr)
try{
   $odbcCon.open()
}
catch{
   Write-Host "接続失敗"
   exit
}
Write-Host "接続成功"

$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

$odbcCmd.CommandText = "CREATE TABLE testTbl0(" +
   "id INT," +
   "isNo INT," +
   "iNumber BIGINT)"
$rt = $odbcCmd.ExecuteNonQuery()

$odbcCmd.CommandText = "CREATE INDEX index1 ON testTbl0(id)"
$rt = $odbcCmd.ExecuteNonQuery()

$odbcCon.Close()
      

2) SELECT

テーブル内のデータを取得します。


# iQ-R DB SELECT 

Set-StrictMode -Version latest

$sCconStr = "DSN=iQRDB;uid=RCPU;pwd=RCPU;"

$odbcCon = New-Object System.Data.Odbc.OdbcConnection($sCconStr)
try{
   $odbcCon.open()
}
catch{
   Write-Host "接続失敗"
   exit
}
Write-Host "接続成功"

$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

$odbcCmd.CommandText = "SELECT * FROM testTbl0 WHERE id <= 3"
$odbcReader = $odbcCmd.ExecuteReader()

$ic = $odbcReader.FieldCount 
while($odbcReader.Read()){        # データ表示
   $sa = ""
   for($ix = 0; $ix -lt $ic; $ix++){
      $sa += $odbcReader[$ix].ToString() + ","
   }
   Write-Host $sa
}
$odbcReader.Close()
$odbcCon.Close()
         

3) INSERT

テーブル内にデータを挿入します。


# iQ-R DB データ挿入

Set-StrictMode -Version latest

# 挿入するデータ
$inData = @((1, 1000, 200053), (2, 1005, 21072), (3, 1008, 23252))

$sCconStr = "DSN=iQRDB;uid=RCPU;pwd=RCPU;"

$odbcCon = New-Object System.Data.Odbc.OdbcConnection($sCconStr)
try{
   $odbcCon.open()
}
catch{
   Write-Host "接続失敗"
   exit
}
Write-Host "接続成功"

$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

$il = $inData.Length
$ssql1 = "INSERT INTO testTbl0 VALUES"
for($ia = 0; $ia -lt $il; $ia++){
   $odbcCmd.CommandText = $ssql1 + "(" +
      $inData[$ia][0].ToString() + "," +
      $inData[$ia][1].ToString() + "," +
      $inData[$ia][2].ToString() + ")"
   $rt = $odbcCmd.ExecuteNonQuery()
}

Write-Host "書き込み完了"

$odbcCon.Close()
         

参考資料
・MELSEC iQ-R CPUユニットユーザーズマニュアル(応用編) (三菱電機(株))

PowerShellメモ
©2022 TEXCELL CORPORATION
テクセル株式会社