2024-12-15 列表索引跳转大汇总(使用心得)

1. 上面在飞行模块中有介绍过列表跳转功能,当时还理解不够透彻,后重新整理编写

https://www.jianshu.com/p/add08a72e545?v=1734226886436

2. 列表跳转又分三种情况,有寄存器索引值跳转,有io跳转,有编码器距离跳转。

3. 实现跳转原理,其实就和goto flag 的类似,通过条件语句是否满足然后进行跳转实现想要的功能。

4. 接下来分别详细介绍三种跳转功能

  • 寄存器值跳转

判断寄存器值接口,类似于条件判断语句

 //当nCounterIndex对应的计数器(0-255)的值大于nCompareValue则跳转到索引nListIndex处,否则执行下一条命令
 //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">跳转索引,用于判断之后,不满足跳转到相应索引</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);
 }

设置寄存器值接口

 //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);
 }

跳转到索引的接口,类似于goto

  //直接跳转到列表索引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);
  }

设置跳转的索引,类似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>
        ///设置板卡缓存指令序号跳转
        /// </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);
        }

上面是接口实现,下面直接看例子代码

  private void button6_Click(object sender, EventArgs e)
  {

      uint indexNum = Convert.ToUInt16(textBox1.Text);
      EzdKernel.E3_MarkerSetMarkCount(m_idMarker, 100, indexNum);
  }


  private void DoLoop()
  {
      //设置输入口模式
      EzdKernel.E3_SetInputPortWorkMode(m_idMarker, true, true);
      //列表准备
      EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000000);

      //DOLOOP硬件模式
      EzdKernel.E3_StartMainLoopIOCheckProcess(m_idMarker, 1, 0, 0x1, 100);
      //循环开始
      EzdKernel.E3_MarkertSetLoopStartToList(m_idMarker);
      //等待输入信号
      EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 0);
      //



      //寄存器设置30以上,就跳到索引11
      EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 30, 50);
      //寄存器设置20-30之间,就跳到索引12
      EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 20, 12);
      EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 10, 13);


      //索引11,加工完跳转索引50
      EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 11);

      //输出信号拉高
      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,加工完跳转索引50
      EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 12);

      //输出信号拉高
      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,加工完跳转索引50
      EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 13);
      //输出信号拉高
      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);
      //输出信号拉高
      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);
      //输出信号拉高
      //输出信号拉高
      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);
      //确保当前数据缓存区的数据已经发送到卡里,并且卡里已经执行列表
      EzdKernel.E3_MarkerSentBufToCardAndRunList(m_idMarker);

      //循环动作结束(检测输入端口、打标)
      EzdKernel.E3_MarkerDoLoopToList(m_idMarker);
      //列表结束
      EzdKernel.E3_MarkerListEndToList(m_idMarker);
      EzdKernel.E3_MarkerWaitForFinish(m_idMarker);
      EzdKernel.E3_MarkerListEnd(m_idMarker);
  }
条件跳转,列表中设置寄存器索引100,判断寄存器值大于30 就跳转到索引为50的语句;寄存器值大于20,小于30,就跳转索引为12的地方;寄存器值大于10,小于20,就跳转索引为13的地方。当然后面是一定有设置对应的索引语句,要不然跳转不生效
  //寄存器设置30以上,就跳到索引11
      EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 30, 50);
      //寄存器设置20-30之间,就跳到索引12
      EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 20, 12);
      EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 100, 10, 13);
设置索引50语句,当寄存器符合大于30的值就跳转到索引为50的语句,下面就是设置当前位置为索引50的位置,类似50的flag
//索引50
     EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 50);
     //输出信号拉高
     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_MarkeDirectJumpToIndexToList(m_idMarker, 60);
直接跳转里面也可以嵌套直接跳转,跳到60,然后往下执行,直接跳转到70
      EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 60);
      //输出信号拉高
      //输出信号拉高
      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判断跳转 满足条件后跳过下一句列表调用

重点:SetInputPortWorkMode 设置模式要为电平模式EzdKernel.E3_SetInputPortWorkMode(m_idMarker, false, true);

疑问?:条件跳转是需要io电平模式还是doloop需要电平模式?-->结论是条件跳转必须要电平模式才可以。

逻辑:判断IO接口,后面往往接条件跳转语句,IO条件不满足就跳下一个索引值,下一个索引值接着IO条件判断,满足IO条件执行当前内容,然后跳到结束索引,继续循环

总结(20250905):E3_MarkerIfIOCondToList 这个接口的意思是满足条件后跳过下一句列表调用 ,那这个接口后面必须要接跳转语句使用,这个和距离判断语句也是一样的

//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);
如果上面不满足,就执行下面的语句条件跳转。
EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, 1, 10,  2);
    对照列表输出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);
    }

上面是接口实现,下面直接看例子代码

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);

//疑问?条件跳转是需要io电平模式还是doloop需要电平模式?-->结论是条件跳转必须要电平模式才可以。
//可以执行DoLoop 脉冲模式,一般不设置的,doloop模式是电平模式,设置E3_SetInputPortWorkMode模式为脉冲也没用,io条件必须要设置电平模式。
EzdKernel.E3_MarkertRepeatToList(m_idMarker);
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 1, false);//循环进来,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);//设置寄存器值23>10可以进去 当前索引为1
    EzdKernel.E3_MarkerConditionJumpToIndexToList(m_idMarker, i, 10, i+1);//跳转条件参数(板卡id,计数器索引:第一个图层就是1,寄存器比较值:外部设置寄存器大于才生效,case:从2开始,条不满足会跳到图层2,满足就继续往下走)
    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]);//标刻图层0
    EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//加工完直接跳转到索引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);
//列表结束标志
EzdKernel.E3_MarkerListEndToList(m_idMarker);
//等待列表执行完成
EzdKernel.E3_MarkerWaitForFinish(m_idMarker);


EzdKernel.E3_MarkerListEnd(m_idMarker);

IO跳转还是需要前面寄存器值跳转一样,目前这个代码是可以通过io的判断的方式,然后写入寄存器值,然后通过寄存器值对比实现跳转,我觉得下面的代码逻辑才正确。后面有时间去验证这个功能。

自我猜测

//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]);//标刻图层0
//EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//加工完直接跳转到索引20

请看这 >>> 补充说明,实际测试结果,可以IO条件判断之后,直接接(直接)跳转指令,看下面的代码

  Task.Run(() =>
  {
      EzdKernel.E3_SetInputPortWorkMode(m_idMarker, false, true);
      EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000000);
      EzdKernel.E3_MarkertSetLoopStartToList(m_idMarker);


      //端口0 是低电平触发 启动信号
      EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 0);

      //满足条件后跳过下一句列表调用
      EzdKernel.E3_MarkerIfIOCondToList(m_idMarker, nIOAllNum=30, 28);  //30=输入2^1,2^2,2^3,2^4 累加30 io端口1-4 portValue = 28 (1 1100 int1低电平 int234高电平 2^2,2^3,2^4 累加28) 
      EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 2);//如果IO不满足条件就执行这句话,就跳转到索引2,如果满足就跳过这句列表指令,
      EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idLayerList[0]);//标刻图层0
      EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 30, 28);//输出
      EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//加工完直接跳转到循环结束索引20



      EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 2);//索引2 标志位
      EzdKernel.E3_MarkerIfIOCondToList(m_idMarker, nIOAllNum=30, 26);  //30=输入2^1,2^2,2^3,2^4 累加30 io端口1-4 portValue = 26 (int1、int3、int4 全部都高电平 int2为低电平 1 1010 )
      EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//如果IO不满足条件就执行这句话,就跳转到索引20,如果满足就跳过这句列表指令,
      EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idLayerList[1]);//标刻图层1
      EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 30, 26);//输出
      EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 20);//加工完直接跳转到索引20



      EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 20);//循环结束索引20
      EzdKernel.E3_MarkerDoLoopToList(m_idMarker);
      EzdKernel.E3_MarkerSentBufToCardAndRunList(m_idMarker);

      //列表结束标志
      EzdKernel.E3_MarkerListEndToList(m_idMarker);
      //等待列表执行完成
      EzdKernel.E3_MarkerWaitForFinish(m_idMarker);
      EzdKernel.E3_MarkerListEnd(m_idMarker);

  });
  • 条件判断之后直接接 (直接)跳转指令,当io判断不生效时候,会进入直接跳转指令,进入下一个图层继续判断IO

  • 第三个图层触发跳转到出光时间为500-600us

  • 第五个图层触发跳转到出光时间为1ms

  • 第十个图层触发跳转到出光时间为1.2ms

  • 第十五个图层触发跳转到出光时间为1.5ms

  • 第二十个图层触发跳转到出光时间为2ms

  • 第二十五个图层触发跳转到出光时间为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);

//实现脉冲触发
         EzdKernel.E3_MarkertRepeatToList(m_idMarker);
EzdKernel.E3_MarkerWaitForInputToList(m_idMarker, 1, 1, false);//循环进来,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++)
         {
//触发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);//跳转条件参数(板卡id,计数器索引:第一个图层就是1,寄存器比较值:外部设置寄存器大于才生效,case:从2开始,条不满足会跳到图层2,满足就继续往下走)
    EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, i + 1);//加工完直接跳转到索引20

    //EzdKernel.E3_MarkerSetMarkCountToList(m_idMarker, i, 23);//设置寄存器值23>10可以进去 当前索引为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]);//标刻图层0
    EzdKernel.E3_MarkerDelayUsToList(m_idMarker, 1000000);
    EzdKernel.E3_MarkerChangeMarkCountToList(m_idMarker, 1); //添加计数器
    EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, (ushort)IOShotVal[i - 1], 0);



             EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 100);//加工完直接跳转到索引20
             EzdKernel.E3_MarkerSetIndexToList(m_idMarker, i+1);
    //IFIO条件判断语句为什么又存在寄存器判断,是否直接判断io是否对应,如果io不对直接跳转到下一个对象判断io



}


EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 100);//加工完直接跳转到索引20
  • 距离防呆跳转(判断距离是否到位了,满足条件后跳过下一句列表调用和前面io判断一样)

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);
    }

上面是接口实现,下面直接看例子代码

EzdKernel.E3_MarkerStop(m_idMarker);//停止加工,退出列表
Task.Run(() =>
{

    
    EzdKernel.E3_ERR err = EzdKernel.E3_MarkerSetCfgParamInt(m_idMarker, 47, 1);
    //列表开始
    EzdKernel.E3_MarkerListReady(m_idMarker, m_idEM, 0x000000400);
    //设置基础板卡笔参数
    EzdKernel.E3_MarkerBasicSetPenList(m_idMarker, 0);

    

    //关闭飞行使能
    EzdKernel.E3_MarkerFlyEnableToList(m_idMarker, false);
    //复位编码器距离,一定要是关闭飞行标志位状态
    EzdKernel.E3_MarkerFlyResetDistanceToList(m_idMarker);
    //开启飞行使能
    EzdKernel.E3_MarkerFlyEnableToList(m_idMarker, true);

    for (int i = 0; i < 2; i++)
    {
        //等待编码器距离 50一个
        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);

        //出光前判断,如果此时编码器距离大于 设置编码器距离(在原来基础设置等待距离上多+1)  就跳转到50,对象不出光
        EzdKernel.E3_MarkerIfFlyXDistanceCondToList(m_idMarker, 30 + (i * 30) + 5);
        EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);//跳转到50

        
        EzdKernel.E3_MarkerStartMarkTimerToList(m_idMarker); //开启列表计时(预估板卡加工时间)

        EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 1, 0);
        
        EzdKernel.E3_MarkerMarkEntToList2(m_idMarker, m_idCurLayer); //列表加工对象
        
        EzdKernel.E3_MarkerSetOutputPortWithMaskToList(m_idMarker, 1, 1);

        EzdKernel.E3_MarkerStopMarkTimerToList(m_idMarker); //关闭计时
        

        //EzdKernel.E3_MarkerChangeMarkCountToList(m_idMarker, 1); //添加计数器

        //int Timems = 0;
        //EzdKernel.E3_MarkerGetMakingTime(m_idMarker, ref Timems);
        ////读取下发数据板卡执行时间
        //Console.WriteLine($"下发索引:{i},时间:{Timems}");

        
    }
    



    
    
    //正常退出 跳索引为60 
    EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);



    EzdKernel.E3_MarkerSetIndexToList(m_idMarker, 50);//50号索引
    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号索引
    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号索引



    //下发到板卡并执行完成
    EzdKernel.E3_MarkerSentBufToCardAndRunList(m_idMarker);
    //关闭飞行,如果不关闭,用E3_MarkEnt2标刻会按飞行标刻
    EzdKernel.E3_MarkerFlyEnableToList(m_idMarker, false);
    EzdKernel.E3_MarkerListEndToList(m_idMarker);
    //等待加工完成
    EzdKernel.E3_MarkerWaitForFinish(m_idMarker);

    //列表结束
    EzdKernel.E3_MarkerListEnd(m_idMarker);
});

使用距离和跳转语句配合使用

EzdKernel.E3_MarkerIfFlyXDistanceCondToList(m_idMarker, 30 + (i * 30) + 5);
        EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 50);//跳转到50,异常索引
···
···
···
//正常退出 跳索引为60 
    EzdKernel.E3_MarkeDirectJumpToIndexToList(m_idMarker, 60);

如果距离大于条件判断距离,就立马会跳到索引为50的地方,流程正常结束就直接跳转到60 的地方。

刚好这个星期用到了距离判断跳转,然后周末整理一下,加深印象

看一遍看不懂就多看几遍

最好的学习就是实操一遍

你品,你细品

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容