powershellスクリプトで三菱電機(株) 製PLC(シーケンサ)iQ-Rシリーズ(RCPU)の内蔵データベースの操作を行います。 データベースへのアクセスは、ODBC から RCPU のEthernetポートを経由して RCPU 内のSDメモリカード内のデータベースに対して行います。内蔵データベースが使用できるCPUについては、三菱電機(株)ホームページ等を 参照して下さい。
ODBCドライバー及びデータベースサンプルを下記サイトからダウンロードします。
CPUユニット内蔵データベースアクセス用ドライバ (三菱電機(株))
以下の2ファイルをダウンロードします。
ダウンロード後、解凍し任意のフォルダに入れます。ODBCドライバは、32ビットと64ビット用があります。ここでは、 64ビットODBCドライバ「CPUModuleDatabaseAccessDriver-64bit-J.msi」をインストールします。
ODBC経由でアクセス出来るように GX-Works3 で設定を行います
RCPU のIPアドレスの設定を行います。ナビゲーションウインドウのプロジェクトから[R**CPU]の[ユニットパラメータ]をマウスダブルクリックし設定シートを 表示します。[設定項目一覧]-[基本設定]-[自ノード設定]でIPアドレス設定を表示します。IPアドレス、サブネットマスクを設定します。
次に [設定項目一覧]-[応用設定]-[内蔵データベースアクセス設定] で 内蔵データベースアクセス設定欄を表示します。
「内蔵データベースアクセス使用有無」を「使用する」にします。ログイン名を「RCPU」(デフォルト)とします。
パスワードは、デフォルトの「RCPU」とします。(未設定の場合デフォルトが使用されます。)
RCPU 内の SDメモリーカードにデータベースの作成を行います。パソコンのSDドライブにSDメモリカードを入れます。
エクスプローラでSDメモリカード内を表示します。
(SDメモリカード用ドライブがあるパソコンで行って下さい。)
ここでは、「DATABASE」フォルダを作成し、「DATABASE」フォルダ内にダウンロードした「my_db_01」フォルダをコピーします。
「my_db_01」フォルダ名を「RDB0」に変更します。
「RDB0」がデータベースとなります。
フォルダ「RDB0」内を表示します。フォルダ「RDB0」内に フォルダ「_lock」、「_trn」フォルダを作成します。
パソコンからSDメモリカードを抜き、RCPUに装着します。
参考:データベース及びテーブルの作成は、シーケンサ(PLC)の命令でも行えます。
ODBC のデータソースを作成します。[コントロールパネル]-[管理ツール]の「ODBC データソース(64ビット)」マウスクリックで ODBC データソース アドミニスタレータ(64ビット)ダイアログを開きます。「追加」ボタンマウスクリックで 「MELSEC iQ-R CPU Module Database Driver」を選択し、「完了ボタン」をクリックします。データソース設定ダイアログが表示されます。
「テスト」ボタンで接続を確認します。「OK」ボタンでデータソース設定ダイアログを閉じます。
テーブルの作成を行います。
# 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()
テーブル内のデータを取得します。
# 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()
テーブル内にデータを挿入します。
# 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ユニットユーザーズマニュアル(応用編) (三菱電機(株))