Labview+Dalsa采集卡二次开发

  • Post author:
  • Post category:其他


由于labview可以调用C++的库,所以可以采用将控制部分封装成DLL,然后从Labview调用DLL的导出函数

例如:

C++

在这里插入图片描述

在这里插入图片描述

*.h

#pragma once
#ifdef CPP_FILE
#define USE_DLL extern"C" __declspec(dllexport)
#else
#define USE_DLL extern"C" __declspec(dllimport)
#endif // CPP_FILE

//USE_DLL int LT_CL_EnumDevice(char* acqServerName);

/// <summary>
/// 初始化采集卡
/// </summary>
/// <param name="ServerName">采集卡名(使用相机专家的枚举名字)</param>
/// <param name="ConfigFilePath">CCF文件路径</param>
/// <param name="ResouceIndex">资源序号,0:灰度图</param>
/// <returns>初始化结果</returns>
USE_DLL long Init(char* ServerName, char* ConfigFilePath, int ResouceIndex);

/// <summary>
/// 释放资源
/// </summary>
/// <returns></returns>
USE_DLL long Release();


/// <summary>
/// 单帧采集
/// </summary>
/// <returns>开启采集的结果</returns>
USE_DLL long Snap();

/// <summary>
/// 采图标记,true:已经采集到图像   false:还没有采集到图像
/// </summary>
/// <returns>当前的采集成功标记</returns>
USE_DLL long SnapFlag();

/// <summary>
/// 获取图像数据
/// </summary>
/// <param name="ImageData">图像指针</param>
/// <param name="ImageWidth">图像宽度</param>
/// <param name="ImageHeight">图像高度</param>
/// <returns></returns>
USE_DLL long GetImageData(void** ImageData, int* ImageWidth, int* ImageHeight);


USE_DLL void Test(void);

*.cpp

#define CPP_FILE
#include "ScanLib.h"
#include <Basic/SapClassBasic.h>
#include <gdiplus.h>
#include <gdipluspixelformats.h>
#pragma comment(lib, "Gdiplus.lib")
using namespace Gdiplus;
using namespace std;

SapAcquisition* g_Acq = NULL;
SapBuffer* g_Buffers = NULL;
SapTransfer* g_Xfer = NULL;
BOOL g_bFlag = FALSE;
BOOL CreateObjects();
BOOL DestroyObjects();
void XferCallback(SapXferCallbackInfo* pInfo);

void write_bmpheader(unsigned char* bitmap, int offset, int bytes, int value)
{
	int i;
	for (i = 0; i < bytes; i++)
		bitmap[offset + i] = (value >> (i << 3)) & 0xFF;
}

unsigned char* convertToBmp(unsigned char* inputImg, int width, int height, int* ouputSize)
{
	/*create a bmp format file*/
	int bitmap_x = (int)ceil((double)width * 3 / 4) * 4;
	unsigned char* bitmap = nullptr;
	bitmap = (unsigned char*)malloc(sizeof(unsigned char) * height * bitmap_x + 54);
	if (bitmap == nullptr)
	{
		return bitmap;
	}
	bitmap[0] = 'B';
	bitmap[1] = 'M';
	write_bmpheader(bitmap, 2, 4, height * bitmap_x + 54); //whole file size
	write_bmpheader(bitmap, 0xA, 4, 54); //offset before bitmap raw data
	write_bmpheader(bitmap, 0xE, 4, 40); //length of bitmap info header
	write_bmpheader(bitmap, 0x12, 4, width); //width
	write_bmpheader(bitmap, 0x16, 4, height); //height
	write_bmpheader(bitmap, 0x1A, 2, 1);
	write_bmpheader(bitmap, 0x1C, 2, 24); //bit per pixel
	write_bmpheader(bitmap, 0x1E, 4, 0); //compression
	write_bmpheader(bitmap, 0x22, 4, height * bitmap_x); //size of bitmap raw data

	for (int i = 0x26; i < 0x36; i++)
		bitmap[i] = 0;
	int k = 54;
	for (int i = height - 1; i >= 0; i--) {
		int j;
		for (j = 0; j < width; j++) {
			int index = i * width + j;
			for (int l = 0; l < 3; l++)
				bitmap[k++] = inputImg[index];
		}
		j *= 3;
		while (j < bitmap_x) {
			bitmap[k++] = 0;
			j++;
		}
	}
	*ouputSize = k;
	return bitmap;
}

bool SaveBitmap(char* savepath, void* data, int width, int height)
{
	int size;
	unsigned char* bmp = convertToBmp((unsigned char*)data, width, height, &size);
	FILE* fp = fopen(savepath, "wb+");
	if (fp == NULL)
	{
		/*sprintf(errorText, "Could not open file: %s", outputFileName);
		errorMsg(errorText);*/
		return false;

	}
	fwrite(bmp, 1, size, fp);
	fclose(fp);
	free(bmp);
	return true;
}


USE_DLL void EnumDevice(char* acqServerName)
{
	int serverCount = SapManager::GetServerCount();

	if (serverCount == 0)
	{
		return;
	}

	// Scan the boards to find those that support acquisition
	BOOL serverFound = FALSE;

	for (int serverIndex = 0; serverIndex < serverCount; serverIndex++)
	{
		if (SapManager::GetResourceCount(serverIndex, SapManager::ResourceAcq) != 0)
		{
			char serverName[CORSERVER_MAX_STRLEN];
			SapManager::GetServerName(serverIndex, serverName, sizeof(serverName));
			serverFound = TRUE;
		}

	}

	// At least one acquisition server must be available
	if (!serverFound)
	{
		return;
	}

	//暂时指定设备ID为1
	SapManager::GetServerName(1, acqServerName, CORSERVER_MAX_STRLEN);

	return;
}

USE_DLL long Init(char* acqServerName, char* configFileName, int nType)
{
	SapLocation loc(acqServerName, nType);

	if (SapManager::GetResourceCount(acqServerName, SapManager::ResourceAcq) > 0)
	{
		g_Acq = new SapAcquisition(loc, configFileName);
		g_Buffers = new SapBufferWithTrash(2, g_Acq);
		g_Xfer = new SapAcqToBuf(g_Acq, g_Buffers, XferCallback, NULL);

	}
	return CreateObjects() ? 1 : 0;
}

USE_DLL long Release()
{

	DestroyObjects();

	// Delete all objects
	if (g_Xfer)			delete g_Xfer;
	//if (g_View)			delete g_View; 
	if (g_Buffers)		delete g_Buffers;
	if (g_Acq)			delete g_Acq;

	return 1;
}

USE_DLL long Snap()
{
	g_bFlag = FALSE;
	return g_Xfer->Snap() ? 1 : 0;
}

USE_DLL long SnapFlag()
{
	return g_bFlag ? 1 : 0;
}


USE_DLL long GetImageData(void** pImageData, int* nImageWidth, int* nImageHeight)
{
	BOOL bIsReady = TRUE;
	if (g_bFlag)
	{

		*nImageWidth = g_Buffers->GetWidth();
		*nImageHeight = g_Buffers->GetHeight();
		g_Buffers->GetAddress(pImageData);
		SaveBitmap((char*)"D:\\saveimage.bmp", *pImageData, *nImageWidth, *nImageHeight);
		bIsReady = FALSE;
		return 1;
	}
	return 0;
}

void Test(void)
{
	FILE* test = nullptr;
	test = fopen("D:\\lab测试文件", "ab+");
	if (test != nullptr)
	{
		fclose(test);
	}
}




BOOL CreateObjects()
{
	// Create acquisition object
	if (g_Acq && !*g_Acq && !g_Acq->Create())
	{
		DestroyObjects();
		return FALSE;
	}
	// Create buffer object
	if (g_Buffers && !*g_Buffers)
	{
		if (!g_Buffers->Create())
		{
			DestroyObjects();
			return FALSE;
		}
		// Clear all buffers
		g_Buffers->Clear();
	}
	// Create transfer object
	if (g_Xfer && !*g_Xfer && !g_Xfer->Create())
	{
		DestroyObjects();
		return FALSE;
	}

	return TRUE;
}
BOOL DestroyObjects()
{
	// Destroy transfer object
	if (g_Xfer && *g_Xfer)
	{
		g_Xfer->Destroy();
	}
	// Destroy buffer object
	if (g_Buffers && *g_Buffers)
	{
		g_Buffers->Destroy();
	}
	// Destroy acquisition object
	if (g_Acq && *g_Acq)
	{
		g_Acq->Destroy();
	}
	return TRUE;
}

void XferCallback(SapXferCallbackInfo* pInfo)
{
	//Test();
	if (!pInfo->IsTrash())
	{
		//Sleep(1);
		g_bFlag = TRUE;
		int Img_Width = g_Buffers->GetWidth();
		int Img_Height = g_Buffers->GetHeight();
		void* addr = nullptr;
		g_Buffers->GetAddress(pInfo->GetPairIndex(), &addr);
		//#ifdef DEBUG
		//
		//#endif // DEBUG
		SaveBitmap((char*)"D:\\saveimage.bmp", addr, Img_Width, Img_Height);
		return;
	}

}

然后在Labview调用这个DLL即可

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

大概就是这样子,由于本人对Labview不熟悉,多余的就不说了,图像转换就更不说了,希望有大佬不吝赐教



版权声明:本文为m0_46496986原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。