上期文章在讲到EAP与上位机通讯时,因本人疏忽,提到一个地方有误----本文就不再介绍控制器程序部分EAP的配置,其配置与本文IO的配置同理 。
下位机(控制器)EAP的配置有些许不同,需要设置AMS NetId或者MAC地址(针对Unicast(单播)),下面就对其进行介绍:
1.Publisher设置
基于有Ethercat驱动的网口上建立EAP device,并添加收发器(Subscriber和Publisher),然后对Publisher的Publish选项进行设置,在这分为广播(Broadcast),多播(Multicast)和单播(Unicast)三种应用模式:广播代表数据向所有的网络节点进行发送,多播则是数据向一个网络组(相当于一个局域网里的所有节点)进行发送,而单播就是只发送到指定的地址了。以本应用为例,在上位机程序上设置指定的控制器的AMS NetId(xx.1.1),注意后缀,本人就是后缀没注意导致多次调试不成功;同理,在路由为控制器的程序上设置上位机的AMS NetId。
2.Publisher网络变量添加
上篇文章讲的是BOOL变量的添加,比较简单,但是针对发送自定义结构体需要考虑结构体变量地址的一一对应,因此,对于结构体的添加,在此进行叙述:
先在TYPE SYSTEM处添加新项;
接着进行新类型的基本设置,选择为Struct类型并进行编辑
依照需求添加结构体内数据个数
然后就是涉及到字节对齐的单个数据的设置,若设置错误会导致下位机收到的数据字节错位,即数据乱码,需要依次按照下图操作步骤进行设置:
1.选择为单个变量或者是数组类型;
2.设置数据类型,INT,BOOL,DINT,LREAL等等,以及变量的描述:正常类型或者指针类型等等,在此我们设置为INT类型;
3.设置偏置和数据的所占位数,由于图中是结构体的第一个变量,因此偏置为0,而INT数据为两个字节,占16位,因此大小填16,同理下一个变量的偏移量Offset就应该是16bits,然后大小按照数据类型进行设置,按照这种方法依次设置所有变量的属性,即可完成结构体的创建。
PS:在本项目的上位机的C++程序,在收发ADS数据程序的初始化前,还需要加入预编译命令:#pragma pack(1),目的是为了设置结构体的边界对齐为1个字节,也就是所有数据在内存中是连续存储的,比如结构体内有CHAR和INT两个类型,默认的系统会进行优化,将其数据类型都统一为4个字节,这样就与我们下位机这边设置的字节数对不上,收到的数据会产生乱码,而有了该命令后,系统会按照1个字节进行对齐,按照原始的数据储存字节数连续排列,就没问题了!
3.Subscriber设置
Subscriber这边可以设置Any Publisher(如果只有一个发送器的话),但是如果网络中有多个发送器同时发送变量,而我们只需要其中一个节点的数据,那就需要设置NetID;又如果是网络组的变量的话,就需要进行设置下方Multicast的地址啦。
4.Subscriber网络变量添加
之后添加接收器的网络变量,有三种方式:
1.如果控制器处于运行模式,publisher的变量已经上传了,就可以通过Browse for Computer进行数据类型的导入;
2.或者也可以通过控制器的配置文件进行Browse for File导入;
3.最后就是人工建立新变量进行导入了,但是还是要注意publisher那边变量的类型和顺序哦。
最后来看一下通讯成功的结果吧:
Publisher中的一个结构体中其中一个变量成功传递给了Subscriber中对于结构体中的对应变量!