テクセル

PowerShellでPLCイーサネット通信(UDP) MCプロトコル(三菱iQ-R、Qシリーズ)


powershellスクリプトで三菱電機(株)製PLC(シーケンサ)iQ-R、QシリーズとUDPイーサネット通信を行います。実行環境は、以下となります。

項目 内容
対象としたイーサネットポート イーサネットユニット:RJ71EN71、QJ71E71-100、CPUのイーサネットポート
通信手順  MCプロトコル QnA互換3Eフレーム ASCIIコード

□ PLCでの設定

1.iQ-R Ethernetユニット RJ71EN71 での設定例

GX Works3 ナビゲーションウインドウのプロジェクトからユニット情報の RJ71EN71(*+*) から [ポート1ユニットパラメータ] をマウスダブルクリックし設定シートを表示します。IPアドレスを設定し、RUN中の書込許可/禁止設定を「一括で許可する(SLMP)」に、交信データコードを「ASCII」とします。 次に「相手機器接続構成設定」の<詳細設定>をマウスダブルクリックしEthernet構成(先頭I/O:****)ダイアログを開きます。
ユニット一覧より「SLMP接続機器」をマウス選択し左下の自局右にドラッグします。プロトコルを「UDP」としポート番号を設定します。 「設定を反映して閉じる」をマウスクリックしダイアログを閉じます。「適用」ボタンをマウスクリックします。

2.iQ-R CPUイーサネットポートでの設定例

GX Works3 ナビゲーションウインドウのプロジェクトから[R**CPU]の[ユニットパラメータ]をマウスダブルクリックし設定シートを 表示します。IPアドレスを設定し、RUN中の書込許可/禁止設定を「一括で許可する(SLMP)」に、交信データコードを「ASCII」とします。 次に「相手機器接続構成設定」の<詳細設定>をマウスダブルクリックしEthernet構成(内蔵Ethernetポート)ダイアログを開きます。
ユニット一覧より「SLMP接続機器」をマウス選択し左下の自局右にドラッグします。プロトコルを「UDP」としポート番号を設定します。 「設定を反映して閉じる」をマウスクリックしダイアログを閉じます。「適用」ボタンをマウスクリックします。

3.Q Ethernetユニット QJ71E71-100 での設定例

GX Works2 ナビゲーションウインドウのネットワークパラメータから[Ethernet/CC IE/MELSECNET]をマウスダブルクリックし、ネットワークパラメータ を開きます。ユニットX欄のネットワーク種別を[Ethernet]とし、先頭I/O No.、ネットワークNo.、グループNo.、局番 を設定します。[モード]を[オンライン]とします。次に[動作設定]をマウスクリックし、[Ethernet 動作設定]ダイアログを開き以下のように設定します。

項目 内容
交信データコード設定 [ASCIIコード交信] を選択
イニシャルタイミング設定 [常にOPEN待ち(STOP中交信可能)] を選択
IPアドレス設定 入力形式を10進数としIPアドレスを設定します。
RUN中書込を許可する チェックを入れます。
送信フレーム設定 [Ethernet(V2.0)]を選択。
TCP生存確認設定 [KeepAliveを使用] を選択。

「設定終了」ボタンマウスクリックで [Ethernet 動作設定]ダイアログを閉じます。
次に[オープン設定]をマウスクリックし、ネットワークパラメータを開きます。任意の行に以下のように設定します。

項目 内容
プロトコル 「UDP」を選択
固定バッファ 「送信」を選択 MCプロトコルの場合は、「送信」、「受信」どちらでも良い
固定バッファ交信手順 「手順あり」を選択
ペアリングオープン 「ペアにしない」を選択
生存確認 「確認しない」を選択
自局ポート番号 ここでは、「9010」(10進)と設定します。
交信相手IPアドレス パソコンのIPアドレスを設定します。例では、192.168.1.3
交信相手ポート番号 パソコン側のポート番号を設定します。例では、9005

「設定終了」ボタンで終了します。

4.Q CPUイーサネットポートでの設定例 (ユニバーサルモデルQCPU)

GX Works2 ナビゲーションウインドウのプロジェクトから[PCパラメータ]をマウスダブルクリックし、Qパラメータ設定 ダイアログを 表示します。IPアドレスを設定し、交信データコード設定を[ASCIIコード交信]とします。[RUN中書込みを許可する]にチェックを 入れます。
「オープン設定」ボタンをマウスクリックし、内蔵Ethernetポートオープン設定 ダイアログを表示します。 任意の行にポート設定を行います。[プロトコル]を「UDP」に、[オープン方式]を「MCプロトコル」とし、[自局ポート番号]を設定します。 「設定終了」ボタンで 内蔵Ethernetポートオープン設定 ダイアログ、Qパラメータ設定 ダイアログ を閉じます。

□ 通信プログラムの例

下記ソフトは、レジスタのD0100より10ワード読み込みを行ってます。エラー処理は行ってません。「q」キーで終了します。プログラムは、コンソールウインドウで実行して下さい。ISEでは、エラーとなります。ここでは、IPアドレス「192.168.1.69」、ポート番号「9010」とします。


# MelEthudpASCII3E.ps1
# 三菱PLC MCプロトコルイーサネット通信
# UDP QnA互換3E ASCII

Set-StrictMode -Version latest

# キー入力
function Keyin{

   $rtkey = $null
   if ([Console]::KeyAvailable){
      $rtkey = [Console]::ReadKey($true)
   }
   return $rtkey
}

# 受信           受信データ、受信データ長
function receive([ref][byte[]]$rcvDt, [ref]$ircvp){

   $ir = 0
   if ($ircvp.Value -eq 0){  # 受信開始
      $Script:reqlen = 0
   }
   $ic = $Script:udpClient.Available      # 受信データバイト数
   if ($ic -gt 0){
      [System.Net.IPEndPoint]$ipEndP = $null
      $bywk = $Script:udpClient.Receive([ref]$ipEndP)    # 受信データ取り込み ※1
      $il = $bywk.Length
      [System.Array]::Copy($bywk, 0, $rcvDt.Value, $ircvp.Value, $il)
      $ircvp.Value += $il
      if ($Script:reqlen -eq 0 -and $ircvp.Value -ge 18){
         [byte[]]$bywk = New-Object byte[] 4
         [System.Array]::Copy($rcvDt.Value, 14, $bywk, 0, 4)  # 応答データ長
         $sa = [System.Text.Encoding]::ASCII.GetString($bywk)
         $Script:reqlen = [int]("0x" + $sa) + 18   # 受信長
      }
      if ($ircvp.Value -ge $Script:reqlen){
         $ir = 1      # 受信完了
      }
   }
   return $ir
}

$remoteHost = "192.168.1.69"     # 接続先ホスト ipアドレス
$remotePort = 9010               # 接続先ポート番号

# ------- D100 から 10ワード読み込み
$itpadd = 100     # 読み込み先頭(デバイス番号)
$ireadsu = 10     # 読み込み個数
$ssbcmd = "0000"  # サブコマンド
$sdv = "D*"       # Dデバイス

# ------- M100 から 20 ビット読み込み
<# $itpadd = 100     # 読み込み先頭(デバイス番号)
$ireadsu = 20     # 読み込み個数
$ssbcmd = "0001"  # サブコマンド
$sdv = "M*"       # Dデバイス #>

# ------- パソコン側のポート番号を指定しない場合   script スコープ
#$Script:udpClient =  New-Object System.Net.Sockets.UdpClient($remoteHost, $remotePort)

# ------- パソコン側のポート番号を指定する場合 ※2
$Script:udpClient = New-Object System.Net.Sockets.UdpClient(9005)
$Script:udpClient.Connect($remoteHost, $remotePort)      
# -------

# サブヘッダー Qヘッダー
$sched = "5000" + "00" + "FF" + "03FF" + "00" + "0000" + "0010"
$scscmd = "0401" + $ssbcmd + $sdv + $itpadd.ToString("D6") + $ireadsu.ToString("X4")
$ilen = $scscmd.Length + 4   # 要求データ長
$slen = $ilen.ToString("X4")
$bylen = [System.Text.Encoding]::ASCII.GetBytes($slen)
$bya = [System.Text.Encoding]::ASCII.GetBytes($sched + $scscmd)
[System.Array]::Copy($bylen, 0, $bya, 14, 4);  # 要求データ長セット

[byte[]]$rcvData = New-Object byte[] 1024
$ircvlen = 0;
$istp = 1

while($true){
   if ($istp -eq 1){
      $ir = $Script:udpClient.Send($bya, $bya.Length)  # 送信
      $istp = 2
   }
   elseif ($istp -eq 2){
      $ir = receive ([ref]$rcvData) ([ref]$ircvlen)
      if ($ir -eq 1){  # 受信完了?
         $srcv = [System.Text.Encoding]::ASCII.GetString($rcvData, 0, $ircvlen)
#         Write-Host $srcv
         $sdd = ""; $ik = 4
         if ($sdv.Substring(0, 1) -eq "M"){$ik = 1}
         for($iq = 0; $iq -lt $ireadsu; $iq++){
            $sdd += $srcv.Substring(22 + $iq * $ik, $ik) + ","
         }
         Write-Host $sdd
         $ircvlen = 0
         $istp = 1
      }
   }
   $inkey = Keyin
   if ($inkey -ne $null -and  $inkey.Key -eq "Q"){
      break;
   }
   Start-Sleep -m 100
}

$udpClient.Close()
   

※1 $ipEndP には、接続先の IPアドレス、ポート番号がセットされます。
※2 QJ71E71-100 で UDP 通信を行う場合はコンストラクターでパソコン側ポート番号を指定します。
QJ71E71-100 の自動オープンUDPポートは、バイナリコード通信です。

参考資料
・SLMPリファレンスマニュアル(三菱電機(株))
・MELSECコミュニケーションプロトコルリファレンスマニュアル(三菱電機(株))
PowerShellメモ
©2025 TEXCELL CORPORATION
テクセル株式会社