Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#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