海康工业相机功能模块sdk调用介绍
IO输入输出控制
- 前言
- IO输入
- IO输出
前言
机器视觉行业里面,相机作为最重要的图像传感器,除了主要的拍摄功能外,它也承担了一部分信号控制功能.
一方面能够接受外部的触发信号例如PLC、光电传感器等,进行指定时刻拍照;另外一方面,能够输出IO信号,控制外围机构进行机械运动;
海康标准工业相机,支持1路GPIO输入,1路GPIO输出,一路可配置的IO输出(非光耦),本文主要讲一下如何使用SDK进行IO配置以及注意事项
IO输入
IO输入的主要作用就是,相机通过IO管脚,收到1个IO信号,相机就立即拍摄一帧图像;
通用的使用方法如下代码依次设置:
- 触发模式:TriggerMode设置为1,开启触发模式
- 触发源选择:TriggerSource设置为0,选择line0,也可以选择line2,或者选择anyway;line0、line2取决于硬件电路接线,anyway支持软触发、硬触发同时使用,需要看相机是否支持
- 沿信号TriggerActivation:默认上升沿触发(可以不设置)
- 触发缓存TriggerCacheEnable:默认不开启。当相机同时收到两个触发信号时,不开启此功能,相机只会响应1个信号,出一张图;开启后,相机会自动缓存第二个信号,上个信号处理完毕后,立即处理缓存信号
- 触发延时TriggerDelay:收到信号后,固定延迟一段时间再曝光
- 滤波设置 LineDebouncerTime:去除信号毛刺抖动,根据实际情况进行调节
//C语言代码段:硬触发模式初始化配置
//参数值,仅针对海康工业相机,其他品牌相机需根据对应节点微调
nRet = MV_CC_SetEnumValue(handle, "AcquisitionMode", 2);
//0:SingleFrame 1:MultiFrame 2:Continuous
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", 1);//0:off 1:on
nRet = MV_CC_SetEnumValue(handle, "TriggerSource", 0);//line2也可做输入源,非光耦
//0:Line0 1:Line1 2:Line2 7:Software 8:FrequencyConverter 13:anyway
nRet = MV_CC_SetEnumValue(handle, "TriggerActivation", 0);//0:Rising Edge 1:Falling Edge 2:LevelHigh 3:LevelLow
nRet = MV_CC_SetFloatValue(handle,"TriggerDelay",0);//根据实际情况设置,默认0 us
nRet = MV_CC_SetBoolValue(handle,"TriggerCacheEnable",TRUE);//开启后会默认缓存1个信号
//滤波设置
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 0);//0:Line0 2:Line2
nRet = MV_CC_SetIntValue(handle,"LineDebouncerTime",10);//硬件滤波时间,可加大此参数防抖us
触发配置:
滤波:
IO输出
IO输出,参考用法主要分为两类
- strobe输出,配合频闪光源拍摄,IO输出跟随曝光,输出周期与曝光周期同步
- software输出,用户自定义时刻输出,用户自主控制,必要时刻输出OK或NG信号
- strobe输出配合频闪光源,IO输出与曝光同步
这里需要注意StrobeLineDuration、StrobeLineDelay、StrobeLinePreDelay三个参数,用于调节与光源同步;光源的LED从灭到亮有个响应时间,那么我们就需要适当的去调节StrobeLineDelay/StrobeLinePreDelay这两个值去做匹配,StrobeLineDuration是持续时间,可以不配置,也可以根据需要配置
//Strobe输出
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 1);
//0:Line0 1:Line1 2:Line2
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8);//仅LineSelector为line2时需要特意设置,其他输出不需要
//0:Input 1:Output 8:Strobe
int DurationValue=0,DelayValue=0,PreDelayValue=0;//us
nRet = MV_CC_SetIntValue(handle, "StrobeLineDuration",DurationValue);
//strobe持续时间,设置为0,持续时间就是曝光时间,设置其他值,就是其他值时间
nRet = MV_CC_SetIntValue(handle, "StrobeLineDelay",DelayValue);//strobe延时,从曝光开始,延时多久输出
nRet = MV_CC_SetIntValue(handle, "StrobeLinePreDelay",PreDelayValue);//strobe提前输出,曝光延后开始
//--------------------------------------------------------------------------------------------------
nRet = MV_CC_SetBoolValue(handle, "StrobeEnable",TRUE);//Strobe输出使能,使能之后,上面配置参数生效,IO输出与曝光同步
//Strobe输出,多用作点亮频闪光源,sensor快门类型为Global相机都支持,rolling需注意相机是否支持
- Software输出,IO输出与LineSource同步
//IO输出做NG信号用
//参数初始化
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 2);
//0:Line0 1:Line1 2:Line2
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8);//仅line2需要设置
//0:Input 1:Output 8:Strobe
nRet = MV_CC_SetEnumValue(handle, "LineSource", 5);
//0:ExposureStartActive 5:SoftTriggerActive 6:HardTriggerActive
int DurationValue=1000,DelayValue=0,PreDelayValue=0;//us
nRet = MV_CC_SetIntValue(handle, "StrobeLineDuration",DurationValue);
nRet = MV_CC_SetIntValue(handle, "StrobeLineDelay",DelayValue);//strobe延时,从曝光开始,延时多久输出
nRet = MV_CC_SetIntValue(handle, "StrobeLinePreDelay",PreDelayValue);//strobe提前输出,曝光延后开始
nRet = MV_CC_SetBoolValue(handle, "StrobeEnable",TRUE);
//Strobe输出使能,使能之后,上面配置参数生效,IO输出与LineSource同步
//-------------------------------------------------------------------------------------
//输出IO信号命令
nRet = MV_CC_SetCommandValue(m_handle, "LineTriggerSoftware");
这里会存在一个问题就是,海康部分相机,LineSource没有SoftTriggerActive的参数选项,那么就必须使用另外一种方法实现
- 电平反转,通过快速反转电平状态,来模拟一个信号输出
当然这种控制电平变化时间做不到精确控制,只能适用于那种不太严格要求信号质量的场景
//电平反转
//IO输出做NG信号用
//参数初始化
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 2);
//0:Line0 1:Line1 2:Line2
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8);//仅line2需要设置
//0:Input 1:Output 8:Strobe
//信号输出----------------------------------------------------
nRet = MV_CC_SetBoolValue(handle, "LineInverter",TRUE);//电平反转,也可用作IO输出,连续两次翻转可以输出一个IO信号
Sleep(10);//延时就相当于电平持续时间,也可以不设置
nRet = MV_CC_SetBoolValue(handle, "LineInverter",false);