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