#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