三菱PLC通信 構造体でトライ -コマンド受信

前回に続き、今回は構造体でコマンドを設定しての受信について説明します。
まずは受信の構造体からです。

//受信コマンドヘッダ
struct QNa3E_Frame_Receive{
    std::uint16_t subheader;
    std::uint8_t network_number;
    std::uint8_t pc_number;
    std::uint16_t request_IO_number;
    std::uint8_t request_station_number;
    std::uint16_t response_data_length;
    std::uint16_t terminal_code;
}rsv;

これも、リファレンスマニュアルのQnA互換3Eフレームのバイナリコードで更新する場合を見ながら作成しました。UDP受信については前々回の三菱PLCとイーサネット通信をご参照ください。

// UDP受信
std::array<unsigned char, 128> recv_buf;
asio::ip::udp::endpoint sender_endpoint;
size_t recv_buf_len = socket.receive_from(
    asio::buffer(recv_buf), sender_endpoint);

今回はこの受信バッファを構造体に入れます。

// 受信データを受信ヘッダへコピー
int rsv_size = sizeof(QNa3E_Frame_Receive);
memcpy(&rsv, &recv_buf,rsv_size);

構造体のサイズ分memcpyでコピーしています。

// 受信したデータを書き出し
for(size_t i=rsv_size; i<recv_buf_len; i+=2)
    std::cout  << (recv_buf[i + 1] << 8) + recv_buf[i] << std::endl;

受信したデータを標準出力で出力します。受信バッファrecv_bufには1バイトずつデータが入っているので、1ワードずつ出力するには、forループで2つずつ進めて上位バイトを8bitシフトさせて下位バイトを足して、ワードデータにして表示しました。出力は下記のようになります。

1
10
100

構造体で作成することができました。次回からはMX Componentの関数にあるような感じでクラスを作っていきます。