CAN模塊的自動代碼生成(Python實現)(1)介紹


CAN模塊的自動代碼生成(Python實現)(1)介紹

概述

2016.07.23

當前新能源汽車形勢大好,商用車更是不得了,很多N年沒出貨的主機廠都復活了,恨不得明年的市場都圈過來。作為ECU供應商,面對各種恨不得剛簽完合同就拿到貨的要求,如在保證質量的前提下,盡快完成項目,服務好這么多衣食父母,就成了一個主要問題。

一個軟件開發團隊,特別是沒錢的團隊,代碼全靠手寫。想想當前人家牛X的公司,各種高大上的工具完全沒有;就算頂着壓力買來了,也不一定用得好,還不如自己造能用的小車,總比走路快點。

找來找去,對於一個穩定的ECU,控制策略基本定型,最大的不同就是控制器對外接口了。寫這些代碼都是體力勞動,基本沒啥技術含量,而且還需要一顆細致的心。我總是想,再看幾年這些控制器管腳配置和CAN協議信號,眼花年齡肯定提前。就算不為提高效率,也要為自己的眼睛好好考慮考慮。

需求

跟着當看着很好,但是沒錢買的工具學:做配置,寫代碼的工作交給工具。看起來要做的就是寫一個軟件,它的功能就是根據配置生成C代碼了。

首先就是要看看工具的需求了。當前的情況如下:

  • 有專門的基礎軟件完成控制器硬件的配置、任務調度和基本服務什么的。這些功能都有相應的接口,使用時只要調用就行了。比如CAN通訊模塊:
// 波特率設置 node 0, 250K
CAN_SetBaudrate(NODE0, BAUDRATE_250K);
// ID 0x18FFF1A0, node 0, 100ms, 接收報文
CAN_InitMessageFrame(0x18FFF1A0, NODE0, PRD_100ms, RECIEVED)
  • CAN信號的打包與解包還是要根據協議手動完成
CAN_Unpack_0x18FFF1A0()
{
  uint32_T tmp = 0;
  
  // Bat.BusCurr  startbit: 0, length: 16, factor: 0.1A/bit, offset: -3200A
  tmp = data[0];
  tmp += data[1] >> 8;
  Bat.BusCurr = (float)tmp * 0.1 - 3200;
}
  • 控制策略已與硬件隔離,不受控制器硬件或是管腳與CAN協議變化的制約。
  • 控制器管腳通過一個映射函數,與控制策略需要的信號聯系起來
// key start信號接控制器32腳
Body.KeyStart = PIN32_DIH;

看來工具的任務,就是完成上面的三段代碼,到時候只要點點鼠標就行了。

工具的輸出是C語言的代碼,那輸入呢,可以分三部分:

  1. CAN協議,可以用DBC
  2. 控制器接口定義
  3. 控制策略需要的信號

實現方案

基本需求確定了,就要開始干活了。

先找找我要的東西有沒有現成的,沒找到(要是找到了,就不寫這個東西了)

再看看有沒有什么模塊是已有的。

嗯,找到個跟DBC有關的項目:CanMatrix,感謝作者Eduard

別的再找不到了,那就只能自己搞了。

野路子編程,只要能實現功能就行,一個模塊一個模塊搭起來。

PS: 已半夜,明天起來繼續寫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM