CCP之DAQ通信流程

CCP通信模式

CCP协议中MCD(主设备)与ECU(从设备)的通信可具体分为两种,一种polling模式,另外一种DAQ模式。

  • polling模式:
    ????通俗可以理解为一问一答模式,主设备先问,从设备回答,两者之间不断交互来实现主从设备的通信和数据交换,这种模式下,当主设备和从设备建立逻辑连接后,主设备与从设备的每一次通信都是从主设备发送一个命令请求开始的,请求从设备执行某项操作,或请求从设备的内部数据。从设备收到命令后,执行相应的操作,通过返回一帧消息,提供主设备请求的数据及命令执行情况代码,这种通信方式实现起来比较简单,占用ECU内存资源较少,但是效率很低。
  • DAQ模式:
    ??这个可以理解为一问多答模式,这种模式下,当主设备和从设备建立逻辑连接后,主设备首先发送一条DAQ请求,从设备收到命令后,按命令中的参数自行配置并组织上传数据,然后从设备可以脱离主设备的控制,按照一定周期向主设备自动上传数据。这种模式不需要主机通过命令逐步控制,所以工作效率比较高,实现比较复杂,如果需要上传的数据量比较大的时候,会占用大量的ECU的内存资源(RAM空间)。

DAQ数据通信

  • 在我们平时使用中,更多的会用到DAQ模式,所以就来谈谈DAQ模式下的数据通信。关于DAQ需要知道下面这些点:
  1. DAQ通信的实现需要借助DAQ列表、OTD列表以及DAQ~DTO;
  2. 按照不同的周期,ECU内部需要实现多个DAQ列表;
  3. DAQ列表个数是由上传周期决定的(比如:有三个信号,他们的上传周期分别为10ms,20ms,100ms,那么就需要3个DAQ);
  4. 同一周期的数据变量归在一个DAQ列表里面;
  5. 一个DAQ列表可包含多个ODT列表;
  6. 每个ODT最大元素数目为7,每个元素都是单字节,所以一个ODT最多能存放7个字节;
  7. ODT列表个数取决于相同周期下上传数据个数和长度(比如:有两个四字节的变量,那么2*4 = 8,8>7,所以至少要两个ODT列表);
  8. ODT列表存放的要上传变量的数据信息,包括变量的存放地址、数据长度以及偏移量;
  9. ODT列表需要转换为DAQ~DTO的形式才能向主设备发送;
  10. 每个ODT都有唯一的绝对编号来对应一个DAQ~DTO;
  11. 每个ODT都有一个相对编号来对应一个在DAQ列表中的位置;
  12. 一个DAQ列表中,总的ODT不能超过254。
  13. 同一个DAQ列表的不同ODT享有同一个事件通道和预分频值;
  14. 不同DAQ理论上有不同的事件通道和预分频值,但是预分频值的作用是将数据的上传周期成倍扩大,所以当两个DAQ上传周期成整数倍关系时,可以共用一个事件通道。
  • 下面就来举例理解这些上面这些概念
    场景:假如我们要依次上传五个数据,如下:
数据变量名字节数(byte)上传周期
byte0110ms
word1210ms
long2410ms
long3420ms
long4420ms
  1. 根据数据上传周期确定DAQ的个数:10ms、20ms两个周期,所以DAQ一共有2个;
  2. 根据数据个数和长度确定ODT的个数:总长度 = 1+2+(3*4) = 15,15/7 = 2…1,所以最少要3个ODT;
  3. 根据上传周期确定DAQ事件通道和预分频值:因为10和20成倍数关系所以可以用一个事件频道,10ms预分频值为1,20ms预分频值为2.
  4. 启动DAQ模式后,数据采集的过程如下图:

    CCP协议之DAQ模式下的数据通信

  5. 当启动数据采集后,ECU就按照所规定的的周期自行上传DAQ~ DTO消息。DAQ~ DTO消息的数据场由8字节构成,第一个字节就是PID,标识了这帧消息所对应的ODT,而后7字节即对应该ODT七个元素规定地址上的一个字节的数据内容,从而就完成数据内容的上传。

 

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中的polling是一种轮询机制,用于等待某个特定条件的满足。它可以在一定的时间间隔内反复检查条件,直到条件满足或超时。使用polling可以避免使用sleep进行等待,提高程序的效率。有几个常见的用法: 1. 等待文件存在:可以使用polling.poll函数等待文件存在,每隔一定时间检查文件是否存在,直到文件存在或超时。 示例代码: ``` file_handle = polling.poll( lambda: open('/tmp/myfile.txt'), ignore_exceptions=(IOError,), timeout=3, step=0.1 ) ``` 2. 轮询selenium webdriver元素:可以使用polling.poll函数等待元素在selenium webdriver中可见,每隔一定时间检查元素是否可见,直到元素可见或超时。 示例代码: ``` search_box = polling.poll( lambda: driver.find_element_by_id('search'), step=0.5, timeout=7 ) ``` 3. 使用自定义条件回调函数:可以使用polling.poll函数根据自定义的回调函数来检查条件是否满足,每隔一定时间执行回调函数,直到条件满足或超时。 示例代码: ``` def is_correct_response(response): return response == 'success' polling.poll( lambda: requests.put('http://mysite.com/api/user', data={'username': 'Jill'}), check_success=is_correct_response, step=1, timeout=10 ) ``` 这些是polling的一些常见用法,它可以帮助我们在需要等待某个条件满足的情况下编写更高效的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python polling轮询函数](https://blog.csdn.net/rhx_qiuzhi/article/details/124740460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值