2024-12-15 列表索引跳轉(zhuǎn)大匯總(使用心得)

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 的地方茎毁。

剛好這個(gè)星期用到了距離判斷跳轉(zhuǎn),然后周末整理一下碧库,加深印象

看一遍看不懂就多看幾遍

做好的學(xué)習(xí)就是實(shí)操一遍

你品,你細(xì)品

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載秕脓,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拣挪,隨后出現(xiàn)的幾起案子赶诊,更是在濱河造成了極大的恐慌舔痪,老刑警劉巖秋麸,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涩赢,居然都是意外死亡悬秉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)况木,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椿猎,“玉大人鸯旁,你說(shuō)我怎么就攤上這事吉殃。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵汽纠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蚯涮,道長(zhǎng)撩荣,這世上最難降的妖魔是什么俱两? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任竹捉,我火速辦了婚禮鹉动,結(jié)果婚禮上飒炎,老公的妹妹穿的比我還像新娘耕驰。我一直安慰自己,他們只是感情好棚菊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著凶杖,像睡著了一般殴泰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捞魁,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天宵蛀,我揣著相機(jī)與錄音,去河邊找鬼。 笑死锅睛,一個(gè)胖子當(dāng)著我的面吹牛鹃锈,可吹牛的內(nèi)容都是我干的仅政。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扔茅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼已旧!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起召娜,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤运褪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后玖瘸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秸讹,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年雅倒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了璃诀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔑匣,死狀恐怖劣欢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裁良,我是刑警寧澤凿将,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站价脾,受9級(jí)特大地震影響牧抵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侨把,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一犀变、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秋柄,春花似錦获枝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜘拉,卻和暖如春萨西,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旭旭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工谎脯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人持寄。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓源梭,卻偏偏與公主長(zhǎng)得像娱俺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子废麻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容