最近有个需求,需要对几台打码机读码器进行集中防重。
实现目标:1.对条码进行分机台收集追溯
2.发现重复进行触发IO报警
首先使用海康MVS软件对读码器进行设置,通讯设置为TCP服务器,我们软件做客户端 进行数据收集。
然后再收集到数据中进行重复校验。最后输出报警信号。
关键代码
/// <summary>
/// 获取设备列表
/// </summary>
public static List<string> DeviceListAcq()
{
List<string> snList = new List<string>();
// ch:创建设备列表 | en:Create Device List
System.GC.Collect();
m_pstDeviceList.nDeviceNum = 0;
int nRet = MvCodeReader.MV_CODEREADER_EnumDevices_NET(ref m_pstDeviceList, MvCodeReader.MV_CODEREADER_GIGE_DEVICE);
if (0 != nRet)
{
WriteLogHelper.WriteLogsAsync("Enumerate devices fail!", "设备获取");
return snList;
}
if (0 == m_pstDeviceList.nDeviceNum)
{
WriteLogHelper.WriteLogsAsync("None Device", "设备获取");
return snList;
}
byte[] chUserDefinedName = null;
// ch:在窗体列表中显示设备名 | en:Display stDevInfo name in the form list
for (int i = 0; i < m_pstDeviceList.nDeviceNum; i++)
{
MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo = (MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_pstDeviceList.pDeviceInfo[i], typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
if (stDevInfo.nTLayerType == MvCodeReader.MV_CODEREADER_GIGE_DEVICE)
{
IntPtr buffer = Marshal.UnsafeAddrOfPinnedArrayElement(stDevInfo.SpecialInfo.stGigEInfo, 0);
MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO stGigeInfo = (MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO)Marshal.PtrToStructure(buffer, typeof(MvCodeReader.MV_CODEREADER_GIGE_DEVICE_INFO));
if (stGigeInfo.chUserDefinedName != "")
{
var name = ("GEV: " + stGigeInfo.chUserDefinedName + " (" + stGigeInfo.chSerialNumber + ")");
}
else
{
var name = ("GEV: " + stGigeInfo.chManufacturerName + " " + stGigeInfo.chModelName + " (" + stGigeInfo.chSerialNumber + ")");
}
snList.Add(stGigeInfo.chSerialNumber);
}
}
// ch:选择第一项 | en:Select the first item
return snList;
}
public bool OpenDevice(string sn) {
var snList = DeviceListAcq();
if (snList.Count == 0 )
{
// ShowErrorMsg("No stDevInfo, please select", 0);
return false;
}
var snIndex = snList.FindIndex(x => x==sn);
if (snIndex < 0) {
return false;
}
// ch:获取选择的设备信息 | en:Get selected stDevInfo information
MvCodeReader.MV_CODEREADER_DEVICE_INFO stDevInfo =
(MvCodeReader.MV_CODEREADER_DEVICE_INFO)Marshal.PtrToStructure(m_pstDeviceList.pDeviceInfo[snIndex],
typeof(MvCodeReader.MV_CODEREADER_DEVICE_INFO));
// ch:打开设备 | en:Open stDevInfo
if (null == m_MyCamera)
{
m_MyCamera = new MvCodeReader();
if (null == m_MyCamera)
{
return false;
}
}
int nRet = m_MyCamera.MV_CODEREADER_CreateHandle_NET(ref stDevInfo);
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
return false;
}
nRet = m_MyCamera.MV_CODEREADER_OpenDevice_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
m_MyCamera.MV_CODEREADER_DestroyHandle_NET();
WriteLogHelper.WriteLogsAsync("设备打开异常", "设备获取");
return false;
}
m_MyCamera.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_ON);
// ch:设置采集连续模式 | en:Set Continues Aquisition Mode
//m_MyCamera.MV_CODEREADER_SetEnumValue_NET("TriggerMode", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_MODE.MV_CODEREADER_TRIGGER_MODE_OFF);
// 设置输出 硬输出
//var res = m_MyCamera.MV_CODEREADER_SetEnumValue_NET("LineSource", 6);
// ch:开始采集 | en:Start Grabbing
nRet = m_MyCamera.MV_CODEREADER_StartGrabbing_NET();
if (MvCodeReader.MV_CODEREADER_OK != nRet)
{
WriteLogHelper.WriteLogsAsync($"设备打开失败{nRet}", "设备开始采集");
}
//m_MyCamera.MV_CODEREADER_RegisterTriggerCallBack_NET
// 触发设置
// m_MyCamera.MV_CODEREADER_SetEnumValue_NET("TriggerSource", (uint)MvCodeReader.MV_CODEREADER_TRIGGER_SOURCE.MV_CODEREADER_TRIGGER_SOURCE_LINE0);
return true;
}
/// <summary>
/// 发送报警
/// </summary>
/// <returns></returns>
public bool SendWarn() {
// 发送IO触发
var res = m_MyCamera.MV_CODEREADER_SetCommandValue_NET("LineTriggerSoftware");
return res == 0;
}