前回下記ネタの続きです、タイトル紛らわしいですが御勘弁を。
この最後で、次は接続カメラを検出するみたいな話を書きましたが、
そこまでは至らず、今回は.ctiファイルをひらくところまで。
下記の規格書を見ながら調べた内容ですが、間違い有ったら御免なさい。
https://www.emva.org/wp-content/uploads/GenICam_GenTL_1_5.pdf
ちなみにGenTL規格、最新は1.6ですが昨年の11月に出たばかりなので、
今回は(世間に出回っている)1.5の内容に従っています。
.ctiファイルの読み込み
いきなりサンプル画面から、MFCのダイアログアプリで作ってます。
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)に説明が載っています、
おおまかな分類は下表参照。
あ、話が前後しましたが、前回ネタで出てきた”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関係(サポート終了しましたが、まだ使ってます)
*** 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
*** 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
*** 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の関係だと、こんな感じになってました。
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詳しくないもので、
色々不備が有ったらごめんなさい。(適当に修正して下さい)
次こそ、接続カメラを検出するところまで行けるかな。