前言:本站为你精心整理了VxWorks高速通信的具体实现范文,希望能为你的创作提供参考价值,我们的客服老师可以帮助你提供个性化的参考范文,欢迎咨询。
基本概述
为保证工件台上步进电机在运动过程中速度和加速度没有突变,减小冲击,提高步进电机运动的稳定性,本文采用两种常用的测试曲线——S-曲线和正弦曲线来测试工件台步进电机加减速控制[3]。正弦以及S-曲线的生成参数需通过上位机传给下位机进而传递给运动控制卡,而数据采集卡通过激光干涉仪采集的数据也要通过下位机传递给上位机。下位机内嵌的vxworks是嵌入式实时操作系统,Windows是一般用户操作系统,要实现两者之间的高速、高可靠性网络通信,一方面需要有好的硬件条件作保证,另一方面需要制定良好的通信规则。为了达到以上目的,本论文首先讨论了如何制定通信协议,再进一步讨论如何加强传输的稳定性。下位机VxWorks中采用了辅助时钟中断,实现了在0.2ms周期内完成一次数据采集,并将数据封装,使其符合上下位机同一的通信规则,发送给上位机。
1通信规则的制定
VxWorks支持流式套接字(streamsocket)、数据报套接字(datagramsocket)和zbuf套接字[4]。为了保证可靠性,与上位机通信时使用的是流式套接字,针对于TCP/IP协议。为了使通信双方可以互相理解对方传递过来的字符串,必须实现建立通信协议。规定特定位置上字符所表示的含义,以保证下传命令和返回信息能够得到正确的接收和解释。通信过程中存在数据和命令的传送,但都是用同一个通信规则。通信的具体规则如下帧头:标志着一帧数据的到来,作为判断标志,由此开始接收一帧数据。可以消除干扰,消除乱码,保证传输数据的准确性。帧类型:一个8位数据,范围为:00-FF,用来区分数据和指令的标志。规定:若此位为01,则表示传递的为数据;若此为为02-FF之间的任一个数,则表示传递的为指令,不同的数字表示不同的指令。这样,就可以通过这一位判断出传递的信息类型。帧数据的长度:分两种情况:(1)若传递的为数据,则此位为要传递的数据的长度加1(其中1代表帧类型传递时也要占用1位);(2)若传递的为指令,如果指令中不包含数据,则此位为1,若指令中包含数据,则此位为数据的长度加1。数据:要传递的数据。要注意在传递过程中,要以字符的形式进行发送。帧尾:表示一帧数据的结束,作为判断标志。由于下位机为嵌入式CPU板,资源比较紧张,为保证高速、可靠地传输,这里把上位机为服务器端,减少网络通信对于下位机资源的占有量。
2通信方案的实现
2.1下位机的数据接收上位机向下位机发送的不仅有数据,还有各种各样的命令。由前面的通信协议可以看出,通过帧类型可以进行区分然后由下位机进行相应的处理。具体各任务执行流程为:首先系统进行网络、变量和激光干涉仪以及板卡的初始化,启动根任务,生成(taskSpawn)网络接收任务(tNetRecv)、网络监视任务(tNetCheckLink),优先级前者大于后者,下位机一直等待接收数据,当接收到命令写入缓冲队列[5]后,根据表3-1,表3-2,表3-3提供的通信协议来解析接收到信息的具体类型,将解析后参数以消息队列方式传送给数据表生成任务(tDataCreat)调用正弦、S-曲线函数生成数据表,同时启动辅助时钟调用数据处理函数rdisrl,即发送数据给上位机和各个运动控制卡。同时在整个流程中都有网络监视任务运行,当接收、发送或者硬件出现强制结束等信号时都会强制执行关闭套接字(close),释放(free)缓冲队列等操作使整个流程强制结束,以达到预防突发事件的目的。
2.2下位机数据发送下位机得到上位机的曲线生成命令生成的S-曲线、正弦曲线数据表以及从各运动控制卡、数据采集卡上读取的数据都要传递给上位机。与接收不同,下位机向上位机发送的主要是数据。可以把不同板卡上的数据,以及求出的S-曲线、正弦曲线的数据绑定在一起进行发送。通过该结构体绑定将数据发送给上位机,上位机按位接收,逐个处理。另外,本课题要求以0.2ms为周期发送一次数据,从高实时、高精度角度考虑,可以利用另外一种获得更高分辨率时钟的机制——辅助时钟[6],它可以启动一个与系统时钟不同的硬件定时器,挂接用户自己的中断处理函数,获得更高的时钟精度。
2.3上位机数据的接收在TServerSocket组件的OnRead事件中调用ReceiveBuf()函数,此函数的原型如下:int__fastcallReceiveBuf(void*Buf,intBufSize,intFlags=0);此函数共有三个参数:第一个是要将数存入的数组,第二个是要读取的字节数,第三个一般省略。函数返回实际读取到的字节数。当读取到数据后经过进一步的处理将下位机发过来的数据最后解析完成后存入MsgList容器中。数据保存:实际上在基类中已经将收到的原始消息保存。为了能更清楚的看到解析完成后的数据,可以在应用程序中创建txt文件对数据进行保存。步骤如下:首先将数据取出保存到intDataFromBoard[4];//板卡上的数据;unsignedcharSin[4],SCurve[4];//sin()和SCurve()四个数组。其次,定义文件指针fp,通过fopen()创建文件并打开,然后即可将读取的数据保存。曲线显示:这里主要利用TChart组件,首先将解析完成的消息取出,保存的各自的数组中,然后调用DrawCurve(TChart*ChartMid,doubleX,floatY,doubleWindowWidth)函数在TChart组件中进行显示,基本流程图如下:
2.4上位机数据的发送利用TBaseSocket中的方法int__fastcallSendBuf(void*Buf,intBufSize,intFlags=0);此函数共有三个参数:第一个是要将数发送到的数组,第二个是要发送的字节数,第三个一般省略。函数返回实际发送的字节数,当数据发出后再由下位机接收解析。
实验结果
上位机发送的曲线参数分别为:正弦曲线:预定的正弦参数为频率20Hz,初始相角为0,幅值为10.5;S-曲线:最大加速度:0.8m/s^2,最大加速度比为2,行程为30.0(参数精度可达到18~19为有效数字)。下位机接收到参数后生成数据表然后发给上位机,然后上位机采用MATLAB仿真得出实际输出曲线和仿真输出曲线。如下图所示:正弦曲线采样5000个点,每0.2ms发送一次;S-曲线采样28648个点,每0.2ms发送一次。由仿真图可看出:实际输出与仿真结果完全吻合、数据无丢失。
结束语
通过本论文的阐述,得到了一种保证数据传输准确高速的通信规则,体现VxWorks所具有的实时性和灵活的任务间通信等优点,为接下来本课题中工件台做正弦、S-曲线和精确定位运动提供了保证,具有很高的工程实践意义。
作者:王公峰徐仁新李聪李星陈兴林单位:哈尔滨工业大学控制科学与工程系华北电力大学(北京)控制与计算机工程学院