08.循环通讯

<< 点击显示目录 >>

主页  轴控开发使用手册 > 轴控应用 >

08.循环通讯

 

1. 版本信息

版本信息

修改内容

修改人

V1.00

创建

刘柏严

 

2.使用ncaction循环通讯

需要配置参数表,常见配置如下图:

clip0041

图中的配置包含了循环写1帧,和循环读2帧。

为了能够分别读到两帧数据,需要写ID234(CYCLIC_FRDRV_REC_INDEX):先将ID234写为0,等待数据返回(需要4个POWERLINK周期),然后读取数据;然后将ID234写为1,等待数据返回(需要4个POWERLINK周期),然后读取数据。通过这种方式写和读都需要4-5个POWERLINK周期。

读取数据的条件是检查pRdPowerlinkInf->cnt是否发生了改变

写数据的条件是pWrPowerlinkInf->cnt++。

例程代码如下:

if (pAcpPowerLink->fromDrvCnt != pRdPowerlinkInf->cnt)                                

   {

      cmdReadData[axisIndex] = ACTIVE;

   } /* if (pAcpPowerLink.FromDrvCnt != pRdPowerlinkInf.cnt) */

 

if (cmdReadData[axisIndex] == ACTIVE)

   {

      ..........................

      ..........................

      /* acknowledge read data /Begin */

      cmdReadData[axisIndex]  = INACTIVE;

      pAcpPowerLink->fromDrvCnt = pRdPowerlinkInf->cnt;        /* keep old counter in mind */

      /* force sending of write telegram */                        

      cmdWriteData[axisIndex] = ACTIVE;

   }

if (cmdWriteData[axisIndex] == ACTIVE)

  {

      *pRecordIndex++;

      pWrPowerlinkInf->cnt++;        /* indicate that new data are ready to send */

      cmdWriteData[axisIndex] = INACTIVE;

   }

 

如果只读一帧数据,那么可以不等待数据返回,不停的向下写,不停的读取数据,这时可以每个POWERLINK周期读取或写入数据,但这种方式需要修改程序。

代码删除读数据条件,每个周期都读取。代码修改如下:

cmdReadData[axisIndex] = ACTIVE;        /*always read data*/

 

if (cmdReadData[axisIndex] == ACTIVE)

   {

      ..........................

      ..........................

      /* acknowledge read data /Begin */

      cmdReadData[axisIndex]  = INACTIVE;

      pAcpPowerLink->fromDrvCnt = pRdPowerlinkInf->cnt;        /* keep old counter in mind */

      /* force sending of write telegram */                        

      cmdWriteData[axisIndex] = ACTIVE;

   }

if (cmdWriteData[axisIndex] == ACTIVE)

  {

      *pRecordIndex++;

      pWrPowerlinkInf->cnt++;        /* indicate that new data are ready to send */

      cmdWriteData[axisIndex] = INACTIVE;

   }

此时如果使用trace记录从powerlink网络上得到的pRdPowerlinkInf->cnt 和向下发送的pWrPowerlinkInf->cnt,可以发现它们之间相差4。

即:从我们向下写一个数据到再一次读到这个数据需要4个powerlink周期。

所以在读取多帧数据的时候,为了确保读到的数据可以正确的对应到相应数据帧的变量中,需要等待powerlink响应,这里就造成了延迟。

 

通常情况下如果不修改代码:

如果任务周期大于5倍powerlink周期,那么参数可以每个任务周期读到;

如果任务周期等于powerlink周期,那么需要5个任务周期读到;

因为通讯任务中考虑了多帧数据通讯,所以每次写好数据帧号后,检查到新数据过来才进行读取操作。

实轴和虚轴的monitor.s 及 monitor.v可以每个任务周期刷新,这两个数据是同步数据。如果需要,我们可以改变这两个参数连接的ID,设置成我们想要读取的参数。设置方法如下:

clip0042

实轴monitor.s 对应 ID787=0 , 实轴monitor.v 对应 ID787=1;

虚轴monitor.s 对应 ID787=2 , 虚轴monitor.v 对应 ID787=3。

 

如果设置后读取的数据与原数据类型不匹配,在程序中作类型转换即可。例如:

上个例子中monitor.s读位置,类型一致,monitor.v读时间,类型不一致。

        gActData.printUnit.sAct[axisIndex]  = (DINT)pAxDat->monitor.s;
        gActData.printUnit.tAct[axisIndex] = *((UDINT*)&pAxDat->monitor.v);

 

3.使用PLCOpen循环通讯

任务周期等于POWERLINK周期的时候,可以实现每个周期刷新数据,即使多帧数据也没有问题。只需要将循环读功能块中模式设为1(多帧数据时,每帧都读此数据)。

 

4.结论及附录

如果任务周期小于5倍POWERLINK周期,那么循环通讯的处理PLCOpen比较好。

如果使用ncaction那么可以通过改变实轴和虚轴的monitor.s及monitor.v的连接变量方式,每个任务周期得到所需要的变量。如果只读一帧数据,可以通过修改程序的方式达到每个周期读取或写入参数。如果是多帧数据,由于缺少文档,暂时没有可靠办法。