{"text_format":"1","workbook":"xlsx","n_sheets":9,"sheets":["テスト結果集計","テストシート","改版履歴(スクリプト)","⇒これ以降ユーザ編集禁止","取扱説明書","コマンドテーブル","library_pre","library_post","改版履歴(ツール)"],"not_rendered":{"charts":0,"images":0,"macros":1,"external_links":0,"defined_names":29,"comments":0,"pivot_tables":0},"unopened":[],"bounds":{"document_bytes":16777216,"sheet_cells":100000,"rows_first":2000,"rows_last":500,"rows_between":2000,"halvings":0,"cell_chars":16384,"cell_head_chars":4096},"cells_cut":0,"cells_raw":0,"read":"whole","date_system":"1900"}

{"sheet":"テスト結果集計","index":0,"n_rows":117,"n_cols":8,"rows_kept":117,"cut":false,"hidden":false,"merged":[[0,1,0,7],[4,1,4,5],[10,1,10,5],[1,5,1,7],[2,5,2,7],[1,1,1,4],[11,1,11,4],[12,1,12,4],[13,1,13,4],[2,1,2,4],[7,1,7,5],[8,1,8,5]]}
[{"$f":"IF(LatestResult=\"\",\"UNF\",LatestResult)","v":"UNF"},"パラメータ"]
[null,"ログ検索フォルダ"]
[null,"テストケース名称"]
[]
[null,"最新結果"]
[null,"No.","リビジョン","ターゲットバージョン","実施日付","判定結果"]
[]
[null,"テストの目的・概要・補足事項など"]
[]
[]
[null,"集計結果",null,null,null,null,"  ★使い方は”取扱説明書”シートを参照してください"]
[null,"OK　(件数）",null,null,null,null,"　★赤枠で囲まれた部分のみユーザ編集可能です（それ以外は編集禁止）"]
[null,"NG　(件数）",null,null,null,null,"　★このブックを\"テストケース名称.xlsm\"にリネームして使うと便利です"]
[null,"合計　(件数）",null,null,null,null,{"$f":"\"　★ツールバージョン：\"&ToolVersion","v":"　★ツールバージョン：version 1.08"}]
[]
[null,"No.","リビジョン","ターゲットバージョン","実施日付","ログファイル","最終行データ","判定結果"]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[null,"(END)"]

{"sheet":"テストシート","index":1,"n_rows":114,"n_cols":9,"rows_kept":114,"cut":false,"hidden":false,"merged":[[0,1,0,3],[1,6,2,8],[3,6,3,8],[10,1,10,3],[1,1,1,2],[2,1,2,2],[3,1,3,2],[4,1,4,2],[5,1,5,2],[7,1,7,2],[7,6,7,8],[8,6,8,7],[9,6,9,7],[0,6,0,8],[4,6,4,8],[5,6,5,8],[6,1,6,2],[9,1,9,3]]}
[null,"パラメータ",null,null,null,"外部DLL名称(空白時は外部DLL呼び出しコマンド使用不可）","ソースファイル検索ベースフォルダ(空白時はファイル名@コメント文字列によるブレークポイント指定不可)"]
[null,"Pythonスクリプト出力ファイル"]
[null,"テストケース名称",null,null,null,"★外部DLL名に\"\\\"パス記号を付けてはいけません（スクリプトと同じパスに置くこと）"]
[null,"テストケース作成者（任意）",null,null,null,"★呼び出し関数プロトタイプはint ___cdecl IronPythonExtention(wchar_t*, int)固定です  ","★ソースツリーが含まれる絶対パスを指定します(これより下のパスを再帰的に検索します)"]
[null,"テストケース作成日付（任意）",null,null,null,"第1引数：スクリプトのフルパス(L\"X:\\...\\～.py\")","★コメント文字列検出行に実行文が無い場合は、その一つ下の行にブレークポイントを設定します"]
[null,"テストケースリビジョン（任意）",null,null,null,"第2引数：”外部DLL呼び出し”コマンドのパラメータ","★IronPythonScriptExecutorの”スクリプト一括生成”コマンドで上書きされます"]
[null,"テストの目的・概要・補足事項など（任意）"]
[null,"対象ソフトウェアバージョン（任意）",null,null,"  ★使い方は”取扱説明書”シートを参照してください",null,"動作オプション"]
[null,null,null,null,"　★赤枠で囲まれた部分のみユーザ編集可能です（それ以外は編集禁止）",null,"比較失敗時にスクリプトを継続する(1:継続する 0:継続しない)",null,0]
[null,"CS+の表示(V)→Pythonコンソール(N)で入力するコマンド（スクリプト作成時にセットされます）",null,null,"　★このブックを\"テストケース名称.xls\"にリネームして使うと便利です",null,"メッセージボックスを表示せず、スキップする(1:スキップする 0:スキップしない)",null,0]
[null,null,null,null,{"$f":"\"　★ツールバージョン：\"&ToolVersion","v":"　★ツールバージョン：version 1.08"}]
[null,"★このコマンド以外でスクリプトを開始しないでください。Pythonコンソールでは”↑”・”↓”でヒストリ機能を使用できます"]
[null,"実行番号","コマンド名称\n（ユーザが編集します)","コマンド説明\n（自動入力されます）","パラメータ\n（ユーザが編集します）","パラメータ説明\n（自動入力されます）","コメント\n（動作に影響しません。ユーザが編集します）","ライブラリ関数\n（自動入力されます）","パラメータ種別\n（自動入力されます）"]
[null,{"$f":"IF(C14=\"\",\"\",ROW()-ROW(B$13))","v":""},null,{"$f":"IF($C14=\"\",\"\",VLOOKUP($C14,コマンド一覧表,2,FALSE))","v":""},null,{"$f":"IF($C14=\"\",\"\",VLOOKUP($C14,コマンド一覧表,3,FALSE))","v":""},null,{"$f":"IF($C14=\"\",\"\",VLOOKUP($C14,コマンド一覧表,5,FALSE))","v":""},{"$f":"IF($C14=\"\",\"\",VLOOKUP($C14,コマンド一覧表,6,FALSE))","v":""}]
[null,{"$f":"IF(C15=\"\",\"\",ROW()-ROW(B$13))","v":""},null,"",null,"",null,"",""]
[null,{"$f":"IF(C16=\"\",\"\",ROW()-ROW(B$13))","v":""},null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,{"$f":"IF($C25=\"\",\"\",VLOOKUP($C25,コマンド一覧表,3,FALSE))","v":""},null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,{"$f":"IF($C46=\"\",\"\",VLOOKUP($C46,コマンド一覧表,2,FALSE))","v":""},null,"",null,{"$f":"IF($C46=\"\",\"\",VLOOKUP($C46,コマンド一覧表,5,FALSE))","v":""},{"$f":"IF($C46=\"\",\"\",VLOOKUP($C46,コマンド一覧表,6,FALSE))","v":""}]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,{"$f":"IF($C78=\"\",\"\",VLOOKUP($C78,コマンド一覧表,2,FALSE))","v":""},null,"",null,{"$f":"IF($C78=\"\",\"\",VLOOKUP($C78,コマンド一覧表,5,FALSE))","v":""},{"$f":"IF($C78=\"\",\"\",VLOOKUP($C78,コマンド一覧表,6,FALSE))","v":""}]
[null,"",null,"",null,"",null,"",""]
[null,{"$f":"IF(C80=\"\",\"\",ROW()-ROW(B$13))","v":""},null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,{"$f":"IF($C89=\"\",\"\",VLOOKUP($C89,コマンド一覧表,3,FALSE))","v":""},null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,"",null,"",""]
[null,"",null,"",null,{"$f":"IF($C113=\"\",\"\",VLOOKUP($C113,コマンド一覧表,3,FALSE))","v":""},null,"",""]
[null,null,"(END)",null,null,null,null,{"$f":"C114","v":"(END)"}]

{"sheet":"改版履歴(スクリプト)","index":2,"n_rows":2,"n_cols":5,"rows_kept":2,"cut":false,"hidden":false,"merged":[[0,1,0,4]]}
[null,"改版履歴（テストスクリプト）"]
[null,"リビジョン","日付","内容","作成者"]

{"sheet":"⇒これ以降ユーザ編集禁止","index":3,"n_rows":0,"n_cols":0,"rows_kept":0,"cut":false,"hidden":false,"merged":[]}

{"sheet":"取扱説明書","index":4,"n_rows":353,"n_cols":32,"rows_kept":353,"cut":false,"hidden":false,"merged":[[107,2,107,3],[97,2,97,3],[98,2,98,3],[99,2,99,3],[100,2,100,3],[101,2,101,3],[102,2,102,3],[113,2,113,3],[108,2,108,3],[103,2,103,3],[104,2,104,3],[105,2,105,3],[109,2,109,3],[110,2,110,3],[111,2,111,3],[112,2,112,3],[106,2,106,3]]}
["IronPythonScriptGenerator"]
["version 1.08"]
["取扱説明書"]
[]
["１．目的"]
[]
[null,"このExcelワークシート及びVBAマクロは、ルネサス社の統合開発環境（IDE）である「CS+」（旧名CubeSuite+）を"]
[null,"自動運転するPythonスクリプトを簡易な操作で自動作成するためのものです。"]
[]
["２．できること"]
[]
[null,"(A)Excelワークシートをで”やりたいこと”を記述するだけで、CS+向けの自動運転スクリプトを自動生成できます。"]
[null,null,"自動運転スクリプトは「CS+」内蔵のIronPythonインタプリタで実行できるよう、Python言語で書かれています。"]
[]
[null,"(B)上記”やりたいこと”はブレークポイントの設定や変数の表示（ウォッチ）だけではなく、以下の機能をサポート"]
[null,null,"しています。"]
[null,null,"・CPUをリセットする"]
[null,null,"・CPUの実行を開始する（＝現在の位置から継続実行する）"]
[null,null,"・CPUの実行を強制的に停止する"]
[null,null,"・設定したブレークポイントに従い、CPUがブレークするまで待つ"]
[null,null,"・スリープ状態や通常状態など、CPUが特定の状態になるまで待つ"]
[null,null,"・表示した変数値/CPUレジスタ値/SFR値のビットマスクを行う（ANDマスク)"]
[null,null,"・表示した変数値/CPUレジスタ値/SFR値の比較検証を行う（一致・不一致・より大きい・より小さい・以上・以下）"]
[null,null,"・メモリ内容をファイルへ保存する、ファイルから読み込む、または指定値で埋める"]
[null,null,"・ロードモジュールをダウンロードする"]
[null,null,"・マルチディスプレイを含むスクリーン全体をキャプチャし、PNG形式で保存する"]
[null,null,"・メッセージボックスを表示する"]
[null,null,"・上記を含むすべての動作をテキスト形式でログファイルに記録する"]
[]
[null,"(C)自動運転スクリプトの実行結果を収集し、一覧で表示します。また、実行結果のうち最新のデータを選択し"]
[null,null,"その結果を表示します。"]
[]
["３．始めてみよう"]
[]
[null,"(1)準備"]
[]
[null,null,"スクリプトを設計する前に、CS+の「デバッグ・ツールでダウンロード」メニューでダウンロード可能な"]
[null,null,"実行モジュールが存在する（ビルドできる）ことを確かめてください。"]
[]
[null,null,"次に、テストケース名称を設計します。仮に通信に関するテストで、大項目1、中項目2、小項目3であれば"]
[null,null,"”通信テスト_1_2_3”のようになります。もちろん、命名規則はユーザ任意で決めて構いません。"]
[]
[null,null,"このファイル原紙、すなわち\"IronPythonScriptGenerator(v???).xlsm\"を、テストケース名称にコピーします。"]
[null,null,"上記の例では\"通信テスト_1_2_3.xls\"としてコピーします。"]
[null,null,"コピー先も階層化して構いません。たとえば\"通信テスト\\1\\2\\通信テスト_1_2_3.xlsm\"のようなフォルダ構成"]
[null,null,"として下さい。もしくは通信テストで1つにまとめて、\"通信テスト\\通信テスト_1_2_3.xlsm\"とするやり方もあります。"]
[]
[null,"(2)テスト項目入力"]
[]
[null,null,"”テストシート”シートで、以下の項目を入力します。"]
[]
[null,null,"（必須入力項目）"]
[null,null,"テストケース名称：”自動設定”ボタンで、Excelブックの名称が入力されます。"]
[]
[null,null,"Pythonスクリプト出力ファイル：”自動設定”ボタンで、Excelブックの拡張子を\".py\"に変えたものが入力されます。"]
[]
[null,null,"上記より、(1)準備でファイル原紙をテストケース名称に変え、さらに適切な場所にコピーしておけば"]
[null,null,"自動設定ボタンのみで事足りるようにしてあります。"]
[]
[null,null,"（任意入力項目）"]
[null,null,"テストケース作成者：”自動設定”ボタンで、現在Windowsにログオンしているユーザ名が入力されます。"]
[]
[null,null,"テストケース作成日付：”現在日付を設定”ボタンで、現在の日付が入力されます。"]
[]
[null,null,"テストケースリビジョン：テスト設計内容が変化した場合に番号を付与できるようにしてあります。"]
[null,null,"”リビジョンアップ”ボタンを押すと空白から\"1\"に変化し、その後\"2\"⇒\"3\"とボタンを押す度に1上がります。"]
[]
[null,null,"テストの目的・概要・補足事項など：このテストで何をテストしたいのか、注意事項は何かなど、自由に"]
[null,null,"記入してください。見やすくするためにAlt+Enterで改行を入れたり、セルの高さを加減しても構いません。"]
[]
[null,null,"対象ソフトウェアバージョン：ターゲットソフトのバージョンアップに伴い、テスト内容が追加されたり、変化したり"]
[null,null,"といったこともあると思います。任意項目ではありますが、なるべく入力することを推奨します。"]
[null,null,"例えばVer0.52のソフトを念頭に設計したテストであれば、\"Ver0.52\"や\"0052\"としてください。"]
[]
[null,"(3)テスト設計"]
[]
[null,null,"いよいよテスト設計に入ります。基本的にはCS+で手動操作することをイメージして設計してください。"]
[null,null,"また、デバッグ・ツールがターゲットモジュールにロードされた直後の状態からを書くようにしてください。"]
[]
[null,null,"具体的な操作は以下の通りです。"]
[]
[null,null,"”テストシート”シートのC14セル以降をクリックし、リストボックスからコマンドを選択する"]
[null,null,"↓"]
[null,null,"”テストシート”シートのE14セル以降をクリックし、パラメータを設定する"]
[null,null,"↓"]
[null,null,"”テストシート”シートのG14セル以降をクリックし、コメントを書き込む（任意）"]
[]
[null,null,"上記をテストしたいコマンド数だけ繰り返します。"]
[]
[null,null,"コメントは任意ですが、テストしたい内容（意味付け）などを自由に書き込むとよいでしょう。G列の幅を"]
[null,null,"広げることも、高さを広げて複数行にわたって書き込むことも自由です。"]
[]
[null,null,"コマンドによってはパラメータ不要のものもありますが、その場合はパラメータ欄はDon't careとなります。"]
[]
[null,null,"以下に典型的なテスト設計の例を示します。"]
[]
[null,null,"[No.]",null,null,"[コマンド]",null,null,null,null,null,null,null,null,null,null,null,null,null,"[パラメータ]"]
[null,null,1,null,null,"コメント",null,null,null,null,null,null,null,null,null,null,null,null,null,"変数値g_countの更新を確認",null,null,null,null,null,null,null,null,null,null,null,"←単なるコメントです"]
[null,null,2,null,null,"CPUリセット",null,null,null,null,null,null,null,null,null,null,null,null,null,"(不要のため空欄にしておく)"]
[null,null,3,null,null,"ブレークポイント全クリア",null,null,null,null,null,null,null,null,null,null,null,null,null,"(不要のため空欄にしておく)"]
[null,null,4,null,null,"ブレークポイント設定（ソフト）",null,null,null,null,null,null,null,null,null,null,null,null,null,"main.c#65",null,null,null,null,null,"←\"main.c\"の65行目という意味です"]
[null,null,5,null,null,"プログラム実行",null,null,null,null,null,null,null,null,null,null,null,null,null,"(不要のため空欄にしておく)"]
[null,null,6,null,null,"ブレークするまで待つ",null,null,null,null,null,null,null,null,null,null,null,null,null,"(不要のため空欄にしておく)"]
[null,null,7,null,null,"変数値表示（符号なし16進）",null,null,null,null,null,null,null,null,null,null,null,null,null,"main.c#g_count",null,null,null,null,null,null,"←main.cで宣言されたstatic/global変数g_countという意味です"]
[null,null,8,null,null,"変数値比較（一致）",null,null,null,null,null,null,null,null,null,null,null,null,null,1,null,null,"←上記g_countが1であることを期待値としてチェックします"]
[null,null,9,null,null,"書き込みデータ設定",null,null,null,null,null,null,null,null,null,null,null,null,null,2,null,null,"←No.10のため書き込み値を設定します"]
[null,null,10,null,null,"変数値設定",null,null,null,null,null,null,null,null,null,null,null,null,null,"main.c#g_count",null,null,null,null,null,null,"←g_count変数の内容を強制的に2に書き換えます"]
[null,null,11,null,null,"プログラム実行",null,null,null,null,null,null,null,null,null,null,null,null,null,"(不要のため空欄にしておく)",null,null,null,null,null,null,null,null,null,null,"←ブレーク位置から継続実行します"]
[null,null,12,null,null,"ブレークするまで待つ",null,null,null,null,null,null,null,null,null,null,null,null,null,"(不要のため空欄にしておく)"]
[null,null,13,null,null,"変数値表示（符号なし16進）",null,null,null,null,null,null,null,null,null,null,null,null,null,"main.c#g_count"]
[null,null,14,null,null,"変数値比較（不一致）",null,null,null,null,null,null,null,null,null,null,null,null,null,2,null,null,"←上記g_countが2でないことを期待値としてチェックします"]
[null,null,15,null,null,"スクリーンキャプチャ",null,null,null,null,null,null,null,null,null,null,null,null,null,"g_count"]
[null,null,16,null,null,"スクリプト終了"]
[]
[null,null,"コマンドを眺めてもらえれば、何をやっているかは分かると思います。g_countという変数にアクセスする"]
[null,null,"箇所にブレークを張り、No.7～No.8で変数値が1であるか確認します。No.9～No.10では変数値を強制的に"]
[null,null,"変更し、No.13～No.14で、さらにその値が（ターゲットプログラムによって）変更されていることを確かめます。"]
[null,null,"最後にNo.15でスクリーンキャプチャをPNG形式で保存し、終了とします。"]
[]
[null,null,"細かなコマンド説明はAppendixで記載しますが、以下のルールを守ってください。"]
[]
[null,null,"1.（コメントやコンソール出力を除いた）最初のコマンドは”CPUリセット”とする。"]
[null,null,null,"⇒これがないと、スクリプトの実行結果がその時々で変わってきます。必ず入れてください。"]
[null,null,null,"⇒ただし、”他のスクリプトを実行した後に実行される”というケースであれば必要ではありません。"]
[null,null,null,null,"（ブレークポイントを除き、前のスクリプト実行の最終状態が引き継がれます）"]
[]
[null,null,"2.（コメントやコンソール出力を除いた）次のコマンドは”ブレークポイント全クリア”とする。"]
[null,null,null,"⇒生成されるスクリプトは、最初にブレークポイント全クリアを暗黙的・強制的に行います。この動作は"]
[null,null,null,null,"テスト設計から見えませんので、上記No.3のように明示的にブレークポイント全クリアを入れてください。"]
[]
[null,null,"また、テストシートは最上行(14行)を除き、行を任意に挿入または削除できます。これにより別の処理を追加"]
[null,null,"したり、不要なコマンドを削除したりできます。その意味でも最初の行はコメントにしておくのが無難でしょう。"]
[]
[null,null,"コマンド列の最後は”スクリプト終了”コマンドで終わることが望ましいですが、それ以降がすべて空白コマンドで"]
[null,null,"ある場合に限り”スクリプト終了”を省略可能です。色々と編集・トライしたい場合は省略するのも一手です。"]
[]
[null,"(4)スクリプト生成"]
[]
[null,null,"”テストシート”右上の”スクリプト生成”を押すとテスト設計内容を検査するとともに、スクリプトファイルを"]
[null,null,"生成します。"]
[]
[null,null,"このときパラメータを必要とするコマンドのパラメータが空欄であれば、そのセルにフォーカスを当てて"]
[null,null,"エラーを示すメッセージボックスを表示します。パラメータを適切に設定してください。"]
[]
[null,null,"”～.pyを作成しました”というメッセージボックスが表示されれば、スクリプト作成は成功です。このとき、"]
[null,null,"B11セルの部分にSource('～.py')という内容がセットされています。これがCS+のPythonコンソールで"]
[null,null,"入力するコマンドになります。"]
[]
[null,"(5)動作テスト"]
[]
[null,null,"スクリプトが生成できたところで、さっそく自動運転させてみましょう。"]
[]
[null,null,"CS+でプロジェクトをオープンし、必要に応じてビルドを実施します。ビルド成功したら、”デバッグ(D)”→"]
[null,null,"”デバッグ・ツールへダウンロード(D)”を選択し、ロードモジュールをデバッグ・ツールへダウンロードします。"]
[]
[null,null,"次に”表示(V)”→”Pythonコンソール(N)”を選択し、Pythonコンソール・ウィンドウを表示させます。"]
[null,null,"（注）表示メニューにPythonコンソールが無い場合は、次の操作でPythonプラグインを有効にしてください。"]
[null,null,"・”ツール(T)”→”プラグインの管理(P)...”を選択し、”IronPythonコンソール・プラグイン”を有効にする"]
[]
[null,null,"”>>>”というプロンプトに続き、(4)のスクリプト生成時に設定されたコマンドをコピー＆ペーストで貼り付けます。"]
[null,null,"コマンドは Source('C:/通信テスト/1/2/通信テスト_1_2_3.py') のようになります。"]
[null,null,"⇒Pythonコンソールウィンドウの”スクリプト・ファイルを選択(S)...”メニューは使用しないで下さい。"]
[null,null,null,"ログ出力の際にログのファイルネームが不正になるなど、動作上の問題が出るためです。"]
[]
[null,null,"しばらくすると、次のメッセージボックスが表示されるはずです。"]
[null,null,"「ロードモジュールがデバッグ・ツールへダウンロードされていますか？」"]
[null,null,"⇒ダウンロードされていれば「はい」、そうでなければ「いいえ」を選択します。「いいえ」であればスクリプト"]
[null,null,null,"実行を中断します。"]
[null,null,"⇒テストシートで”スクリプト起動時に確認メッセージボックスを表示する”にOFFした場合、表示されません"]
[]
[null,null,"「画面レイアウトはスクリーンショット向けに調整されていますか？」"]
[null,null,"⇒コマンドに”スクリーンキャプチャ”を含む場合、含まない場合の両方で表示されます。含まない場合は"]
[null,null,null,"関係ありませんので、「はい」を選んでください。含む場合は以下のポイントを確認して「はい」を選んで"]
[null,null,null,"ください。「いいえ」を選択するとスクリプト実行を中断します。"]
[]
[null,null,null,"・ソースファイルエリアが十分な広さを持っている"]
[]
[null,null,null,"・Pythonコンソールエリアが十分な広さを持っている"]
[]
[null,null,null,"・ウォッチウィンドウが表示され、ウォッチ式に対象となる変数名が入力されている(任意）"]
[null,null,null,"たとえば”変数値表示”をコマンドに含む場合、そのパラメータをあらかじめウォッチウィンドウへ記載し、"]
[null,null,null,"”変数値表示”の後に”スクリーンキャプチャ”コマンドを入れると綺麗に画面が撮れます。"]
[]
[null,null,null,"同様に、”CPUレジスタ/SFR表示”コマンドを使う場合は、SFRウィンドウやCPUレジスタウィンドウを"]
[null,null,null,"あらかじめ表示させておき、パラメータで見たいレジスタが見える状態にしておくと良いでしょう。"]
[]
[null,null,"⇒テストシートで”スクリプト起動時に確認メッセージボックスを表示する”にOFFした場合、上記2つの"]
[null,null,null,"メッセージボックスとも表示されないスクリプトになります。複数のスクリプトを自動運転する場合は"]
[null,null,null,"OFFにした状態でスクリプト作成すると、毎回のスクリプトでメッセージボックス操作が不要になります。"]
[]
[null,null,"さて上記2つのメッセージボックス両方とも”はい”を選択すると、自動運転がスタートします。"]
[null,null,"自動運転は”Ctrl+D”キーを押すことで、いつでも強制停止できます。いつまでもブレークで止まらないなど"]
[null,null,"設計意図と異なる動作をする場合は、この操作で止めてください。"]
[]
[null,null,"実行完了したら、Pythonコンソールが次のメッセージで終わっているかチェックしてください。"]
[null,null,"[YYYY/MM/DD HH:MM:SS] スクリプト実行を正常終了しました"]
[]
[null,null,"このメッセージが出力されていれば、スクリプトは正常終了しています。そうでなければ失敗です。"]
[null,null,"ただし正常終了の場合でも、テスト設計後1度はPythonコンソールでPage Up/Page Downキーを押して結果を"]
[null,null,"確かめたほうがよいでしょう。ブレークポイント設定や変数値表示において存在しない要素を指定した場合に"]
[null,null,"CS+からエラーメッセージが表示されることがあり、スクリプトでは、その確実な捕捉ができないためです。"]
[]
[null,null,"スクリプトが失敗終了した場合、ターゲットプログラムが誤っているか、テスト設計が誤っているかのどちらか"]
[null,null,"です。特にブレークポイントを行数単位で指定している場合は1行ソースを編集しただけでズレてしまいます。"]
[null,null,"Appendixで示すように、ブレークポイントを関数シンボル単位で指定するなどして工夫してください。"]
[]
[null,"(6)結果ログ及びスクリーンキャプチャ"]
[]
[null,null,"最初の2つのメッセージボックス両方とも”はい”を選択すると、結果ログが生成されます。"]
[]
[null,null,"生成フォルダはスクリプト(*.py)の下に、スクリプト名フォルダを加えたものになります。以下の例を見て"]
[null,null,"ください。"]
[]
[null,null,"(例)C:\\通信テスト\\1\\2\\通信テスト_1_2_3.xls として原紙をコピーし、編集した場合"]
[null,null,null,null,"↓"]
[null,null,null,"C:\\通信テスト\\1\\2\\通信テスト_1_2_3.py がスクリプトとして生成される"]
[null,null,null,null,"↓"]
[null,null,null,"CS+でSource('C:/通信テスト/1/2/通信テスト_1_2_3.py')を実行する"]
[null,null,null,null,"↓"]
[null,null,null,"C:\\通信テスト\\1\\2\\通信テスト_1_2_3\\*.log のようにログファイルが記録される"]
[]
[null,null,"結果ログファイルは”YYYYMMDD_HHMMSS.log”の形式になります。これはスクリプト実行開始時の日付を"]
[null,null,"示します。"]
[]
[null,null,"スクリーンキャプチャは”YYMMDD_HHMMSS_N_名前.png”の形式になります。スクリーンキャプチャ取得時の"]
[null,null,"日付に加え、マルチディスプレイを考慮したディスプレイ番号Nが加わります。取得範囲はスクリーン全体です。"]
[]
[null,"(7)再実行"]
[]
[null,null,"Pythonコンソールで”↑””↓”のキーを押すと、ヒストリ機能が使用できます。"]
[]
[null,null,"これを使うと一度実行したスクリプトを容易に再実行でき、そのとき上記(6)の通りログファイルの名前も違えて"]
[null,null,"記録されますので、同じテストを何度も繰り返して実行できます。"]
[]
["４．結果収集"]
[]
[null,"テスト設計を編集し、Pythonコンソールでスクリプト実行を繰り返していくと、結果フォルダにログとスクリーン"]
[null,"ショットが集積されていきます。"]
[]
[null,"”テスト結果集計”シートは集積結果のうち結果ログ、特にテストOK／テストNGを区分して集計するツールです。"]
[null,"使い方は次の通りです。"]
[]
[null,"(1)項目入力"]
[]
[null,null,"以下の項目を入力します。"]
[]
[null,null,"テストケース名称：”自動設定”ボタンで、Excelブックの名称が入力されます。"]
[]
[null,null,"ログ検索フォルダ：”自動設定”ボタンで、Excelブックのパスを元に、Excelブックの名称を加えたものが入力されます。"]
[]
[null,"(2)集計開始"]
[]
[null,null,"”結果集計”ボタンを押すと現在の結果を全てクリアしたのち、ログ検索フォルダのログファイルを検索します。"]
[]
[null,null,"検索結果はB17セル以降に順次記入され、完了すると以下の内容が表示されます。"]
[]
[null,null,"・結果一覧(B17セル以降)"]
[]
[null,null,"・結果OK件数、結果NG件数、合計件数(OK+NGの合算)"]
[]
[null,null,"・結果のうち最新のログファイルから抽出したデータ"]
[]
[null,"(3)注意事項"]
[]
[null,null,"”結果集計”では、以下の条件に沿ってマッチングをしています。"]
[]
[null,null,"・ファイル名が\"YYYYMMDD_HHMMSS.log\"である"]
[null,null,null,"かつ"]
[null,null,"・”結果集計”シートの”テストケース名称と、ログに含まれるテストケース名称が一致している"]
[]
[null,null,"上記の条件に当てはまらない場合は対象外とし、そのファイルを無視しています。"]
[]
["５．複数テストケースの連続実行"]
[]
[null,"”テストシート”シートで記載するテスト内容は、特定の単一テストケースになります。実際は運用を考えると複数の"]
[null,"テストケースが存在しますので、このファイルを原紙とするファイルが多数存在することになります。"]
[]
[null,"これらを用いて作成できるPythonスクリプトを、毎回Pythonコンソール・ウィンドウで入力して実行するには手間が"]
[null,"かかります。また最新の結果を収集するにも複数のExcelファイルを開かねばならず、それらの目視確認作業に"]
[null,"人為的要因によるミスが混入する可能性があります。"]
[]
[null,"これらの問題を解決するため、上位ツールとして\"IronPythonScriptExecutor(v???).xlsm\"を開発しました。これにより"]
[null,"以下の機能を実現できます。"]
[]
[null,null,"・特定のパスを起点に、サブディレクトリを再帰的検索し、テストケースおよびパラメータをリストアップする"]
[]
[null,null,"・リストアップしたテストケースのスクリプトを一括して生成する"]
[]
[null,null,"・一括生成されたスクリプトを連続的に実行し、結果を一覧表で表示する"]
[]
[null,null,"・理由あって実行できなかったスクリプト、実行したが結果NGであったスクリプトを色分け表示する"]
[]
[null,"IronPythonScriptExecutorを利用することで、ターゲットバージョンのバージョンアップに対する回帰テスト"]
[null,"（リグレッションテスト）が極めて効率的に行なえます。是非、あわせて活用してみてください。"]
[]
["６．他ツールの紹介"]
[]
[null,"スクリーンキャプチャ機能を用いて保存した画像ファイルをエビデンス（証跡）として使用したい場合、画像の"]
[null,"貼り付け＆整形をExcel上で自動実行させることができます。以下を利用してください。"]
[]
[null,"Evidencel (画像ファイルからエビデンス用Excelシートを自動生成）"]
[null,"https://osdn.jp/users/xm6_original/pf/Evidencel/wiki/FrontPage"]
[]
["Appendix．コマンドについて"]
[]
[null,"以下コマンドに関する特記事項（補足事項）を記載します。"]
[]
[null,"特記事項１：ブレークポイントとして以下の4種類の記法を使うことができます。"]
[]
[null,"(1)ソースファイル名#行番号　で指定する"]
[null,null,"⇒もっとも一般的な形式です。しかし行番号で指定するため、ソース編集の影響をすぐ受けてしまう問題があります。"]
[]
[null,"(2)ソースファイル名#関数名　で指定する"]
[null,null,"⇒main.c#main のように指定します。その性質上、関数の冒頭のみ張れることになります。"]
[]
[null,"(3)ソースファイル名#関数名 + オフセットで指定する"]
[null,null,"⇒main.c#main + 0x0c のように指定します。オフセットはコンパイル結果から読み解く必要があります"]
[null,null,null,"（ブレークを張りたい行のアドレスから、その関数の先頭アドレスを引き算して算出する）"]
[]
[null,"(4)ソースファイル名@コメントで指定する (version 1.06以降で使用可能)"]
[null,null,"⇒main.c@ここでブレーク のように指定します。以下の2つのケースを想定しています。"]
[null,null,null,"[パターンA]コメントを後置する場合"]
[null,null,null,"    foo();   /* ここでブレーク */ "]
[null,null,null,"[パターンB]コメントの下に実行文がある場合"]
[null,null,null,"    /* ここでブレーク */"]
[null,null,null,"    foo();"]
[null,null,"パターンA, Bいずれにも当てはらまないケース、特にコメントを前置するタイプはサポートしていません。"]
[]
[null,"(1)や(3)を使うときはコメント欄に、どの部分で張りたいのか注記しておくと良いでしょう。"]
[null,"またブレーク時に該当ソースにジャンプする仕組みにしているため、”ブレークするまで待つ”コマンドの後に"]
[null,"”スクリーンキャプチャ”コマンドを置き、画像からブレーク箇所を判断することも効果的です。"]
[]
[null,"特記事項２：外部DLL連携ができます。"]
[]
[null,"version 1.02より、テストシートの”外部DLL名称”に任意の文字列を入力した場合に限り、”外部DLL呼び出し”"]
[null,"コマンドが使えるようになりました。”外部DLL名称”にはパスを含まない任意のDLL名称を入力します。"]
[null,"例えば、”IronPython.dll”のように入力します。このDLLはスクリプトと同じフォルダに格納する必要があります。"]
[null,"また、呼び出し関数のプロトタイプは以下に固定されています。"]
[]
[null,"int ___cdecl IronPythonExtention(wchar_t* lpwszScriptPath, int nParameter)"]
[]
[null,"__cdecl：この関数が__cdecl呼び出し規約であることを示します。"]
[null,null,"__cdeclと__stdcallの違いについては、MSDNなど関連する文書を参照してください。"]
[]
[null,"wchar_t* lpwszScriptPath：スクリプトのフルパスをUNICODE文字列で示します。L\".py\"で終わる文字列です。"]
[null,"nParmeter：”テストシート”でパラメータとして指定した数値がそのまま入ります。"]
[]
[null,"戻り型intは、処理の結果を戻します。この値が負の場合、DLL側でエラー検出したものとしてスクリプト実行を"]
[null,"失敗させます。"]
[]
[null,"呼び出し関数のプロトタイプが上記のように固定されているため、外部DLLは”中継DLL”としての役目を"]
[null,"持つことになります。スクリプトフルパスとパラメータに応じて、それぞれに合った処理を実施するか、さらに"]
[null,"別のDLLを呼び出してください。"]

{"sheet":"コマンドテーブル","index":5,"n_rows":79,"n_cols":6,"rows_kept":79,"cut":false,"hidden":false,"merged":[[0,0,0,5]]}
["コマンド一覧表"]
["機能名称","機能説明","パラメータ説明","CS+ Python関数","ライブラリ関数","パラメータ種別"]
["プログラム停止","実行中のプログラムを強制的に停止します","パラメータは必要ありません","debugger.Stop()","program_stop",0]
["プログラム実行","プログラムを現在の位置から実行します","パラメータは必要ありません","debugger.Go(GoOption.Normal)","program_go_normal",0]
["ブレークするまで待つ","プログラム実行がブレーク・アクションイベントで止まるまで待ちます","パラメータは必要ありません","debugger.GetBreakStatus()","wait_until_break",0]
["ステップ・イン","ステップ・イン実行を行います","実行単位（TRUE=ソース行単位、FALSE=CPU命令単位）","debugger.Step(StepOption.Source/StepOption.Instruction)","program_step_in",1]
["繰り返しステップ・イン","ソース行単位のステップ・イン実行を繰り返し行います","繰り返し回数","debugger.Step(StepOption.Source)","repeat_step_in",3]
["ステップ・オーバー","ステップ・オーバー実行を行います","実行単位（TRUE=ソース行単位、FALSE=CPU命令単位）","debugger.Next(NextOption.Source/NextOption.Instrcution)","program_step_over",1]
["繰り返しステップ・オーバー","ソース行単位のステップ・オーバー実行を繰り返し行います","繰り返し回数","debugger.Next(NextOption.Source)","repeat_step_over",3]
["リターンアウト","現在の関数からリターンします","パラメータは必要ありません","debugger.ReturnOut()","program_return_out",0]
["CPUリセット","CPUリセットを行います","パラメータは必要ありません","debugger.Reset()","cpu_reset",0]
["CPU状態表示","CPU状態(None/Standby/Stop/Sleep/etc...)を表示します","パラメータは必要ありません","debugger.GetCpuStatus()","display_cpu_status",0]
["CPU状態待ち","指定CPU状態になるまで待ちます","CPU状態（None/Standbyなど。詳しくはCS+のdebugger.GetCpuStaｔus()ヘルプ参照）","debugger.GetCpuStatus()","wait_until_status",6]
["プログラムカウンタ表示","プログラムカウンタ（プログラムの実行位置）及びマッチするソース行を表示します","パラメータは必要ありません","debugger.GetPC()","display_cpu_pc",0]
["プログラムカウンタ表示（逆アセンブル）","プログラムカウンタ（プログラムの実行位置）及び逆アセンブルを表示します","パラメータは必要ありません","debugger.GetPC()","display_pc_asm",0]
["----------------","(区切りのため何もしません)","パラメータは必要ありません",null,"skip_line",0]
["ブレークポイント設定（ハード)","ブレークポイントを追加します（ハードウェア・ブレーク）","ブレークアドレス（関数名 or ファイル名#行番号 or ファイル名@コメント）","debugger.Breakpoint.Set()","add_hw_break",2]
["ブレークポイント設定（ソフト）","ブレークポイントを追加します（ソフトウェア・ブレーク）","ブレークアドレス（関数名 or ファイル名#行番号 or ファイル名@コメント）","debugger.Breakpoint.Set()","add_sw_break",2]
["ブレークポイント設定（8bit読み込み）","ブレークポイントを追加します（8bit読み込みアクセス時にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_8r_break",8]
["ブレークポイント設定（16bit読み込み）","ブレークポイントを追加します（16bit読み込みアクセス時にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_16r_break",8]
["ブレークポイント設定（32bit読み込み）","ブレークポイントを追加します（32bit読み込みアクセス時にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_32r_break",8]
["ブレークポイント設定（8bit書き込み）","ブレークポイントを追加します（8bit書き込みアクセス時にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_8w_break",8]
["ブレークポイント設定（16bit書き込み）","ブレークポイントを追加します（16bit書き込みアクセス時にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_16w_break",8]
["ブレークポイント設定（32bit書き込み）","ブレークポイントを追加します（32bit書き込みアクセス時にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_32w_break",8]
["ブレークポイント一致値設定","ブレークポイントで期待する一致値を設定します","比較値（0x16進数または10進数）","(グローバル変数へ記憶）","set_break_value",3]
["ブレークポイント設定（8bit値一致）","ブレークポイントを追加します（8bit変数値が一致した場合にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_8eq_break",8]
["ブレークポイント設定（16bit値一致）","ブレークポイントを追加します（16bit変数値が一致した場合にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_16eq_break",8]
["ブレークポイント設定（32bit値一致）","ブレークポイントを追加します（32bit変数値が一致した場合にブレーク）","ブレークアドレス（変数名またはファイル名#変数名）","debugger.Breakpoint.Set()","add_32eq_break",8]
["ブレークポイント有効化","指定アドレスに対するブレークポイントを全て有効化します","ブレークアドレス","debugger.Breakpoint.Enable()","enable_break",8]
["ブレークポイント無効化","指定アドレスに対するブレークポイントを全て無効化します","ブレークアドレス","debugger.Breakpoint.Disable()","disable_break",8]
["ブレークポイント全クリア","ブレークポイントを全て削除します","パラメータは必要ありません","debugger.Breakpoint.Delete()","clear_break",0]
["----------------","(区切りのため何もしません)","パラメータは必要ありません",null,"skip_line",0]
["書き込みデータ設定","CPUレジスタ/SFR/変数/メモリフィルで書き込む値を設定します","書き込み値（0x16進数、10進数、列挙子）","(グローバル変数へ記憶）","set_write_data",5]
["式評価結果から書き込み設定","アドレス式を評価した結果を書き込み値として設定します","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","(グローバル変数へ記憶）","set_write_data_expr",5]
["CPUレジスタ／SFR表示","指定レジスタの内容を符号なし16進数で表示します","CPUレジスタ名またはSFR名","debugger.Register.GetValue()","display_register",4]
["CPUレジスタ／SFR設定","指定レジスタへ書き込みデータ設定値を設定します","CPUレジスタ名またはSFR名","debugger.Register.SetValue()","set_register",4]
["変数値表示（符号つき10進）","変数値の内容を符号つき10進数で表示します","変数名（static変数はファイル名#変数名）","debugger.Watch.GetValue(WatchOption.SignedDecimal)","display_value_signed",5]
["変数値表示（符号なし10進）","変数値の内容を符号なし10進数で表示します","変数名（static変数はファイル名#変数名）","debugger.Watch.GetValue(WatchOption.UnsignedDecimal)","display_value_unsigned",5]
["変数値表示（符号なし16進）","変数値の内容を符号なし16進数で表示します","変数名（static変数はファイル名#変数名）","debugger.Watch.GetValue(WatchOption.Hexdecimal)","display_value_hex",5]
["変数値表示（自動）","変数値の内容を型にあわせた形式で表示します","変数名（static変数はファイル名#変数名）","debugger.Watch.GetValue(WatchOption.Auto)","display_value_auto",5]
["変数値設定","変数値へ書き込みデータ設定値を設定します","変数名（static変数はファイル名#変数名）","debugger.Watch.SetValue()","set_value",5]
["表示値ANDマスク","表示値をANDマスクし、指定のビットのみ残します","AND値（0x16進数または10進数）","(グローバル変数を操作）","mask_output_value",3]
["表示値OR演算から書き込み設定","表示値をORしたものから、書き込み値を設定します","OR値（0x16進数または10進数）","(グローバル変数を操作）","or_output_value",3]
["一致比較（表示値==パラメータ）","表示値とパラメータが一致することを確かめます","比較対象となるパラメータ値（0x16進数または10進数）","(Register.GetValue または Watch.GetValueと比較)","compare_eq",3]
["不一致比較（表示値!=パラメータ）","表示値とパラメータが一致しないことを確かめます","比較対象となるパラメータ値（0x16進数または10進数）","(Register.GetValue または Watch.GetValueと比較)","compare_ne",3]
["大小比較（表示値>パラメータ）","表示値がパラメータより大きいことを確かめます（符号は表示形式に依存）","比較対象となるパラメータ値（0x16進数または10進数）","(Register.GetValue または Watch.GetValueと比較)","compare_hi",3]
["大小比較（表示値>=パラメータ）","表示値がパラメータ以上であることを確かめます（符号は表示形式に依存）","比較対象となるパラメータ値（0x16進数または10進数）","(Register.GetValue または Watch.GetValueと比較)","compare_he",3]
["大小比較（表示値<パラメータ）","表示値がパラメータより小さいことを確かめます（符号は表示形式に依存）","比較対象となるパラメータ値（0x16進数または10進数）","(Register.GetValue または Watch.GetValueと比較)","compare_lo",3]
["大小比較（表示値<=パラメータ）","表示値がパラメータ以下であることを確かめます（符号は表示形式に依存）","比較対象となるパラメータ値（0x16進数または10進数）","(Register.GetValue または Watch.GetValueと比較)","compare_le",3]
["メモリ値表示（バイト）","指定アドレスの内容を16進数で表示します（【RL78】【RH850】8bit）","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","debugger.Memory.Read(MemoryOption.Byte)","read_mem_byte",5]
["メモリ値表示（ハーフ・ワード）","指定アドレスの内容を16進数で表示します（【RH850】16bit）","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","debugger.Memory.Read(MemoryOption.HalfWord)","read_mem_halfword",5]
["メモリ値表示（ワード）","指定アドレスの内容を16進数で表示します（【RL78】16bit・【RH850】32bit）","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","debugger.Memory.Read(MemoryOption.Word)","read_mem_word",5]
["メモリ書き込み（バイト）","指定アドレスへ書き込みデータを書き込みます（【RL78】【RH850】8bit）","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","debugger.Memory.Write(MemoryOption.Byte)","write_mem_byte",5]
["メモリ書き込み（ハーフ・ワード）","指定アドレスへ書き込みデータを書き込みます（【RH850】16bit）","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","debugger.Memory.Write(MemoryOption.HalfWord)","write_mem_halfword",5]
["メモリ書き込み（ワード）","指定アドレスへ書き込みデータを書き込みます（【RL78】16bit・【RH850】32bit）","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","debugger.Memory.Write(MemoryOption.Word)","write_mem_word",5]
["----------------","(区切りのため何もしません)","パラメータは必要ありません",null,"skip_line",0]
["メモリ開始アドレス設定","メモリ操作の開始アドレスを設定します","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","(グローバル変数へ記憶）","set_start_addr",5]
["メモリ終了アドレス設定","メモリ操作の終了アドレスを設定します","デバッガで評価可能なアドレス式（変数名 or 0x16進数）","(グローバル変数へ記憶）","set_end_addr",5]
["メモリ表示","開始アドレスから終了アドレスまでのメモリ内容を表示します","パラメータは必要ありません","debugger.Memory.ReadRange()","display_mem",0]
["メモリロード（バイナリ）","開始アドレスから終了アドレスまでのメモリ内容をファイルからバイナリ形式で読み込みます","ファイルネーム＋拡張子（実行時の日付／時間修飾はありません）（\\使用禁止）","debugger.Download.Binary()","down_mem_bin",6]
["メモリロード（ヘキサ）","開始アドレスをオフセットとしてファイルからメモリ内容をヘキサ形式で読み込みます","ファイルネーム＋拡張子（実行時の日付／時間修飾はありません）（\\使用禁止）","debugger.Download.Hex()","down_mem_hex",6]
["メモリセーブ（バイナリ）","開始アドレスから終了アドレスまでのメモリ内容をバイナリ形式でファイルへ保存します","ファイルネーム＋拡張子（実行時に日付／時間が付加されます）（\\使用禁止）","debugger.Upload.Binary()","up_mem_bin",6]
["メモリセーブ（モトローラ）","開始アドレスから終了アドレスまでのメモリ内容をモトローラ形式でファイルへ保存します","ファイルネーム＋拡張子（実行時に日付／時間が付加されます）（\\使用禁止）","debugger.Upload.Motorola()","up_mem_mot",6]
["メモリフィル","開始アドレスから終了アドレスまでのメモリ内容を書き込みデータ設定値（8bit）で埋めます","パラメータは必要ありません","debugger.Memory.Fill()","fill_mem",0]
["データフラッシュ消去","データフラッシュ・メモリを消去します","パラメータは必要ありません","debugger.Erase(EraseOption.Data)","erase_mem_data",0]
["----------------","(区切りのため何もしません)","パラメータは必要ありません",null,"skip_line",0]
["コメント","何もしません","メッセージ（スクリプトへ埋め込まれるのみです）",null,"comment",6]
["時間待ち","指定msだけ待ちます","待ち時間（ms単位）",null,"delay_ms",7]
["メッセージボックス（OK）","メッセージボックスを表示します（OKボタン／キャンセルボタン）","メッセージボックスに表示するメッセージ（キャンセルボタンでスクリプト実行中止）","（グローバル関数）","msgbox_ok",6]
["メッセージボックス（はい／いいえ）","メッセージボックスを表示します（はいボタン／いいえボタン／キャンセルボタン）","メッセージボックスに表示するメッセージ（キャンセルボタンでスクリプト実行中止）","（グローバル関数）","msgbox_yesno",6]
["メッセージボックス応答チェック（はい）","メッセージボックスのボタン押下結果を確かめます（期待値：はい）","パラメータは必要ありません",null,"msgbox_isyes",0]
["メッセージボックス応答チェック（いいえ）","メッセージボックスのボタン押下結果を確かめます（期待値：いいえ）","パラメータは必要ありません",null,"msgbox_isno",0]
["コンソール表示","指定メッセージをコンソール／ログに表示します","メッセージ（コンソールに表示）","print","display_console",6]
["スクリーンキャプチャ","スクリーン全体をPNG画像ファイルとして保存します","ファイルネーム（実行時に日付／時間／拡張子が付加されます）","（グローバル関数）","save_screen",6]
["外部DLL呼び出し","外部DLLをint引数を付けて呼び出し、結果を表示します","外部DLLに渡すint引数","（cdll.DLL名称(__file__,parameter）を呼び出し）","ext_dll",7]
["ファイルinclude","指定ファイルのテストシート項目をinclude挿入します（多重include不可）","ファイルネーム（先頭がピリオドの場合は相対パス指定）","(ファイルinclude)","skip_line",9]
["ダウンロード（プロジェクト既定）","ロード・モジュールをダウンロードします（プロジェクト既定）","パラメータは必要ありません","debugger.Download.LoadModule()","load_module_def",0]
["ダウンロード（フルパス指定）","ロード・モジュールをダウンロードします（フルパス指定）","ファイルネーム（フルパス指定）","debugger.Download.LoadModule()","load_module_path",6]
["スクリプト終了","スクリプトの実行を終了します","パラメータは必要ありません","sys.exit()","terminate_script",0]

{"sheet":"library_pre","index":6,"n_rows":1522,"n_cols":1,"rows_kept":1522,"cut":false,"hidden":false,"merged":[]}
["# coding: shift-jis"]
["#"]
[{"$f":"\"# ToolVersion: \"&ToolVersion","v":"# ToolVersion: version 1.08"}]
[{"$f":"\"# Testcase: \"&TestCaseName","v":"# Testcase: "}]
[{"$f":"\"# Created by: \"&TestCaseUser","v":"# Created by: "}]
[{"$f":"\"# Date: \"&TEXT(TestCaseDate,\"yyyy/mm/dd\")","v":"# Date: 1900/01/00"}]
[{"$f":"\"# Revision: \"&TestCaseRevision","v":"# Revision: "}]
[{"$f":"\"# TargetVersion: \"&TargetVersion","v":"# TargetVersion: "}]
[{"$f":"\"# TestDescription: \"&SUBSTITUTE(TestDescription,CHAR(10),\"\\n\")","v":"# TestDescription: "}]
["#"]
[]
["#"]
["# CLRインポート"]
["#"]
["import clr"]
["clr.AddReferenceByPartialName(\"System.Windows.Forms\")"]
["from System.Windows.Forms import *"]
["clr.AddReferenceByPartialName(\"System.Drawing\")"]
["from System.Drawing import *"]
["# clr.AddReferenceByPartialName(\"System.Threading\")は不要でありエラーの原因となるため削除した(version 1.07)"]
["from System.Threading import *"]
[]
["#"]
["# ライブラリインポート"]
["#"]
["import os"]
["import datetime"]
["from ctypes import *"]
[]
["#"]
["# スクリプト開始"]
["#"]
["common.ViewOutput = True"]
["print \"Pythonスクリプトを開始しました\""]
[]
["#"]
["# プロジェクトオープンされているか確認"]
["#"]
["print \"プロジェクト確認中です\""]
["if project.IsOpen != True:"]
["    print \"プロジェクトがオープンされていません\""]
["    sys.exit()"]
["print \"プロジェクト確認しました\""]
[]
["# 開始時の確認メッセージボックスここから"]
["# startMsgBoxOnStart"]
[]
["#"]
["# ロードモジュールがダウンロードされているか確認"]
["#"]
["print \"ダウンロード確認中です\""]
["if MessageBox.Show(\"ロードモジュールがデバッグ・ツールへダウンロードされていますか？\", \"ロード確認\", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No:"]
["    print \"キャンセルしました\""]
["    sys.exit()"]
[]
["#"]
["# 画面レイアウトが適切か確認"]
["#"]
["print \"画面レイアウト確認中です\""]
["if MessageBox.Show(\"画面レイアウトはスクリーンショット向けに調整されていますか？\", \"レイアウト確認\", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No:"]
["    print \"キャンセルしました\""]
["    sys.exit()"]
[]
["# 開始時の確認メッセージボックスここまで"]
["# endMsgBoxOnStart"]
[]
["# アクティブプロジェクト名からPythonベースパスを作成"]
["# (プロジェクト名に日本語文字を含めないこと)"]
["# basePath:スクリプト存在パス/スクリプト名/"]
["#"]
["print \"Python作業パスを確認中です\""]
["basePath = os.path.dirname(__file__).replace(\"/\", \"\\\\\") + \"\\\\\" + os.path.basename(__file__).rpartition(\".\")[0]"]
["# パスが存在しなければ作成(作成できたかどうかのチェックは行わない)"]
["if os.path.exists(basePath) != True:"]
["    os.mkdir(basePath)"]
["# パスの存在をチェック"]
["if os.path.exists(basePath) != True:"]
["    print \"フォルダ作成に失敗しました\""]
["    sys.exit()"]
["# パスがディレクトリか、またはファイルかチェック"]
["if os.path.isdir(basePath) != True:"]
["    print \"Pythonフォルダがファイルとして存在しています\""]
["    sys.exit()"]
["# 末尾にパス区切り文字を追加"]
["basePath = basePath + \"\\\\\""]
["print \"Python作業パスを確認しました \" + basePath"]
[]
["#"]
["# ログファイルを作成"]
["# scriptName:スクリプトファイル名(.pyは含まない)"]
["# logPath:スクリプト存在パス/スクリプト名/日付_時刻.log"]
["#"]
["logDate = datetime.datetime.now()"]
["logPath = basePath + logDate.strftime(\"%Y%m%d_%H%M%S.log\")"]
["logFile = open(logPath, \"a\")"]
["# オープンできたかチェック"]
["if logFile.closed == True:"]
["    print \"ログファイルを追加オープンできません\""]
["    sys.exit()"]
[]
["#"]
["# グローバル変数を初期化"]
["#"]
["logNum = 0"]
["startAddress = 0x80000000"]
["endAddress = 0x80000000"]
["writeValue = 0"]
["outputValue = 0"]
["compareValue = 0"]
["numBreak = 0"]
["breakPoints = []"]
[{"$f":"\"fatalCont = \" & IF(OptionfatalCont=0,\"False\",\"True\")","v":"fatalCont = False"}]
["fatalError = 0"]
[{"$f":"\"skipMsgBox = \" & IF(OptionSkipMsgBox=0,\"False\",\"True\")","v":"skipMsgBox = False"}]
["yesMsgBox = True"]
[]
["#-[ 汎用関数 ]----------------------------------------------------------------"]
[]
["#"]
["# 関数:行スキップ"]
["#"]
["def skip_line():"]
["    pass"]
[]
["#"]
["# 関数:コメント"]
["#"]
["def comment(msg):"]
["    pass"]
[]
["#"]
["# 関数:ログ出力"]
["#"]
["def output_log(msg, err=False):"]
["    global fatalCont"]
["    global fatalError"]
[]
["    # ログ番号をフォーマット"]
["    global logNum"]
["    numMsg = \"[%06d] \" % logNum"]
[]
["    # ログ番号を+1"]
["    logNum = logNum + 1"]
[]
["    # 日付をフォーマット"]
["    dtNow = datetime.datetime.now()"]
["    dtMsg = dtNow.strftime(\"%Y/%m/%d %H:%M:%S \")"]
[]
["    # [ログ番号] 日付 時間 文字列"]
["    numMsg = numMsg + dtMsg + msg"]
[]
["    # Pythonコンソール"]
["    print numMsg"]
[]
["    # ログ"]
["    numMsg = numMsg + \"\\n\""]
["    logFile.write(numMsg.encode(\"cp932\"))"]
[]
["    # エラーなら、ここでスクリプト打ち切り"]
["    if err == True:"]
["        # エラー中断フラグをチェック"]
["        if fatalCont == False:"]
["            # 中断"]
["            numMsg = \"スクリプトを続行できません。強制終了します\""]
["            print numMsg"]
["            logFile.write(numMsg.encode(\"cp932\"))"]
["            logFile.close()"]
["            sys.exit()"]
["        else:"]
["            # エラーが発生したことを記憶する"]
["            fatalError += 1"]
[]
["    # コンソールをフラッシュ"]
["    common.ViewOutput = False"]
["    common.ViewOutput = True"]
["    sys.stdout.flush()"]
[]
["#"]
["# 関数:コンソール表示"]
["#"]
["def display_console(msg):"]
["    output_log(msg)"]
[]
["#"]
["# 関数:スクリーンキャプチャの取得とセーブ(マルチディスプレイ対応)"]
["#"]
["def save_screen(name):"]
["    # スクリーン番号を表すインデックスを初期化"]
["    index = 0"]
[]
["    # 表示バッファのフラッシュを待つため1000msウェイト"]
["    Thread.Sleep(1000)"]
[]
["    # スクリーン毎にループ"]
["    for scr in Screen.AllScreens:"]
["        # 現在日付＋スクリーン番号＋パラメータからパス名を作成"]
["        dtNow = datetime.datetime.now()"]
["        dtMsg = dtNow.strftime(\"%Y%m%d_%H%M%S\")"]
["        scrMsg = \"_%1d_\" % index"]
["        path = basePath + dtMsg + scrMsg + name + \".png\""]
[]
["        # ログ出力"]
["        output_log(\"スクリーンキャプチャを保存しました \" + path)"]
[]
["        # スクリーン毎のサイズを表すRectangle型を取得"]
["        rect = scr.Bounds"]
[]
["        # ビットマップとグラフィックを併用してスクリーンキャプチャ"]
["        bmp = Bitmap(rect.Width, rect.Height)"]
["        grp = Graphics.FromImage(bmp)"]
["        grp.CopyFromScreen(Point(0, 0), Point(0, 0), Size(rect.Width, rect.Height))"]
[]
["        # PNG形式でファイルに保存"]
["        bmp.Save(path, Imaging.ImageFormat.Png)"]
[]
["        # 後片付け"]
["        grp.Dispose()"]
["        bmp.Dispose()"]
[]
["        # 次のスクリーンへ"]
["        index = index + 1"]
[]
["#"]
["# 関数:スクリプト開始"]
["#"]
["def start_script():"]
[{"$f":"\"    output_log(\"\"ToolVersion: \"&ToolVersion & \"\"\")\"","v":"    output_log(\"ToolVersion: version 1.08\")"}]
[{"$f":"\"    output_log(\"\"Testcase: \"&TestCaseName & \"\"\")\"","v":"    output_log(\"Testcase: \")"}]
[{"$f":"\"    output_log(\"\"Revision: \"&TestCaseRevision&\"\"\")\"","v":"    output_log(\"Revision: \")"}]
[{"$f":"\"    output_log(\"\"TestDescription: \"&SUBSTITUTE(TestDescription,CHAR(10),\"\\n\")&\"\"\")\"","v":"    output_log(\"TestDescription: \")"}]
[{"$f":"\"    output_log(\"\"TargetVersion: \"&TargetVersion&\"\"\")\"","v":"    output_log(\"TargetVersion: \")"}]
["    output_log(\"スクリプト実行を開始します\")"]
[]
["    # ブレークポイントを全て初期化(berakPointsリストと実体をあわせるため)"]
["    output_log(\"ブレークポイントを全て初期化します\")"]
["    debugger.Breakpoint.Delete()"]
[]
["#"]
["# 関数:スクリプト終了"]
["#"]
["def terminate_script():"]
["    global fatalError"]
[]
["    # エラーフラグにより判定"]
["    if fatalError == 0:"]
["        output_log(\"スクリプト実行を正常終了しました\")"]
["    else:"]
["        output_log(\"NG\" + str(fatalError) + \"件で異常終了しました\")"]
[]
["    logFile.close()"]
["    sys.exit()"]
[]
["#"]
["# 関数:メッセージボックス(OK/キャンセル)"]
["#"]
["def msgbox_ok(msg):"]
["    global fatalCont"]
["    global skipMsgBox"]
[]
["    # ログ表示"]
["    output_log(\"メッセージボックス:\" + msg)"]
[]
["    # スキップ指定されていればスキップ"]
["    if skipMsgBox == True:"]
["        output_log(\"スキップしました\")"]
["        return"]
[]
["    # メッセージボックス"]
["    ret = MessageBox.Show(msg, \"スクリプト実行\", MessageBoxButtons.OKCancel, MessageBoxIcon.Question)"]
[]
["    # キャンセルされたら終了する"]
["    if ret == DialogResult.Cancel:"]
["        # 手動操作であるため、必ず打ち切る"]
["        fatalCont = False"]
["        output_log(\"キャンセルされました\", True)"]
[]
["#"]
["# 関数:メッセージボックス(YES/NO/キャンセル)"]
["#"]
["def msgbox_yesno(msg):"]
["    global fatalCont"]
["    global skipMsgBox"]
["    global yesMsgBox"]
[]
["    # ログ表示"]
["    output_log(\"メッセージボックス:\" + msg)"]
[]
["    # スキップ指定されていればスキップ"]
["    if skipMsgBox == True:"]
["        output_log(\"スキップしました\")"]
["        return"]
[]
["    # メッセージボックス"]
["    ret = MessageBox.Show(msg, \"スクリプト実行\", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)"]
[]
["    # キャンセルされたら終了する"]
["    if ret == DialogResult.Cancel:"]
["        # 手動操作であるため、必ず打ち切る"]
["        fatalCont = False"]
["        output_log(\"キャンセルされました\", True)"]
[]
["    # 結果を表示"]
["    if ret == DialogResult.Yes:"]
["        yesMsgBox = True"]
["        output_log(\"入力結果：はい\")"]
["    else:"]
["        yesMsgBox = False"]
["        output_log(\"入力結果：いいえ\")"]
[]
["#"]
["# 関数:メッセージボックス\"はい\"を期待"]
["#"]
["def msgbox_isyes():"]
["    global skipMsgBox"]
["    global yesMsgBox"]
[]
["    # ログ表示"]
["    output_log(\"メッセージボックス入力結果：はい　を期待\")"]
[]
["    # スキップ指定されていればスキップ"]
["    if skipMsgBox == True:"]
["        output_log(\"メッセージボックスをスキップしているため、チェックしません\")"]
["        return"]
[]
["    # チェック"]
["    if yesMsgBox == True:"]
["        output_log(\"入力結果：期待通り\")"]
["    else:"]
["        output_log(\"入力結果：期待と異なる\", True)"]
[]
["#"]
["# 関数:メッセージボックス\"いいえ\"を期待"]
["#"]
["def msgbox_isno():"]
["    global skipMsgBox"]
["    global yesMsgBox"]
[]
["    # ログ表示"]
["    output_log(\"メッセージボックス入力結果：いいえ　を期待\")"]
[]
["    # スキップ指定されていればスキップ"]
["    if skipMsgBox == True:"]
["        output_log(\"メッセージボックスをスキップしているため、チェックしません\")"]
["        return"]
[]
["    # チェック"]
["    if yesMsgBox == False:"]
["        output_log(\"入力結果：期待通り\")"]
["    else:"]
["        output_log(\"入力結果：期待と異なる\", True)"]
[]
["#"]
["# 関数:ロード・モジュールのダウンロード(デフォルト)"]
["#"]
["def load_module_def():"]
["    # ログ表示"]
["    output_log(\"ロード・モジュールのダウンロード(プロジェクト既定)\")"]
[]
["    # ロード"]
["    output_log(\"ダウンロード結果：\")"]
["    debugger.Download.LoadModule()"]
[]
["    # 結果表示"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:ロード・モジュールのダウンロード(フルパス指定)"]
["#"]
["def load_module_path(name):"]
["    # ログ表示"]
["    output_log(\"ロード・モジュールのダウンロード \" + name)"]
[]
["    # ロード"]
["    output_log(\"ダウンロード結果：\")"]
["    debugger.Download.LoadModule(name)"]
[]
["    # 結果表示"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:指定msだけ時間待ち"]
["#"]
["def delay_ms(ms=1000):"]
["    # ログ"]
["    msMsg = \"時間待ち %d(ms)\" % ms"]
["    output_log(msMsg)"]
[]
["    # スリープ"]
["    Thread.Sleep(ms)"]
[]
["#"]
["# 関数:外部DLL呼び出し"]
["#"]
["def ext_dll(param):"]
["    # ログ"]
["    output_log(\"外部DLL呼び出し(\" + str(param) + \"):\")"]
[]
["    # 呼び出し"]
["    pypath = __file__.replace(\"/\", \"\\\\\")"]
[{"$f":"IF(ExtDllName=\"\",\"    result = -1\",\"    result = cdll.\" & SUBSTITUTE(UPPER(ExtDllName),\".DLL\",\"\") &\".IronPythonExtention(c_wchar_p(pypath), c_int(param))\")","v":"    result = -1"}]
["    if result < 0:"]
["        output_log(str(result), True)"]
["    else:"]
["        output_log(str(result))"]
[]
["#-[ 実行制御 ]----------------------------------------------------------------"]
[]
["#"]
["# 関数:プログラム停止"]
["#"]
["def program_stop():"]
["    # ログ表示"]
["    output_log(\"プログラム実行を強制停止します(Ctrl+Dで中断)。現在の実行中フラグ:\")"]
[]
["    # プログラム実行中かチェックする"]
["    ret = debugger.IsRunning()"]
["    output_log(common.Output)"]
["    if ret == False:"]
["        return"]
[]
["    # 強制ストップ＆コンソール出力オフ"]
["    debugger.Stop()"]
["    common.ViewOutput = False"]
[]
["    # 停止状態となるまで最大10sec待つ"]
["    counter = 0"]
["    while counter < 100:"]
["        if debugger.IsRunning() == False:"]
["            common.ViewOutput = True"]
["            output_log(\"プログラム停止しました\")"]
["            output_log(\"実行時間：\")"]
["            debugger.XTime()"]
["            output_log(common.Output)"]
["            debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
["            return"]
["        counter += 1"]
["        Thread.Sleep(100)"]
["    # タイムアウト"]
["    common.ViewOutput = True"]
["    output_log(\"プログラム停止に失敗しました\", True)"]
[]
["#"]
["# 関数:プログラム実行"]
["#"]
["def program_go_normal():"]
["    # ログ表示"]
["    output_log(\"プログラムの実行を開始します(Ctrl+Dで中断)。現在の実行中フラグ:\")"]
[]
["    # プログラム実行中かチェックする"]
["    ret = debugger.IsRunning()"]
["    output_log(common.Output)"]
["    if ret == True:"]
["        return"]
[]
["    # 実行開始＆コンソール出力オフ"]
["    debugger.Go(GoOption.Normal)"]
["    common.ViewOutput = False"]
[]
["    # 実行状態またはブレーク状態となるまで最大10sec待つ"]
["    counter = 0"]
["    while counter < 100:"]
["        if debugger.IsRunning() == True:"]
["            common.ViewOutput = True"]
["            output_log(\"プログラム実行開始しました\")"]
["            return"]
["        if debugger.GetBreakStatus() != BreakStatus.None:"]
["            common.ViewOutput = True"]
["            output_log(\"ブレークしました。ブレーク要因：\")"]
["            debugger.GetBreakStatus()"]
["            output_log(common.Output)"]
["            output_log(\"実行時間：\")"]
["            debugger.XTime()"]
["            output_log(common.Output)"]
["            debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
["            return"]
["        counter += 1"]
["        Thread.Sleep(100)"]
["    # タイムアウト"]
["    common.ViewOutput = True"]
["    output_log(\"プログラム実行開始に失敗しました\", True)"]
[]
["#"]
["# 関数:ブレークするまで待つ"]
["#"]
["def wait_until_break():"]
["    # ログ表示"]
["    output_log(\"ブレークポイントまたはイベント発生まで待機します(Ctrl+Dで中断)。現在のブレーク状態:\")"]
[]
["    # 現在の状態を得る"]
["    status = debugger.GetBreakStatus()"]
["    output_log(common.Output)"]
["    if status != BreakStatus.None:"]
["        return"]
[]
["    # コンソール出力オフ"]
["    common.ViewOutput = False"]
[]
["    # ブレークするまで100ms周期で待つ"]
["    while debugger.GetBreakStatus() == BreakStatus.None:"]
["        Thread.Sleep(100)"]
[]
["    # コンソール出力オン"]
["    common.ViewOutput = True"]
[]
["    # 現在の状態を再度得る"]
["    output_log(\"ブレークしました。ブレーク要因：\")"]
["    debugger.GetBreakStatus()"]
["    output_log(common.Output)"]
["    output_log(\"実行時間：\")"]
["    debugger.XTime()"]
["    output_log(common.Output)"]
["    debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
[]
["#"]
["# 関数:ステップ・イン"]
["#"]
["def program_step_in(mode):"]
["    # モード別"]
["    if mode == True:"]
["        # 行単位でステップ・イン実行"]
["        output_log(\"ステップ・イン実行(行単位)\")"]
["        debugger.Step(StepOption.Source)"]
[]
["        # ジャンプ"]
["        debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
["    else:"]
["        # CPU命令単位でステップ・イン実行"]
["        output_log(\"ステップ・イン実行(CPU命令単位)\")"]
["        debugger.Step(StepOption.Instruction)"]
[]
["        # ジャンプ"]
["        debugger.Jump.Address(JumpType.Assemble, debugger.GetPC())"]
[]
["#"]
["# 関数:繰り返しステップ・イン"]
["#"]
["def repeat_step_in(count):"]
["    # ログ"]
["    output_log(\"繰り返しステップ・イン実行(行単位) \" + str(count))"]
[]
["    # 繰り返し"]
["    while count > 0:"]
["        debugger.Step(StepOption.Source)"]
["        debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
["        count -= 1"]
[]
["#"]
["# 関数:ステップ・オーバー"]
["#"]
["def program_step_over(mode):"]
["    # モード別"]
["    if mode == True:"]
["        # 行単位でステップ・オーバー実行"]
["        output_log(\"ステップ・オーバー実行(行単位)\")"]
["        debugger.Next(NextOption.Source)"]
[]
["        # ジャンプ"]
["        debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
["    else:"]
["        # CPU命令単位でステップ・オーバー実行"]
["        output_log(\"ステップ・オーバー実行(CPU命令単位)\")"]
["        debugger.Next(NextOption.Instruction)"]
[]
["        # ジャンプ"]
["        debugger.Jump.Address(JumpType.Assemble, debugger.GetPC())"]
[]
["#"]
["# 関数:繰り返しステップ・オーバー"]
["#"]
["def repeat_step_over(count):"]
["    # ログ"]
["    output_log(\"繰り返しステップ・オーバー実行(行単位) \" + str(count))"]
[]
["    # 繰り返し"]
["    while count > 0:"]
["        debugger.Next(NextOption.Source)"]
["        debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
["        count -= 1"]
[]
["#"]
["# 関数:リターン・アウト"]
["#"]
["def program_return_out():"]
["    output_log(\"リターン・アウト実行\")"]
["    debugger.ReturnOut()"]
[]
["    # ジャンプ"]
["    debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
[]
["#"]
["# 関数:CPUリセット"]
["#"]
["def cpu_reset():"]
["    # ログ表示"]
["    output_log(\"CPUリセットします\")"]
[]
["    # リセット"]
["    debugger.Reset()"]
[]
["#"]
["# 関数:現在のCPU状態を取得"]
["#"]
["def display_cpu_status():"]
["    # ログ表示"]
["    output_log(\"現在のCPU状態:\")"]
[]
["    # 取得"]
["    debugger.GetCpuStatus()"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:CPU状態待ち"]
["#"]
["def wait_until_status(target):"]
["    # 先頭のみ大文字化"]
["    target = target.capitalize()"]
[]
["    # ログ表示"]
["    output_log(\"CPUが次の状態になるまで待ちます(Ctrl+Dで中断) \" + str(target))"]
["    output_log(\"現在のCPU状態:\")"]
["    debugger.GetCpuStatus()"]
["    output_log(common.Output)"]
[]
["    # 1secおきにループ"]
["    while common.Output != target:"]
["        Thread.Sleep(1000)"]
["        debugger.GetCpuStatus()"]
[]
["    # ログ表示"]
["    output_log(\"現在のCPU状態:\")"]
["    debugger.GetCpuStatus()"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:現在のプログラムカウンタを取得"]
["#"]
["def display_cpu_pc():"]
["    # ログ表示"]
["    output_log(\"現在のプログラムカウンタ:\")"]
[]
["    # 取得＆ジャンプ"]
["    debugger.GetPC()"]
["    output_log(common.Output)"]
["    debugger.Jump.Address(JumpType.Source, debugger.GetPC())"]
[]
[]
["#"]
["# 関数:現在のプログラムカウンタを取得(逆アセンブル)"]
["# version 1.05で追加"]
["#"]
["def display_pc_asm():"]
["    # ログ表示"]
["    output_log(\"現在のプログラムカウンタ:\")"]
[]
["    # 取得＆ジャンプ"]
["    debugger.GetPC()"]
["    output_log(common.Output)"]
["    debugger.Jump.Address(JumpType.Assemble, debugger.GetPC())"]
[]
["#-[ ブレークポイント ]--------------------------------------------------------"]
[]
["#"]
["# 関数:ブレークポイントを追加"]
["#"]
["def add_break():"]
["    global breakPoints"]
["    global numBreak"]
[]
["    breakPoints.append(BreakCondition())"]
["    numBreak += 1"]
["    return numBreak - 1"]
[]
["#"]
["# 関数:ハードウェア・ブレークポイントを追加"]
["#"]
["def add_hw_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(ハードウェア) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].BreakType = BreakType.Hardware"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["    # ブレークポイントを示す"]
["    debugger.Jump.Address(JumpType.Source, addr)"]
[]
["#"]
["# 関数:ソフトウェア・ブレークポイントを追加"]
["#"]
["def add_sw_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(ソフトウェア) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].BreakType = BreakType.Software"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["    # ブレークポイントを示す"]
["    debugger.Jump.Address(JumpType.Source, addr)"]
[]
["#"]
["# 関数:8bit読み込みブレークポイントを追加"]
["#"]
["def add_8r_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(8bit読み込み) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = None"]
["    breakPoints[num].AccessSize = 8"]
["    breakPoints[num].BreakType = BreakType.Read"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:16bit読み込みブレークポイントを追加"]
["#"]
["def add_16r_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(16bit読み込み) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = None"]
["    breakPoints[num].AccessSize = 16"]
["    breakPoints[num].BreakType = BreakType.Read"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:32bit読み込みブレークポイントを追加"]
["#"]
["def add_32r_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(32bit読み込み) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = None"]
["    breakPoints[num].AccessSize = 32"]
["    breakPoints[num].BreakType = BreakType.Read"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:8bit書き込みブレークポイントを追加"]
["#"]
["def add_8w_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(8bit書き込み) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = None"]
["    breakPoints[num].AccessSize = 8"]
["    breakPoints[num].BreakType = BreakType.Write"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:16bit書き込みブレークポイントを追加"]
["#"]
["def add_16w_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(16bit書き込み) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = None"]
["    breakPoints[num].AccessSize = 16"]
["    breakPoints[num].BreakType = BreakType.Write"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:32bit書き込みブレークポイントを追加"]
["#"]
["def add_32w_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(32bit書き込み) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = None"]
["    breakPoints[num].AccessSize = 32"]
["    breakPoints[num].BreakType = BreakType.Write"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:比較データを設定"]
["#"]
["def set_break_value(value):"]
["    global compareValue"]
[]
["    # ログ表示"]
["    output_log(\"比較データ \" + hex(value))"]
[]
["    # 記憶"]
["    compareValue = value"]
[]
["#"]
["# 関数:8bit一致ブレークポイントを追加"]
["#"]
["def add_8eq_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(8bit値一致) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = compareValue"]
["    breakPoints[num].AccessSize = 8"]
["    breakPoints[num].BreakType = BreakType.Access"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:16bit一致ブレークポイントを追加"]
["#"]
["def add_16eq_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(16bit値一致) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = compareValue"]
["    breakPoints[num].AccessSize = 16"]
["    breakPoints[num].BreakType = BreakType.Access"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:16bit一致ブレークポイントを追加"]
["#"]
["def add_32eq_break(addr):"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイント追加(32bit値一致) \" + addr)"]
[]
["    # ブレークポイント追加"]
["    num = add_break()"]
["    breakPoints[num].Address = addr"]
["    breakPoints[num].Data = compareValue"]
["    breakPoints[num].AccessSize = 32"]
["    breakPoints[num].BreakType = BreakType.Access"]
["    debugger.Breakpoint.Set(breakPoints[num])"]
[]
["#"]
["# 関数:ブレークポイントを有効化"]
["#"]
["def enable_break(addr):"]
["    # ログ表示"]
["    output_log(\"ブレークポイント有効化 \" + addr)"]
[]
["    # ブレークポイント有効化"]
["    index = 1"]
["    for condition in breakPoints:"]
["        if condition.Address == addr:"]
["            debugger.Breakpoint.Enable(index)"]
["            if common.Output != \"True\":"]
["                output_log(\"ブレークポイント有効化に失敗しました\", True)"]
["                return"]
["        index += 1"]
[]
["#"]
["# 関数:ブレークポイントを無効化"]
["#"]
["def disable_break(addr):"]
["    # ログ表示"]
["    output_log(\"ブレークポイント無効化 \" + addr)"]
[]
["    # ブレークポイント無効化"]
["    index = 1"]
["    for condition in breakPoints:"]
["        if condition.Address == addr:"]
["            debugger.Breakpoint.Disable(index)"]
["            if common.Output != \"True\":"]
["                output_log(\"ブレークポイント無効化に失敗しました\", True)"]
["                return"]
["        index += 1"]
[]
["#"]
["# 関数:ブレークポイントを全て削除"]
["#"]
["def clear_break():"]
["    global numBreak"]
["    global breakPoints"]
[]
["    # ログ表示"]
["    output_log(\"ブレークポイントを全て削除\")"]
[]
["    # 全て削除"]
["    debugger.Breakpoint.Delete()"]
[]
["    # 変数"]
["    numBreak = 0"]
["    del breakPoints[:]"]
[]
["#-[ ウォッチ ]----------------------------------------------------------------"]
[]
["#"]
["# 関数:書き込みデータを設定"]
["# version 1.06より列挙型に対応"]
["#"]
["def set_write_data(value):"]
["    global writeValue"]
[]
["    # \"0X\"または\"0x\"で始まっている場合は基数を付けてint変換(version 1.07)"]
["    if value.find(\"0x\") == 0 or value.find(\"0X\") == 0:"]
["        value = int(value, 16)"]
[]
["    # 記憶(例外発生の有無に関係なく実行できるため、先に行う)"]
["    writeValue = value"]
[]
["    # ログ表示のためにhex表示またはstr表示を行う(str表示はenum型対応のため)"]
["    try:"]
["        output_log(\"書き込みデータ \" + hex(int(value)))"]
["        writeValue = int(value)"]
["    except TypeError:"]
["        output_log(\"書き込みデータ \" + str(value))"]
[]
["#"]
["# 関数:アドレス式を評価した結果を書き込みデータとして設定"]
["# version 1.06で追加"]
["#"]
["def set_write_data_expr(name):"]
["    global writeValue"]
[]
["    # アドレス式を評価"]
["    debugger.Address(name)"]
["    valueStr = common.Output"]
[]
["    # 文字列ではなく数値として保存"]
["    writeValue = convert_to_int(valueStr)"]
[]
["    # ログ表示"]
["    output_log(\"アドレスを評価 \" + name + \" : \" + hex(writeValue))"]
["    output_log(\"書き込みデータ \" + hex(writeValue))"]
[]
["#"]
["# 関数:比較文字列を数値へ変換"]
["#"]
["def convert_to_int(value):"]
["    try:"]
["        # \"0x\"で始まる場合と、そうでない場合に分ける"]
["        if value.find(\"0x\") == 0:"]
["            # 0xを除去"]
["            target = value.replace(\"0x\", \"\")"]
["            # int関数に16進数を指定して返す"]
["            return int(target, 16)"]
["        else:"]
["            # \"0X\"で始まる場合と、そうでない場合に分ける"]
["            if value.find(\"0X\") == 0:"]
["                # 0Xを除去"]
["                target = value.replace(\"0X\", \"\")"]
["                # int関数に16進数を指定して返す"]
["                return int(target, 16)"]
["            else:"]
["                # int関数に10進数を指定して返す"]
["                return int(value, 10)"]
["    except Exception:"]
["        # 変換不可能であるため、0を返す"]
["        output_log(\"数値ではないためOR操作、AND操作はできません\")"]
["        return 0"]
[]
["#"]
["# 関数:CPUレジスタ/SFRを表示"]
["#"]
["def display_register(name):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"CPUレジスタ/SFR表示 \" + name)"]
[]
["    # 表示"]
["    debugger.Register.GetValue(name)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:CPUレジスタ/SFRを設定"]
["#"]
["def set_register(name):"]
["    # ログ表示"]
["    output_log(\"CPUレジスタ/SFR設定 \" + name + \" <- \" + hex(writeValue))"]
[]
["    # 設定"]
["    debugger.Register.SetValue(name, writeValue)"]
[]
["#"]
["# 関数:変数値を符号つき10進で表示"]
["#"]
["def display_value_signed(name):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"変数値を符号つき10進数で表示 \" + name + \":\")"]
[]
["    # 表示"]
["    debugger.Watch.GetValue(name, WatchOption.SignedDecimal)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:変数値を符号なし10進で表示"]
["#"]
["def display_value_unsigned(name):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"変数値を符号なし10進数で表示 \" + name + \":\")"]
[]
["    # 表示"]
["    debugger.Watch.GetValue(name, WatchOption.UnsignedDecimal)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:変数値を16進で表示"]
["#"]
["def display_value_hex(name):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"変数値を16進数で表示 \" + name + \":\")"]
[]
["    # 表示"]
["    debugger.Watch.GetValue(name, WatchOption.Hexdecimal)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:変数値を型にあわせて表示"]
["#"]
["def display_value_auto(name):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"変数値を型にあわせて表示 \" + name + \":\")"]
[]
["    # 表示"]
["    debugger.Watch.GetValue(name, WatchOption.Auto)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:変数値へデータ書き込み"]
["# version 1.06より列挙型に対応"]
["#"]
["def set_value(name):"]
["    global writeValue"]
[]
["    # 書き込み(例外発生の有無に関係なく実行できるため、先に行う)"]
["    debugger.Watch.SetValue(name, writeValue)"]
[]
["    # ログ表示のためにhex表示またはstr表示を行う(str表示はenum型対応のため)"]
["    try:"]
["        output_log(\"変数値設定 \" + name + \" <- \" + hex(writeValue))"]
["    except TypeError:"]
["        output_log(\"変数値設定 \" + name + \" <- \" + str(writeValue))"]
[]
["#"]
["# 関数:表示値をANDマスク"]
["#"]
["def mask_output_value(mask):"]
["    global outputValue"]
[]
["    # 文字列作成"]
["    beforeStr = \"[表示値] 0x%08x\" % outputValue"]
["    maskStr = \" AND [マスク値] 0x%08x\" % mask"]
[]
["    # マスク"]
["    outputValue &= mask"]
[]
["    # 文字列作成"]
["    afterStr = \" -> [マスク結果] 0x%08x\" % outputValue"]
[]
["    # ログ表示"]
["    output_log(beforeStr + maskStr + afterStr)"]
[]
["#"]
["# 関数:表示値OR演算から書き込み値設定"]
["# version 1.05で追加"]
["#"]
["def or_output_value(set):"]
["    global writeValue"]
["    global outputValue"]
[]
["    # 文字列作成"]
["    beforeStr = \"[表示値] 0x%08x\" % outputValue"]
["    maskStr = \" OR [指定値] 0x%08x\" % set"]
[]
["    # ORした結果を書き込み値とする"]
["    writeValue = outputValue"]
["    writeValue |= set"]
[]
["    # 文字列作成"]
["    afterStr = \" -> [書き込みデータ] 0x%08x\" % writeValue"]
[]
["    # ログ表示"]
["    output_log(beforeStr + maskStr + afterStr)"]
[]
["#"]
["# 関数:メモリ読み込み(バイト)"]
["# version 1.06で追加"]
["#"]
["def read_mem_byte(addr):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"メモリ読み込み(バイト) \" + addr + \":\")"]
[]
["    # 表示"]
["    debugger.Memory.Read(addr, MemoryOption.Byte)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:メモリ読み込み(ハーフ・ワード)"]
["# version 1.06で追加"]
["#"]
["def read_mem_halfword(addr):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"メモリ読み込み(ハーフ・ワード) \" + addr + \":\")"]
[]
["    # 表示"]
["    debugger.Memory.Read(addr, MemoryOption.HalfWord)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:メモリ読み込み(ワード)"]
["# version 1.06で追加"]
["#"]
["def read_mem_word(addr):"]
["    global outputValue"]
[]
["    # ログ表示"]
["    output_log(\"メモリ読み込み(ワード) \" + addr + \":\")"]
[]
["    # 表示"]
["    debugger.Memory.Read(addr, MemoryOption.Word)"]
["    valueStr = common.Output"]
["    output_log(valueStr)"]
[]
["    # 文字列ではなく数値として保存"]
["    outputValue = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:メモリ書き込み(バイト)"]
["# version 1.06で追加"]
["#"]
["def write_mem_byte(addr):"]
["    global writeValue"]
[]
["    # 書き込み(例外発生の有無に関係なく実行できるため、先に行う)"]
["    debugger.Memory.Write(addr, writeValue & 0xff, MemoryOption.Byte)"]
[]
["    # ログ表示のためにhex表示またはstr表示を行う(str表示は変数名対応のため)"]
["    try:"]
["        output_log(\"メモリ書き込み(バイト) \" + hex(addr) + \" <- \" + hex(writeValue & 0xff))"]
["    except TypeError:"]
["        output_log(\"メモリ書き込み(バイト) \" + str(addr) + \" <- \" + hex(writeValue & 0xff))"]
[]
["#"]
["# 関数:メモリ書き込み(ハーフ・ワード)"]
["# version 1.06で追加"]
["#"]
["def write_mem_halfword(addr):"]
["    global writeValue"]
[]
["    # 書き込み(例外発生の有無に関係なく実行できるため、先に行う)"]
["    debugger.Memory.Write(addr, writeValue, MemoryOption.HalfWord)"]
[]
["    # ログ表示のためにhex表示またはstr表示を行う(str表示は変数名対応のため)"]
["    try:"]
["        output_log(\"メモリ書き込み(ハーフ・ワード) \" + hex(addr) + \" <- \" + hex(writeValue))"]
["    except TypeError:"]
["        output_log(\"メモリ書き込み(ハーフ・ワード) \" + str(addr) + \" <- \" + hex(writeValue))"]
[]
["#"]
["# 関数:メモリ書き込み(ハーフ・ワード)"]
["# version 1.06で追加"]
["#"]
["def write_mem_word(addr):"]
["    global writeValue"]
[]
["    # 書き込み(例外発生の有無に関係なく実行できるため、先に行う)"]
["    debugger.Memory.Write(addr, writeValue, MemoryOption.Word)"]
[]
["    # ログ表示のためにhex表示またはstr表示を行う(str表示は変数名対応のため)"]
["    try:"]
["        output_log(\"メモリ書き込み(ワード) \" + hex(addr) + \" <- \" + hex(writeValue))"]
["    except TypeError:"]
["        output_log(\"メモリ書き込み(ワード) \" + str(addr) + \" <- \" + hex(writeValue))"]
[]
["#"]
["# 関数:比較エラー"]
["#"]
["def compare_error(msg, param, hex=False):"]
["    # 文字列作成"]
["    if hex == True:"]
["        outputStr = \"[表示値] 0x%08x\" % outputValue"]
["    else:"]
["        outputStr = \"[表示値] \" + str(outputValue)"]
[]
["    errMsg = \"条件に反しています。\" + outputStr + msg + \" [比較値] \" + param"]
[]
["    # メッセージボックスで終了を知らせる"]
["    if skipMsgBox == False:"]
["        MessageBox.Show(errMsg, \"条件比較\", MessageBoxButtons.OK, MessageBoxIcon.Error)"]
[]
["    # ログ表示"]
["    output_log(errMsg, True)"]
[]
["#"]
["# 関数:一致比較"]
["#"]
["def compare_eq(param):"]
["    # 文字列作成"]
["    paramStr = \"0x%08x\" % param"]
[]
["    # 一致比較"]
["    if outputValue != param:"]
["        compare_error(\" == \", paramStr)"]
["        return       "]
[]
["    # 比較成功"]
["    output_log(\"比較( == \" + paramStr + \" )に成功しました\")"]
[]
["#"]
["# 関数:不一致比較"]
["#"]
["def compare_ne(param):"]
["    # 文字列作成"]
["    paramStr = \"0x%08x\" % param"]
[]
["    # 不一致比較"]
["    if outputValue == param:"]
["        compare_error(\" != \", paramStr)"]
["        return"]
[]
["    # 比較成功"]
["    output_log(\"比較( != \" + paramStr + \" )に成功しました\")"]
[]
["#"]
["# 関数:大小比較(より大きい)"]
["#"]
["def compare_hi(param):"]
["    # 大小比較(より大きい)"]
["    if outputValue <= param:"]
["        compare_error(\" > \", str(param))"]
["        return"]
[]
["    # 比較成功"]
["    output_log(\"比較( > \" + str(param) + \" )に成功しました\")"]
[]
["#"]
["# 関数:大小比較(以上)"]
["#"]
["def compare_he(param):"]
["    # 大小比較(以上)"]
["    if outputValue < param:"]
["        compare_error(\" >= \", str(param))"]
["        return"]
[]
["    # 比較成功"]
["    output_log(\"比較( >= \" + str(param) + \" )に成功しました\")"]
[]
["#"]
["# 関数:大小比較(より小さい)"]
["#"]
["def compare_lo(param):"]
["    # 大小比較(より小さい)"]
["    if outputValue >= param:"]
["        compare_error(\" < \", str(param))"]
["        return"]
[]
["    # 比較成功"]
["    output_log(\"比較( < \" + str(param) + \" )に成功しました\")"]
[]
["#"]
["# 関数:大小比較(以下)"]
["#"]
["def compare_le(param):"]
["    # 大小比較(以下)"]
["    if outputValue > param:"]
["        compare_error(\" <= \", str(param))"]
["        return"]
[]
["    # 比較成功"]
["    output_log(\"比較( <= \" + str(param) + \" )に成功しました\")"]
[]
["#-[ メモリ操作 ]--------------------------------------------------------------"]
[]
["#"]
["# 関数:メモリ操作の開始アドレスを設定"]
["#"]
["def set_start_addr(addr):"]
["    global startAddress"]
[]
["    # ログ表示"]
["    try:"]
["        output_log(\"メモリ操作の開始アドレス \" + hex(addr))"]
["    except TypeError:"]
["        output_log(\"メモリ操作の開始アドレス \" + str(addr))"]
[]
["    # 記憶"]
["    finally:"]
["        debugger.Address(addr)"]
["        valueStr = common.Output"]
["        output_log(valueStr)"]
[]
["        # 文字列ではなく数値として保存"]
["        startAddress = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:メモリ操作の終了アドレスを設定"]
["#"]
["def set_end_addr(addr):"]
["    global endAddress"]
[]
["    # ログ表示"]
["    try:"]
["        output_log(\"メモリ操作の終了アドレス \" + hex(addr))"]
["    except TypeError:"]
["        output_log(\"メモリ操作の終了アドレス \" + str(addr))"]
[]
["    # 記憶"]
["    finally:"]
["        debugger.Address(addr)"]
["        valueStr = common.Output"]
["        output_log(valueStr)"]
[]
["        # 文字列ではなく数値として保存"]
["        endAddress = convert_to_int(valueStr)"]
[]
["#"]
["# 関数:メモリ内容を表示"]
["#"]
["def display_mem():"]
["    # アドレス範囲チェック"]
["    if startAddress == 0x80000000:"]
["        if endAddress == 0x80000000:"]
["            output_log(\"アドレス範囲が指定されていません\")"]
["            return"]
["    if startAddress > endAddress:"]
["        output_log(\"アドレス範囲が不正です\")"]
["        return"]
[]
["    # 表示"]
["    output_log(\"メモリ内容(バイト単位):\")"]
["    debugger.Memory.ReadRange(startAddress, endAddress - startAddress + 1, MemoryOption.Byte)"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:バイナリ形式でメモリ範囲を読み込み"]
["#"]
["def down_mem_bin(name):"]
["    # アドレス範囲チェック"]
["    if startAddress == 0x80000000:"]
["        if endAddress == 0x80000000:"]
["            output_log(\"アドレス範囲が指定されていません\")"]
["            return"]
["    if startAddress > endAddress:"]
["        output_log(\"アドレス範囲が不正です\")"]
["        return"]
[]
["    # ダウンロード"]
["    path = basePath + name"]
["    output_log(\"メモリへバイナリ形式でダウンロードします \" + path)"]
["    output_log(\"ダウンロード結果:\")"]
["    debugger.Download.Binary(path, startAddress, True, False)"]
[]
["    # ログ表示"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:ヘキサ形式でメモリ範囲を読み込み"]
["#"]
["def down_mem_hex(name):"]
["    # アドレス範囲チェック"]
["    if startAddress == 0x80000000:"]
["        if endAddress == 0x80000000:"]
["            output_log(\"アドレス範囲が指定されていません\")"]
["            return"]
["    if startAddress > endAddress:"]
["        output_log(\"アドレス範囲が不正です\")"]
["        return"]
[]
["    # ダウンロード"]
["    path = basePath + name"]
["    output_log(\"メモリへヘキサ形式でダウンロードします \" + path)"]
["    output_log(\"ダウンロード結果:\")"]
["    debugger.Download.Hex(path, startAddress, True, False)"]
[]
["    # ログ表示"]
["    output_log(common.Output)"]
[]
["#"]
["# 関数:バイナリ形式でメモリ範囲を保存"]
["#"]
["def up_mem_bin(name):"]
["    # アドレス範囲チェック"]
["    if startAddress == 0x80000000:"]
["        if endAddress == 0x80000000:"]
["            output_log(\"アドレス範囲が指定されていません\")"]
["            return"]
["    if startAddress > endAddress:"]
["        output_log(\"アドレス範囲が不正です\")"]
["        return"]
[]
["    # 保存"]
["    dtNow = datetime.datetime.now()"]
["    dtMsg = dtNow.strftime(\"%Y%m%d_%H%M%S\")"]
["    path = basePath + dtMsg + \"_\" + name"]
["    debugger.Upload.Binary(path, startAddress, endAddress, True)"]
[]
["    # ログ表示"]
["    output_log(\"メモリ内容をバイナリ形式で保存しました \" + path)"]
[]
["#"]
["# 関数:モトローラ形式でメモリ範囲を保存"]
["#"]
["def up_mem_mot(name):"]
["    # アドレス範囲チェック"]
["    if startAddress == 0x80000000:"]
["        if endAddress == 0x80000000:"]
["            output_log(\"アドレス範囲が指定されていません\")"]
["            return"]
["    if startAddress > endAddress:"]
["        output_log(\"アドレス範囲が不正です\")"]
["        return"]
[]
["    # 保存"]
["    dtNow = datetime.datetime.now()"]
["    dtMsg = dtNow.strftime(\"%Y%m%d_%H%M%S\")"]
["    path = basePath + dtMsg + \"_\" + name"]
["    debugger.Upload.Motorola(path, startAddress, endAddress, True)"]
[]
["    # ログ表示"]
["    output_log(\"メモリ内容をモトローラ形式で保存しました \" + path)"]
[]
["#"]
["# 関数:メモリ内容を埋める(フィル)"]
["#"]
["def fill_mem():"]
["    # アドレス範囲チェック"]
["    if startAddress == 0x80000000:"]
["        if endAddress == 0x80000000:"]
["            output_log(\"アドレス範囲が指定されていません\")"]
["            return"]
["    if startAddress > endAddress:"]
["        output_log(\"アドレス範囲が不正です\")"]
["        return"]
[]
["    # 表示"]
["    output_log(\"メモリフィル(バイト単位):\")"]
["    debugger.Memory.Fill(startAddress, endAddress, writeValue, MemoryOption.Byte)"]
["    output_log(common.Output)"]
[]
["#"]
["# データフラッシュ消去"]
["#"]
["def erase_mem_data():"]
["    output_log(\"データフラッシュ・メモリの消去:\")"]
["    debugger.Erase(EraseOption.Data)"]
["    output_log(common.Output)"]
[]
["#"]
["# スクリプト実行開始"]
["#"]
["start_script()"]

{"sheet":"library_post","index":7,"n_rows":17,"n_cols":1,"rows_kept":17,"cut":false,"hidden":false,"merged":[]}
["#"]
["# スクリプト実行終了"]
["#"]
["terminate_script()"]
[]
["#"]
["# Generated by IronPythonScriptGenerator.xls"]
["# Author: Yasushi Tanaka"]
["#"]
[{"$f":"\"# Filename: \"&ScriptFileName","v":"# Filename: "}]
[{"$f":"\"# Testcase: \"&TestCaseName","v":"# Testcase: "}]
[{"$f":"\"# Created by: \"&TestCaseUser","v":"# Created by: "}]
[{"$f":"\"# Date: \"&TEXT(TestCaseDate,\"yyyy/mm/dd\")","v":"# Date: 1900/01/00"}]
[{"$f":"\"# Revision: \"&TestCaseRevision","v":"# Revision: "}]
[{"$f":"\"# TestDescription: \"&SUBSTITUTE(TestDescription,CHAR(10),\"\\n\")","v":"# TestDescription: "}]
[{"$f":"\"# TargetVersion: \"&TargetVersion","v":"# TargetVersion: "}]
["#"]

{"sheet":"改版履歴(ツール)","index":8,"n_rows":51,"n_cols":5,"rows_kept":51,"cut":false,"hidden":false,"merged":[[0,1,0,4]]}
[null,"改版履歴（ツール）"]
[null,"バージョン","日付","内容","作成者"]
[null,"version 1.00","2015-12-07","新規作成","Yasushi Tanaka"]
[null,"version 1.01","2015-12-13","取扱説明書シートを追加した","Yasushi Tanaka"]
[null,null,"2015-12-13","テスト結果集計で、ログ検索フォルダの末尾が'\\'で終わっていると正しく検索できない不具合を修正した","Yasushi Tanaka"]
[null,null,"2015-12-13","テスト結果集計・テストシートのユーザ入力可能エリアを赤太枠で囲い、明確化した","Yasushi Tanaka"]
[null,null,"2015-12-13","テスト結果集計で、ログ検索フォルダとテストケースに数字のみのデータを入力できない不具合を修正した","Yasushi Tanaka"]
[null,null,"2015-12-13","”テストの目的・概要・補足事項など”を記入する欄を追加し、スクリプトに埋め込むと同時に集計時も表示されるようにした","Yasushi Tanaka"]
[null,null,"2015-12-13","表示値をANDマスクする機能を追加した。これに伴いoutputValueを文字列型から整数型へ設計変更した","Yasushi Tanaka"]
[null,null,"2015-12-13","Pythonスクリプト実行コマンドをSource('～.py')に限定する旨の注記を追加した","Yasushi Tanaka"]
[null,null,"2015-12-13","テスト結果集計で、テストケース名称のマッチングが正常にできない問題を修正した","Yasushi Tanaka"]
[null,"version 1.02","2015-12-20","メモリフィル機能を追加した","Yasushi Tanaka"]
[null,null,"2015-12-20","開始時のメッセージボックス×2を抑制できるチェックボックスを追加した","Yasushi Tanaka"]
[null,null,"2015-12-20","外部DLL呼び出し機能を追加した","Yasushi Tanaka"]
[null,"version 1.03","2015-12-26","変数値表示（符号なし16進）でInvalidエラーが表示される不具合を修正した","Yasushi Tanaka"]
[null,null,"2015-12-26","テスト結果集計シートのボタン名称を変更した","Yasushi Tanaka"]
[null,null,"2015-12-29","IronPythonScriptExecutorからのスクリプト作成に対応した","Yasushi Tanaka"]
[null,null,"2015-12-31","取扱説明書に、IronPythonコンソールメニューが表示されない場合の対処方法を記載した","Yasushi Tanaka"]
[null,null,"2016-01-01","開始時のメッセージボックス×2を抑制できるチェックボックスの論理を逆にした","Yasushi Tanaka"]
[null,null,"2016-01-01","IronPythonScriptExecutorからのスクリプト作成の場合、開始時のメッセージボックス×2が必ずOFFになるようにした","Yasushi Tanaka"]
[null,null,"2016-01-02","テスト結果集計シートでの文字列判定基準を厳密化し、IronPythonScriptExecutorと同一にした","Yasushi Tanaka"]
[null,null,"2016-01-02","テスト結果集計シートでログファイルにハイパーリンクを設定するようにした","Yasushi Tanaka"]
[null,"version 1.04","2016-02-22","library_postシートの最終行だけ書式が異なっていたため修正した","Yasushi Tanaka"]
[null,null,"2016-02-27","取扱説明書の誤記を修正し、IronPythonScriptExecutorとの連携について記載した","Yasushi Tanaka"]
[null,null,"2016-02-27","”スクリプト作成時にコマンドをクリップボードへコピーする”チェックボックスを追加した","Yasushi Tanaka"]
[null,"version 1.05","2016-03-12","メモリフィルコマンドのパラメータ説明を”パラメータは必要ありません”に修正した","Yasushi Tanaka"]
[null,null,"2016-03-12","”プログラムカウンタ表示（逆アセンブル）”コマンドを追加した","Yasushi Tanaka"]
[null,null,"2016-04-11","”表示値OR演算から書き込み設定”コマンドを追加した","Yasushi Tanaka"]
[null,"version 1.06","2016-05-01","”書き込みデータ設定”コマンドで列挙型を指定可能とした","Yasushi Tanaka"]
[null,null,"2016-05-01","”変数値設定”コマンドで列挙型を指定可能とした","Yasushi Tanaka"]
[null,null,"2016-05-01","”式評価結果から書き込み設定”コマンドを追加した","Yasushi Tanaka"]
[null,null,"2016-05-09","”メモリ値表示（バイト／ハーフワード／ワード）”コマンド及び”メモリ書き込み（バイト／ハーフワード／ワード）コマンドを追加した","Yasushi Tanaka"]
[null,null,"2016-05-09","”メモリ開始アドレス設定”及び”メモリ終了アドレス設定”コマンドで絶対アドレスだけでなく、変数名を使用可能とした","Yasushi Tanaka"]
[null,null,"2016-05-09","スクリプト作成時にコマンドをクリップボードにコピーする際、環境によって正常に動作しない不具合を修正した","Yasushi Tanaka"]
[null,null,"2016-05-09","”ブレークポイント設定（ハード)”と”ブレークポイント設定（ソフト）”で、ソースファイル中のコメントを検索して行番号を決定する方式を追加した","Yasushi Tanaka"]
[null,"version 1.07","2016-07-24","スクリプト実行時に.NET Framework 4.5以上がインストールされていない環境で、\"Could not reference System.Threading\"エラーが表示される問題を修正した","Yasushi Tanaka"]
[null,null,"2016-07-24","”変数値表示（自動）”コマンドを追加した。これにより文字列型や列挙型を表示可能とした","Yasushi Tanaka"]
[null,null,"2016-07-24","”データフラッシュ消去”コマンドを追加した","Yasushi Tanaka"]
[null,null,"2016-07-24","比較処理やメモリ操作処理でのエラー検出時に、意図をわかりやすくするためのreturn文を追加した","Yasushi Tanaka"]
[null,null,"2016-08-19","”メモリロード（バイナリ）”コマンドの振る舞いを、上書きダウンロードから追加ダウンロードに変更した。(debugger.Mem.Download.Binaryコマンドの第3引数をFalseからTrueに変更した)","Yasushi Tanaka"]
[null,null,"2016-08-19","”メモリロード（ヘキサ）”コマンドを追加した。ダウンロードモードは上記バイナリ同様、追加ダウンロードとした","Yasushi Tanaka"]
[null,null,"2016-08-19","オプション”比較失敗時にスクリプトを継続する”を追加した","Yasushi Tanaka"]
[null,null,"2016-08-19","オプション”メッセージボックスを表示せず、スキップする”を追加した","Yasushi Tanaka"]
[null,null,"2016-08-20","”書き込みデータ設定”コマンドで整数型を指定した際、特定のコマンドが動作しない不具合を修正した","Yasushi Tanaka"]
[null,null,"2016-08-20","”ファイルinclude”コマンドを追加した","Yasushi Tanaka"]
[null,null,"2016-08-27","”メッセージボックス応答チェック”コマンド2種を追加した","Yasushi Tanaka"]
[null,null,"2016-08-27","”ダウンロード”コマンド2種を追加した","Yasushi Tanaka"]
[null,"version 1.08","2016-09-01","テストシートで、複数の条件付き書式が定義されていたため、余分な条件付き書式を削除した","Yasushi Tanaka"]
[null,null,"2016-09-01","Excel 2010で、”保護されたビューで開いています”と表示される問題を修正した","Yasushi Tanaka"]
[null,null,"2016-09-24","結果NG時にスクリプトを継続するモードで、NG回数をカウントする機能を追加した","Yasushi Tanaka"]
[null,null,"2016-10-24","Excel 2007形式(拡張子xlsm)へ変更した","Yasushi Tanaka"]