コレは何?/What is this?
UDPで変数値を別端末に送るクラス。
メンバ関数と定義一覧
// コンストラクタ (関数オーバーロード: 宛先のみ指定する場合) // IPaddress_dest : 宛先IPアドレス, PortNum_dest : 宛先Port番号 // TypeOfVar : 送信する変数の型(ヘッダの定義を参照せよ), NumOfVar : 送信する変数の数 UDPTransmitter(const char* IPaddress, const unsigned short PortNum, VarType TypeOfVar, unsigned int NumOfVar); // コンストラクタ (関数オーバーロード: 発信元を指定する場合) // IPaddress_dept : 発信元IPアドレス, PortNum_dept : 発信元Port番号 // IPaddress_dest : 宛先IPアドレス, PortNum_dest : 宛先Port番号 // TypeOfVar : 送信する変数の型, NumOfVar : 送信する変数の数 UDPTransmitter(const char* IPaddress_dept, const unsigned short PortNum_dept, const char* IPaddress_dest, const unsigned short PortNum_dest, VarType TypeOfVar, unsigned int NumOfVar); ~UDPTransmitter(); // デストラクタ void SetNumOfVar(unsigned int NumOfVar); // 送信する変数の数を再設定する関数 注意:コンストラクタのNumOfVarを超えてはならない! // オーバーロードここから (そのうちテンプレートで書きなおす予定) // charデータを送信する関数 // Data : 送信データ, Length : 送信データのバイト数 void Transmit(const char* Data, unsigned int Length); // int16_tデータを送信する関数 Data : 送信データ volatile bool Transmit(int16_t* Data); // int32_tデータを送信する関数 Data : 送信データ volatile bool Transmit(int32_t* Data); // uint16_tデータを送信する関数 Data : 送信データ volatile bool Transmit(uint16_t* Data); // uint32_tデータを送信する関数 Data : 送信データ volatile bool Transmit(uint32_t* Data); // doubleデータを送信する関数 Data : 送信データ volatile bool Transmit(double* Data); // オーバーロードここまで // 送信データの型の設定用定義 enum VarType { UDP_INT16_T, // int16_t型 UDP_INT32_T, // int32_t型 UDP_UINT16_T, // uint16_t型 UDP_UINT32_T, // uint32_t型 UDP_DOUBLE // double型 };
使用例
#include "UDPTransmitter.hh" 1 : void ControlFunctions::ControlFunction1(ControlFunctions* pCF){ 2 : // 制御用周期実行関数1 3 : 4 : // 制御用定数設定 5 : const double Ts = ConstParams::SAMPLING_TIME[0]*1e-9; // [s] 制御周期 6 : 7 : // 制御用変数宣言 8 : static double u[2] = {3.141592}; // 送信する値 9 : 10 : // 制御器等々 11 : static UDPTransmitter* UDP1; 12 : 13 : if(pCF->CmdFlag==CTRL_INIT){ 14 : // 初期化モード (ここは制御開始時に1度だけ呼び出される(非実時間空間なので重い処理もOK)) 15 : UDP1 = new UDPTransmitter("192.168.0.39", 5121, UDPTransmitter::UDP_DOUBLE, 2); // UDP送信器の生成 16 : } 17 : if(pCF->CmdFlag==CTRL_LOOP){ 18 : // 周期モード (ここは制御周期 SAMPLING_TIME[0] 毎に呼び出される(実時間空間なので処理は制御周期内に収めること)) 19 : pCF->count++; // ループカウンタを進める 20 : t=pCF->count*Ts; // 時刻の計算 21 : 22 : // 制御ここから 23 : pCF->pIF->GetTorque(TorqueRes); // [Nm] トルク応答値の取得 24 : pCF->pIF->GetPosition(PositionRes); // [rad] 位置応答値の取得 25 : 26 : // ここにやりたい制御を書くがよい!! 27 : UDP1->Transmit(u); // UDP送信 28 : 29 : pCF->pIF->SetCurrent(CurrentRef); // [A] 電流指令値の出力 30 : // 制御ここまで 31 : 32 : // 任意変数値表示用 33 : pCF->IndicVars[0] = 0; // 表示変数 34 : pCF->IndicVars[1] = 0; // 表示変数 35 : pCF->IndicVars[2] = 0; // 表示変数 36 : pCF->IndicVars[3] = 0; // 表示変数 37 : pCF->IndicVars[4] = 0; // 表示変数 38 : pCF->IndicVars[5] = 0; // 表示変数 39 : pCF->IndicVars[6] = 0; // 表示変数 40 : pCF->IndicVars[7] = 0; // 表示変数 41 : 42 : // 任意変数プロット 43 : pCF->PlotVars[0] = 0; 44 : pCF->PlotVars[1] = 0; 45 : 46 : // データの保存 47 : pCF->Data[0] = t; // [s] 時刻の保存 48 : pCF->Data[1] = 0; // 保存変数 49 : pCF->Data[2] = 0; // 保存変数 50 : pCF->Data[3] = 0; // 保存変数 51 : pCF->ExpData->PutData(pCF->Data,ConstParams::DATA_NUM); // データ格納 52 : } 53 : if(pCF->CmdFlag==CTRL_EXIT){ 54 : // 終了処理モード (ここは制御終了時に1度だけ呼び出される(非実時間空間なので重い処理もOK)) 55 : delete UDP1; // UDP送信器の破棄 56 : UDP1 = NULL; 57 : } 58 : }
研究室の横の倉庫 - Side Warehouse of Laboratory
Copyright(C), Side Warehouse, All rights reserved.