MPC2000 Reference Manual [JAPANESE] [ENGLISH]
【コマンド】   【TCP/IP】
【使い方】
Q3E

Q3E TCP|0 WRITE_BULK "D" 1000 aho(50) 30
Q3E TCP|0 READ_BULK "D" 1000 aho(10) 30
Q3E TCP|0 WRITE_BIT "M" 1000 4 1 0 1 0
Q3E (15,TCP|0) READ_BULK "D" 1000 aho(10) 30
【書   式】 【機   能】
Q3E TCP|n func エリア 引数
Q3E (tmout,TCP|n) func エリア 引数

Q3Eフォーマット(MCプロトコル)を生成
【解   説】
三菱PLCのMCプロトコルの1つであるQ3Eフレームを生成します(Headerが0x50のタイプ)
機能コードとして以下の五種類があり、
対応エリアは、、X,Y,M,B,D,W です
WRITE_BULK 連続書込み
READ_BULK 連続読み取り
WRITE_RNDM ランダム書込み
READ_RNDM ランダム読み取り
WRITE_BIT ビット書込み

使用例: Q3E TCP|n WRITE_BULK エリア アドレス ソース配列先頭 数
WRITE_BULK(連続書込み)対応例です。この例ではCH0に対して、”D”エリア1000番にaho(50)~aho(79)を書込みます 。
Q3E TCP|0 WRITE_BULK "D" 1000 aho(50) 30

使用例: Q3E TCP|n READ_BULK エリア アドレス ソース配列先頭 数
READ_BULK(連続読み込み)対応例です。この例ではCH0に対して、”D”エリア1000番を読
み取りaho(10)~aho(39)に書込み ます。
Q3E TCP|0 READ_BULK "D" 1000 aho(10) 30

使用例: Q3E TCP|n WRITE_RNDM {エリア アドレス 値 }*n
WRITE_RNDM(ランダム書込み)対応例です。ここでは、Dの1000番地に100 Wの100番地に100を書き込みます。
Q3E TCP|0 WRITE_RNDM "D" 1000 100 "W" 100 100


使用例: Q3E TCP|n READ_ RNDM {エリア アドレス}*n ソース配列先頭 
READ_RNDM(ランダム読み込み)対応例です。ここでは、Dの1000,Wの100を読み取りaho(10),aho(11)に代入します。
Q3E TCP|0 READ_RNDM "D" 1000 "W" 100 aho(10)


使用例: Q3E TCP|n WRITE_BIT エリア アドレス 数 {1 or 0 }*数
WRITE_BIT(ビット書込み)対応例です。以下では、Mの1000〜1003をON/OFF/ON/OFFに設定します。
Q3E TCP|0 WRITE_BIT "M" 1000 4 1 0 1 0

*送信、受信タイムアウトはデフォルトで10秒です タイムアウト時間は1〜30秒の範囲で調整できますが、この場合はTCP番号設定に(tmout, )を追加します tmoutは1〜29秒です
*引数の数は14個以内という制限があり、その範囲内の書き込みです。
*配列には、DIM宣言した配列と、X(n)~Z(n),MBKが使用可能です。
*PLCのデバイスは領域により表現が異なります このためPLC側のツールでヘキサ表現領域を参照するとMPC側で1000指定はPLC側では&H3E8という表現になります
D:2byteの10進 W: ワードの16進 M: ビットの10進 X,Y,B: ビットの16進

Q3E プロトコルはUDP PACKET通信でも使用できます
使い方はTCPの場合と同様ですが 
2.01_53 2022/04/04 以降で使用してください
三菱PLCのUDPレスポンスにはタイムラグがないためMPC側に高速応答に対応する修正が加えられています
またUDP通信の特性上エラー処理を簡易に行える機能拡張があります

例:
Q3E (1,UDP|0) READ_BULK "D" 1000 aho(10) 30 Err_Udp
エラーコード用の変数を末尾に与えるとランタイムエラーが無くなりエラーコードが変数に入ります
以下のように実行後エラー変数を監視してリトライあるいはそのほかの回避処理をします

retry:
Q3E (1,UDP|0) READ_BULK "D" 1000 aho(10) 30 Err_Udp
IF Err_Udp!=0 THEN : MBK(1000)=Err_Udp : TIME 100 : GOTO *retry

エラー変数にはいる値は82, 94もしくは95 
82は、MCプロトコルエラーです 存在しないエリアなどを要求するとPLCから返されます
94はQ3E送出タイムアウトエラー 95はQ3E受信タイムアウトエラー

UDP通信では94,95のエラーは一定確率で発生しますので必ずエラー処理をしてください




SET_IP   TCP Telnet
SET_IP 192 168 0 20 255 255 255 0 192 168 0 248
SET_IP TCP PACKET 9000 192 168 0 195
ON_ERROR *sys_err
QUIT_FORK 1 *W_BIT
END
*WR_BULK
d=0
w=0
m=0
x=0
y=0
b=0
DO
d=d+1
X(100)=d
X(101)=d+1
'X(100)下位2バイト -> Q03 D100 (Q03のアドレスはワードのDEC表記)
'X(101)下位2バイト -> Q03 D101
Q3E TCP|0 WRITE_BULK "D" 100 X(100) 2
'Y(100)下位2バイト <- Q03 D100
'Y(101)下位2バイト <- Q03 D101
Q3E TCP|0 READ_BULK "D" 100 Y(100) 2
PRINT "DW" X(100) X(101)
PRINT "DR" Y(100) Y(101)
w=w+1
X(200)=w
X(201)=w+1
'X(200)下位2バイト -> Q03 W0C8 (Q03のアドレスはワードのHEX表記)
'X(201)下位2バイト -> Q03 W0C9
Q3E TCP|0 WRITE_BULK "W" 200 X(200) 2
'Y(200)下位2バイト <- Q03 W0C8
'Y(201)下位2バイト <- Q03 W0C9
Q3E TCP|0 READ_BULK "W" 200 Y(200) 2
PRINT "WW" X(200) X(201)
PRINT "WR" Y(200) Y(201)
m=m+1
X(300)=m
X(301)=m+1
'X(300)下位2バイト -> Q03 M300 (Q03のアドレスはビットのDEC表記)
'X(301)下位2バイト -> Q03 M316
Q3E TCP|0 WRITE_BULK "M" 300 X(300) 2
'Y(300)下位2バイト <- Q03 M300
'Y(301)下位2バイト <- Q03 M316
Q3E TCP|0 READ_BULK "M" 300 Y(300) 2
PRINT "MW" X(300) X(301)
PRINT "MR" Y(300) Y(301)
x=x+1
X(400)=x
X(401)=x+1
'X(400)下位2バイト -> Q03 X190 (Q03のアドレスはビットのHEX表記)
'X(401)下位2バイト -> Q03 X1A0
Q3E TCP|0 WRITE_BULK "X" 400 X(400) 2
'Y(400)下位2バイト <- Q03 X190
'Y(401)下位2バイト <- Q03 X1A0
Q3E TCP|0 READ_BULK "X" 400 Y(400) 2
PRINT "XW" X(400) X(401)
PRINT "XR" Y(400) Y(401)
y=y+1
X(500)=y
X(501)=y+1
'X(500)下位2バイト -> Q03 Y1F4 (Q03のアドレスはビットのHEX表記)
'X(501)下位2バイト -> Q03 Y204
Q3E TCP|0 WRITE_BULK "Y" 500 X(500) 2
'Y(500)下位2バイト <- Q03 Y1F4
'Y(501)下位2バイト <- Q03 Y204
Q3E TCP|0 READ_BULK "Y" 500 Y(500) 2
PRINT "YW" X(500) X(501)
PRINT "YR" Y(500) Y(501)
b=b+1
X(600)=b
X(601)=b+1
'X(600)下位2バイト -> Q03 B258 (Q03のアドレスはビットのHEX表記)
'X(601)下位2バイト -> Q03 B268
Q3E TCP|0 WRITE_BULK "B" 600 X(600) 2
'Y(600)下位2バイト <- Q03 B258
'Y(601)下位2バイト <- Q03 B268
Q3E TCP|0 READ_BULK "B" 600 Y(600) 2
PRINT "BW" X(600) X(601)
PRINT "BR" Y(600) Y(601)
TIME 1000
LOOP
*WR_RNDM
d=0
DO
d=d+1
'Q3E の W3E8,W3F0,W3F8 に書き込み
Q3E TCP|0 WRITE_RNDM "W" 1000 d "W" 1008 d+1 "W" 1016 d+2
'Q3E の W3E8,W3F0,W3F8 から MBK(100)~(102)に読み込み
Q3E TCP|0 READ_RNDM "W" 1000 "W" 1008 "W" 1016 MBK(100)
PRINT MBK(100) MBK(101) MBK(102)
TIME 1000
LOOP
*W_BIT
c=0
DO
c=c+1
c=c%2
Q3E TCP|0 WRITE_BIT "X" &H00000100 1 c
Q3E TCP|0 WRITE_BIT "Y" &H00000100 2 c 1-c
Q3E TCP|0 WRITE_BIT "B" &H0000010C 3 1-c c 1-c
Q3E TCP|0 READ_BULK "X" &H00000100 MBK(200) 1
Q3E TCP|0 READ_BULK "Y" &H00000100 MBK(201) 1
Q3E TCP|0 READ_BULK "B" &H00000100 MBK(202) 1
PRX MBK(200) MBK(201) MBK(202)
TIME 500
LOOP
*sys_err
PRINT "TCP(0)=" TCP(0)
PRINT "ERROR Line:" err_&&H00FFFFFF "Code:" err_>>24 "Message:" ERR$(err_)
END
  [LASTMODIFY]2022-04-05 16:15:35 [CREATEDATE]2019-09-30 18:27:48
MPC2000 Reference Manual -R5.11-   (C)2007 ACCEL Corp. all right reserved.