MCプロトコルによる外部デバイスへのデータの書き込み
PLCは、マスター通信の送信権限を持っています。通信は、MCプロトコルをサポートし、応答を受信するデバイスにコマンドを送信することによって実行されます。 ユーザープログラムでメモリアドレスを指定し、書き込み命令を実行することにより、PLCはプロトコルに従ったメッセージを自動的に生成します。
入力
Ethernetポート 例:SYS_ETHERNET_USER_CONNECTION_1
スレーブに書き込むデータのマスターユニットのワードエリアまたはレジスタ
受信データの数を指定します。受信データの数は、ワード送信ではワード単位で、ビット送信ではビット単位です(入力Words_Bitsに適用されるデータ型によって異なる)
転送方法とWords_Bitsに指定された送信データ数は、Sourceのデータタイプによって変わります。
Sourceに指定されたメモリエリア |
転送方式 |
送信されたデータの数Words_Bits |
解説 |
---|---|---|---|
16ビットメモリエリア WX、WY、WR、WL、DT、LD |
ワード送信 |
1~960ワード |
|
1ビットメモリエリア X,Y,R,L,DT,n,LD,n |
ビット送信 |
1~7168ビット |
送信データの数が奇数の場合、4ビットダミーコード16#0が追加されます。 |
データが書き込まれるスレーブのメモリエリア。
単位 |
メモリエリアタイプ |
システム変数 |
||
---|---|---|---|---|
ビット |
入力 |
X | 16進数 SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X |
|
出力 |
Y | 16進数 SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y |
||
リンクリレー |
B | 16進数 SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B |
||
内部リレー |
M | 10進 SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M |
||
ラッチリレー |
L | 10進 SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L |
||
ワード |
データレジスタ |
D | 10進 SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D |
|
ファイルレジスタ |
R | 10進 SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R |
||
ZR | 16進数 SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR |
|||
リンクレジスタ |
W | 16進数 SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W |
データが書き込まれるスレーブのメモリエリアのオフセット。
範囲:16#0~16#F7FFFF (0~16252927)
出力
実行結果コードを格納するマスターユニットのメモリエリアを指定します(エリアWX、WY、XR、WL、DT、LD内の1ワード)
0:正常完了
1:通信ポートがマスタ通信に使用されている
2:通信ポートがスレーブ通信で使用されている
3:同時に実行できるマスタ通信命令数を超えている
4:送信タイムアウト
5:レスポンス受信タイムアウト
6:受信データエラー
送信時:マスター通信の送信フラグはTRUEです
送信完了時:マスター通信の送信フラグはFALSEです
正常完了:FALSE
異常完了:TRUE
インデックス修飾時にエリアを超えたとき
パラメータに指定された値が許容範囲外の場合。
Ethernetポートが正しくないか、Ethernetポートが閉じている場合。
Words_Bitsに指定された送信データ数が正しくないとき
Sourceにより指定されたマスターユニットのワードエリアまたはレジスタが正しくないか、許容範囲外の場合。
実行結果コードが格納されるメモリエリアが正しくない場合。
インデックス修飾時にエリアを超えたとき
パラメータに指定された値が許容範囲外の場合。
Ethernetポートが正しくないか、Ethernetポートが閉じている場合。
Words_Bitsに指定された送信データ数が正しくないとき
Sourceにより指定されたマスターユニットのワードエリアまたはレジスタが正しくないか、許容範囲外の場合。
実行結果コードが格納されるメモリエリアが正しくない場合。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bEnable: BOOL:=FALSE;
awValues: ARRAY [0..2] OF WORD:=[3(0)];
diMemoryOffset: DINT:=0;
iResult: INT:=0;
abValues: ARRAY [0..2] OF BOOL:=[3(FALSE)];
iPort: INT:=0;
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_COMMENT,,Bit transfer,2,0,10,1,);
B(B_COMMENT,,Memory Areas: SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X ^SYS_MC_PROTOCOL_MEMORY_AREA_OUTPUT_Y ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_RELAY_B ^SYS_MC_PROTOCOL_MEMORY_AREA_INTERNAL_RELAY_M ^SYS_MC_PROTOCOL_MEMORY_AREA_LATCH_RELAY_L,13,0,39,6,);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,abValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_COMMENT,,Memory Areas: ^SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_R ^SYS_MC_PROTOCOL_MEMORY_AREA_FILE_REGISTER_ZR ^SYS_MC_PROTOCOL_MEMORY_AREA_LINK_REGISTER_W,13,0,39,5,);
B(B_COMMENT,,Word Transfer,2,0,10,1,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_VARIN,,iPort,26,2,28,4,);
B(B_VARIN,,awValues,18,3,20,5,);
B(B_VARIN,,SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,26,5,28,7,);
B(B_VARIN,,diMemoryOffset,26,6,28,8,);
B(B_VAROUT,,iResult,41,2,43,4,);
B(B_CONTACT,,bEnable,5,1,7,3,);
B(B_F,FP_MC_PROTOCOL_WRITE!,,28,0,41,8,,?DEN?DPort?DSource?DWords_Bits?HDestMemoryArea?DDestMemoryOffset?AENO?CResult);
B(B_F,Size_Of_Var!,,21,4,28,6,,?D?C);
L(1,2,5,2);
L(7,2,28,2);
L(20,4,28,4);
L(21,4,21,5);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_COMMENT,,only valid for ethernet ports! ^--> Valid Ports: SYS_ETHERNET_USER_CONNECTION_1 - SYS_ETHERNET_USER_CONNECTION_216,3,1,52,4,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
(*Bit transfer*)
If (bEnable) then
FP_MC_PROTOCOL_WRITE(Port := iPort,
Source := abValues,
Words_Bits := Size_Of_Var(abValues),
DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_INPUT_X,
DestMemoryOffset := diMemoryOffset,
Result => iResult);
End_if;
(*Word transfer*)
If (bEnable) then
FP_MC_PROTOCOL_WRITE(Port := iPort,
Source := awValues,
Words_Bits := Size_Of_Var(awValues),
DestMemoryArea := SYS_MC_PROTOCOL_MEMORY_AREA_DATA_REGISTER_D,
DestMemoryOffset := diMemoryOffset,
Result => iResult);
End_if;