通信ポートまたはEthernetユーザーコネクションを介したデータ送信
この命令は、送信バッファを使用して、指定した通信ポートから、あるいはEthernetユーザーコネクション経由で、外部機器(コンピュータ、計測機器、バーコードリーダーなど)にデータを送信します。CPUのCOMポートに割り付けた場合、受信バッファをクリアし、"受信完了"フラグをリセットして、再度データを受信できる状態にします。
入力
通信ポートの指定(PLC機種による):
COMポート、例:SYS_COM0_PORT
Ethernetポート 例: SYS_ETHERNET_USER_CONNECTION_1
MCU/SCU、例:16#xx01 (xx =スロット番号) COM01
送信バッファ
送信バイト数:
負の値: システムレジスタで設定された終端コードは、送信文字列には付加されません。
0 (ゼロバイト):次データ受信準備
16#8000:通信モードの切り替え
指定されたバイト数の送信が完了したとき、"送信完了フラグ"がTRUEになります。新しいデータを送信または受信できます。送信命令によって"送信完了"フラグがFALSEになると、データを受信することはできません。"送信完了"フラグの確認は、例えばブロードキャストメッセージのように応答がない場合に利用することができます。
SendDataは次の命令の中にカプセル化されます。
SendCharacters
SendCharactersAndClearString
ClearReceiveBuffer
SetCommunicationMode
インデックス修飾時にエリアを超えたとき
NumberOfBytesで指定した送信バイト数が指定エリアを超えたとき
MCU用のフラグのみ:
MCUユニットが指定されたスロットに存在しないとき、または0バイトを送信する必要があるとき
MEWTOCOL-COMマスタ/スレーブモードで、16#8000が指定されているとき
インデックス修飾時にエリアを超えたとき
NumberOfBytesで指定した送信バイト数が指定エリアを超えたとき
MCU用のフラグのみ:
MCUユニットが指定されたスロットに存在しないとき、または0バイトを送信する必要があるとき
MEWTOCOL-COMマスタ/スレーブモードで、16#8000が指定されているとき
この例では、文字列sSendDataの文字が送信されます。30バイト(ARRAY [0...15] OF WORD)の送信バッファを定義し、8文字の文字列("ABCDEFGH")をバッファにコピーします。
送信バッファの割り付け:
送信バッファの最初のワード(オフセット0)は、送信するバイト数用に予約されています。したがって、データはオフセット1(SendBuffer[1])にコピーします。
送信が開始されると(送信命令の実行条件がTRUEに変わる)、オフセット0の値は8に設定されます。オフセット0の値は、送信の終了時に自動的に0にリセットされます。オフセット1~オフセット4のデータが、順番に下位バイトから送信されます。
COMポート1に接続されている外部デバイスに文字"ABCDEFGH"を送信します。始端コードと終端コードでは、初期値設定の「No-STX」と「CR」が選択されます。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bSend: BOOL:=FALSE;
(*activates function*)
sSendData: STRING[30]:='ABCDEFGH';
(*up to 30 chars*)
awSendBuffer: ARRAY [0..15] OF WORD:=[16(0)];
(*for 30 chars + 1 word*)
END_VAR
bSendがTRUEのとき、F10_BKMVはsSendDataで文字列の文字を、awSendBuffer[1]を先頭にバッファawSendBufferへコピーします。文字列の最初の2ワードは、その文字列のヘッダ情報を含んでいます(最大文字数と現在の文字数)。文字列のヘッダは、バッファにコピーしないでください。したがって、データをコピーする前に、文字列の開始アドレスにオフセット値"2"を入力してください。 送信する全データに対して、送信バッファのサイズが十分であることを確認してください。SendBufferの配列の各要素には、SendStringの文字列の2文字を含めることができます。送信する全バイト数に対してSendBuffer[0]が確保されます。
SendDataは、送信バッファ(Startとして指定されているawSendBuffer[0]))の最初の要素からデータを送信します。送信する文字列の長さ(8バイト)は、NumberOfBytesで設定されます。ファンクションLENを使用して、バイト数を計算します。データは、Portで指定されたCOMポート1から出力されます。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 10 ;
NETWORK_BODY
B(B_COMMENT,,Creating the send buffer,1,0,14,1,);
B(B_CONTACT,,bSend,3,2,5,4,R);
B(B_VAROUT,,awSendBuffer[1],26,4,28,6,);
B(B_F,F10_BKMV,,18,2,26,7,,?DEN?D@'s1'?Ds2?AENO?Cd);
B(B_F,Adr_Of_VarOffs_I!,,9,3,18,7,,?D@'Var'?DOffs?CAdr);
B(B_VARIN,,sSendData,7,4,9,6,);
B(B_F,AdrLast_Of_Var_I!,,9,7,18,9,,?D?C);
B(B_VARIN,,sSendData,7,7,9,9,);
B(B_VARIN,,2,7,5,9,7,);
L(5,3,18,3);
L(1,3,3,3);
L(18,3,18,4);
L(1,0,1,10);
L(18,6,18,8);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 7 ;
NETWORK_BODY
B(B_COMMENT,,bSend sign of the bSend buffer via the serial interface,1,0,25,1,);
B(B_CONTACT,,bSend,3,2,5,4,R);
B(B_VARIN,,awSendBuffer[0],14,4,16,6,);
B(B_F,LEN!,,9,4,14,7,,?DIN?C);
B(B_VARIN,,sSendData,7,5,9,7,);
B(B_F,E_SendData!,,16,1,26,7,,?DEN?DPort?DStart?DNumberOfBytes?AENO);
B(B_VARIN,,1,14,3,16,5,);
L(1,3,3,3);
L(5,3,16,3);
L(14,6,16,6);
L(1,0,1,7);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if (DF(bSend)) then
(* Copy all characters of the SendString to the SendBuffer from position 1 *)
F10_BKMV(s1_Start := Adr_Of_VarOffs(Var := sSendData, Offs :=2),
s2_End := AdrLast_Of_Var(sSendData),
d_Start => awSendBuffer[1]);
(* Send the data of the SendBuffer via the COM Port 2 of the MCU unit in slot 3 *)
(* In SendBuffer[0] the number of bytes not yet transmitted is stored *)
SendData(Port :=1, start := awSendBuffer[0], NumberOfBytes := LEN(sSendData));
end_if;