Translate

2018/01/09

TRNSYSでPythonスクリプトを動かす

Type169(Python)

TRNSYS18からPython(Type169)が使えるようになりました。TRNSYSのプロジェクトで、ちょっとした計算や判定処理をPythonで手軽(?)に記述できます。

でも、いきなりType169を利用すると図のようなエラーが発生します。

image

詳細なメッセージは以下。

*** Fatal Error at time   :         0.000000

     Generated by Unit     : Not applicable or not available

     Generated by Type     :   169

     TRNSYS Message    105 : A TYPE was called in the TRNSYS input file but was either not linked into trndll.dll or was not found in an external dll. A dummy subroutine was called in its place. Please link the TYPE or remove it from the input file

     Reported information  :  Type169 could not be located in either the trndll.dll or in an external dll. Please relink theTRNDll.dll including this Type or make sure that an external DLL in the \UserLib\DebugDLLs and \UserLib\ReleaseDLLs folders contain the Type.


これ、普段はTypeのDLLが無い、もしくは関連するDLLが不足しているときに表示されるメッセージです。分かりにくいですが、Type169ではPyhtonの実行環境が必須なので、予め環境を整えてないとこのエラーになります。

Pythonの環境を整える

ということで、事前にPythonの実行環境の設定が必要です。
一般的にはPythonの公式サイト(https://www.python.org/)からインストーラーをダウンロードして、インストールしますが、ここではAnacondaのパッケージを使って環境を整えます。(サイズは少々大きくなりますが、こちらの方が取り扱いが簡単です)

AnacondaのダウンロードサイトからPython3.6,64bit版のインストーラーをダウンロードしてインストールします。いくつかオプションが表示されますが、すべてデフォルトでOKです。

https://www.anaconda.com/download/

image

環境変数の設定

インストールが終了したら、次は環境変数、PathにAnacondaのパスを追加します。

デフォルトでインストールしていれば、環境変数Path C:\Users\<ユーザー名>\Anaconda3 を追加すれば準備完了です。

2018/3/9 追記

Anaconda 5.1をインストールしたら、パスが変わっていました。(というか前回勘違いしていた?)環境変数Pathに追加するのは、こちらのパスになります。

C:\Users\<username>\AppData\Local\Continuum\anaconda3

Anacondaのバージョンやインストール方法で変わるのかも知れないので、環境に合わせて調整してください。


image

Simulation Studioでなにかプロジェクトを用意して、うまく動けば設定環境です。

image

Pythonスクリプト

この例で使っているスクリプト(以下)を簡単に説明すると、Type169からはPythonFunction()を呼び出して、さらにmyFunc()を呼び出しています。エラーが起きたときにログファル(_error.log)に書き出したかったので、2段階の呼び出しになっています。直接myFunc()を呼び出してもそのまま動くはずです。

type169_wtih_try.py

"""type169(Python) sample"""
import TRNSYSpy as trn
import traceback
import os

def myFunc():
    # retrieve values from the Inputs
    inp1 = trn.getInputValue(1)
    inp2 = trn.getInputValue(2)
    inp3 = trn.getInputValue(3)
    # processing
    out1 = inp1+inp2
    out2 = inp3**inp2
    # return the new values to the Outputs
    trn.setOutputValue(1, out1)
    trn.setOutputValue(2, out2)
    return

def PythonFunction():
    """This function is called from TRNSYS/Type169"""
    # delete the previous log file if it exists.
    logfile = "_error.log"
    if os.path.exists(logfile):
        os.remove(logfile)

    try:
        myFunc()

    except:
        # save messages to the log file when something goes wrong.
        print('error')
        with open(logfile, 'w') as f:
            f.write(traceback.format_exc())

上記サンプルのダウンロードはこちらから。

Github/TRNSYS.JP

https://github.com/TRNSYSJP/TRNSYS.JP/tree/master/TRNSYS18/Examples/Type169_Calling_Python


動作環境

以下の環境で動作を確認しています。

Windows10 Pro(64bit)
Python:Anaconda 5.0.1(Python 3.6/64bit) https://www.anaconda.com/download/
TRNSYS18.00.0015(64bit)

3 件のコメント:

  1. Hello,

    Could you pls tell me why when I import python modules, type 169 works for
    some modules and does not work for some others python modules.

    For example:

    If in my python script:

    import TRNSYSpy as trn
    import os
    import traceback
    import math
    import sys

    It works.

    However when I tried to import numpy or some other modules (scipy, pandas),

    I got this error

    Floating point division by zero

    Thank you very much for your help.

    Best regards,

    Long

    返信削除
  2. It seems to me that Type169 is not linked to the latest library or is linked to wrong library.

    You should contact your local TRNSYS distributor for help.

    返信削除
  3. Dear Yuichi,

    Thank you very much for your reply. Indeed I tried to contact my local distributor. However, they cannot give me more help than your post and so I also tried to contact TESS. What I received as the answer is as following:
    "Unfortunately we cannot provide much insight into the issue you are having. I would guess that it was path issues where the Python function cannot find the included modules, but we don't know the answer for certain."

    Indeed, I tried to recompiled the Type169.cpp as another type Type269 and put the dll file in Userlib. But it doesn't work either.

    By the way, thank you very much for your reply.

    I really appreciate your posts.

    Best regards,

    Long

    返信削除