mengineer's blog

ニッチなネタばかりですが。

GenTL .ctiファイルを開いてみる

前回下記ネタの続きです、タイトル紛らわしいですが御勘弁を。

mengineer.hatenablog.com

この最後で、次は接続カメラを検出するみたいな話を書きましたが、
そこまでは至らず、今回は.ctiファイルをひらくところまで。

下記の規格書を見ながら調べた内容ですが、間違い有ったら御免なさい。

https://www.emva.org/wp-content/uploads/GenICam_GenTL_1_5.pdf

ちなみにGenTL規格、最新は1.6ですが昨年の11月に出たばかりなので、
今回は(世間に出回っている)1.5の内容に従っています。

.ctiファイルの読み込み

いきなりサンプル画面から、MFCのダイアログアプリで作ってます。

f:id:mengineer:20200831104714p:plain

  1.  Select .cti fileボタンで、対象の.ctiファイルを選択
    →今回は手動で選択させるかたち

2. LoadLibraryで、.ctiファイルを読み込む
3. GetProcessAddressで、各APIアドレス取得

2.と3.は、こんな感じです。
(詳しく無いのですが、通常のdllでも同様の流れなんですかね)

CTransportLayer::CTransportLayer(CString filepath)
    :   m_iNumOfInterfaces(0),
        m_iNumOfDevices(0),
        m_hDll(NULL)
{
    // Load .cti file
    m_hDll = LoadLibrary(filepath);
    if (m_hDll == NULL)
    {
        OutputDebugString(_T("Failed to Load .cti file\n"));
        return;
    }
    // Get Address
    m_pGCInitLib = reinterpret_cast<PGCInitLib>(GetProcAddress(m_hDll, "GCInitLib"));
    if (m_pGCInitLib == NULL)
        OutputDebugString(_T("Failed to Get GCInitLib\n"));

    m_pGCCloseLib = reinterpret_cast<PGCCloseLib>(GetProcAddress(m_hDll, "GCCloseLib"));
    if (m_pGCCloseLib == NULL)
        OutputDebugString(_T("Failed to Get GCCloseLib\n"));

以降同様に列記、アドレス取得出来なかったらデバッグ出力させています。

GCInitLib等はAPIの名称で、GenTL規格(上記pdf)に説明が載っています、
おおまかな分類は下表参照。

f:id:mengineer:20200901103955p:plain

あ、話が前後しましたが、前回ネタで出てきた”GenTL.h”をダウンロードして、
忘れずにincludeして下さい、ここまで出来れば前準備は完了です。

おおまかな流れ

今回はTransportLayerをOpenして見るだけなので

1. GCInitLib → 全体の初期化
2. TLOpen  → TransportLayerをOpen
3, TLGetInfo →  TransportLayerの情報取得(デバッグ出力)
4. TLClose  → TransportLayerをClose
5. GCClose → 全体をClose

という流れになります、TransportLayerの情報確認するのが目的。

3.のTLGetInfoですが、TL_INFO_CMDというパラメータを切り替えて、
下記一連の情報(GeTL.hより抜粋)を取得出来るようです。

    /* System module information commands for the GenICam::TL::Client::TLGetInfo and GenICam::TL::Client::GCGetInfo functions. */
    enum  TL_INFO_CMD_LIST
    {
      TL_INFO_ID              = 0,    /* STRING    Transport layer ID. */
      TL_INFO_VENDOR          = 1,    /* STRING    Transport layer vendor name. */
      TL_INFO_MODEL           = 2,    /* STRING    Transport layer model name. */
      TL_INFO_VERSION         = 3,    /* STRING    Transport layer version. */
      TL_INFO_TLTYPE          = 4,    /* STRING    Transport layer technology that is supported. */
      TL_INFO_NAME            = 5,    /* STRING    File name including extension of the library. */
      TL_INFO_PATHNAME        = 6,    /* STRING    Full path including file name and extension of the library. */
      TL_INFO_DISPLAYNAME     = 7,    /* STRING    User readable name of the device. If this is not defined in the device this should be VENDOR MODEL (ID). */
      TL_INFO_CHAR_ENCODING   = 8,    /* INT32     Reporting the char encoding used by this Producer, GenTL v1.4 */
      TL_INFO_GENTL_VER_MAJOR = 9,    /* UINT32    Major number of the GenTL spec this producer complies with, GenTL v1.5 */
      TL_INFO_GENTL_VER_MINOR = 10,   /* UINT32    Minor number of the GenTL spec this producer complies with, GenTL v1.5 */
      TL_INFO_CUSTOM_ID       = 1000  /* Starting value for custom IDs. */
    };
    typedef int32_t TL_INFO_CMD;

今回は(手抜きで)これらをデバッグウィンドウに出力させてみました。

色々な.ctiファイルで試してみた

PC内に有った.ctiファイルを指定し、デバッグウィンドウで確認した結果です。

まずはJAISDK関係(サポート終了しましたが、まだ使ってます)

C:\Program Files\JAI\SDK\bin\JaiGevTL.cti

*** TL_INFO_ID=JaiGevTL.cti
*** TL_INFO_VENDOR=JAI A-S
*** TL_INFO_MODEL=GevTL
*** TL_INFO_VERSION=3.0.7.0
*** TL_INFO_TLTYPE=GEV
*** TL_INFO_NAME=JaiGevTL.cti
*** TL_INFO_PATHNAME=C:\Program Files\JAI\SDK\bin\JaiGevTL.cti
*** TL_INFO_DISPLAYNAME=JAI A-S GevTL
Error : TLGetInfo TL_INFO_CHAR_ENCODNIG
Error : TLGetInfo TL_INFO_GENTL_VER_MAJOR
Error : TLGetInfo TL_INFO_GENTL_VER_MINOR

C:\Program Files\JAI\SDK\bin\JaiUSB3vTL.cti

*** TL_INFO_ID=01c11f94-8bbf-467f-8208-c580a873742e
*** TL_INFO_VENDOR=JAI Software
*** TL_INFO_MODEL=Jai
*** TL_INFO_VERSION=1.0.0
*** TL_INFO_TLTYPE=U3V
*** TL_INFO_NAME=JaiUSB3vTL.cti
*** TL_INFO_PATHNAME=C:\Program Files\JAI\SDK\bin\JaiUSB3vTL.cti
*** TL_INFO_DISPLAYNAME=Jai - JAI GenTL Producer for USB3 Vision
*** TL_INFO_CHAR_ENCODNIG=0
Error : TLGetInfo TL_INFO_GENTL_VER_MAJOR
Error : TLGetInfo TL_INFO_GENTL_VER_MINOR

C:\Program Files\JAI\SDK\bin\JaiCLTL.cti

*** TL_INFO_ID=JaiCLTL.cti
*** TL_INFO_VENDOR= 
*** TL_INFO_MODEL=JaiCLTL
*** TL_INFO_VERSION=2.1.6.7
*** TL_INFO_TLTYPE=CL
*** TL_INFO_NAME=JaiCLTL.cti
*** TL_INFO_PATHNAME=C:\Program Files\JAI\SDK\bin\JaiCLTL.cti
*** TL_INFO_DISPLAYNAME=JAI Camera Link TL 
Error : TLGetInfo TL_INFO_CHAR_ENCODNIG
Error : TLGetInfo TL_INFO_GENTL_VER_MAJOR
Error : TLGetInfo TL_INFO_GENTL_VER_MINOR

TL_INFO_TYPEで、各ctiファイルのIFが判ります(GEV / U3V / CL)
(どういうTYPEが有るかは、規格書6.6.1辺り参照)

CHAR_ENCODNIG、GENTL_VER_MAJOR、GENTL_VER_MINORは、
.ctiファイルによっては未対応みたいです。

続いてAvalData用

C:\Program Files\AVAL DATA\TransFlyer\bin\Win64_x64\avaldata.tf.GenTL.cti

*** TL_INFO_ID=TransFlyer
*** TL_INFO_VENDOR=AVAL DATA CORPORATION
*** TL_INFO_MODEL=GENTL
*** TL_INFO_VERSION=3.4.4.0
*** TL_INFO_TLTYPE=CXP
*** TL_INFO_NAME=avaldata.tf.GenTL.cti
Error : TLGetInfo TL_INFO_PATHNAME
*** TL_INFO_DISPLAYNAME=TransFlyer
*** TL_INFO_CHAR_ENCODNIG=0
Error : TLGetInfo TL_INFO_GENTL_VER_MAJOR
Error : TLGetInfo TL_INFO_GENTL_VER_MINOR

色々エラー出てますが、おそらくAvalのGrabberBoardをOpenしないと
正しい情報を取得出来ないのかも。(この辺も手探りで色々試してます)

GenTLにもSFNC規格有り

上記で出てきたID、VENDOR、MODEL、TLTYPE等々の用語など、
GenTLの規格と別で、”GenTL用のSFNC規格”が存在します、下記リンク参照。

https://www.emva.org/wp-content/uploads/GenICam_GenTL_SFNC_1_2.pdf

中身は通常のSFNC規格と同様で、対象がGenTLというだけですね、
今回のTLGetInfoの関係だと、こんな感じになってました。 f:id:mengineer:20200902104809p:plain

Level RならRecommend、MならMandatory、OならOptional
Visibility BならBeginner、EならExpert、GならGuru
当たり前ですが、まんまSFNCですね。

でも先ほどの結果からして、”Mandatory”なのに未対応の情報も有るし、
TL_INFO_CHAR_ENCODNIGに至っては、この規格に載っていないような?

通常のSFNC同様GenTL版も、どこまで遵守されるべきか不透明ですね。

まとめ

・.ctiファイルをLoadLibaryで読み込んで使用出来る(通常のdll同様)
・GCInitLib→TLOpen→なんか処理→TLClose→GCCloseという流れ
・TLGetInfoでTransportLayerの各種情報を取得出来る
・GenTL用のSFNC規格が有る

最後の件、今回初めて知った衝撃の事実!!!(ちとオーバー)でした、
規格ばかり増えていきますね、もっとスッキリ整理出来ないものか。

現時点でのサンプルソフト(MFCダイアログ/VisualStudio2017)
下記にUpしました。(2020年10月末までダウンロード有効)

https://4.gigafile.nu/1101-b7cc2348240f92d4378af319196810997

興味有る方は御自由にお使い下さい、MFC詳しくないもので、
色々不備が有ったらごめんなさい。(適当に修正して下さい)

次こそ、接続カメラを検出するところまで行けるかな。