1. 版本信息
版本信息 |
修改内容 |
修改人 |
V1.00 |
创建 |
刘柏严 |
2.使用ncaction循环通讯
需要配置参数表,常见配置如下图:
图中的配置包含了循环写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,设置成我们想要读取的参数。设置方法如下:
实轴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的连接变量方式,每个任务周期得到所需要的变量。如果只读一帧数据,可以通过修改程序的方式达到每个周期读取或写入参数。如果是多帧数据,由于缺少文档,暂时没有可靠办法。