Created
October 12, 2019 05:44
-
-
Save lingmujianshi/eb7fbb8a7daa0b202ee028783b496d25 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <iomanip> | |
#define ASIO_STANDALONE | |
#include <asio.hpp> | |
#pragma pack(push,1) | |
//送信コマンドヘッダ | |
struct QNa3E_Frame_Send{ | |
std::uint16_t subheader=0x0050; //サブヘッダ | |
std::uint8_t network_number=0x00; //ネットワーク番号 | |
std::uint8_t pc_number=0xFF; //PC番号 | |
std::uint16_t request_IO_number=0x03FF; //要求先ユニットIO番号 | |
std::uint8_t request_station_number=0x00; //要求先ユニット局番号 | |
std::uint16_t request_data_length; //要求データ長 | |
std::uint16_t cpu_monitoring_timer=0x10; //CPU監視タイマ | |
} qna; | |
//一括読み出しコマンド | |
struct ReadAllCommand{ | |
std::uint16_t command=0x0401; //コマンドタイプ | |
std::uint16_t sub_command=0x0000; //サブコマンド | |
std::uint32_t top_device; //先頭デバイス | |
std::uint16_t number_of_device; //デバイス数 | |
} read_all; | |
//デバイス | |
enum struct Device_type : std::uint32_t{ | |
D = 0xA8, | |
X = 0x9C, | |
Y = 0x9D, | |
M = 0x90, | |
}; | |
//受信コマンドヘッダ | |
struct QNa3E_Frame_Receive{ | |
std::uint16_t subheader; //サブヘッダ | |
std::uint8_t network_number; //ネットワーク番号 | |
std::uint8_t pc_number; //PC番号 | |
std::uint16_t request_IO_number; //要求先ユニットIO番号 | |
std::uint8_t request_station_number; //要求先ユニット局番号 | |
std::uint16_t response_data_length; //要求データ長 | |
std::uint16_t terminal_code; //終了コード | |
}rsv; | |
#pragma pack(pop) | |
int main() | |
{ | |
try | |
{ | |
//デバイス番号を設定 | |
std::uint32_t device = static_cast<std::uint32_t>(Device_type::D); | |
read_all.top_device = ( device << 24) | 300; // D300 | |
read_all.number_of_device = 3; // 3ワード | |
//送信データ長を計算 | |
qna.request_data_length=sizeof(qna.cpu_monitoring_timer) + sizeof(read_all); | |
// UDP送信 | |
std::string const host = "192.168.0.10"; | |
short const port = 1025; | |
asio::io_context context; | |
asio::ip::udp::endpoint endpoint( | |
asio::ip::address::from_string(host), port); | |
asio::ip::udp::socket socket(context); | |
socket.open(asio::ip::udp::v4()); | |
socket.send_to(asio::buffer(&qna, sizeof(qna)), endpoint); | |
socket.send_to(asio::buffer(&read_all, sizeof(read_all)), endpoint); | |
// 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); | |
// 受信したデータを書き出し | |
for(size_t i=rsv_size; i<recv_buf_len; i+=2) | |
std::cout << (recv_buf[i + 1] << 8) + recv_buf[i] << std::endl; | |
} | |
catch (const std::exception &e) | |
{ | |
std::cerr << "exception: " << e.what() << std::endl; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment