1. 上面在飛行模塊中有介紹過(guò)列表跳轉(zhuǎn)功能位衩,當(dāng)時(shí)還理解不夠透徹糖驴,后重新整理編寫(xiě)
http://www.reibang.com/p/add08a72e545?v=1734226886436。
2. 列表跳轉(zhuǎn)又分三種情況俺榆,有寄存器索引值跳轉(zhuǎn)罐脊,有io跳轉(zhuǎn)萍桌,有編碼器距離跳轉(zhuǎn)上炎。
3. 實(shí)現(xiàn)跳轉(zhuǎn)原理藕施,其實(shí)就和goto flag 的類(lèi)似,通過(guò)條件語(yǔ)句是否滿足然后進(jìn)行跳轉(zhuǎn)實(shí)現(xiàn)想要的功能线椰。
4. 接下來(lái)分別詳細(xì)介紹三種跳轉(zhuǎn)功能
寄存器值跳轉(zhuǎn)
判斷寄存器值接口烦绳,類(lèi)似于條件判斷語(yǔ)句
//當(dāng)nCounterIndex對(duì)應(yīng)的計(jì)數(shù)器(0-255)的值大于nCompareValue則跳轉(zhuǎn)到索引nListIndex處径密,否則執(zhí)行下一條命令
//E3_API int E3_MarkerConditionJumpToIndexToList(E3_ID idMarker, int nCounterIndex, unsigned int nCompareValue, int nListIndex);
/// <summary>
///
/// </summary>
/// <param name="idMarker">板卡id</param>
/// <param name="nCounterIndex">寄存器索引值</param>
/// <param name="nCompareValue">寄存器值享扔,用于判斷</param>
/// <param name="nListIndex">跳轉(zhuǎn)索引惧眠,用于判斷之后氛魁,不滿足跳轉(zhuǎn)到相應(yīng)索引</param>
/// <returns></returns>
[DllImport("Ezcad3kernel", EntryPoint = "E3_MarkerConditionJumpToIndexToList", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern E3_ERR e3_MarkerConditionJumpToIndexToList(E3_POINTER idMarker, int nCounterIndex, UInt32 nCompareValue, int nListIndex);
public static E3_ERR E3_MarkerConditionJumpToIndexToList(E3_ID idMarker, int nCounterIndex, UInt32 nCompareValue, int nListIndex)
{
return e3_MarkerConditionJumpToIndexToList(idMarker, nCounterIndex, nCompareValue, nListIndex);
}
設(shè)置寄存器值接口
//E3_API int E3_MarkerSetMarkCount(E3_ID idMarker, int index, unsigned int nCount);
[DllImport("Ezcad3kernel", EntryPoint = "E3_MarkerSetMarkCount", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern E3_ERR e3_MarkerSetMarkCount(E3_POINTER idMarker, int index, UInt32 nCount);
public static E3_ERR E3_MarkerSetMarkCount(E3_ID idMarker, int index, UInt32 nCount)
{
return e3_MarkerSetMarkCount(idMarker, index, nCount);
}
跳轉(zhuǎn)到索引的接口捶码,類(lèi)似于goto
//直接跳轉(zhuǎn)到列表索引index處
//E3_API int E3_MarkeDirectJumpToIndexToList(E3_ID idMarker, int index);
[DllImport("Ezcad3kernel", EntryPoint = "E3_MarkeDirectJumpToIndexToList", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern E3_ERR e3_MarkeDirectJumpToIndexToList(E3_POINTER idMarker, int index);
public static E3_ERR E3_MarkeDirectJumpToIndexToList(E3_ID idMarker, int index)
{
return e3_MarkeDirectJumpToIndexToList(idMarker, index);
}
設(shè)置跳轉(zhuǎn)的索引惫恼,類(lèi)似Flag
//E3_API int E3_MarkerGetCfgParamDouble(E3_ID idMarker, int nIndex, double& dParam);
//E3_API int E3_MarkerSetCfgParamDouble(E3_ID idMarker, int nIndex, double dParam);
//E3_API int E3_MarkerSetIndexToList(E3_ID idMarker, int nIndex);
/// <summary>
///設(shè)置板卡緩存指令序號(hào)跳轉(zhuǎn)
/// </summary>
/// <param name="idMarker"></param>
/// <param name="nIndex"></param>
/// <returns></returns>
[DllImport("Ezcad3kernel", EntryPoint = "E3_MarkerSetIndexToList", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern E3_ERR e3_MarkerSetIndexToList(E3_POINTER idMarker, int nIndex);
public static E3_ERR E3_MarkerSetIndexToList(E3_ID idMarker, int nIndex)
{
return e3_MarkerSetIndexToList(idMarker, nIndex);
}
上面是接口實(shí)現(xiàn),下面直接看例子代碼
private void button6_Click(object sender, EventArgs e)
{
uint indexNum = Convert.ToUInt16(textBox1.Text);
EzdKernel.E3_MarkerSetMarkCount(m_idMarker, 100, indexNum);
}
private void DoLoop()
{
//設(shè)置輸入口模式
EzdKernel.E3_SetInputPortWorkMode(m_idMarker, true, true);
//列表準(zhǔn)備
EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000000);
//DOLOOP硬件模式
EzdKernel.E3_StartMainLoopIOCheckProcess(m_idMarker, 1, 0, 0x1, 100);
//循環(huán)開(kāi)始
EzdKernel.E3_MarkertSetLoopStartToList(m_idMarker);
//等待輸入信號(hào)
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 0);
//
//寄存器設(shè)置30以上盆繁,就跳到索引11
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 30, 50);
//寄存器設(shè)置20-30之間,就跳到索引12
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 20, 12);
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 10, 13);
//索引11倾贰,加工完跳轉(zhuǎn)索引50
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 11);
//輸出信號(hào)拉高
EzdKernel.E3_MarkerWritePortToList(m_idMarker, 1);
EzdKernel.E3_MarkerSelectTransMatirxToList(m_idMarker, 0, true);
EzdKernel.E3_MarkerSetTransformMatrixByIndex3(m_idMarker, 0, 0, 0, 0, 0, (10) * Math.PI / 180, 0x1);
EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idEntList[0]);
//輸出 拉低
EzdKernel.E3_MarkerWritePortToList(m_idMarker, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);
//索引12匆浙,加工完跳轉(zhuǎn)索引50
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 12);
//輸出信號(hào)拉高
EzdKernel.E3_MarkerWritePortToList(m_idMarker, 1);
//EzdKernel.E3_MarkerAutoSelectListMatirxToList(m_idMarker);
EzdKernel.E3_MarkerSelectTransMatirxToList(m_idMarker, 1, true);
EzdKernel.E3_MarkerSetTransformMatrixByIndex3(m_idMarker, 1, 0, 0, 0, 0, (70) * Math.PI / 180, 0x1);
EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idEntList[1]);
//輸出 拉低
EzdKernel.E3_MarkerWritePortToList(m_idMarker, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);
//索引13,加工完跳轉(zhuǎn)索引50
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 13);
//輸出信號(hào)拉高
EzdKernel.E3_MarkerWritePortToList(m_idMarker, 1);
//EzdKernel.E3_MarkerAutoSelectListMatirxToList(m_idMarker);
EzdKernel.E3_MarkerSelectTransMatirxToList(m_idMarker, 2, true);
EzdKernel.E3_MarkerSetTransformMatrixByIndex3(m_idMarker, 2, 0, 0, 0, 0, (90) * Math.PI / 180, 0x1);
EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idEntList[2]);
//輸出 拉低
EzdKernel.E3_MarkerWritePortToList(m_idMarker, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);
//索引50
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 50);
//輸出信號(hào)拉高
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2,2);
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000_000);
//輸出 拉低
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 60);
//輸出信號(hào)拉高
//輸出信號(hào)拉高
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000_000);
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 2);
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000_000);
//輸出 拉低
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 70);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 70);
//確保當(dāng)前數(shù)據(jù)緩存區(qū)的數(shù)據(jù)已經(jīng)發(fā)送到卡里软能,并且卡里已經(jīng)執(zhí)行列表
EzdKernel.E3_MarkerSentBufToCardAndRunList(m_idMarker);
//循環(huán)動(dòng)作結(jié)束(檢測(cè)輸入端口查排、打標(biāo))
EzdKernel.E3_MarkerDoLoopToList(m_idMarker);
//列表結(jié)束
EzdKernel.E3_MarkerListEndToList(m_idMarker);
EzdKernel.E3_MarkerWaitForFinish(m_idMarker);
EzdKernel.E3_MarkerListEnd(m_idMarker);
}
條件跳轉(zhuǎn),列表中設(shè)置寄存器索引100叛买,判斷寄存器值大于30 就跳轉(zhuǎn)到索引為50的語(yǔ)句刻伊;寄存器值大于20娃圆,小于30讼呢,就跳轉(zhuǎn)索引為12的地方;寄存器值大于10节沦,小于20甫贯,就跳轉(zhuǎn)索引為13的地方叫搁。當(dāng)然后面是一定有設(shè)置對(duì)應(yīng)的索引語(yǔ)句渴逻,要不然跳轉(zhuǎn)不生效
//寄存器設(shè)置30以上惨奕,就跳到索引11
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 30, 50);
//寄存器設(shè)置20-30之間竭钝,就跳到索引12
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 20, 12);
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 10, 13);
設(shè)置索引50語(yǔ)句卧波,當(dāng)寄存器符合大于30的值就跳轉(zhuǎn)到索引為50的語(yǔ)句幽勒,下面就是設(shè)置當(dāng)前位置為索引50的位置港令,類(lèi)似50的flag
//索引50
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 50);
//輸出信號(hào)拉高
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2,2);
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000_000);
//輸出 拉低
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);
直接跳轉(zhuǎn)咪惠,存在多個(gè)索引跳轉(zhuǎn)的時(shí)候淋淀,就一定需要直接跳轉(zhuǎn)語(yǔ)句炭臭,條件跳轉(zhuǎn)先進(jìn)入需要的執(zhí)行的邏輯鞋仍,然后直接跳轉(zhuǎn)到退出的位置。
//直接跳轉(zhuǎn)語(yǔ)句
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);
直接跳轉(zhuǎn)里面也可以嵌套直接跳轉(zhuǎn)落午,跳到60溃斋,然后往下執(zhí)行梗劫,直接跳轉(zhuǎn)到70
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 60);
//輸出信號(hào)拉高
//輸出信號(hào)拉高
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000_000);
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 2);
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000_000);
//輸出 拉低
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 70);
IO判斷跳轉(zhuǎn)
重點(diǎn):SetInputPortWorkMode 設(shè)置模式要為電平模式EzdKernel.E3_SetInputPortWorkMode(m_idMarker, false, true);
判斷IO接口,后面往往接條件跳轉(zhuǎn)語(yǔ)句
//16 8 4 2
//1^4 1^3 1^2 1^1
//0就是低電平
//1就是高電平
//30=輸入2^1 ,2^2 瓷翻,2^3 妒牙,2^4 累加30
//io端口1-4 portValue = 0 (1对妄、2剪菱、3孝常、4 全部都為低電平)
EzdKernel.E3_MarkerIfIOCondToList(m_idMarker, 30, 0);
如果上面不滿足构灸,就執(zhí)行下面的語(yǔ)句條件跳轉(zhuǎn)。
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 1, 10, 2);
對(duì)照列表輸出IO的mask 和value
/// <summary>
/// E3_API E3_MarkerIfIOCondToList(E3_ID idMarker, uint PortMask, uint PortValue)
/// </summary>
/// <param name="idMarker"></param>
/// <param name="PortMask">mask為端口 </param>
/// <param name="PortValue">端口電平值</param>
/// <returns></returns>
[DllImport("Ezcad3kernel", EntryPoint = "E3_MarkerIfIOCondToList", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern E3_ERR e3_MarkerIfIOCondToList(E3_POINTER idMarker, uint PortMask, uint PortValue);
public static E3_ERR E3_MarkerIfIOCondToList(E3_ID idMarker, uint PortMask, uint PortValue)
{
return e3_MarkerIfIOCondToList(idMarker, PortMask, PortValue);
}
上面是接口實(shí)現(xiàn)曹阔,下面直接看例子代碼
EzdKernel.E3_SetInputPortWorkMode(m_idMarker, false, true);
//EzdKernel.E3_StartMainLoopIOCheckProcess(m_idMarker, 1, 0, 0x1, 100);
EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000000);
EzdKernel.E3_MarkerClearWaitForInputLock(m_idMarker, 1);
EzdKernel.E3_MarkertSetLoopStartToList(m_idMarker);
EzdKernel.E3_MarkertRepeatToList(m_idMarker);
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 1, false);//循環(huán)進(jìn)來(lái)次兆,wait阻塞住
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 5);
EzdKernel.E3_MarkertUntilToList(m_idMarker, RepeatNumber);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 5);//索引5
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 0, false);
for (int i = 0; i < m_idLayerList.Length; i++)
{
EzdKernel.E3_MarkerSetMarkCountToList(m_idMarker, i + 1, 10);
}
//0 1 2 3 4 5
//1 2 4 8 16 32
uint nIOAllNum = 30;
uint[] IOShotVal = new uint[12];
IOShotVal[0] = 0;
IOShotVal[1] = 2;
IOShotVal[2] = 4;
IOShotVal[3] = 6;
IOShotVal[4] = 8;
IOShotVal[5] = 10;
IOShotVal[6] = 12;
IOShotVal[7] = 14;
IOShotVal[8] = 16;
IOShotVal[9] = 18;
IOShotVal[10] = 20;
IOShotVal[11] = 22;
for (int i = 1; i <=12; i++)
{
EzdKernel.E3_MarkerIfIOCondToList(m_idMarker, nIOAllNum, IOShotVal[i-1]); //30=輸入2^1,2^2园蝠,2^3,2^4 累加30 io端口1-4 portValue = 0 (1痢士、2善延、3易遣、4 全部都為低電平)
EzdKernel.E3_MarkerSetMarkCountToList(m_idMarker, i, 23);//設(shè)置寄存器值23>10可以進(jìn)去 當(dāng)前索引為1
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, i, 10, i+1);//跳轉(zhuǎn)條件參數(shù)(板卡id豆茫,計(jì)數(shù)器索引:第一個(gè)圖層就是1揩魂,寄存器比較值:外部設(shè)置寄存器大于才生效,case:從2開(kāi)始火脉,條不滿足會(huì)跳到圖層2倦挂,滿足就繼續(xù)往下走)
EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, false, false);
EzdKernel.E3_MarkerResetDistanceToList(m_idMarker, true, true);
EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, true, true);
EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idLayerList[i-1]);//標(biāo)刻圖層0
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//加工完直接跳轉(zhuǎn)到索引20
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, i+1);
}
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 20);//索引20
//EzdKernel.E3_MarkerChangeMarkCountToList(m_idMarker, 1);
//EzdKernel.E3_MarkerSentBufToCardAndRunList(m_idMarker);
EzdKernel.E3_MarkerDoLoopToList(m_idMarker);
EzdKernel.E3_MarkerSetFlyEnableToList(m_idMarker, false, isRotateFly);
//列表結(jié)束標(biāo)志
EzdKernel.E3_MarkerListEndToList(m_idMarker);
//等待列表執(zhí)行完成
EzdKernel.E3_MarkerWaitForFinish(m_idMarker);
EzdKernel.E3_MarkerListEnd(m_idMarker);
IO跳轉(zhuǎn)還是需要前面寄存器值跳轉(zhuǎn)一樣,目前這個(gè)代碼是可以通過(guò)io的判斷的方式肯骇,然后寫(xiě)入寄存器值,然后通過(guò)寄存器值對(duì)比實(shí)現(xiàn)跳轉(zhuǎn)漾脂,我覺(jué)得下面的代碼邏輯才正確骨稿。后面有時(shí)間去驗(yàn)證這個(gè)功能坦冠。
自我猜測(cè)
//EzdKernel.E3_MarkerSetIndexToList(m_idMarker, i);
//EzdKernel.E3_MarkerIfIOCondToList(m_idMarker, nIOAllNum, IOShotVal[i - 1]); //30=輸入21哥桥,22判呕,23,24 累加30 io端口1-4 portValue = 0 (1侠草、2犁嗅、3奥吩、4 全部都為低電平)
//EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, i+1);//
//EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, false, false);
//EzdKernel.E3_MarkerResetDistanceToList(m_idMarker, true, true);
//EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, true, true);
//EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idLayerList[i - 1]);//標(biāo)刻圖層0
//EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//加工完直接跳轉(zhuǎn)到索引20
請(qǐng)看這 >>> 補(bǔ)充說(shuō)明腮介,實(shí)際測(cè)試結(jié)果叠洗,可以IO條件判斷之后灭抑,直接接(直接)跳轉(zhuǎn)指令
-
條件判斷之后直接接 (直接)跳轉(zhuǎn)指令十艾,當(dāng)io判斷不生效時(shí)候,會(huì)進(jìn)入直接跳轉(zhuǎn)指令腾节,進(jìn)入下一個(gè)圖層繼續(xù)判斷IO
-
第三個(gè)圖層觸發(fā)跳轉(zhuǎn)到出光時(shí)間為500-600us
-
第五個(gè)圖層觸發(fā)跳轉(zhuǎn)到出光時(shí)間為1ms
-
第十個(gè)圖層觸發(fā)跳轉(zhuǎn)到出光時(shí)間為1.2ms
-
第十五個(gè)圖層觸發(fā)跳轉(zhuǎn)到出光時(shí)間為1.5ms
-
第二十個(gè)圖層觸發(fā)跳轉(zhuǎn)到出光時(shí)間為2ms
-
第二十五個(gè)圖層觸發(fā)跳轉(zhuǎn)到出光時(shí)間為2.4ms
uint RepeatNumber = 10;
EzdKernel.E3_SetInputPortWorkMode(m_idMarker, false, true);
//EzdKernel.E3_StartMainLoopIOCheckProcess(m_idMarker, 1, 0, 0x1, 100);
EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000000);
EzdKernel.E3_MarkerClearWaitForInputLock(m_idMarker, 1);
EzdKernel.E3_MarkertSetLoopStartToList(m_idMarker);
//實(shí)現(xiàn)脈沖觸發(fā)
EzdKernel.E3_MarkertRepeatToList(m_idMarker);
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 1, false);//循環(huán)進(jìn)來(lái)忘嫉,wait阻塞住
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 5);
EzdKernel.E3_MarkertUntilToList(m_idMarker, RepeatNumber);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 5);//索引5
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 0, false);
//for (int i = 0; i < m_idLayerList.Length; i++)
// {
// EzdKernel.E3_MarkerSetMarkCountToList(m_idMarker, i + 1, 10);
// }
//0 1 2 3 4 5
//1 2 4 8 16 32
uint nIOAllNum = 62;
uint[] IOShotVal = new uint[25];
uint a = 0;
for (int i = 0; i < 25; i++)
{
//觸發(fā)io
IOShotVal[i] = a;//00 0000
a += 2;
}
/*
* 00 0000
* 00 0010
* 00 0100
* 00 0110
* 00 1000
*
* 00 1010
* 00 1100
* 00 1110
* 01 0000
* 01 0010
*
* 01 0100
* 01 0110
* 01 1000
* 01 1010
* 01 1100
*
* 01 1110
* 10 0000
* 10 0010
* 10 0100
* 10 0110
*
* 10 1000
* 10 1010
* 10 1100
* 10 1110
* 11 0000
*
* 11 0010
* 11 0100
* 11 0110
* 11 1000
* 11 1010
*
* 11 1100
* 11 1110
*
*/
for (int i = 1; i <=25; i++)
{
EzdKernel.E3_MarkerIfIOCondToList(m_idMarker, nIOAllNum, IOShotVal[i-1]); //30=輸入2^1荤牍,2^2,2^3,2^4庆冕,2^5 累加62 io端口1-4 portValue = 0 (1康吵、2、3晦嵌、4 全部都為低電平)
// EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, i, 10, i+1);//跳轉(zhuǎn)條件參數(shù)(板卡id响巢,計(jì)數(shù)器索引:第一個(gè)圖層就是1,寄存器比較值:外部設(shè)置寄存器大于才生效,case:從2開(kāi)始,條不滿足會(huì)跳到圖層2,滿足就繼續(xù)往下走)
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, i + 1);//加工完直接跳轉(zhuǎn)到索引20
//EzdKernel.E3_MarkerSetMarkCountToList(m_idMarker, i, 23);//設(shè)置寄存器值23>10可以進(jìn)去 當(dāng)前索引為1
//EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, false, false);
//EzdKernel.E3_MarkerResetDistanceToList(m_idMarker, true, true);
//EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, true, true);
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker,(ushort)IOShotVal[i-1], (ushort)IOShotVal[i - 1]);
EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idLayerList[i-1]);//標(biāo)刻圖層0
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000000);
EzdKernel.E3_MarkerChangeMarkCountToList(m_idMarker, 1); //添加計(jì)數(shù)器
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, (ushort)IOShotVal[i - 1], 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 100);//加工完直接跳轉(zhuǎn)到索引20
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, i+1);
//IFIO條件判斷語(yǔ)句為什么又存在寄存器判斷燕刻,是否直接判斷io是否對(duì)應(yīng),如果io不對(duì)直接跳轉(zhuǎn)到下一個(gè)對(duì)象判斷io
}
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 100);//加工完直接跳轉(zhuǎn)到索引20
距離防呆跳轉(zhuǎn)(判斷距離是否到位了)
X編碼器飛行條件判斷
[DllImport("Ezcad3kernel", EntryPoint = "E3_MarkerIfFlyXDistanceCondToList", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
static extern E3_ERR e3_MarkerIfFlyXDistanceCondToList(E3_POINTER idMarker, double FlyDistance);
public static E3_ERR E3_MarkerIfFlyXDistanceCondToList(E3_ID idMarker, double FlyDistance)
{
return e3_MarkerIfFlyXDistanceCondToList(idMarker, FlyDistance);
}
上面是接口實(shí)現(xiàn)本橙,下面直接看例子代碼
EzdKernel.E3_MarkerStop(m_idMarker);//停止加工贷币,退出列表
Task.Run(() =>
{
EzdKernel.E3_ERR err = EzdKernel.E3_MarkerSetCfgParamInt(m_idMarker, 47, 1);
//列表開(kāi)始
EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000400);
//設(shè)置基礎(chǔ)板卡筆參數(shù)
EzdKernel.E3_MarkerBasicSetPenList(m_idMarker, 0);
//關(guān)閉飛行使能
EzdKernel.E3_MarkerFlyEnableToList(m_idMarker, false);
//復(fù)位編碼器距離字管,一定要是關(guān)閉飛行標(biāo)志位狀態(tài)
EzdKernel.E3_MarkerFlyResetDistanceToList(m_idMarker);
//開(kāi)啟飛行使能
EzdKernel.E3_MarkerFlyEnableToList(m_idMarker, true);
for (int i = 0; i < 2; i++)
{
//等待編碼器距離 50一個(gè)
EzdKernel.E3_MarkerFlyWaitForDistToList(m_idMarker, 30 + (i * 30), false);
EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, false, false);
EzdKernel.E3_MarkerResetDistanceToList(m_idMarker, true, true);
EzdKernel.E3_MarkerEnableFlyCorrectionToList(m_idMarker, true, true);
//出光前判斷,如果此時(shí)編碼器距離大于 設(shè)置編碼器距離(在原來(lái)基礎(chǔ)設(shè)置等待距離上多+1) 就跳轉(zhuǎn)到50丁逝,對(duì)象不出光
EzdKernel.E3_MarkerIfFlyXDistanceCondToList(m_idMarker, 30 + (i * 30) + 5);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);//跳轉(zhuǎn)到50
EzdKernel.E3_MarkerStartMarkTimerToList(m_idMarker); //開(kāi)啟列表計(jì)時(shí)(預(yù)估板卡加工時(shí)間)
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 1, 0);
EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idCurLayer); //列表加工對(duì)象
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 1, 1);
EzdKernel.E3_MarkerStopMarkTimerToList(m_idMarker); //關(guān)閉計(jì)時(shí)
//EzdKernel.E3_MarkerChangeMarkCountToList(m_idMarker, 1); //添加計(jì)數(shù)器
//int Timems = 0;
//EzdKernel.E3_MarkerGetMakingTime(m_idMarker, ref Timems);
////讀取下發(fā)數(shù)據(jù)板卡執(zhí)行時(shí)間
//Console.WriteLine($"下發(fā)索引:{i},時(shí)間:{Timems}");
}
//正常退出 跳索引為60
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 50);//50號(hào)索引
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 2);
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000000);
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 2, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 100);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 60);//60號(hào)索引
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 4, 4);
EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000000);
EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 4, 0);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 100);
EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 100);//100號(hào)索引
//下發(fā)到板卡并執(zhí)行完成
EzdKernel.E3_MarkerSentBufToCardAndRunList(m_idMarker);
//關(guān)閉飛行琢感,如果不關(guān)閉,用E3_MarkEnt2標(biāo)刻會(huì)按飛行標(biāo)刻
EzdKernel.E3_MarkerFlyEnableToList(m_idMarker, false);
EzdKernel.E3_MarkerListEndToList(m_idMarker);
//等待加工完成
EzdKernel.E3_MarkerWaitForFinish(m_idMarker);
//列表結(jié)束
EzdKernel.E3_MarkerListEnd(m_idMarker);
});
使用距離和跳轉(zhuǎn)語(yǔ)句配合使用
EzdKernel.E3_MarkerIfFlyXDistanceCondToList(m_idMarker, 30 + (i * 30) + 5);
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);//跳轉(zhuǎn)到50,異常索引
···
···
···
//正常退出 跳索引為60
EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);
如果距離大于條件判斷距離,就立馬會(huì)跳到索引為50的地方寄月,流程正常結(jié)束就直接跳轉(zhuǎn)到60 的地方茎毁。