SimInTechダむナミックシミュレヌション環境のステヌトマシン。 パヌト3. Cコヌドに枡したす

第1郚ず第2郚では、「有限状態マシン」のロゞックに基づいお制埡システムを䜜成する䟋を怜蚎し、ヒヌタヌコントロヌラヌのモデルを䜜成したした。

このパヌトでは、「ステヌトマシン」のロゞックに基づいお制埡プログラムを実装するSimInTechからCコヌドを生成し、MS Visual Studio 2015でSimInTechのオブゞェクトモデルず共に削陀する方法を瀺したす。

SimInTech環境の有限状態マシンロゞックに基づいお前の段階で䜜成された制埡アルゎリズムは、コントロヌラヌにロヌドする準備ができお自動的にCコヌドに倉換できたす。 コントロヌラヌが手元にないので、この䟋では生成されたコヌドからdllを収集したす。 このパヌトでは、モデルを準備し、SimInTech環境からCコヌドを生成するための䞻な手順を分析したす。

前の手順で䜜成したプロゞェクトをHeater.prtずいう名前で保存したす

Cコヌドを䜜成するには、䞀般モデルをオブゞェクトモデルず制埡システムモデルに分割する必芁がありたす。 最初の段階では、制埡モデルを「ヒヌタヌコントロヌラヌ」サブ構造にパックしたため、この構造を別のプロゞェクトに入れるだけで十分です。

「Controller_dll」ずいう新しいプロゞェクトを䜜成し、同じディレクトリに保存したす。 次に、「Heater controller」ブロックをコピヌしたす。

SimInTechで倖郚プログラムを䜜成するには、特別な入力-出力ブロックを䜿甚する必芁がありたす。 これらのブロック「入力接点S3」および「出力接点S3」は、「デヌタ」タブにありたす図45-46を参照。

画像
図45.ブロック入力接点S3。

画像
図46.ブロック出力ピンS3。

図に2぀のブロック「入力接点S3」ず2぀のブロック「出力接点S3」を配眮し、ブロック「ヒヌタヌコントロヌラヌ」に接続したす。 回路のタむプを図47に瀺したす。

画像
図47.別のプロゞェクトのヒヌタヌコントロヌラヌのアルゎリズム図。

入力を構成するには、ブロックのプロパティを入力しブロックをダブルクリック、次のように入力ポヌトを構成したす。

「連絡先名」-入力最初のブロックは0、入力2番目のブロックは1
「コンタクトタむプ」-フロヌト図48を参照

画像
図48.プログラムぞの入力信号の蚭定。

出力を構成するには、ブロックのプロパティに移動し、次のように出力ポヌトのパラメヌタヌを構成したす。

「連絡先名」は、最初のブロックでは0、2番目のブロックでは1です。
「コンタクトタむプ」-フロヌト図49を参照

画像
図49.制埡プログラムからの出力信号の蚭定。

プログラムたたは動的ラむブラリの名前を蚭定するには、ダむアグラムりィンドりの[蚈算パラメヌタ]ボタンをクリックしたす。 衚瀺されるダむアログボックスで、将来のプログラムの名前を指定したす。 [アルゎリズムの名前]パラメヌタヌで、controller_dllを指定したす。 図50を参照

画像
図50.プログラム名の蚭定。

プロゞェクトをdll.prt_controllerずしお保存したす。

コヌド生成プロセスのセットアップに移りたしょう。 プログラムのメむンメニュヌで、[コヌドゞェネレヌタ]を遞択したす。 ダむアログボックスで、[蚭定]タブに移動し、テンプレヌトコヌドディレクトリ「codetemplatesVC2015 \」を遞択したす図51を参照。

画像
図51.コヌド生成テンプレヌトの構成。

コヌドを生成するために、さたざたなコンパむラヌ甚に構成された準備枈みテンプレヌトのセットがありたす。 SimInTech開発者は、さたざたなハヌドりェアプラットフォヌムずOS向けに蚭蚈されたコヌド生成テンプレヌトにいく぀かのオプションを提䟛したす。 その䞭でも、Windows、Linux、QNX甚のコヌド生成。 開発者サむトから、Windows実行可胜ファむルずラむブラリを䜜成するためのMinGWツヌルキットをダりンロヌドできたす。

この䟋では、Visual Studio 2015コンパむラ甚のテンプレヌトを䜿甚したすが、このプログラムの無料「共産䞻矩者」バヌゞョンで十分です。 Visual Studio Community 2015のバヌゞョンは、公匏Webサむトbeta.visualstudio.com/enからダりンロヌドできたす。

プログラムのメむンテキストは、ANSI暙準に準拠した玔粋なCコヌドの圢匏で䜜成されたす。 このテキストは、さたざたなコンパむラ甚に事前に準備されたテンプレヌトに配眮されたす。

プログラムのメむンメニュヌでコヌドを生成するには、「ツヌル」項目ずサブ項目「プログラムの生成」を遞択したす。 この項目を遞択するず、ダむアグラムりィンドりの䞋郚に゚ラヌメッセヌゞが衚瀺されたす。 ゚ラヌ行をダブルクリックするず、゚ラヌが発生したサブモデルに移行し、プログラムコヌドを生成できないブロックが遞択されたす図52を参照。

画像
図52.゚ラヌメッセヌゞず゚ラヌのあるブロックの匷調衚瀺。

この堎合、゚ラヌは、䞀般的なプロゞェクトでグロヌバルflash_time信号を䜿甚しお、遷移の応答時間を状態onからoff状態に、そしおその逆に倉曎したためです。 そのような信号がない新しいプロゞェクトに回路の䞀郚を転送した埌、SimInTechぱラヌを衚瀺したす。 この゚ラヌは、新しいプロゞェクトでこの信号を䜜成するこずで修正されたす。 SimInTechメむンメニュヌで、[サヌビス]項目の[信号]サブメニュヌを遞択したす図53を参照

画像
図53.プロゞェクト信号の呌び出し蚭定。

新しい信号を䜜成しりィンドりの䞋郚にあるボタンを远加、flash_timeずいう名前を蚭定したす。 モヌドを「無指向性」に蚭定し、デフォルト倀を5に蚭定したす図54を参照。

画像
図54.プロゞェクト信号の远加。

[OK]ボタンでダむアログボックスを閉じ、コヌド生成プロセスを繰り返したす。プログラムのメむンメニュヌで、[ツヌル]項目の[プログラムの生成]サブ項目を遞択したす。

Visual Studio Community 2015環境が正しくむンストヌルされおいる堎合、察応するテキストが回路のメッセヌゞボックスに衚瀺されたす図55を参照。

画像
図55.プロゞェクトメッセヌゞりィンドり。
[゚ラヌ]「コヌド生成モゞュヌルが登録されおいたせん。 回路のブロックの最倧蚱容数200 "
[゚ラヌ]「プロゞェクト内のブロック数56」

メッセヌゞの最初の2行は、゚ラヌ未登録のコヌド生成モゞュヌルに぀いお通知したす。 未登録のフォヌムでは、ブロック数が200を超えない回路のコヌドをモゞュヌルで生成できたす。このプロゞェクトには56個のブロックが含たれおいるため、゚ラヌメッセヌゞにもかかわらずコヌドが生成されたす。

[情報]「゜ヌスコヌドはc\ simintech \ demo \ automatic \ State maps-state flow \ Heater controller \ controller_dll.incに保存されたす。」
[情報]「状態セクションはcに保存されたす\ simintech \ demo \ automatic \状態マップ-状態フロヌ\ヒヌタヌコントロヌラヌ\ controller_dll_state.inc」
[情報]「タむトルはcに保存されたす\ simintech \ demo \ automatic \ State maps-state flow \ Heater controller \ controller_dll.h」
[情報]「タむトルはcに保存されたす\ simintech \ demo \ automatic \ State maps-state flow \ Heater controller \ controller_dll_init.inc "
[情報]「プログラムの゜ヌスコヌドが生成されたす」

次のメッセヌゞは、゜ヌスコヌドファむルの䜜成に぀いおナヌザヌに通知し、それらの堎所を瀺したす。 コヌドゞェネレヌタヌの蚭定で特に指定されおいない限り、ファむルはプロゞェクトを保存したディレクトリず同じディレクトリに保存されたす。

[情報]「コヌドテンプレヌトが䜿甚されたすC\ SimInTech \ bin \ CodeTemplates \ VC2015 \」
[情報]「compile.batアセンブリスクリプトの実行」c\ simintech \ demo \ automatic \ State maps-state flow \ Heater controller \ controller_dll“ 192.168.1.1 root root”

次に、SimInTechは、どのコヌドテンプレヌトが䜿甚されおいるかどのディレクトリにあるかを報告したす。
最埌の行は、controller_dllビルドスクリプトが実行されおいるこずを瀺しおいたす。 Visual Studio 2015プログラムが正しくむンストヌルおよび構成され、゚クスプロヌラヌを開くず、すべおのファむルが元のプロゞェクトず同じフォルダヌにあるこずがわかりたす。 図56を参照
画像
図56.コヌドゞェネレヌタヌずコンパむラヌによっお䜜成されたファむル。

プロゞェクトから䜜成されたDLLを呌び出す


゜ヌスプロゞェクトを開きHeater.prtずいう名前で保存、Heater_loader.prtずいう名前で保存したす。このプロゞェクトは、SimInTech環境で䜜成されたコヌドをテストするために䜿甚したす。

「Heater Controller」ブロックを削陀し、「Substructures」タブから「External DLL」ブロックを配眮したす図57を参照。

画像
図57. dllテスト甚のプロゞェクトのセットアップ。

デフォルトでは、このブロックには入力ポヌトず出力ポヌトが含たれおいたせん。 このブロックを構成するには、ブロックをダブルクリックし、ブロックプロパティで次のパラメヌタヌを蚭定したす図58を参照。


画像
図58.倖郚dllブロックのプロパティの蚭定

「OK」ボタンを抌しおりィンドりを閉じたす。その埌、「External DLL」ブロックの図にリモヌトブロック「Heater Controller」のポヌトず同様のポヌトが衚瀺されたす。 図59に瀺すように回路を接続したす。

画像
図59. dllテストのヒヌタヌ図。

その埌、蚈算のためにプロゞェクトを開始し、dllでアセンブルされたコヌドがどのように機胜するかを確認できたす。
以前、「External DLL」ブロックのプロパティでコヌドが生成されたプロゞェクトの名前を指定したしたが、シミュレヌション䞭に「External DLL」ブロックの画像をダブルクリックするこずで、コヌドが生成されたプロゞェクトりィンドりが開き、芳察できるようになりたすコヌドはdllで動䜜したす。 図60を参照。


図60. dllの䜜業スキヌムの衚瀺。

モデルを蚈算するためのグラフを図61に瀺したす。グラフは、シャットダりン時に枩床が䜎䞋し、加熱時に枩床が䞊昇するこずを瀺しおいたす。 動䜜モヌドは、最初の段階で䜜成された有限状態マシンのモデルに察応するこずもわかりたす。 最初に、40秒間、ヒヌタヌがオフになり、冷华速床で枩床が䜎䞋し、次に20秒間オンになり、加熱速床で枩床が䞊昇したす。 そしお、サむクルが繰り返されたす
しかし、むンゞケヌタヌは蚈画どおりに機胜したせん。 むンゞケヌタはステヌタスを正しく衚瀺したすが、スむッチング呚波数は倉わりたせん。 明らかに、むンゞケヌタヌモデリングブロックのflash_timeプロパティには問題がありたす図61を参照

画像
図61. dllのコントロヌラヌを䜿甚したヒヌタヌのグラフ。

SimInTechでのCコヌド生成の機胜


コヌドず元のモデルの間で怜出された䞍䞀臎は、コヌドゞェネレヌタヌの機胜に関連付けられおいたす。 シミュレヌションモヌドのSimInTech環境では、任意のプロパティを倉数ずしお蚭定し、スクリプト蚀語を䜿甚しお蚈算できたす。これは、指瀺を制埡するステヌトマシンを䜜成するずきに行いたした。 シミュレヌション䞭、ブロックプロパティの倉曎は可胜です。 SimInTechの数孊的コアは、ブロックの゜ヌトプロセスず蚈算プロセスでこれを考慮したす。 SimInTech環境の「State Exposure」ブロックの操䜜図を図62に瀺したす。

画像
図62. SimInTech環境の「State Exposure」ブロックの操䜜図。

シミュレヌション䞭に倖出先でパラメヌタヌを倉曎できるため、システムの柔軟性が倧幅に向䞊し、SimInTech最適化ツヌルを䜿甚しおブロックパラメヌタヌを遞択したり、コントロヌルを調敎したりできたす。

Cコヌドを䜜成する堎合、指定されたパラメヌタヌを䜿甚しおブロックの入力ず出力を明確に察応させる必芁がありたす。 Cコヌドを生成するずき、パラメヌタヌを倉曎する機胜は、コヌドの圢成に䞍確実性をもたらしたす。入力倀、ブロックのプロパティ、ブロック関数の蚈算結果の間には明確な分離が必芁です。 この䞍確実性を排陀するために、すべおのブロックプロパティはコヌド生成䞭に定数に倉換されたす。 Cコヌドの「State Exposure」ブロックの動䜜図を図63に瀺したす。

画像
図63. Cコヌドの「露出状態」ブロックの操䜜図

Cコヌドで䜜業しおいるずきにブロックのプロパティを倉曎するには、コヌドの操䜜䞭にflash_time信号が倉化するこずを明瀺的に瀺す必芁がありたす。 この堎合、コヌドゞェネレヌタヌの堎合、このプロパティは通垞の入力に倉わり、ブロックプロパティの䞍確実性は削陀されたす。 「State Exposure」ブロックの操䜜図は、図64に瀺すようになりたす。

画像
図64. Cコヌドで露光時間が可倉のナニットの操䜜スキヌム。

SimInTechでのCコヌド生成の䞊蚘の機胜を考慮しお、コントロヌラヌを修正したしょう。

Controller_dll.prtプロゞェクトを開き、「Heater Controller」サブモデルをダブルクリックしおから、それをオフにしお、「Programming Language」ブロックを回路から削陀したす。 回路の[デヌタ]タブから[信号リストに蚘録]ブロックを配眮したす図65を参照

画像
図65.修正埌の状態図は「オフ」です。

「信号リストに曞き蟌む」ブロックのプロパティで、信号名-flash_timeを指定したす。 図66を参照

画像
図66.「信号リストに曞き蟌む」ブロックのプロパティ

ステヌタスがオンの堎合、このプロセスを繰り返したす。 2぀のブロック「定数」ず「信号のリストに曞き蟌む」をコピヌしお、ステヌタスブロックに貌り付けるこずができたす。 ナニットぞの入力で、定数1加熱モヌドでの切り替え時間を適甚したす。 含たれるステヌタスブロック図は、図67のようになりたす。

画像
図67.オン状態での䜜業スキヌム。

したがっお、コヌドを生成するずきに状態回路からの信号を倉曎するこずを明瀺的に瀺したした。

衚瀺のステヌトマシンのセットアップに移りたしょう。 ディスプレむマシンのサブモデルを入力しおから、オフ状態にしたす。 「状態露出」ブロックを削陀し、「有限状態マシン」タブから「倉数状態露出」ブロックを眮き換えたす。

たた、図の「デヌタ」タブから「信号のリストから読み取る」ブロックを配眮したす。 信号名をflash_timeに蚭定したす。 回路は図68のようになりたす。

画像
図68.状態図は自動タむマヌ操䜜に含たれおいたす。

オフ状態に぀いおも同じ手順を繰り返したす。 レむアりトは、図69に瀺すようになりたす。

画像
図69.ステヌタス図はオフになっおいたす。

したがっお、コヌドゞェネレヌタヌに察しお、状態の露出時間の倀を倉曎するこずを明瀺的に瀺したすむンゞケヌタヌの点滅間隔。 プロゞェクトを保存したす。

コヌド生成プロセスを繰り返したす。 プログラムのメむンメニュヌで、[ツヌル]項目の[プログラムの生成]を遞択したす。 䞊蚘の手順に埓った堎合、Cコヌドからdllが䜜成されたす。

Heater_Loader_Holeプロゞェクトを開きたす。 蚈算のためにプロゞェクトを実行し、自動衚瀺が正しく機胜し、モヌドに応じお衚瀺の頻床が倉曎されるこずを確認したす。 図70を参照

画像
図70. dllのコントロヌラヌを䜿甚したヒヌタヌの操䜜。

Visual Studio 2015ずSimInTechでの共同デバッグ


デフォルトでは、SimInTech環境は、回路からプログラムを䜜成するプロセスが完党に自動化されるように構成されおいたす。 ナヌザヌは、Cでプログラムのテキストを線集する必芁はありたせん。 ナヌザヌは回路からプログラムを受信し、コントロヌラヌにダりンロヌドする準備ができおいるか、dllの圢で提䟛されたす。 前の䟋は、コヌドを線集せずにプログラムを䜜成する方法を瀺しおいたす。

ただし、Cコヌドを同時にデバッグし、SimInTechを䜿甚しおこのコヌドをテストする必芁がある堎合がありたす。 次に、SimInTech環境でテストしおCコヌドを手動で線集するようにVisual Studio 2015を構成する方法を瀺したす。

SimInTechは、コヌド生成ずプログラム䜜成を自動化するために、さたざたなコンパむラヌず開発環境甚に事前構成されたテンプレヌトを䜿甚したす。 この䟋では、フォルダヌにあるVisual Studio 2015テンプレヌトを䜿甚したした。
C\ SimInTech \ bin \ CodeTemplates \ VC2015

このフォルダヌには、完党に自動化されたラむブラリアセンブリを提䟛するコマンド起動ファむルが含たれおいたす。 コヌドを生成するずき、コヌドを含むファむルはプロゞェクトディレクトリたたは構成䞭にナヌザヌが指定した別のディレクトリずテンプレヌトディレクトリの䞡方に配眮されたす。 プロゞェクトフォルダ内の名前は、生成コヌドの蚭定内のプログラム名に察応しおいたす。 テンプレヌトフォルダヌ内のファむル名は固定されおおり、SimInTechで異なるプロゞェクトを生成するず、ファむルは䞊曞きされたす。

テンプレヌトパック内のファむルずヒヌタヌコントロヌラヌのプロゞェクトフォルダヌずの察応を次の衚に瀺したす。

画像

゜ヌスコヌドをデバッグしお手動で線集するには、C\ SimInTech \ bin \ CodeTemplates \ VC2015 \ srcフォルダヌをプロゞェクトの䜜業ディレクトリに転送する必芁がありたす。 この䟋では、次を実行したす。

  1. C\ SimInTech \ bin \ CodeTemplates \ VC2015 \ srcをHeater ControllerプロゞェクトがあるフォルダヌにコピヌしたすC\ SimInTech \ Demo \ Heater Controllerがありたす。

  2. Visual StudioのC\ SimInTech \ Demo \ Heater Controller \ srcディレクトリにあるVisual Studio 2015プロゞェクトファむルexample_cpp.vcxprojを開きたす。

  3. プロゞェクト蚭定で、䜜業ディレクトリぞのパスを指定したす。 これを行うには、「゜リュヌション゚クスプロヌラヌ」りィンドりで、example_cppファむルを遞択し、「プロパティ」ボタンをクリックしたす。 蚭定ダむアログボックスで、dll呌び出しを含むプロゞェクトが眮かれおいる䜜業ディレクトリを「出力ディレクトリ」ずしお遞択したす。 この䟋では、䜜業ディレクトリは゜ヌスファむルがあるディレクトリの1レベル䞊にありたす。 䜜成されたdllの名前「タヌゲット名」はcontroller_dll、䜜成されたファむルの拡匵子はdllです。 図71を参照


    図71.䜜業甚デバッグディレクトリの蚭定

  4. [デバッグ]セクションに移動し、SimInTech環境ぞの呌び出しを構成したす。
    • 「コマンド」-C\ SimInTech \ bin \ mmain.exe-プログラム実行可胜ファむルの名前。
    • 「コマンド匕数」-「C\ SimInTech \ Demo \ Heater Controller \ Heater_loader_dll.prt」は、デバッグされたdllを呌び出すプロゞェクトの名前です。
    • 「䜜業ディレクトリ」-C\ SimInTech \ Demo \ Heater Controller \プロゞェクトずデバッグdllがある䜜業ディレクトリ図72を参照


図72. DLLデバッグ甚のSimInTech環境の構成。

ブレヌクポむントを蚭定しおRUN_FUNCプログラムを実行するメむンプロシヌゞャを入力し、Visual Studio 2015の察応するボタンをクリックしおロヌカルデバッグを開始したす図73を参照。


図73.プログラム本䜓のブレヌクポむント

すべおの蚭定が正しく行われおいる堎合、ロヌカルデバッグを開始するず、SimInTechが起動し、プロゞェクトHeater_loader_dll.prtがその䞭で開かれたす。

SimInTech環境でこのプロゞェクトのシミュレヌションを開始するず、デバッグされたcontroller_dll.dllが最初のステップで呌び出され、ブレヌクポむントでVisual Studio 2015に制埡が移動したす。

䜜成されたプロゞェクト構成ず䜜業ディレクトリの蚭定により、Visual Studio 2015でCコヌドを手動で倉曎し、SimInTechのモデルず共にステップバむステップのコヌドデバッグを実行できたす。 プログラムのメむンテキストはprog.incファむルにありたす図73を参照。

Visual Studioでinc拡匵子を持぀ファむルの構文匷調衚瀺を蚭定するには、メむンメニュヌの[ツヌル] / [オプション..]を遞択し、[テキスト゚ディタヌ/ファむル拡匵子]セクションのダむアログボックスでinc拡匵子を远加したす。


図74.ファむル拡匵子の構成。

蚈算スキヌムのブロックに関連付けられたCコヌドのセクションを怜玢するには、次の手順を実行したす。

  1. ダむアグラムでブロックを遞択したす。
  2. ブロックプロパティを線集するためのりィンドりを呌び出したすダブルクリック。
  3. [党般]タブで、䞀意の識別子UID倀を芋぀けたす。
  4. Visual Studioりィンドりで、怜玢はUID =” N”ずいうテキストを芋぀けたす。ここで、Nはブロックの䞀意の識別子の番号です。 図75を参照


図75.回路内のブロックむンデックスによるCコヌドの怜玢。

SimInTechの最新バヌゞョンはここでリク゚ストできたす...
プロゞェクトファむルを含むアヌカむブはここにありたす...

Source: https://habr.com/ru/post/J309296/


All Articles