VM是??禉C(jī)器人自主研發(fā)的機(jī)器視覺軟件,將一系列的圖像算法、邏輯工具和通訊協(xié)議等封裝成圖形化模塊,致力于幫助客戶提供快速搭建視覺應(yīng)用、解決視覺難題,能夠滿足視覺定位、尺寸測量、缺陷檢測以及信息識別等機(jī)器視覺應(yīng)用。
轉(zhuǎn)自:機(jī)器視覺技術(shù)交流社區(qū)
1 引言
在VM的工具箱中,雖然已經(jīng)包含了一百多個算法模塊可供用戶通過連線組合的方式來完成相應(yīng)的視覺需求,但仍存在一些數(shù)據(jù)處理邏輯是工具箱中的模塊所不涵蓋的。此時,腳本模塊就可以體現(xiàn)數(shù)據(jù)處理的靈活性。腳本使用的常用場景包括:日志打印、坐標(biāo)排序、定位偏差計算、檢測結(jié)果分類、圖像格式轉(zhuǎn)換、聯(lián)合OpenCV開發(fā)等等。
腳本模塊主要是需要確定輸入變量、輸出變量以及數(shù)據(jù)處理邏輯??蓪?dǎo)入或?qū)С鲆呀?jīng)編寫的腳本內(nèi)容,腳本文本格式的后綴為cs;可編輯程序集來調(diào)用第三方庫;可直接在腳本編輯頁面編寫代碼、預(yù)編譯和執(zhí)行;也可導(dǎo)出當(dāng)前腳本的工程,直接就會打開工程所在文件夾,再用VS打開工程、附加進(jìn)程就可以進(jìn)行腳本的調(diào)試,具體介紹見腳本模塊章節(jié)。
2 腳本模塊
雙擊打開腳本模塊,界面如下所示,可以分為五個區(qū)域:變量輸入?yún)^(qū)、變量輸出區(qū)、菜單欄、C#編程區(qū)、提示區(qū)。
C#編程區(qū)的代碼可分為三部分:命名空間、初始化函數(shù)、執(zhí)行函數(shù)。Init()函數(shù)為初始化函數(shù),Process()為執(zhí)行函數(shù)。
2.1 接口介紹
使用腳本模塊的目的,主要是為了處理數(shù)據(jù),那么就需要獲取腳本輸入的數(shù)據(jù)以及通過設(shè)置數(shù)據(jù)將腳本某些結(jié)果進(jìn)行輸出,因此需要了解相應(yīng)的獲取和設(shè)置數(shù)據(jù)的接口函數(shù)。針對不同類型的數(shù)據(jù)有不同的接口函數(shù),如:string、float、int、byte、image等數(shù)據(jù)類型的獲取和設(shè)置接口大同小異。另外,還可以使用通信的發(fā)送數(shù)據(jù)接口,全局變量獲取及設(shè)置接口,模塊的結(jié)果獲取和運行參數(shù)設(shè)置。
- 數(shù)據(jù)類型接口
功能 | 函數(shù)方法 | 參數(shù)說明 |
---|---|---|
獲取int型 | GetIntValue(string paramName, ref int paramValue) | 輸入:變量名paramName;輸出:變量值paramValue |
獲取float型 | GetFloatValue (string paramName, ref float paramValue) | 輸入:變量名paramName;輸出:變量值paramValue |
獲取string型 | GetStringValue (string paramName, ref string paramValue) | 輸入:變量名paramName;輸出:變量值paramValue |
獲取byte型 | GetBytesValue (string paramName,ref byte[] paramValue) | 輸入:變量名paramName;輸出:變量值paramValue |
獲取圖像數(shù)據(jù) | GetIMAGEValue (string paramName, ref Image paramValue) | 輸入:變量名paramName;輸出:變量值paramValue |
獲取int型數(shù)組 | GetIntArrayValue(string paramName, ref int[] paramValue,out int arrayCount) | 輸入:變量名paramName;輸出:變量值paramValue,數(shù)組個數(shù)arrayCount |
獲取float型數(shù)組 | GetFloatArrayValue(string paramName, ref float[] paramValue,out int arrayCount) | 輸入:變量名paramName;輸出:變量值paramValue,數(shù)組個數(shù)arrayCount |
獲取string型數(shù)組 | GetStringArrayValue(string paramName, ref string[] paramValue,out int arrrayCount) | 輸入:變量名paramName;輸出:變量值paramValue,數(shù)組個數(shù)arrayCount |
設(shè)置int型 | SetIntValue(string key, int value) | 輸入:變量名key,變量值value |
設(shè)置float型 | SetFloatValue (string key, float value) | 輸入:變量名key,變量值value |
設(shè)置string型 | SetStringValue (string key, string value) | 輸入:變量名key,變量值value |
設(shè)置byte型 | SetBytesValue (string key, byte[] value) | 輸入:變量名key,變量值value |
設(shè)置圖像數(shù)據(jù) | SetImageValue (string key, Image value) | 輸入:變量名key,變量值value |
設(shè)置int型數(shù)組 | SetIntValueByIndex(string key, int[] value, int index, int total) | 輸入:變量名key,變量值value,數(shù)組索引index,數(shù)組元素個數(shù)total |
設(shè)置float型數(shù)組 | SetFloatValueByIndex (string key, float[] value, int index, int total) | 輸入:變量名key,變量值value,數(shù)組索引index,數(shù)組元素個數(shù)total |
設(shè)置string型數(shù)組 | SetStringValueByIndex(string key, string[] value, int index, int total) | 輸入:變量名key,變量值value,數(shù)組索引index,數(shù)組元素個數(shù)total |
- 其它接口
功能 | 函數(shù)方法 | 參數(shù)說明 |
---|---|---|
設(shè)置全局變量 | GlobalVariableModule.SetValue(string paramName,string paramValue) | 輸入:變量名paramName,變量值paramValue |
獲取全局變量 | GlobalVariableModule.GetValue (string paramName) | 輸入:變量名paramName |
獲取模塊結(jié)果數(shù)據(jù) | CurrentProcess.GetModule(string paramModuleName).GetValue(string paramValueName) | 輸入:模塊名paramModuleName,結(jié)果名paramValueName |
設(shè)置模塊運行參數(shù) | CurrentProcess.GetModule(string paramModuleName).SetValue(string paramValueName,string paramValue) | 輸入:模塊名paramModuleName,變量名paramValueName,變量值paramValue |
PLC、Modbus發(fā)送數(shù)據(jù) | GlobalCommunicateModule.GetDevice(int deviceID).GetAddress(int addressID).SendData(string data,DataType dataType) | 輸入:設(shè)備deviceID,設(shè)備地址addressID,待發(fā)送數(shù)組data,待發(fā)送數(shù)據(jù)類型dataType |
TCP、UDP、串口發(fā)送數(shù)據(jù) | GlobalCommunicateModule.GetDevice(int deviceID).SendData(string data) | 輸入:設(shè)備deviceID,待發(fā)送數(shù)據(jù)data |
2.2 引用和調(diào)試
-
添加引用
在腳本界面點擊【編輯程序集】進(jìn)入程序集界面,點擊【添加】根據(jù)需求進(jìn)行程序集動態(tài)庫的添加,僅支持C#程序集添加,到需要的第三方程序集路徑下找到想要添加的.dll點擊打開即可添加,添加完成后在腳本中調(diào)用即可。 -
調(diào)試步驟
在腳本界面點擊【導(dǎo)出工程】,選擇.sln文件使用VS打開,設(shè)置斷點并且重新生成,然后點擊【調(diào)試】中的【附加到進(jìn)程】,VM4.2版本是選擇VmModuleProxy.exe(VM4.0版本是附加ShellMouleManager.exe)附加,最后在VM中單次執(zhí)行方案或者單次執(zhí)行流程或者腳本模塊來查看是否能進(jìn)入斷點。小小提示:斷點調(diào)試時,每次修改代碼都需要重新編譯,VS每次重新編譯后,只有第一次運行會進(jìn)入初始化函數(shù)Init()。
2.3 VM4.2的更新
-
VM4.2雖然保留了VM4.0的一系列接口函數(shù),但VM4.2的腳本模塊提供了更簡單更方便的編程寫法,不需要使用接口函數(shù),直接在腳本中用等于號(=)來獲取輸入變量的值或用等于號(=)給輸出變量賦值。
-
VM4.2在調(diào)試的時候,相比較VM4.0,附件的進(jìn)程由ShellMouleManager.exe變?yōu)閂mModuleProxy.exe。這是因為當(dāng)一個方案中包含多個腳本,我們對每個腳本進(jìn)行調(diào)試附加進(jìn)程時,每個腳本得附加進(jìn)程名都是ShellMouleManager.exe,因此得打開任務(wù)管理器,需要在進(jìn)程中來查看每個腳本對應(yīng)的PID,然后通過ID編號來確定當(dāng)前腳本調(diào)試需要附加的是哪個ShellMouleManager.exe。這一步查看比較繁瑣,因此提出附加VmModuleProxy.exe,無論時哪個腳本進(jìn)行調(diào)試,都只需要附加這個進(jìn)程即可。
3 案例演示
需求:獲取下圖中條碼信息和二維碼信息,然后通過編寫腳本打印日志到本地。
根據(jù)案例需求,步驟如下:
- 使用條碼識別模塊和二維碼識別模塊獲取識別信息;
- 用GetStringValue函數(shù)分別獲取條碼和二維碼信息;
- 通過FileStream類操作流寫入信息到本地;
- 并通過SetstringValue函數(shù)輸出打印日志的狀態(tài)信息給到下一個模塊。
效果如下所示,確定輸入輸出變量,然后編寫代碼,執(zhí)行之后將輸出相應(yīng)得結(jié)果。
完整代碼如下所示:
using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Script.Methods;
public partial class UserScript:ScriptMethods,IProcessMethods
{
//********輸入變量**********
string Barcode; //條碼
string TwoD_Code; //二維碼
//*******輸出變量**********
string writeSucceedOrFailed; //日志寫入狀態(tài);
/// <summary>
/// 預(yù)編譯時變量初始化
/// </summary>
public void Init()
{
//變量初始化,其余變量可在該函數(shù)中添加
}
/// <summary>
/// Enter the process function when running code once
/// 流程執(zhí)行一次進(jìn)入Process函數(shù)
/// </summary>
/// <returns></returns>
public bool Process()
{
//每次執(zhí)行將進(jìn)入該函數(shù),此處添加所需的邏輯流程處理
GetStringValue("barcode",ref Barcode); //獲取條碼信息
GetStringValue("twoD_Code", ref TwoD_Code); //獲取二維碼信息
try
{
using(FileStream fsWrite = new FileStream(@"E:\\Log.txt",FileMode.Append,FileAccess.Write) )
{
string str= "條碼信息:"+ Barcode + "\r\n" + "二維碼信息:" + TwoD_Code;
byte[] buffer=Encoding.Default.GetBytes(str+"\r\n");
fsWrite.Write(buffer,0,buffer.Length);
}
writeSucceedOrFailed="寫入OKAY";
}
catch
{
writeSucceedOrFailed="寫入失敗";
}
SetStringValue("stateOutput",writeSucceedOrFailed); //輸出日志打印狀態(tài)
return true;
}
}
由于我們可以直接使用等于號(=)進(jìn)行賦值,不需要使用不同類型的接口函數(shù)獲取變量(GetxxxxValue)和賦值變量(SetxxxxValue),上述Process()函數(shù)中的代碼也可以用如下方式實現(xiàn)。文章來源:http://www.zghlxwxcb.cn/news/detail-458473.html
public bool Process()
{
//每次執(zhí)行將進(jìn)入該函數(shù),此處添加所需的邏輯流程處理
Barcode=barcode;//獲取條碼信息
TwoD_Code=twoD_Code;//獲取二維碼信息
try
{
using(FileStream fsWrite = new FileStream(@"E:\\Log.txt",FileMode.Append,FileAccess.Write) )
{
string str= "條碼信息:"+ Barcode + "\r\n" + "二維碼信息:" + TwoD_Code;
byte[] buffer=Encoding.Default.GetBytes(str+"\r\n");
fsWrite.Write(buffer,0,buffer.Length);
}
writeSucceedOrFailed="寫入OKAY";
}
catch
{
writeSucceedOrFailed="寫入失敗";
}
//輸出日志打印狀態(tài)
stateOutput=writeSucceedOrFailed;
return true;
}
4 總結(jié)
作為VM中的邏輯模塊之一,腳本模塊能夠靈活的按照需求處理數(shù)據(jù),只要簡單的模仿寫過一遍,就能掌握其中規(guī)則,隨后就能在實際項目中拓展使用。根據(jù)經(jīng)驗,有以下兩點需要注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-458473.html
- 無法進(jìn)入到斷點位置。建議調(diào)試過程中,導(dǎo)出工程后關(guān)閉腳本模塊編輯界面,只使用vs修改代碼和編譯,然后附加進(jìn)程。
- 全局變量與局部變量的差異,在函數(shù)外定義的是全局變量,在process函數(shù)定義的是局部變量。
到了這里,關(guān)于??礦isionMaster-腳本模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!