カテゴリ | |
対象製品 |
設定項目 | マスターチャンネル設定 | スレーブチャンネル設定 |
Use The CC? | Yes | |
Exposure | 任意の値を設定します。 ただしCycleより小さい値を設定してください。 |
|
Cycle | 任意の値を設定します。 | マスターチャンネルのCC出力周期と同じ値を設定すること |
Sync Ch | 0に設定します。 | 同期するチャンネルに設定します。 マスターチャンネルがCH1の場合、1に設定します。 |
CC Stop | チェックを付けます。 |
設定項目 | マスターチャンネル設定 | スレーブチャンネル設定 |
Use The CC? | Yes | |
Exposure | 任意の値を設定します。 ただしCycleより小さい値を設定してください。 |
|
Cycle | 任意の値を設定します。 | 以下の条件を満たした値を設定して下さい。 ・カメラの制限を超えない範囲で、可能な限り早い周期であること ・マスターチャンネルのCycle(CC信号周期)より早い周期であること |
Sync Ch | 0に設定します。 | 同期するチャンネルに設定します。 マスターチャンネルがCH1の場合、1に設定します。 |
CC Stop | チェックを付けます。 |
HANDLE hDev = NULL; // ボードのハンドル格納用
int ch_all = 0; // 全てのch
int ch_1 = 1; // ch1
int ch_2 = 2; // ch2
int CCCycle_us = 30000; // CC 出力周期
int CCWidth_us = 15000; // CC 出力幅
int nRet = 0; // 関数戻り値用
int CamType = 0; // カメラタイプ
ACAPBOARDINFO abi; // ボード情報構造体
// ボード情報を取得
AcapGetBoardInfo(&abi);
// 全てのch をオープン
hDev = AcapOpen(abi.BOARDINDEX[0].pBoardName, abi.BOARDINDEX[0].nBoardID, ch_all);
// ini ファイルで基本部分の初期設定
nRet = AcapSelectFile(hDev, ch_1, ".¥¥camera_ch1.ini", 0);
nRet = AcapSelectFile(hDev, ch_2, ".¥¥camera_ch2.ini", 0);
//////////////////////////////////////////////////////////////////
// 〇スレーブチャンネルのCC 出力周期設定はボードによって異なります。
// APX-3302:マスターチャンネルのCC 出力周期と同じ値を設定します。
// APX-3324 / APX-3326:カメラの制限を超えない範囲で、できるだけ短い周期に設定します。
// また必ずマスターチャンネルのCC 出力周期より早い周期を設定してください。
// 〇外部トリガを使用する場合、ボードによって外部トリガの入力方法が異なります。
// APX-3302:マスターチャンネルとスレーブチャンネルの両方に外部トリガを入力します。
// APX-3324 / APX-3326:マスターチャンネルのみ外部トリガを入力します。
// 〇CC信号を出力する場合、周期も出力幅も1以上に設定しなければいけません。
// 0に設定した場合、CC信号が出力されません。
// 〇CC信号の周期は出力幅より大きく設定します。
// 〇CC信号を出力してから、CC 信号出力周期期間が終わるまで、
// 次の同期要求を受けられません。
//////////////////////////////////////////////////////////////////
// マスターチャンネルのCC 出力設定
CCCycle_us = 100 * 1000; // 100[ms]
CCWidth_us = 20 * 1000; // 20[ms]
nRet = AcapSetInfo(hDev, ch_1, ACL_EXP_CYCLE, -1, CCCycle_us);
nRet = AcapSetInfo(hDev, ch_1, ACL_EXPOSURE, -1, CCWidth_us);
// スレーブチャンネルのCC 出力設定
nRet = AcapSetInfo(hDev, ch_2, ACL_EXPOSURE, -1, CCWidth_us);
if(memcmp(abi.BOARDINDEX[0].pBoardName, "APX-3302", sizeof("APX-3302")) == 0) {
// APX-3302の場合
nRet = AcapSetInfo(hDev, ch_2, ACL_EXP_CYCLE, -1, CCCycle_us);
}else{
// APX-3324 / APX-3326の場合
nRet = AcapSetInfo(hDev, ch_2, ACL_EXP_CYCLE, -1, CCCycle_us - 1000);
}
// CC 出力を有効
nRet = AcapSetInfo(hDev, ch_1, ACL_EXP_EN, -1, 1);
nRet = AcapSetInfo(hDev, ch_2, ACL_EXP_EN, -1, 1);
//////////////////////////////////////////////////////////////////
// ラインセンサの場合、センサの飽和を避けるため取り込み停止中でもCC信号が出力されています。
// この状態でチャンネル間同期を行った場合、
// マスターチャンネルが取り込み停止しているにも関わらず、
// スレーブチャンネルがマスターチャンネルのCC 信号に同期して、CC 信号を出力してしまい、
// 先に取込を行ってしまいますので、必ずCC 信号は停止してください。
//////////////////////////////////////////////////////////////////
// カメラの種類を取得
nRet = AcapGetInfo(hDev, ch_1, ACL_SCAN_SYSTEM, 0, &CamType);
if(CamType == 0) {
// エリアセンサの場合、ローリングシャッタを有効にします。
nRet = AcapSetInfo(hDev, ch_1, ACL_ROLLING_SHUTTER, -1, 1);
nRet = AcapSetInfo(hDev, ch_2, ACL_ROLLING_SHUTTER, -1, 1);
}else{
// ラインセンサの場合、取り込み開始前にCC信号を停止します。
nRet = AcapSetInfo(hDev, ch_1, ACL_CC_STOP, -1, 1);
nRet = AcapSetInfo(hDev, ch_2, ACL_CC_STOP, -1, 1);
}
//////////////////////////////////////////////////////////////////
// AcapSetInfo の第4引数を‐1 にして設定の反映を保留にして置き、
// 全ての設定が終わった後、AcapReflectParam 関数で一括して設定を反映させます。
// (毎回設定の反映を行うと処理時間の無駄が発生します)
//////////////////////////////////////////////////////////////////
// スレーブチャンネル(2ch)のマスター(1ch)を設定
nRet = AcapSetInfo(hDev, ch_2, ACL_SYNC_CH, -1, ch_1);
// 設定を反映
nRet = AcapReflectParam(hDev, ch_1);
nRet = AcapReflectParam(hDev, ch_2);
//////////////////////////////////////////////////////////////////
// 取り込み開始
//////////////////////////////////////////////////////////////////
// イベント登録(説明用)
nRet = AcapSetEvent(hDev, ch_1, ACL_INT_GRABEND, TRUE);
nRet = AcapSetEvent(hDev, ch_2, ACL_INT_GRABEND, TRUE);
// スレーブチャンネルを先に取込開始しなければならない
nRet = AcapGrabStart(hDev, ch_2, 5); // 5 枚
// 100[ms]後にマスターチャンネルの取込を開始(説明用)
Sleep(100);
nRet = AcapGrabStart(hDev, ch_1, 5); // 5 枚
//////////////////////////////////////////////////////////////////
// 取り込み停止
//////////////////////////////////////////////////////////////////
// ACL_INT_GRABEND(5枚入力完了)待ち
if(ACL_RTN_ERROR == AcapWaitEvent(hDev, ch_1, ACL_INT_GRABEND, 10000))
{ /* タイムアウトetc */ }
if(ACL_RTN_ERROR == AcapWaitEvent(hDev, ch_2, ACL_INT_GRABEND, 10000))
{ /* タイムアウトetc */ }
// ACL_INT_GRABEND後であれば停止順は自由
nRet = AcapGrabStop(hDev, ch_1);
nRet = AcapGrabStop(hDev, ch_2);
// 同期取り込みをやめる場合はスレーブ側の設定を解除
nRet = AcapSetInfo(hDev, ch_2, ACL_SYNC_CH, 0, 0);
Now Loading...