SendData

通信ポートまたはEthernetユーザーコネクションを介したデータ送信

この命令は、送信バッファを使用して、指定した通信ポートから、あるいはEthernetユーザーコネクション経由で、外部機器(コンピュータ、計測機器、バーコードリーダーなど)にデータを送信します。CPUのCOMポートに割り付けた場合、受信バッファをクリアし、"受信完了"フラグをリセットして、再度データを受信できる状態にします。

パラメータ

入力

Port (WORD, INT, UINT)

通信ポートの指定(PLC機種による):

  • COMポート、例:SYS_COM0_PORT

  • Ethernetポート 例: SYS_ETHERNET_USER_CONNECTION_1

  • MCU/SCU、例:16#xx01 (xx =スロット番号) COM01

Start (WORD, INT, UINT)

送信バッファ

NumberOfBytes (WORD, INT, UINT)

送信バイト数:

  • 負の値: システムレジスタで設定された終端コードは、送信文字列には付加されません。

  • 0 (ゼロバイト):次データ受信準備

  • 16#8000:通信モードの切り替え

解説

  • 指定されたバイト数の送信が完了したとき、"送信完了フラグ"がTRUEになります。新しいデータを送信または受信できます。送信命令によって"送信完了"フラグがFALSEになると、データを受信することはできません。"送信完了"フラグの確認は、例えばブロードキャストメッセージのように応答がない場合に利用することができます。

  • SendDataは次の命令の中にカプセル化されます。

    • SendCharacters

    • SendCharactersAndClearString

    • ClearReceiveBuffer

    • SetCommunicationMode

エラーフラグ

sys_bIsOperationErrorHold (TRUEになり、TRUEを保持)
  • インデックス修飾時にエリアを超えたとき

  • NumberOfBytesで指定した送信バイト数が指定エリアを超えたとき

  • MCU用のフラグのみ:

    • MCUユニットが指定されたスロットに存在しないとき、または0バイトを送信する必要があるとき

    • MEWTOCOL-COMマスタ/スレーブモードで、16#8000が指定されているとき

sys_bIsOperationErrorNonHold (1回のスキャンに対してTRUE)
  • インデックス修飾時にエリアを超えたとき

  • 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」が選択されます。

  1.  (1)  「送信完了」フラグ
  2.  (2) 実行条件
  3.  (3) 送信命令の実行
  4.  (4) 送信

POUヘッダ

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

POUボディ

bSendTRUEのとき、F10_BKMVsSendDataで文字列の文字を、awSendBuffer[1]を先頭にバッファawSendBufferへコピーします。文字列の最初の2ワードは、その文字列のヘッダ情報を含んでいます(最大文字数と現在の文字数)。文字列のヘッダは、バッファにコピーしないでください。したがって、データをコピーする前に、文字列の開始アドレスにオフセット値"2"を入力してください。 送信する全データに対して、送信バッファのサイズが十分であることを確認してください。SendBufferの配列の各要素には、SendStringの文字列の2文字を含めることができます。送信する全バイト数に対してSendBuffer[0]が確保されます。

SendDataは、送信バッファ(Startとして指定されているawSendBuffer[0]))の最初の要素からデータを送信します。送信する文字列の長さ(8バイト)は、NumberOfBytesで設定されます。ファンクションLENを使用して、バイト数を計算します。データは、Portで指定されたCOMポート1から出力されます。

LDボディ

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

STボディ

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;

IsTransmissionDone 「送信完了」フラグの確認

最終修正日: 2022-04-21このページに関するフィードバックお問い合わせ窓口