做Ethercat总线运动控制器过程中的一些记录

排版不是很好,还在持续更新中,欢迎讨论。。。
一,
问:
Ethercat是基于以太网的,为什么它的有效传输数据率比普通以太网高很多?

答:…这个我还在思考怎样把它描述得通俗易懂

二,
问:
标准linux操作系统是非实时的,如何改进linux系统的实时性能?

答:
提高linux系统实时性主要有两种方法。
一种是采用双内核结构,即在标准linux内核里嵌套一个微小、实时的内核,将其改造为具有双内核的异构系统。实时任务运行在微内核上,非实时任务则作为…典型的有Xenomai
另一种是对linux内核进行直接改造(其中代表有rt-preempt),其改造方法可分为两点
a.将大部分的自旋锁替换为支持优先级继承并且可抢占的互斥量(原理解释:自旋锁是一种非阻塞锁,也就是说如果某线程需要获取自旋锁,但该锁已经被其它线程所占用,则该线程不会被挂起,而是在不断地消耗CPU时间,不停地试图获取该锁。想想如果这种情况发生在单核处理器上,CPU利用率就变低了。 与之相反的是,互斥量是一种阻塞锁,当某线程无法获取互斥量时,该线程会被直接挂起因此该线程不会再消耗cpu时间,当其它线程释放互斥量之后,操作系统会激活那个被挂起的线程,让其投入运行)。
b.中断线程化,由于硬中断实时性太高,会影响实时线程的实时性,故将中断处理程序线程化并设置其优先级,使中断线程的优先级比实时线程的优先级低,从而提高系统的实时性


问:Igh Ethercat Master 是个啥,如何把它移植到linux系统?
答:它是一个基于linux操作系统的开元Ethercat主站软件。它主要由三大部分组成:
a.主站模块。它是一个linux内核模块,包含了一个或多个主站对象、一个设备接口(用于向下访问以太网设备)、和一个应用程序接口(提供给用户调用)

b.控制应用程序。他不是主站模块的一部分,需要用户来编写。它通过主站模块提供的API接口,与Ethercat从交换周期性的过程数据。控制应用程序可以是内核空间的一个模块(直接使用内核应用程序接口),也可以是用户空间的程序(通过Ethercat库访问应用程序接口)。控制应用程序到底是在内核层实现还是在应用层实现主要跟你的整个软件架构有关,这个要自己评估

c.兼容Ethercat的以太网设备驱动模块。为了提高Ethercat实时性能,不仅要改造linux内核,另外一个很关键的地方就是改造网络设备驱动程序。


问:如何改造网络设备驱动程序?
答:主要是从以下三个方面入手
a.对于所有Ethercat设备必须避免调用netif_*()函数,因为Ethercat设备不经过linux内核的网络协议栈,所以不能调用网络协议栈提供的这些函数接口
b.由于硬件中断时间发生上的不确定性,会导致抖动增加,不利于以太网设备驱动程序的实时性。所以在网络设备驱动程序中应避免使能中断和调用中断服务函数。其实Ethercat设备驱动是在轮训的方式下工作的,只不过这个轮训时间精度很高
c.主站在初始化的时候会分配一个固定的套接字缓冲区,在每次发送Ethercat数据之前,会先在这个缓冲区填充新的Ethercat数据帧,然后将它传递给hard_start_xmit()回调函数。在整个过程中不会创建新的socket buffer,因此网络设备驱动也不能像往常一样释放这个socket buffer。


做运动控制器过程中的的一些重难点:
普片性的:
a. 虽然大家的运动控制功能块指令都是基于Plc_open标准做的,但是各家在功能块的封装上都多多少少会有些差异,功能块指令哪些参数需要哪些参数不需要这个不仅要求做运动控制算法的工程师把握还要有现场应用经验的工程师进行一个协助。如果这个前期不考虑好的话,产品易用性就会很差

b.现在国内做ethercat伺服的公司也不少,但是他们做出来的产品也存在差异。一个具体的例子是当时我们在带多个厂家的ethercat伺服电机在跑,发现有一家电机(南京-埃斯顿)跑的情况跟我们预期不一样,后来跟他们的技术人员沟通过后发现,是由于运动控制器在读取电机速度值得时候,它们家的电机的速度反馈单位不一致。这个速度反馈单位有两种,一是脉冲/每秒,二是(0.1)转/没分。它们只有一个默认的转/分。跟其它家的都不一样,其他家这个单位反馈是可以选择的。后来我们的一个方案是不读速度了,因为在PDO配置的时候,位置(也就是6064)这个pdo对象是一定要有的。我们就通过位置除以周期获得速度。如果不考虑兼容性的话也可以不用这么做。

因项目而异的:
a.脉冲加总线的融合,底层如何区分哪个是脉冲轴,哪个是Ethercat总线轴。
b.有些伺服带编码器,有些不带编码器(大部分是带的),这个系统原点怎么统一,怎么确定

…待更新

你可能感兴趣的:(Ethercat总线运动控制器)