問題概要#
JSBSim XMLをExcelテンプレートから生成する際、Excelに値を入力したはずなのに、生成されたXMLではデフォルト値が使用されているという問題が発生することがあります。意図したパラメータが反映されず、機体の仕様が正しく設定されません。
原因#
この問題の主な原因は、Excelセルが空欄(空文字列)または数式エラーでNaNとして認識されていることです。
詳細な原因#
- 空欄セル: セルに何も入力されていない
- 数式エラー: 数式の参照先が空欄または無効
- 見た目の錯覚: セルに値があるように見えても、実態は数式のエラー
PythonのPandasライブラリがExcelを読み込む際、これらのセルをNaN(Not a Number)と判定します。変換スクリプトはNaNを検出すると、安全のためにデフォルト値を使用します。
よくあるケース:
- 数式
=B5*2で、セルB5が空欄 → 結果がNaN - セルに見た目は
0があるが、実態は#DIV/0!エラー - 条件分岐の数式
=IF(A1>0, A1, "")で、空文字列""が返される
解決方法#
解決策1: セルに値があるか確認#
手順:
- Excelで該当セルをクリック
- 画面上部の数式バーを確認
- 数式バーに値が正しく表示されることを確認
チェックポイント:
- 数式バーが空欄でないか
- 数式がエラー(
#VALUE!,#DIV/0!等)を返していないか - 空文字列
""が返されていないか
解決策2: 数式を値に変換#
数式が入っている場合、数式を値に変換することで問題を解決できます。
手順:
- 該当セルを選択
- コピー(Ctrl+C)
- 右クリック → 「形式を選択して貼り付け」
- 「値」を選択
- OK
これにより、数式が計算結果の値に置き換わり、NaN判定を回避できます。
解決策3: model_ir.json で確認#
XML生成スクリプトが中間ファイル model_ir.json を出力する場合、このファイルで実際に使用された値を確認できます。
確認手順:
- XML生成後、
model_ir.jsonを開く - 該当パラメータの
sourceフィールドを確認
例:
{
"metrics": {
"wingarea": {
"value": 1.109,
"unit": "FT2",
"source": "default"
}
}
}"source": "default"→ デフォルト値が使用されている(❌ Excel値が読み込まれていない)"source": "excel"→ Excel値が正しく読み込まれている(✅ 正常)
この情報を元に、どのセルに問題があるかを特定できます。
予防策#
1. Excel入力規則の設定#
Excelテンプレートに入力規則を設定し、空欄を防止します。
設定方法:
- データ入力セルを選択
- 「データ」タブ → 「データの入力規則」
- 「設定」タブで以下を設定:
- 入力値の種類: 「整数」または「小数点数」
- データ: 「次の値以上」(必要に応じて範囲を設定)
- 「エラーメッセージ」タブで警告メッセージを設定
これにより、空欄のまま次のセルに移動しようとすると、Excelが警告を表示します。
2. 変換スクリプトのログ出力強化#
変換スクリプトに詳細なログ出力を追加することで、問題の早期発見が可能になります。
推奨ログ出力例:
警告: セルB5(翼面積)が空欄のため、デフォルト値1.109 FT2を使用しました
警告: セルC10(翼幅)の数式エラーのため、デフォルト値6.56 FTを使用しました3. バリデーションチェックスクリプト#
Excel読み込み前にバリデーションチェックを実行し、空欄セルや数式エラーを事前に検出します。
チェック項目例:
- 必須入力セルの空欄チェック
- 数式エラーの検出
- 数値範囲の妥当性チェック
まとめ#
Excelテンプレートのデフォルト値問題は、セルの空欄や数式エラーによるNaN判定が原因です。
解決の鍵:
- 数式バーで値を確認(空欄、エラーを検出)
- 数式を値に変換(NaN判定を回避)
- model_ir.jsonで検証(どのパラメータに問題があるか特定)
予防策:
- Excel入力規則で空欄を防止
- ログ出力でデフォルト値使用を可視化
- バリデーションチェックで事前検出
これらの対策により、意図しないデフォルト値の使用を防ぎ、正確な機体XMLを生成できます。
関連記事#
- 【トラブル備忘】XML生成時の単位変換エラー - サポート外単位の使用(記事E-5)
- 【トラブル備忘】JSBSimが機体XMLを読み込めない - ディレクトリ構造の罠(記事E-4)
© 2025 Yaaasoh. All Rights Reserved.