どうも、もももです!
パソコンのプログラム(VB.NET)から三菱製PLCに対して、MCプロトコルを用いて通信を行った際のコマンドをまとめます。
MCプロトコルとは
MELSEC Communication プロトコルの略。
Ethernet通信やシリアルコミュニケーションユニットの交信手順で、パソコン等の機器からCPU ユニットへアクセスするための通信方式の名前です。
実際に通信をするプログラムは下記で紹介しています。
前提条件
VB.NETで3Eフレーム(通信相手:Qシリーズ、Ethernetインタフェース)を使用します。
文字列配列(16進数)でコマンドを作成したあと、Byte配列(10進数)に変換してコマンドを送信します。(マニュアル中のバイナリコード)
送信コマンドとレスポンス
単体デバイス ビット読取り
「M1000」のビットを読取り
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:12) stringCmd(7) = "0C" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 読取(0401) stringCmd(12) = "04" 'コマンド 読取(0401) stringCmd(13) = "01" 'サブコマンド ビット(0001) stringCmd(14) = "00" 'サブコマンド ビット(0001) stringCmd(15) = "E8" 'デバイス番号56(1000→0003"E8") stringCmd(16) = "03" 'デバイス番号34(1000→00"03"E8) stringCmd(17) = "00" 'デバイス番号12(1000→"00"03E8) stringCmd(18) = "90" 'デバイスコード stringCmd(19) = "01" '読取点数34 stringCmd(20) = "00" '読取点数12 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:12) byteCmd(7): 12 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 4 byteCmd(13): 1 byteCmd(14): 0 byteCmd(15): 232 byteCmd(16): 3 byteCmd(17): 0 byteCmd(18): 144 byteCmd(19): 1 byteCmd(20): 0
・受信データ
■byte列配列(10進数) (0): 208 (1): 0 (2): 0 (3): 255 (4): 255 (5): 3 (6): 0 '応答データ長(エラーコード+読取データ) (7): 3 (8): 0 'エラーコード (9): 0 (10): 0 '読取データ (11): 16 '読取データ 16進数変換で16D→10H
※M1000=1
複数デバイス ビット読取り
「M1000」から10点のビットを読取り
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:12) stringCmd(7) = "0C" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 読取(0401) stringCmd(12) = "04" 'コマンド 読取(0401) stringCmd(13) = "01" 'サブコマンド ビット(0001) stringCmd(14) = "00" 'サブコマンド ビット(0001) stringCmd(15) = "E8" 'デバイス番号56(1000→0003"E8") stringCmd(16) = "03" 'デバイス番号34(1000→00"03"E8) stringCmd(17) = "00" 'デバイス番号12(1000→"00"03E8) stringCmd(18) = "90" 'デバイスコード stringCmd(19) = "0A" '読取点数34 stringCmd(20) = "00" '読取点数12 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:12) byteCmd(7): 12 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 4 byteCmd(13): 1 byteCmd(14): 0 byteCmd(15): 232 byteCmd(16): 3 byteCmd(17): 0 byteCmd(18): 144 byteCmd(19): 10 byteCmd(20): 0
・受信データ
■byte列配列(10進数) (0): 208 (1): 0 (2): 0 (3): 255 (4): 255 (5): 3 (6): 0 '応答データ長(エラーコード+読取データ) (7): 7 (8): 0 'エラーコード (9): 0 (10): 0 '読取データ(1001001100) (11): 16 '読取データ 16進数変換で16D→10H (12): 1 '読取データ 16進数変換で1D→01H (13): 0 '読取データ 16進数変換で0D→00H (14): 17 '読取データ 16進数変換で17D→11H (15): 0 '読取データ 16進数変換で0D→00H
M1000 | 1 | M1005 | 0 |
M1001 | 0 | M1006 | 1 |
M1002 | 0 | M1007 | 1 |
M1003 | 1 | M1008 | 0 |
M1004 | 0 | M1009 | 0 |
単体デバイス ワード読取り
「D0」のワードを読取り
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:12) stringCmd(7) = "0C" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 読取(0401) stringCmd(12) = "04" 'コマンド 読取(0401) stringCmd(13) = "00" 'サブコマンド ワード(0000) stringCmd(14) = "00" 'サブコマンド ワード(0000) stringCmd(15) = "00" 'デバイス番号56(0000"00") stringCmd(16) = "00" 'デバイス番号34(00"00"00) stringCmd(17) = "00" 'デバイス番号12("00"0000) stringCmd(18) = "A8" 'デバイスコード stringCmd(19) = "01" '読取点数34 stringCmd(20) = "00" '読取点数12 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:12) byteCmd(7): 12 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 4 byteCmd(13): 0 byteCmd(14): 0 byteCmd(15): 0 byteCmd(16): 0 byteCmd(17): 0 byteCmd(18): 168 byteCmd(19): 1 byteCmd(20): 0
・受信データ
■byte列配列(10進数) (0): 208 (1): 0 (2): 0 (3): 255 (4): 255 (5): 3 (6): 0 '応答データ長(エラーコード+読取データ) (7): 4 (8): 0 'エラーコード (9): 0 (10): 0 '読取データ (11): 210 '読取データ BitConverter.ToInt16()で(11)と(12)を変換 → 1234 (12): 4 '読取データ BitConverter.ToInt16()で(11)と(12)を変換 → 1234
※D0=1234
複数デバイス ワード読取り
「D0」から5点のビットを読取り
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:12) stringCmd(7) = "0C" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 読取(0401) stringCmd(12) = "04" 'コマンド 読取(0401) stringCmd(13) = "00" 'サブコマンド ワード(0000) stringCmd(14) = "00" 'サブコマンド ワード(0000) stringCmd(15) = "00" 'デバイス番号56(0000"00") stringCmd(16) = "00" 'デバイス番号34(00"00"00) stringCmd(17) = "00" 'デバイス番号12("00"0000) stringCmd(18) = "A8" 'デバイスコード stringCmd(19) = "05" '読取点数34 stringCmd(20) = "00" '読取点数12 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:12) byteCmd(7): 12 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 4 byteCmd(13): 0 byteCmd(14): 0 byteCmd(15): 0 byteCmd(16): 0 byteCmd(17): 0 byteCmd(18): 168 byteCmd(19): 5 byteCmd(20): 0
・受信データ
■byte列配列(10進数) (0): 208 (1): 0 (2): 0 (3): 255 (4): 255 (5): 3 (6): 0 '応答データ長(エラーコード+読取データ) (7): 4 (8): 0 'エラーコード (9): 0 (10): 0 '読取データ (11): 210 '読取データ BitConverter.ToInt16()で(11)と(12)を変換 → 1234 (12): 4 '読取データ BitConverter.ToInt16()で(11)と(12)を変換 → 1234 (13): 46 '読取データ BitConverter.ToInt16()で(13)と(14)を変換 → 5678 (14): 22 '読取データ BitConverter.ToInt16()で(13)と(14)を変換 → 5678 (15): 255 '読取データ BitConverter.ToInt16()で(15)と(16)を変換 → -1 (16): 255 '読取データ BitConverter.ToInt16()で(15)と(16)を変換 → -1 (17): 255 '読取データ BitConverter.ToInt16()で(17)と(18)を変換 → 32767 (18): 127 '読取データ BitConverter.ToInt16()で(17)と(18)を変換 → 32767 (19): 0 '読取データ BitConverter.ToInt16()で(19)と(20)を変換 → 0 (20): 0 '読取データ BitConverter.ToInt16()で(19)と(20)を変換 → 0
※D0=1234, D1=5678, D2=-1, D3=32767, D4=0
単体デバイス ビット書込み
「M1000」にビットON(=1)を書込み
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:13) stringCmd(7) = "0D" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 書込(1401) stringCmd(12) = "14" 'コマンド 書込(1401) stringCmd(13) = "01" 'サブコマンド ビット(0001) stringCmd(14) = "00" 'サブコマンド ビット(0001) stringCmd(15) = "E8" 'デバイス番号56(1000→0003"E8") stringCmd(16) = "03" 'デバイス番号34(1000→00"03"E8) stringCmd(17) = "00" 'デバイス番号12(1000→"00"03E8) stringCmd(18) = "90" 'デバイスコード stringCmd(19) = "01" '書込点数34 stringCmd(20) = "00" '書込点数12 stringCmd(21) = "10" '書込内容 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:13) byteCmd(7): 13 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 20 byteCmd(13): 1 byteCmd(14): 0 byteCmd(15): 232 byteCmd(16): 3 byteCmd(17): 0 byteCmd(18): 144 byteCmd(19): 1 byteCmd(20): 0 byteCmd(21): 16
・受信データ
■byte列配列(10進数) (0): 208 (1): 0 (2): 0 (3): 255 (4): 255 (5): 3 (6): 0 '応答データ長(エラーコード+読取データ) (7): 2 (8): 0 'エラーコード (9): 0 (10): 0
複数デバイス ビット書込み
以下を書込み
M1000 | 1 | M1005 | 0 |
M1001 | 0 | M1006 | 1 |
M1002 | 0 | M1007 | 1 |
M1003 | 1 | M1008 | 0 |
M1004 | 0 | M1009 | 0 |
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:17) stringCmd(7) = "11" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 書込(1401) stringCmd(12) = "14" 'コマンド 書込(1401) stringCmd(13) = "01" 'サブコマンド ビット(0001) stringCmd(14) = "00" 'サブコマンド ビット(0001) stringCmd(15) = "E8" 'デバイス番号56(1000→0003"E8") stringCmd(16) = "03" 'デバイス番号34(1000→00"03"E8) stringCmd(17) = "00" 'デバイス番号12(1000→"00"03E8) stringCmd(18) = "90" 'デバイスコード stringCmd(19) = "0A" '書込点数34 stringCmd(20) = "00" '書込点数12 stringCmd(21) = "10" '書込内容 stringCmd(22) = "01" '書込内容 stringCmd(23) = "00" '書込内容 stringCmd(24) = "11" '書込内容 stringCmd(25) = "00" '書込内容 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:17) byteCmd(7): 17 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 20 byteCmd(13): 1 byteCmd(14): 0 byteCmd(15): 232 byteCmd(16): 3 byteCmd(17): 0 byteCmd(18): 144 byteCmd(19): 10 byteCmd(20): 0 byteCmd(21): 16 byteCmd(22): 1 byteCmd(23): 0 byteCmd(24): 17 byteCmd(25): 0
・受信データ
受信データは書込みコマンドで共通
単体デバイス ワード書込み
「D0」に10を書込み
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:14) stringCmd(7) = "0E" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 書込(1401) stringCmd(12) = "14" 'コマンド 書込(1401) stringCmd(13) = "00" 'サブコマンド ワード(0000) stringCmd(14) = "00" 'サブコマンド ワード(0000) stringCmd(15) = "E8" 'デバイス番号56(1000→0003"E8") stringCmd(16) = "03" 'デバイス番号34(1000→00"03"E8) stringCmd(17) = "00" 'デバイス番号12(1000→"00"03E8) stringCmd(18) = "A8" 'デバイスコード stringCmd(19) = "01" '書込点数34 stringCmd(20) = "00" '書込点数12 stringCmd(21) = "0A" '書込内容34 stringCmd(22) = "00" '書込内容12 ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:14) byteCmd(7): 14 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 20 byteCmd(13): 0 byteCmd(14): 0 byteCmd(15): 232 byteCmd(16): 3 byteCmd(17): 0 byteCmd(18): 168 byteCmd(19): 1 byteCmd(20): 0 byteCmd(21): 10 byteCmd(22): 0
・受信データ
受信データは書込みコマンドで共通
複数デバイス ワード書込み
D0=1234, D1=5678, D2=-1, D3=32767, D4=0を書込み
・送信データ
■文字列配列(16進数) 'サブヘッダ(3Eフレーム:5000) stringCmd(0) = "50" stringCmd(1) = "00" 'アクセス経路 stringCmd(2) = "00" 'ネットワーク番号 stringCmd(3) = "FF" 'PC番号 stringCmd(4) = "FF" '要求先ユニットI/O番号 stringCmd(5) = "03" '要求先ユニットI/O番号 stringCmd(6) = "00" '要求先ユニット局番号 '要求データ長(監視タイマ+要求データの要素数:22) stringCmd(7) = "16" stringCmd(8) = "00" '監視タイマ(2Byte) stringCmd(9) = "10" stringCmd(10) = "00" '要求データ stringCmd(11) = "01" 'コマンド 書込(1401) stringCmd(12) = "14" 'コマンド 書込(1401) stringCmd(13) = "00" 'サブコマンド ワード(0000) stringCmd(14) = "00" 'サブコマンド ワード(0000) stringCmd(15) = "E8" 'デバイス番号56(1000→0003"E8") stringCmd(16) = "03" 'デバイス番号34(1000→00"03"E8) stringCmd(17) = "00" 'デバイス番号12(1000→"00"03E8) stringCmd(18) = "A8" 'デバイスコード stringCmd(19) = "05" '書込点数34 stringCmd(20) = "00" '書込点数12 stringCmd(21) = "D2" 'BitConverter.GetBytes()で1234を変換 戻り値の配列(0) stringCmd(22) = "04" 'BitConverter.GetBytes()で1234を変換 戻り値の配列(1) stringCmd(23) = "2E" 'BitConverter.GetBytes()で5678を変換 戻り値の配列(0) stringCmd(24) = "16" 'BitConverter.GetBytes()で5678を変換 戻り値の配列(1) stringCmd(25) = "FF" 'BitConverter.GetBytes()で-1を変換 戻り値の配列(0) stringCmd(26) = "FF" 'BitConverter.GetBytes()で-1を変換 戻り値の配列(1) stringCmd(27) = "FF" 'BitConverter.GetBytes()で32767を変換 戻り値の配列(0) stringCmd(28) = "7F" 'BitConverter.GetBytes()で32767を変換 戻り値の配列(1) stringCmd(29) = "00" 'BitConverter.GetBytes()で0を変換 戻り値の配列(0) stringCmd(30) = "00" 'BitConverter.GetBytes()で0を変換 戻り値の配列(1) ■byte列配列(10進数) 'サブヘッダ(3Eフレーム:5000) byteCmd(0): 80 byteCmd(1): 0 'アクセス経路 byteCmd(2): 0 byteCmd(3): 255 byteCmd(4): 255 byteCmd(5): 3 byteCmd(6): 0 '要求データ長(監視タイマ+要求データの要素数:22) byteCmd(7): 22 byteCmd(8): 0 '監視タイマ(2Byte) byteCmd(9): 16 byteCmd(10): 0 '要求データ byteCmd(11): 1 byteCmd(12): 20 byteCmd(13): 0 byteCmd(14): 0 byteCmd(15): 232 byteCmd(16): 3 byteCmd(17): 0 byteCmd(18): 168 byteCmd(19): 5 byteCmd(20): 0 byteCmd(21): 210 byteCmd(22): 4 byteCmd(23): 46 byteCmd(24): 22 byteCmd(25): 255 byteCmd(26): 255 byteCmd(27): 255 byteCmd(28): 127 byteCmd(29): 0 byteCmd(30): 0
・受信データ
受信データは書込みコマンドで共通
まとめ
パソコンのプログラム(VB.NET)から三菱製PLCに対して、MCプロトコルを用いてデバイスの読書きを行うコマンドについてまとめました。
参考
MELSECコミュニケーションプロトコルリファレンスマニュアル
コメント