赞
踩
在阅读本文档前,默认已经基本掌握了Smart3的基本使用方式,理解Smart3的基本知识。嵌入库需要配合Smart3软件共同开发
Smart3是一款简单易用功能、功能齐全、性能稳定的视觉软件开发平台。视觉系统还支持用户基于自定义需求的二次开发。并基于COM和.NET接口技术,增加了对C#,C++等多种编程语言的支持。能满足用户的特殊嵌入使用需求。嵌入库技术提供了将Smart3嵌入到客户的软件中的可能性。Smart3将再后台运行,视觉部分仍由Smart3完成,而客户软件则展示在前台。通过API接口,完成必要的软件信息交互,操作交互。
根据Smart3的安装指引安装Smart3软件以及环境,成功安装Smart3并能顺利打开软件。
Smart3软件根目录下,以管理员身份运行RegisterSciCmtCam.bat或者在控制台中直接输入
regsvr32 "xx\xxx\xx\SciSmtCam.dll" (xx\xxx\xx为软件目录)
注册成功后,会弹出注册成功的提示窗口。
注册失败的常见原因:
使用引擎时,需要调用到Smart3依赖的dll。目前需要将Smart3的根目标和所生成的exe放在同一路径下。
注:v1.8.1.0版本可以通过替换dll来实现不需要将exe放在Smart根目录下
#第三章:编程讲解/C++
选择创建带界面的QWidget工程,根据提示点击下一步。完成Qt工程创建。
点击解决方案->属性->Qt Project Settings->Qt Modules, 添加axontainer。
亦可使用Qt的添加模组窗口,选择ActiveQtS.
此类用于让Qt调用com组件。
将所需的头文件添加到项目中
开发思路讲解: 使用引擎开发时,首先需要了解需要开发的主要内容,通常可以分为以下几个部分,本章节也会围绕着该部分进行讲解。
初始化引擎: 引擎类初始化应当跟随软件初始化一同完成。引擎初始化需要一定的时间(主要为硬件搜索、UI构造、方案加载解析等)
配置显示窗口: 绑定UI显示界面到嵌入软件中,主要为Smart中方案已经编辑好的显示窗口,用于视觉界面展示,数据展示与参数调整界面等。
Smart软件交互: 该部分内容主要是针对已有项目方案的细节开发,根据每个算子块和算子都有启动、结束信号,可以根据该信号对应的时机获取相应的变量结果。可以通过算子块名称->算子名称打开对应算子的参数设置页面。
变量交互: 顾名思义就是可以读取,修改对应的变量,控制参数,流程的改变,获取结果展示等功能。
在对应的界面类中添加SciEngine类,并在构造函数中完成对引擎的初始化。
class SciSmartEngineDemo : public QWidget
{
Q_OBJECT
...
SciEngine* m_engine;
...
};
引擎初始化的四个步骤:
void SciEngine::InitEngine();
void SciEngine::SetMsgWindow((long long) handle);
void SciEngine::ReleaseEngine();
SciSmartEngineDemo::SciSmartEngineDemo(QWidget *parent) : QWidget(parent) { ui.setupUi(this); //构造SciEngine m_engine = new SciEngine(); //初始化引擎 m_engine->InitEngine(); //设置windows消息窗口 m_engine->SetMsgWindow((long)this->window()); ... } SciSmartEngineDemo::~SciSmartEngineDemo() { m_engine->ReleaseEngine(); }
显示控件引擎允许将UI设计其中编辑的界面绑定到Qt的控件中,通常使用Widget或Label控件进行绑定。通过下面函数进行绑定。
int SciEngine::RunMode()
2.连接运行界面窗口
SciEngine::ConnectRunWnd(int index,long long winId);
参数1:index:序号,通过序号控制绑定不同的界面,如Main主界面序号为0,Page1子界面序号为1,以此类推。
参数2:winID:控件的winID,通过Qt控件的winId()方法获得
注:此处UI界面的窗口样式可以把标题栏设置为空,否则点击标题栏可以在控件范围内拖动UI。
把一个控件绑定为运行界面的显示窗口,调用方式如下:
SciSmartEngineDemo::SciSmartEngineDemo(QWidget *parent) : QWidget(parent)
{
...
//设置引擎为运行模式
m_engine->RunMode();
//连接运行界面1到控件上
m_engine->ConnectRunWnd(0,(long long)ui.image1->winId());
...
}
软件基本功能主要指运行、停止等主软件的交互接口。如下图所示,菜单栏中的一些主要功能。通过接口,可以控制软件运行。
常用交互接口
切换至软件运行模式
void SciEngine::RunMode();
软件运行
void SciEngine::Run();
软件停止运行
void SciEngine::Stop();
弹出Smart3软件本体(主界面)
void SciEngine::ShowMainWindow();
弹出硬件设置
void SciEngine::ShowSettingWindow();
弹出设置窗口
void SciEngine::ShowSettingWindow();
弹出标定窗口
void SciEngine::ShowCaliSettingDlg();
保存方案
void SciEngine::SaveProject();
void SciEngine::SaveProjectAs(QString); //路径
打开方案
void SciEngine::OpenProject(const QString path);
如果需要监控某个算子块或某个算子的运行结果,可以通过以下两个接口来调用。该方式为主动调用,获取状态结果。需要用户自己选择获取的时机。
long long SciEngine:: GetBlockRunState(QString blockName , int& value); //输入参数为算子块名称,参数2为结果值、0为NG,1为OK
long long SciEngine::GetOprRunState(QString blockName,QString oprName,int& value); //输入参数为算子块,算子名称,参数3为结果,0为NG,1为OK
下图为对应的关系
使用该功能前,首先需要在Smart3中开启对应算子的执行事件。
打开Smart3软件与对应方案(不使用嵌入库的情况下打开,否则UI功能会被禁用)
UI设计器 ->> 事件 ->> 事件设置,弹出事件设置窗口。
根据算子块和算子名找到对应需要打开的事件,并开启对应的功能。
代码注册部分
注册方式,通过Qt信号槽完成注册:
下面代码演示了如何注册事件,并举例了在事件中当灰度匹配_1开始执行前,打印了相关信息。
.h
class yourWidget:public QWidget
{
....
SciEngine *p_engine; //引擎对象指针
public slots:
void OnOperatorStartSlot(QString,QString);
void OnOperatorEndSlot(QString,QString);
void OnOperatorRunOK(QString,QString);
void OnOperatorRunNG(QString,QString);
private:
void ConnectSignalSlots();
....
}
.cpp void yourWidget::ConnectSignalSlots() { connect(p_engine->m_axObj,SIGNAL(OnOperatorStart(QString,QString)),this,SLOT(OnOperatorStartSlot(QString,QString))); connect(p_engine->m_axObj,SIGNAL(OnOperatorEnd(QString,QString)),this,SLOT(OnOperatorStartSlot(QString,QString))); connect(p_engine->m_axObj,SIGNAL(OnOperatorRunOK(QString,QString)),this,SLOT(OnOperatorRunNG(QString,QString))); connect(p_engine->m-axObj,SIGNAL(OnOperatorRunNG(QString,QString)),this,SLOT(OnOperatorRunNG(QString,QString))); } void yourWidget::OnOpearotrStartSlot(QString blockName,QString oprName) { if(blockName == "Block1" && oprName == "灰度匹配_1") { qDebug()<<"灰度匹配即将执行"; ... } ... }
嵌入库提供与Smart变量交互的接口,可以在嵌入软件中调用接口操作Smart3的变量系统以及唤出参数设置界面。
Smart3中一共有6种类型的变量:其中常规类型的变量有4种,3D的变量有2种,每种变量各自有对应的点集。
N | S | B | P | 3D_P | 3D_PL |
---|---|---|---|---|---|
数字 | 字符串 | 布尔 | 点(x,y) | 3D点(x,y,z) | 3D点云(a,b,c,d) |
1.获取全局变量的数组
long long SciEngine::GetVaraibleList(SciStringArray* variableNames);
参数1:输出全局变量的数组
2. 获取 N型全局变量
long long SciEngine::GetVariableNumber(const QString variableName ,double& value);
参数1:变量名称
参数2:获取的变量值
long long SciEngine::GetVariableArray(const QString variableName,SciNumberArray *arrayValue);
参数1:变量名称
参数2:获取N变量数组
3.获取 B型全局变量
long long SciEngine::GetVariableBool(const QString variableName,int& value);
参数1:变量名称
参数2:获取的B变量
long long SciEngine::GetVariableBoolArray(const QString variableName, SciBoolArray* arrayValue);
参数1:变量名称
参数2:获取的B变量数组
4.获取 S型全局变量
long long SciEngine::GetVariableString(const QString variableName,QString& value);
参数1:变量名称
参数2:获得的S型变量值
long long SciEngine::GetVariableStringArray(const QString variableName,SciStringArray* arrayValue);
参数1:变量名称
参数2:获得的S型变量数组
5.获取 P型全局变量
long long SciEngine::GetVariablePoint(const QString variableName,SciPoint* value);
参数1:变量名称
参数2:获得的P型点的值
long long SciEngine::GetVariablePointArray(const QString variableName, SciPointArray* arrayValue);
参数1:变量名称
参数2:获得的P型数组的值
6.获取 3D_P全局变量
long long SciEngine::GetVariable3DPoint(const QString variableName,Sci3DPoint* value);
参数1:变量名称
参数2:获得的3D_P型数据的值
long long SciEngine::SciEngine::GetVariable3DPointArray(const QString variableNames, Sci3DPointArray *arrayValue);
参数1:变量名称
参数2:获得的3D_P型数组的值
7.获取 3D_PL全局变量
long long SciEngine::GetVariable3DPlane(const QString variableNames,Sci3DPlane *value);
参数1:变量名称
参数2:获得的3D_Plane数据的值
long long SciEngine::GetVariable3DPlaneArray(const QString varibaleNames,Sci3DPlaneArray *value);
参数1:变量名称
参数2:获得的3D_Plane数据的值
设置变量
Smart3中,设置变量可分为两种状态:
第一种为只改变当前的值。即可调用接口后,在本次软件打开后生效。下次软件打开时,变量会恢复到Smart3创建变量中的初始值,即创建变量时设置的初始值。
第二种则是同时改变当前的值与初始值,在下次打开软件后,会变成新设置的值。
例如:假设视觉流程为定位贴合流程,变量A控制是否进入标定流程,此时修改A的值调用第一种方式,在进入标定流程结束后,在脚本中复位该变量。这个设置动作并不会保留下来,若调用第二种方式设置初始值,则第二次打开软件时,该变量就会为这个默认的初始值,后面打开软件,运行时则会默认跑一次标定流程。所以调用哪一种接口,需要开发者根据实际情况选择。
以下接口的参数,含义一致,故不再重复声明。
参数1:需要修改的变量名称参数2:变量值
1.设置N变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariableNumber(const QString variableName, double value);
修改变量值数组
void SciEngine::SetVariableNumberArray(const QString variableName , SciNumberArray *value);
修改变量值与初始值
int SciEngine::SetCustomLongVarInitValueAndValue(const QString varName, int INumVariant);
int SciEngine::SetCustomDoubleVarInitValueAndValue(const QString varName, double dNumberVariant);
int SciEngine::SetCustomLongVarInitValueAndValue(const QString varName, long LNumberVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomNumberArrayVarInitValueAndValue(const QString varName,SciNumberArray *value);
2.设置B变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariableBool(const QString variableName,int value);
修改变量值数组
void SciEngine::SetVariableBoolArray(const QString variableName,SciBoolArray *value)
修改变量与初始值
int SciEngine::SetCustomBoolVarInitValueAndValue(const QString varName,int boolVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomBoolArrayVarInitValueAndValue(const QString varname,SciBoolArray* value);
3.设置S变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariableString(const QString variableName,const QString value);
修改变量值数组
void SciEngine::SetVariableStringArray(const QString variableName,SciStringArray* value);
修改变量与初始值
int SciEngine::SetCustomStringVarInitValueAndValue(const QString varName,const QString strVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomStringArrayVarInitValueAndValue(const QString varName,SciStringArray *value);
4.设置P变量以及其数组的两种接口
修改变量值
void SciEngine::SetCustomPoint(const QString varName, const QString strVariant);
修改变量值数组
void SciEngine::SetVariableStringArray(const QString variableName,SciStringArray* value);
修改变量与初始值
int SciEngine::SetCustomPointVarInitValueAndValue(const QString varName,const QString strVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomPointArrayVarInitValueAndValue(const QString varName,SciStringArray *value);
5.设置3D_P变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariable3DPoint(const QString variableName,Sci3DPoint *value);
修改变量数组
void SciEngine::SetVariable3DPointArray(const QString variableName,Sci3DPointArray *value);
修改变量与初始值
int SciEngine::SetCustom3DPointVarInitValueAndValue(const QString varName,Sci3DPoint *value);
修改变量数组的值与初始值
int SciEngine::SetCustom3DPointArrayVarInitValueAndValue(const QString varName,Sci3DPointArray *value);
6.设置3D_Plane变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariable3DPlane(const QString variableName,Sci3DPlane* value);
修改变量数组
void SciEngine::SetVaraible3DPlaneArray(const QString variableName,Sci3DPlaneArray* value);
修改变量与初始值
int SciEngine::SetCustom3DPlaneVarInitValueAndValue(const QString varName,Sci3DPlane* value);
修改变量数组的值与初始值
int SetCustom3DPlaneArrayVarInitValueAndValue(const QString varName,Sci3DPlaneArray *value);
在确保注册成功后,在对应的C#项目中,解决方案资源管理器-》引用-》添加引用。如下图所示,点击COM 资源,在列表中找到“SciSmtCam 1.0 Type Library”即可。
添加后,在对应文件中添加添加引用 SciSmtCamLib 即可。
using SciSmtCamLib
开发思路讲解: 使用引擎开发时,首先需要了解需要开发的主要内容,通常可以分为以下几个部分,本章节也会围绕着该部分进行讲解。
初始化引擎: 引擎类初始化应当跟随软件初始化一同完成。引擎初始化需要一定的时间(主要为硬件搜索、UI构造、方案加载解析等)
配置显示窗口: 绑定UI显示界面到嵌入软件中,主要为Smart中方案已经编辑好的显示窗口,用于视觉界面展示,数据展示与参数调整界面等。
Smart软件交互: 该部分内容主要是针对已有项目方案的细节开发,根据每个算子块和算子都有启动、结束信号,可以根据该信号对应的时机获取相应的变量结果。可以通过算子块名称->算子名称打开对应算子的参数设置页面。
变量交互: 顾名思义就是可以读取,修改对应的变量,控制参数,流程的改变,获取结果展示等功能。
在相应的类中声明并创建对象
SciEngine m_engine = new SciEngine();
在对此类中的构造函数中进行引擎初始化。
1.初始化引擎
InitEngine();
2.绑定窗口界面
SetMsgWindow(long WindowHandle);
3.设置运行模式
RunMode();
4.绑定显示窗口
ConnectRunWnd(int index,long windowHandle);
5.移动窗口
MoveRunWindow(int index,int left,int top,int righrt,int bottom);
参数1为窗口编号
参数2,3,4,5分别为控件的位置关系。通常的用法为
m_engine.MoveRunWindow(0, 0, 30, pictureBox1.Right - pictureBox1.Left, pictureBox1.Bottom - pictureBox1.Top );
代码演示
public Form1()
{
...
m_engine.InitEngine();
m_engine.SetMsgWindow((long)this.Handle);
m_engine.RunMode();
m_engine.ConnectRunWnd(0, (long)pictureBox1.Handle);
//The height of the title is approximately 30 pixels.
m_engine.MoveRunWindow(0, 0, 30, pictureBox1.Right - pictureBox1.Left, pictureBox1.Bottom - pictureBox1.Top );
}
释放引擎
通常情况下,在调用了SciEngine类的析构函数中,调用释放引擎函数。请注意,若未成功释放引擎,Smart3会残留在后台中,若再次打开会提示软件已打开。
ReleaseEngine();
软件基本功能主要是指运行、停止等主软件的交互接口。如下图所示,菜单栏中的一些主要功能。可以通控制软件运行、停止、加载方案、保存方案、弹出设置比窗口等功能。
1.切换至软件运行模式
void SciEngine::RunMode();
2.软件运行
void SciEngine()::Run();
3.软件停止运行
void SciEngine::Stop();
4.弹出Smart3软件本体(主界面)
void SciEngine::ShowMainWindow();
5.弹出硬件设置
void SciEngine::ShowHardwarSettingDlg();
6. 弹出设置窗口
void SciEngine::ShowCailSettingDlg();
7.弹出标定窗口
void SciEngine::ShowCaliSettingDlg();
8.保存方案
int SciEngine::SaveProject();
int SciEngine::SavePriojectAs(string); //路径
9.打开方案
void SciEngine::OpenProject(string);
如果需要监控某个算子块或者某个算子的运行结果,可以通过以下两个接口来调用。该方式为主动调用,获取状态结果。需要用户自己选择获取时机。
1. 获取算子块运行状态
int GetBlockRunState(string blockName,out int value);
blockName:算子名
value:结果值
2. 获取算子运行状态
int GetOprRunState(string blockName,string oprName,out int& value)
3.注册事件
嵌入库C#接口共提供6个事件。其中分为软件事件和算子事件。
软件事件
OnAppStart //软件开始 指软件方案开始运行的动作
OnAppEnd //软件结束 指软件方案结束运行的动作
算子事件
OnOperatorStart(QString blockName,string oprName); //算子运行开始(即算子即将开始执行,尚未完成运行动作时)
OnOperaotorEnd(QString blockName,string oprName); //算子运行结束
OnOperatorRunOK(QString blockName,string oprName); //算子运行OK
OnOperatorRunNG(QString blockName,string oprName); //算子运行NG
通过参数中的blockName和oprName
嵌入库提供与Smart变量交互的接口,可以在嵌入软件中调用接口操作Smart3的变量系统以及唤出参数设置界面。
Smart3中一共有6种类型的变量:其中常规类型的变量有4种,3D的变量有2种,每种变量各自有对应的点集。
N | S | B | P | 3D_P | 3D_PL |
---|---|---|---|---|---|
数字 | 字符串 | 布尔 | 点(x,y) | 3D点(x,y,z) | 3D点云(a,b,c,d) |
获取变量
1.获取 全局变量的数组
int GetVariableList(SciStringArray* variableNames);
参数1:输出全局变量的数组。
2.获取N型全局变量
int GetVariableNumber(string variableName,ref double arrayValue);
参数1:变量名称
参数2:获取的变量值
int GetVariableNumberArray(string variableName,ref SciStringArray arrayValue);
参数1:变量名称
参数2:获取的N型变量数组
3.获取B型全局变量
int GetVariableBool(string variableName,out int value);
参数1:变量名称
参数2:获取的变量值
int GetVariableBoolArray(string variableName,ref SciBoolArray arrayValue);
参数1:变量名称
参数2:获得的B型变量数组
4.获取S型全局变量
int GetVariableString(string variableName,out string value);
参数1:变量名称
参数2:获得的S型变量值
int GetVariableStringArray(string variableName,ref SciStringArray arrayValue);
参数1:变量名称
参数2:获得的S型数组变量
5.获取P型全局变量
int GetVariablePoint(string variableName, ref SciPoint value);
参数1:变量名称
参数2:获得的P型点的值
int GetVariablePointArray(string variableName , ref SciPointArray value);
参数1:变量名称
参数2:获得的P型数组的值
6.获取3D_P全局变量
int GetVariable3DPoint(string variableName , ref Sci3DPoint point3D);
参数1:变量名称
参数2:获得的3D_P型数据的值
int GetVariable3DPointArray(string variableName, ref Sci3DPointArray point3DArray);
参数1:变量名称
参数2:获得的3D_P型数组的值
7.获取3D_PL全局变量
int GetVariable3DPlane(string variableName,ref Sci3DPlane plane3d);
参数1:变量名称
参数2:获得的3D_Plane数据的值
int GetVariable3DPlaneArray(string variableName, ref Sci3DPlaneArray plane3dArray);
参数1:变量名称
参数2:获得的3D_Plane数据的值
设置变量
Smart3中,设置变量可分为两种状态:
第一种为只改变当前的值。即可调用接口后,在本次软件打开后生效。下次软件打开时,变量会恢复到Smart3创建变量中的初始值,即创建变量时设置的初始值。
第二种则是同时改变当前的值与初始值,在下次打开软件后,会变成新设置的值。
例如:假设视觉流程为定位贴合流程,变量A控制是否进入标定流程,此时修改A的值调用第一种方式,在进入标定流程结束后,在脚本中复位该变量。这个设置动作并不会保留下来,若调用第二种方式设置初始值,则第二次打开软件时,该变量就会为这个默认的初始值,后面打开软件,运行时则会默认跑一次标定流程。所以调用哪一种接口,需要开发者根据实际情况选择。
以下接口的参数,含义一致,故不再重复声明。
1.设置N变量以及其数组的两种接口
修改变量值
int SetVariableNumber(string variableName,double value);
修改变量值数组
int SetVariableNumberArray(string variableName, SciNumberArray arrayValue);
修改变量值与初始值
int SetCustomStringVarInitValueAndValue(string varName, double dNumberVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomNumberArrayVarInitValueAndValue(const QString varName,SciNumberArray *value);
2.设置B变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariableBool(const QString variableName,int value);
修改变量值数组
void SciEngine::SetVariableBoolArray(const QString variableName,SciBoolArray *value)
修改变量与初始值
int SciEngine::SetCustomBoolVarInitValueAndValue(const QString varName,int boolVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomBoolArrayVarInitValueAndValue(const QString varname,SciBoolArray* value);
3.设置S变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariableString(const QString variableName,const QString value);
修改变量值数组
void SciEngine::SetVariableStringArray(const QString variableName,SciStringArray* value);
修改变量与初始值
int SciEngine::SetCustomStringVarInitValueAndValue(const QString varName,const QString strVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomStringArrayVarInitValueAndValue(const QString varName,SciStringArray *value);
4.设置P变量以及其数组的两种接口
修改变量值
void SciEngine::SetCustomPoint(const QString varName, const QString strVariant);
修改变量值数组
void SciEngine::SetVariableStringArray(const QString variableName,SciStringArray* value);
修改变量与初始值
int SciEngine::SetCustomStringVarInitValueAndValue(const QString varName,const QString strVariant);
修改变量数组的值与初始值
int SciEngine::SetCustomPointArrayVarInitValueAndValue(const QString varName,SciStringArray *value);
5.设置3D_P变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariable3DPoint(const QString variableName,Sci3DPoint *value);
修改变量数组
void SciEngine::SetVariable3DPointArray(const QString variableName,Sci3DPointArray *value);
修改变量与初始值
int SciEngine::SetCustom3DPointVarInitValueAndValue(const QString varName,Sci3DPoint *value);
修改变量数组的值与初始值
int SciEngine::SetCustom3DPointArrayVarInitValueAndValue(const QString varName,Sci3DPointArray *value);
6.设置3D_Plane变量以及其数组的两种接口
修改变量值
void SciEngine::SetVariable3DPlane(const QString variableName,Sci3DPlane* value);
修改变量数组
void SciEngine::SetVaraible3DPlaneArray(const QString variableName,Sci3DPlaneArray* value);
修改变量与初始值
int SciEngine::SetCustom3DPlaneVarInitValueAndValue(const QString varName,Sci3DPlane* value);
修改变量数组的值与初始值
int SetCustom3DPlaneArrayVarInitValueAndValue(const QString varName,Sci3DPlaneArray *value);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。