由于项目需要使用到了EL1258模块以及分布时钟DC的功能,网上相关资料demo较少,因此将自己学习过程以及收集到的资料分享如下,有可能有有误之处,希望指正。
目录
一、文件资料收集
1、官网英文说明书:主要的使用方法在第五章节,其中提供了一些demo
https://www.beckhoff.com.cn/zh-cn/products/i-o/ethercat-terminals/el1xxx-digital-input/el1258.html?
2、官网给的EL2258、1259的demo:
https://infosys.beckhoff.com/content/1033/el125x_el2258/Resources/2139514763/.zip
https://infosys.beckhoff.com/content/1033/el125x_el2258/Resources/4513278347/.zip
3、客服给的EL1259等的demo:
EtherCAT及E-bus模块: sample | 倍福虚拟学院
其中这个文件相对有用一些,如果是使用时间戳的输出,就可以参考这个。
二、EL1258的参数定义
下图对应着对于EL1258的一个I口开放了5个时间戳后产生的参数
具体的意义在说明书中有了说明:
三、我对EL1258使用的参数理解
1、NoOfInputEvents:采集时一个IO口设置了几个时间戳。
nNoOfInputEvents AT%I* : ARRAY[0..7] OF USINT;
2、InputState:从0变成1,若不使用时间戳,那这个就是最普通的IO口接收0-1变化的。
bInputState AT%I* : ARRAY[0..7] OF BOOL;
3、InputBufferOverflow:在CoE 0x80no:13中,有一个选项可以选择是否进一步到达输入的新事件是:
-不再存储在缓冲区中(默认),或者
-在删除旧事件时存储在缓冲区中
bInputBufferOverflow AT%I* : ARRAY[0..7] OF BOOL;
4、InputCycleCounter:没用用到,不清楚怎么用。
5、EventsInInputBuffer:没用用到,不清楚怎么用。
在每个EtherCAT周期中,尽可能多的事件被加载到缓冲区中。每个通道的事件数量可以通过EventsInInputBuffer读取。可存储的最大事件数为32。
6、InputOrderFeedback:指示终端是否接收并处理InputOrderCounter。
以下的对应如果打开了10个时间戳所对应的状态和时间戳值:
aInputEventState AT%I* : ARRAY[0..7] OF ARRAY[0..9] OF BOOL;
aInputEventTimes AT%I* : ARRAY[0..7] OF ARRAY[0..9] OF UDINT;
7、输出InputBufferReset:可以设置
bInputBufferReset AT%Q* : ARRAY[0..7] OF BOOL;//初始
8、输出InputOrderCounter:只有当计数器由控制器递增时,通道才会向现场总线输出一组新的事件。
nInputOrderCounter AT%Q* : ARRAY[0..7] OF USINT;
我使用的设置:
四、时间戳的转换
https://infosys.beckhoff.com/content/1033/el125x_el2258/Resources/1885941003/.zip
读取到的时间戳是一个32位的UDint低位,我们需要将其转换为64位,才可知道年月日的表达时间。此时便需要为其添加高位DC时钟,因此用到了上述提供的程序以及一些转化语句。
n64time1 : FB_HandleCyclic32bitDc_Basic;//想要转化成的64位时间
actDC : T_DCTIME64;//得到此时的DC时间
zwDC : T_DCTIME;//转换DC时间类型
zwtimestamp1 :T_DCTIME64;//输出时间戳1转换后的结果
actDC := F_GetActualDcTime64( );//获取系统DC时间
zwDC:= DCTIME64_TO_DCTIME(actDC); //转换成下面的要的格式
n64time1(nnCurrentDcTime64bit:=zwDC,
n32bitDcTime:= aInputEventTimes[0][0] , //获取32位时间戳
nn64bitDcTime=>,
bOutPutValid=> , bError=> , sError=> , nErrorCounter=> );
zwtimestamp1 := DCTIME_TO_DCTIME64( n64time1.nn64bitDcTime);//转化为64位时间戳
关于对倍福时间、分布时钟的理解见下一个文章【倍福】EtherCAT同步方式:分布时钟(DC)的理解与使用-CSDN博客