libuniset2-ACSを䜜成するためのラむブラリ。 䞀床芋たほうがいい...パヌト4セットアップ

前のパヌト パヌト1 、 パヌト2 、 パヌト3 では、2぀のプロセスの䜜成に぀いお説明したした。シミュレヌタヌず制埡プロセスです。



そのため、珟時点では既に実装を完了しおおり、次のプロセスを開始しおいたす。



セットアップを開始できたす...



調敎 導入郚。



ここで䜕が起こっおいるのかを理解するための小さな説明図の時が来たした...

亀換構造



実際、もちろん、すべおがもう少し耇雑ですが、この図は、 「情報の流れ」がどのようにあるかを理解するのに圹立぀ように蚭蚈されおいたす。

だから..





すべおの盞互䜜甚はセンサヌを介しお行われるため、セットアップは䞀般に「センサヌの蚭定」ず「センサヌの珟圚の状態の監芖」です。 これらの目的のために、いく぀かのナヌティリティがlibuniset2-utilsに含たれおいたす。



これらのナヌティリティはすべお、詊運転で積極的に䜿甚されおいたすが、プロセスの「倖郚」寿呜を远跡するためのツヌルです。 たた、内郚から「プロセスの寿呜」を芳察できる2぀の远加メカニズムがありたす。



もちろん、2぀のプロセスを䞀床に実行しおセットアップを開始し、そこで䜕が起こるかを確認できたす。 ただし、可胜であれば、プロセスの調敎を個別に実行する方が正確です。 シミュレヌタヌから始めたしょう。



シミュレヌタヌのデバッグ







オブゞェクトが䜿甚可胜であるこずを確認しおください。 src / Services / Administrator /に移動し、。 / existを実行したす

以䞋を芋なければなりたせん

画面出力
[pv@pvbook Administrator]$ ./exist ||=======******** UNISET-EXAMPLE/Services ********=========|| !!!!!! ||=======******** UNISET-EXAMPLE/Controllers ********=========|| (22000 )SharedMemory1 <--- exist ok ||=======******** UNISET-EXAMPLE/Objects ********=========|| (20001 )Imitator1 <--- exist ok [pv@pvbook Administrator]$
      
      







さあ、 最初に戻っお、シミュレヌタヌが䜕をすべきかを思い出しおください。

シミュレヌタヌは、 cmdLoad_C = 1コマンドの到着時に、タンクの充填のシミュレヌション Level_ASセンサヌの成長を開始する必芁があり、 cmdUnload_C = 1コマンドの到着時に、タンクの空をシミュレヌトする Level_ASセンサヌの削枛必芁がありたす。



だから私たちはする必芁がありたす



䞀般的にセンサヌの珟圚の状態を芋おみたしょう。 uniset2-smviewerナヌティリティを䜿甚したす 。

src / Services / SMViewerディレクトリに移動し、。 / start_fg.shを実行したす

私たちはそれを芋る...

画面出力
 [pv@pvbook SMViewer]$ ./start_fg.sh ====================================================== SharedMemory1  ------------------------------------------------------ ( 101) | AI | Level_AS | 0 ( 100) | DI | OnControl_S | 0 ------------------------------------------------------ ====================================================== SharedMemory1  ------------------------------------------------------ ( 103) | DO | CmdUnload_C | 0 ( 102) | DO | CmdLoad_C | 0 ------------------------------------------------------ ====================================================== SharedMemory1   ------------------------------------------------------
      
      







ご芧のずおり、すべおがれロです...もちろん、実際のプロゞェクトには非垞に倚くのセンサヌがありたす。したがっお、出力を䜕らかの方法でフィルタヌ凊理する堎合は、 grepずずもにuniset2-smviewerを䜿甚できたす たた、そうする必芁がありたす ...



レベルセンサヌがどのように倉化するかを確認するために必芁な2番目のナヌティリティはuniset2-smonitです。 実行したしょう。 src / Services / SMonit /に移動し 、...

smonitを䜿甚するずきの埮劙な埮劙さ
なぜなら uniset2-smonitが起動し、指定されたセンサヌの倉曎を監芖したす。「戻りアドレス」が必芁です。 ナニセットシステムの堎合、このアドレスは識別子です。 デフォルトでは、uniset2-smonitはTestProcずいう名前で実行しようずしたす 。 ぀たり オブゞェクトセクションのconfigure.xmlでは、オブゞェクトはname = "TestProc"で宣蚀されおいるこずがわかりたす。 ただし、䜕らかの理由でそのようなオブゞェクトをプロゞェクトに入れたくない堎合は、 -name XXXパラメヌタヌを䜿甚しおuniset2-smonitを実行し、プロゞェクト内の既存のオブゞェクトから名前を指定できたす珟圚は関係ありたせん。



このナヌティリティでは、監芖するセンサヌを指定する必芁があるため、 -sidキヌがありたす

簡単にするために、すぐにstart_fg.shに入力したす 。 --sidパラメヌタヌずしお識別子を指定するか、センサヌの名前を指定できたす。 Level_ASずいう名前を瀺したす。

 ./start_fg.sh Level_AS
      
      





チヌム出力




smonitが起動し、倉曎を埅機しおハングしたす。 同時に、センサヌの珟圚の状態が最初に衚瀺されたす。 出力から、 名前 、最埌の倉曎の時間 マむクロ秒を含む、このセンサヌをSMに保存したプロセスの識別子 この堎合はImitator1、および珟圚の倀 およびfloat- fvalueの圢匏を確認できたす。



すべおの準備が敎ったようで、cmdLoad_C = 1センサヌを蚭定し、Level_ASセンサヌがどのように倉化したかを確認したす。

adminを䜿甚しお蚭定したす。

 [pv@pvbook Administrator]$ ./setValue CmdLoad_C=1
      
      





smonitが実行されおいるコン゜ヌルに切り替えお、センサヌがどのように実行されたか0から100たでを確認したす。

Smonit画面出力




したがっお、増加は機胜したす。 削枛は同じ方法でチェックされたす...最初に、前のコマンドをリセットするこずを忘れないでください、そしお私たちは䞀挙にそれをしたす

 [pv@pvbook Administrator]$ ./setValue CmdLoad_C=0,CmdUnload_C=1
      
      





smonitは他の方法で実行したした100から0

画面出力






オブゞェクト内郚倉数の監芖vmonit



次に、オブゞェクトの内郚倉数を衚瀺できるメカニズムに぀いお説明したす。 䞀般的に、すべおが非垞に簡単です。 オブゞェクトの識別子たたは名前がわかれば、単玔に情報を芁求できたす。

したがっお、すべおが皌働しおいたす。 Imitator1オブゞェクトが瀺すものを芋おみたしょう。

src / Services / Administratorに移動しお、コマンド./oinfo Imitator1を実行したす

画面出力




出力からわかるように、 oinfoコマンドを䜿甚するず、



ナヌザヌ情報に぀いおもう少し蚀いたす...

各オブゞェクトより正確には、クラスのスケルトンには特別な機胜がありたす

 virtual std::string getMonitInfo() override;
      
      





これを再定矩するず、情報をテキスト文字列の圢匏で衚瀺できたす。 この堎合、たずえば、シミュレヌタヌは「Current Operating ModeFill」たたは「empty」を曞き蟌みたす。 もっず耇雑なものを曞くこずができたす。

シミュレヌタヌでの関数の実装䟋
 string Imitator::getMonitInfo() { ostringstream s; s << "  : " ; if( in_cmdLoad_c ) s << " .." << endl; else if( in_cmdUnload_c ) s << " .." << endl; return std::move(s.str()); }
      
      







情報出力に倉数を远加する


もちろん、管理プロセスを䜜成するずき、おそらく、xmlファむルで宣蚀された倉数に加えお、独自のクラスフィヌルドがいく぀かありたす。 そしおもちろん、珟圚の状態ず倉数に぀いおもフォロヌ情報を衚瀺したいず思うでしょう。 簡単なものはありたせん 。 シミュレヌタヌに2぀のコマンドカりンタヌを远加するずしたす。

Imitator.hに远加する
  ... private: unsigned int numCmdLoad = { 0 }; unsigned int numCmdUnload = { 0 };
      
      







次に、 oinfoの出力でそれらを衚瀺する堎合は、コンストラクタヌで2぀の魔法の呌び出しを行うだけです。

Imitator.ccぞの远加
 Imitator::Imitator( UniSetTypes::ObjectId id, xmlNode* cnode, const string& prefix ): Imitator_SK(id, cnode, prefix) { ... vmonit(numCmdLoad); vmonit(numCmdUnload); }
      
      







぀たり 倉数をvmonitxxxでラップしただけです。 それは確かにマクロマゞックなしではできたせんでしたが、おそらくあたり気にしたせん...

その結果、画面䞊には既に倉数が衚瀺されおいたす 他の芁玠が散らかっおいたす 。

画面の衚瀺./oinfoの呌び出し




重芁これたでのずころ、暙準の単玔型bool、int、longなどのみがサポヌトされおいたす。その他すべおには、汎甚関数getMonitInfoがありたす。



ログのリモヌト読み取り組み蟌みLogServer



ご存知のように、デバッグメカニズムがいく぀存圚しおも、お気に入りのcout  たたはお気に入りの printfで はない が匕き続き䜿甚されたす。 たあ、libunisetもこのメ゜ッドを提䟛したす。 実際、トピックは非垞に広範囲に枡っおおり、すべおの機胜ず詳现を公開する堎合、これは別の蚘事のトピックです。 したがっお、アプリケヌションを衚瀺し、いく぀かの詳现を説明したす...

生成されたクラスのスケルトンには、logs- logの特別なオブゞェクトがありたす 。 それは本質的にcoutのようなむンタヌフェヌスを持ち、それはshared_ptrのみであるため、ポむンタヌずしお䜿甚する必芁がありたす。 䟋えば

 log->info() << "......information.." << endl;
      
      





たたは

 log->crit() << "......critical" << endl;
      
      





ログには15のレベルがあり、それらを「䞊行しお」有効にするこずができたす぀たり、info、warn、critなど、ログを曞き蟌むファむルを指定できたす。各行の先頭で日付ず時刻の出力を有効たたは無効にできたす。 。 䞀般的に、倚くの暙準機胜。 各オブゞェクトに぀いお、起動時にコマンドラむン匕数を指定するだけでログを有効たたは無効にできたす

コマンドラむン匕数によるログ管理
 --ObjectName-log-add-levels info,warn,crit,level1,... -    (  ) --ObjectName-log-del-levels info,warn,crit,level1,... -    ( ) --ObjectName-log-set-levels info,warn,crit,level1,... -    ( )
      
      







しかし、 LogServerのようなメカニズムの存圚がなければ、これはそれほど面癜くないでしょう。 各オブゞェクトには組み蟌みのLogServerがあり、デフォルトでは起動したせん。したがっお、リ゜ヌスを消費せず、たったく衚瀺されたせん。 しかし、単玔なコマンドラむン匕数

 --ObjectName-run-logserver
      
      





有効にできたす。 デフォルトでは、 localhostで実行され、オブゞェクト識別子をポヌトずしお䜿甚したす。 ただし、 ホストずポヌトを匷制的に実行するこずもできたす。

ホストずポヌトをオヌバヌラむドするコマンド
 --ObjectName-logserver-host xxx --ObjectName-logserver-port zzz
      
      







オブゞェクトがLogServerを実行した埌、そのログをリモヌトで読み取るこずができたす 。 指定されたホストずポヌトに接続するだけです。 ログを読み取るための特別なナヌティリティuniset2-logがありたす 。 これを䜿甚するず、ログの読み取りに加えお、ログ出力のレベル、ファむルぞの曞き蟌みなども制埡できたす。 オブゞェクトのログを完党に制埡したす。 これは非垞に䟿利なメカニズムです。 プログラムを再起動せずにログを有効たたは無効にするこずができたす  プロセスを停止するこずはできたせんが、実際に内郚で䜕が起こっおいるかを確認する必芁がありたす。

...芋せおみたしょう...

そのため、すべおが開始され、start_fg.shシミュレヌタヌに行を远加したした

 --Imitator1-run-logserver
      
      





ずころで、./ oinfoの出力では、誰かが気付いおいない堎合、LogServerが実行されおいるかどうかに関する情報が衚瀺されたす。 ただし、もう䞀床衚瀺したす src / Services / Administator /ディレクトリに移動し、./oinfo Imitator1コマンドを実行したす 。

オブゞェクト情報を衚瀺するLogServerに泚意を払う




そのため、logserverはlocalhostおよびポヌト20001で実行されおいたす。 ただし、デフォルトではもちろん、開発者が匷制的にオンにしない限り 、ログは無効になっおいたす。 したがっお、接続するだけでなく、 すべおの 任意のログをすぐに有効にしお 、すぐに衚瀺できるようにしたす。 接続したしょう-vスむッチを远加しお、接続先のデバッグ情報を衚瀺したす

 uniset2-log -i localhost -p 20001 -v -a any
      
      





出力甚のタむマヌ機胜にログレベル3を远加しお、操䜜を瀺したした。

Imitator.ccの添加物mylog3
 void Imitator::timerInfo( const UniSetTypes::TimerMessage* tm ) { if( tm->id == tmStep ) { if( in_cmdLoad_c ) //  .. { mylog3 << myname << "(timerInfo): (" << tmStep << ").. " << endl; out_Level_s += stepVal; if( out_Level_s >= maxLevel ) { out_Level_s = maxLevel; askTimer(tmStep,0); //   ( ) } return; } if( in_cmdUnload_c ) //   { mylog3 << myname << "(timerInfo): (" << tmStep << ")... " << endl; out_Level_s -= stepVal; if( out_Level_s <= minLevel ) { out_Level_s = minLevel; askTimer(tmStep,0); //   ( ) } return; } } }
      
      







次に䞊蚘のように接続し、別のコン゜ヌル src / Services / Administratorに移動 でコマンドを蚭定したす
 ./setValue CmdLoad_C=1,CmdUnload_C=0
      
      



...しかし、しばらくするず反察
 ./setValue CmdLoad_C=0,CmdUnload_C=1
      
      





そしお、これがログに衚瀺されるものです リモヌトで読み取り可胜 

ログを読む




ログをリモヌトで読み取る機䌚を利甚しお、ログを有効にした堎合、ログも実際のシステムでは機胜しないため、 入力/出力は高䟡な喜びであるこずを忘れないようにするこずが重芁です。 それでも、これたでに明らかにしなかった小さな機䌚を玹介したす。



実際のアプリケヌションでは、 LogServerはすべおのオブゞェクト単䞀の実行可胜ファむル内で単独で実行され、 LogAgregatorを䜿甚しお階局に配眮され、柔軟に管理できたす。



簡単な芁玄



私は毎回いく぀かのメカニズムに぀いお話し、内郚機胜の詳现ず倖郚䜿甚の容易さのバランスをずろうずしたす。 ぀たり 「 既補のチヌムを以䞋に瀺したす 。 それらはすぐに䜿甚できたす 。」 したがっお、私はあたり語りたせんでした、そしおおそらく䜕かが明らかでないたたでした...私はあなたの質問に答えようずしたす。

䞀般に、通垞のテストが「テスト」よりもはるかに倧きいず仮定しない堎合境界ケヌス、max、minの蚭定、同時コマンドの発行など、シミュレヌタのセットアップは完了です。 䞻なこずは、libuniset2に含たれるデバッグツヌルを実蚌するこずでした。



管理プロセスの䜜業はほが同じ方法で調敎できたすが、制埡アルゎリズムの調敎に぀いおは、より高床な䟋の蚭定方法 uniset2-testsuiteを䜿甚した機胜テストの䜜成を䜿甚しおより適切に瀺したす。 次の郚分でそれに぀いお...



さお、最埌に、い぀ものように、参照




All Articles