服务与案例 Service 当前位置: 首页 > 服务与案例 > 应用案例 >
固定电话:028-68743610
客服手机:13730631678
客服QQ  :
 
联系地址:四川省成都市成华区双林横路12号
CAN自定义高速标定协议
2015-01-08 14:46:46
  在标定系统中,很多用户使用的了标准的CCP协议。其好处是协议比较通用,市面上有成熟的CCP标定工具。缺点是其数据传输效率并不高,特别在数据监测功能上,资源浪费地很多。为了更大的利用CAN的传输能力,须要对其协议进行改进。
 为了便于大于8字节数据的传输,我们将CCP协议与ISO15765-2传输协议相结合。以ISO15765-2作为网络传输层,以传输作为应用层的CCP命令。但是,我们修改ISO15765-2以适应更大的数据量,同时并不照搬CCP协议命令,仅仅借鉴其思想。
ISO15765-2协议的修改包括如下内容:
1.取消FC帧,以缩短数据传输间隔,加快数据传输。
2.增加“心跳”帧。在复帧传输中,接收方必须以100毫秒为周期,发送“心跳”帧,以让发送方确认接收方正确存在。
3.对FF帧增加两字节作为复帧数据长度,加上原协议的12比特,这样总共就有28比特能够表示数据长度,这个数据长度对标定系统是足够了的。
4.增加复帧传输取消帧MC,以方便复帧接收方主动要求取消复帧传输。
5.增加一个从设备的CAN ID,单独作为监测功能使用的ID。
对CCP协议修改如下:
1.保留普通命令的一问一答方式,但不用计数器同步,改为ISO15765-2对命令应答的方式同步。
2.对监测功能,不用问答形式,在开始命令下达后,由设备反复主动传输数据,不要需要请求命令。直到收到结束命令方才停止。
3.修改其命令格式ISO15765-3方式。但对应答需要命令的比特或0x40,改为比特或0x80,以增加可用命令数,方便之后功能 的扩展。
4.不使用CCP命令的参数形式,而是自定义。
  网络层传输流程如下:
\
\
 应用层流程如下:

\

\
\
  对该协议具体代码实现,分为三部分:1.上位机程序;2.设备程序;3.CAN通信接口设备。
  上位机程序,一般就是桌面电脑程序。用户可以选择的发开工具很多,一般最好选用C++、C#、JAVA等面向对象的编程语言比较好。
  设备程序,一般就是ECU程序,可选的实现语言一般只有C语言。用C语言实现该协议,用户最好用分层的思想方式开发,而且建议使用面向对象语言常用的状态模式来处理,尽量不要使用switch语句之类的方式来做主架构(这需要一定的编程功底),这样以方便程序维护。
  对CAN通信接口设备,可以采用CANslinkal、CANupoks或者CANdirect任意一种。它们全都支持通过电脑的USB接口收发CAN数据的,即所谓的USB转CAN功能。而且功能调用库是完全一样的,可以通用。 网络连接如下:
 \


 为了增加数据的传输速度,除了对CAN通信波特率做合适的设定外,每帧CAN数据的传输间隔也必须尽量很短。特别在做复帧传输时,如果数据量很大,过长的时间间隔将会给用户带来反应迟缓的印象。
  传输连续两个CAN帧,有两种方式,一种是连续传输,也就是当确认第一个CAN帧已经发出去后,马上再发送第二个CAN帧。另一种是定时传输,也即固定周期,比如每5毫秒传输一个。
  第一种方式的数据延迟比较大。因为CAN数据从电脑通过USB,再经过USB转CAN设备发送到CAN总线上后,又需要通过USB回传给电脑一个数据已经发送的信息,这期间就有不小的传输延迟。
  第二种式,可以将周期尽量缩短,一般而言,五毫秒的间隔是可以实现此目的。如果要更短,比如一毫秒,就需要考量一下了,因为一毫秒的间隔,并不能保证先从USB传来的数据会先被发送到CAN总线上。这就存在一个问题,就是并不知道前一帧已经传输出去话,马上就发后一帧数据,可能导致后一帧先发出去(CAN控制器一般都有多个并行发送管道,如果多个管道都放有数据,它的传输先后顺序是按一定规则来的,这种机制并不能保证先放的数据先发,后放的数据后发)。这样就会让通信错乱的。
  为了解决这个问题,CANslinkal/CANupoks/CANdirect为此提供了一套机制,用户可以设置某个CAN ID为先进先出的发送方式,以保证先放的数据先发送到CAN总线上,后放的数据后发送到CAN总线上。这是在硬件层上处理的,这样用户就可以按极短的周期发送数据,不用管其是否会顺序颠倒了。其实其内部实现也是在确认前一帧发送后,才会把下一帧放到发送管道中发送,但其处理是在USB转CAN设备的硬件层中,而不是在电脑的上位机,这就省去了USB数据传输确认这一过程,所以具有极高的传输效率。