




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Can.cpp模塊設(shè)計說明1 .總則:傳送故障記錄數(shù)據(jù)或運行記錄數(shù)據(jù)時,不傳送參數(shù)數(shù)據(jù)和實時數(shù)據(jù)。傳送參數(shù)數(shù)據(jù)和實時數(shù)據(jù)可同時傳送。在界面層:1 .讀故障記錄數(shù)據(jù)BUTTON和運行記錄數(shù)據(jù)BUTTON和記錄實時數(shù)據(jù)BUTTON沒有按下,參數(shù)沒有操作時,才能按下讀故障記錄數(shù)據(jù)BUTTON或運行記錄數(shù)據(jù)BUTTON。否則彈出信息框。2 .按下故障記錄數(shù)據(jù)BUTTON后,把運行記錄數(shù)據(jù)BUTTON和記錄實時數(shù)據(jù)BUTTON變灰,參數(shù)MENU和參數(shù)界面上的讀和修改BUTTON變灰,故障記錄數(shù)據(jù)讀完后,上述按鈕復(fù)原。對按下運行記錄數(shù)據(jù)BUTTON作同樣處理。3 .按下記錄實時數(shù)據(jù)BUTTON時,把故障記
2、錄數(shù)據(jù)BUTTON和運行記錄數(shù)據(jù)BUTTON變灰。按下停止記錄實時數(shù)據(jù)BUTTON時,把故障記錄數(shù)據(jù)BUTTON和運行記錄數(shù)據(jù)BUTTON復(fù)原。4 .對參數(shù)上載和修改時,把故障記錄數(shù)據(jù)BUTTON和運行記錄數(shù)據(jù)BUTTON變灰,完成操作后把故障記錄數(shù)據(jù)BUTTON和運行記錄數(shù)據(jù)BUTTON復(fù)原。CAN和以太網(wǎng)類似,相應(yīng)7種事件:關(guān)閉CAN、實時數(shù)據(jù)請求、讀參數(shù)、寫參數(shù)、發(fā)送心跳報文,讀故障記錄,讀運行記錄。2功能模塊類名為:ClassCan類對象定義在Can.cpp中,是一個全局對象。ClassLang_Can;該模塊的功能為:1 .通過USB轉(zhuǎn)CAN與下位機(jī)進(jìn)行實時數(shù)據(jù)請求和參數(shù)的上傳下載,
3、讀故障記錄,讀運行記錄;2 .通過PCI插卡與下位機(jī)進(jìn)行實時數(shù)據(jù)請求和參數(shù)的上傳下載,讀故障記錄,讀運行記錄;3 .出錯處理。3流程邏輯CAN部分由線程CanThread(證成5個事件。OpenCan(DWORDDevType,DWORDDevIndex,DWORDReserved)函數(shù)通過調(diào)用API函數(shù)VCI_OpenDevice(DWORDDevType,DWORDDevIndex,DWORDReserved)打開CAN;CloseCan(DWORDDevType,DWORDDevIndex)函數(shù)通過調(diào)用API函數(shù)VCI_CloseDevice(DWORDDevType,DWORDDevI
4、ndex)關(guān)閉CAN;StartCanThread()函數(shù)用于開啟Can線程;SuspendedCanThread()函數(shù)用于關(guān)閉線程;CanThread()為Can線程函數(shù),用于執(zhí)行五種事件:關(guān)閉Can、發(fā)送實時數(shù)據(jù)請求、讀參數(shù)、寫參數(shù)和發(fā)送心跳報文。SendCanPacket(intiEvent,intIndex=0,intSubIndex=0,*Data=NULL)為CAN發(fā)送報文函數(shù),iEvent為事件值,Index、SubIndex、Data用于參數(shù)的讀寫事件。根據(jù)不同的事件,發(fā)送相應(yīng)的報文。RecvCanPacket()JudgeOvertime();以上函數(shù)形參封裝在以下的數(shù)據(jù)結(jié)
5、構(gòu)中:typedefstruct_CAN_DEVICE_PARM_DWORDdwDevType;設(shè)備類型號DWORDdwDevIndex;設(shè)備索引號DWORDdwReserved;保留DWORDdwCANIndex;Can第幾路DWORDdwChecCode;/驗收碼DWORDdwMask;/屏蔽碼DWORDm_dwMode;/模式intiTimer0;/定時器intiTimer1;/定時器intiFilterType;/濾波方式CAN_DEVICE_PARM;typedefstruct_VCI_CAN_OBJUINTuiID;UINTuiTimeStamp;BYTEbyTimeFlag;BY
6、TEbySendType;BYTEbyRemoteFlag;/是否是遠(yuǎn)程幀BYTEbyExternFlag;/是否是擴(kuò)展幀BYTEbyDataNbytes;BYTEbyDataBuf8;BYTEbyReserved3;VCI_CAN_OBJ,*PVCI_CAN_OBJ;成員uiID:報文ID;uiTimeStamp:接收到信息幀的時間標(biāo)識,從CAN控制器初始化開始計時;byTimeFlag:是否使用時間標(biāo)識,為1時uiTimeStamp有效,byTimeFlag和uiTimeStamp只在此幀為接收幀時有意義;bySendType:發(fā)送幀類型,0為正常發(fā)送,1為單次發(fā)送,2為自發(fā)自收,3為單次
7、自發(fā)自收只在此幀為發(fā)送幀時有意義;byRemoteFlag:是否為遠(yuǎn)程幀;byExternFlag:是否為擴(kuò)展幀;byDataNbytes:數(shù)據(jù)長度(=8),即Data的長度;byDataBuf:報文的數(shù)據(jù);byReserved:系統(tǒng)保留。typedefstruct_VCI_INIT_CONFIGDWORDdwAccCode;DWORDdwAccMask;DWORDdwReserved;UCHARucFilter;UCHARucTiming。;UCHARucTiming1;UCHARucMode;VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;成員:dwAccCode:驗收
8、碼;dwAccMask:屏蔽碼;dwReserved:系統(tǒng)保留;ucFilter:濾波方式,1為單波方式,0為雙波方式;ucTiming0:定時器0;ucTimingl:定時器1;ucMode:模式。0為正常模式,1為只聽模式在Datalayer.cpp中添加成員變量:BYTEm_byCANRealTimeBuffer;BYTEm_byCANParmBuffer口;添加成員函數(shù):intGetDataFromCANPacket();對CAN接收到的數(shù)據(jù)進(jìn)行解析分類,將數(shù)據(jù)存于他對應(yīng)的地方。CAN從界面層到通訊層的整體流程圖:返回失敗SendCanPacket()流程圖:SendCanPacket
9、()/判斷iEventCANThread()流程圖:發(fā)送實時數(shù)據(jù)請求報文接收實時數(shù)據(jù)報文While判斷是否委生其他事件并且是否為一”;組數(shù)據(jù)的最后一幀.通過返回值判斷是否超時重發(fā)請求1)如收到的是心跳報文;則丟掉IDDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x7020x01State00000002)如收到的是中止SDO請求報文(最后4個字節(jié)是16進(jìn)制中止代碼之一06010000,其功能描述是對象不支持訪問”)CANIDDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte7DL0x5820x080x80IndexSub-
10、index00000106則上位機(jī)通知參數(shù)設(shè)定界面,參數(shù)設(shè)定界面彈出對話框告知參數(shù)INDEX或SUBINDEX出錯。上位機(jī)停止上傳/下載系統(tǒng)參數(shù)。4實時數(shù)據(jù)和參數(shù)通信過程(供參考)4.1 數(shù)據(jù)結(jié)構(gòu):在InternalDef.h中增加#defineLIMIT_CAN_RECV_ONE_PACKET_TIMEOUT_MS200#definePACKET_TIMEOUT2在PdasConfig中增加Intm_iCanRecvOnePacketTimeoutMs;在PdasCong.cpp中m_iCanRecvOnePacketTimeoutMs=LIMIT_CAN_RECV_ONE_PACKET_T
11、IMEOUT_MS在DataLayer.h中增力口intm_iCanRealTimeDataNbytes;/UDP收到的數(shù)據(jù)長度BYTEm_byCanRealTimeData500;在Can.h中增加BYTEm_byRealTimeData128Intm_iIndexOfRealTimeData;BOOLm_bFirstRealTimeBlock4.2 程序偽代碼:1 .初始化m_byRealTimeData口為全0,且m_byRealTimeData00=0xff;m_bFirstRealTimeBlock=TRUE2 .在應(yīng)該發(fā)送的時刻調(diào)用SendNmi(0x01)函數(shù)然后調(diào)用VCI_Tr
12、asmit()3.BOOLbShouldSave=FALSE;While(TRUE)If(ShouldSendParmPacket(.)/W上載參數(shù)報文或修改參數(shù)報文要發(fā)送OrganizeParmPacket(.)/組織發(fā)送VCI_Transmit(.)iNbytes=VCI_Receive(.),超時時間用變量g_PdasConfig.CanRecvOnePacketTimeoutMs;iState=ProcessPossibleTimeOut(.)/返回PACKET_TIMEOUT或DEVICE_FAULTIf(iState=PACKET_TIMEOUT)Continue;Elseif(i
13、State=DEVICE_FAULT)g_DataLayer.iDeviceStateDEVICE_CAN=DEVICE_FAULTBreak;iPacketType=JudgeReceivedPacketType(.)If(iPacketType=REAL_TIME_DATA|=LAST_REAL_TIME_DATA)/收至U實時數(shù)據(jù)報文根據(jù)ID,DL,Byte放入相應(yīng)m_byRealTimeData?口Elseif(iPacketType=UPLOAD_PARM)ProcessUpLoadParm(.)/參數(shù)報文處理Elseif(iPacketType=MODITY_PARM)Proces
14、sModityParm(.)參數(shù)報文處理If(iPacketType=LAST_REAL_TIME_DATA)/(0x484,0x08,0x0B)收到If(m_iReadRecordStage=BEGIN)break/退出循環(huán),去讀故障記錄數(shù)據(jù)If(m_bFirstRealTimeBlock=TRUE)If(12個報文全收到)m_bFirstRealTimeBlock=FALSEbShouldSave=TRUEElsebShouldSave=TRUEIf(bShouldSave)bShouldSave=FALSE;g_DataLayer.PutRealTimeData(m_byRealTime
15、Data,iErrorCode,DEVICE_CAN);)/endofWhile()5傳送故障記錄數(shù)據(jù)或運行記錄數(shù)據(jù)過程(供參考)5.1 數(shù)據(jù)結(jié)構(gòu):InternalDef.h中增加# defineNON_RECORD0# defineFAULT_RECORD1# defineNORMAL_RECORD2#defineBEGIN_RECORD1.#defineCOMPLETE_RECORDxx0x20000x3000(0x3000-1)(0x4000-1)#defineFIRST_INDEX_OF_FAULT_RECORD#defineFIRST_INDEX_OF_NORMAL_RECORD#d
16、efineLAST_INDEX_OF_FAULT_RECORD#defineLAST_INDEX_OF_NORMAL_RECORD/現(xiàn)由周提供PdasConfig.h中增力口Intm_iFirstIndexOfFaultRecordIntm_iFirstIndexOfNormalRecordIntm_iLastIndexOfFaultRecordIntm_iLastIndexOfNormalRecordPdasConfig.cpp中增力口對它們賦初值Can類中增力口Intm_iRecvRecordTypeIntm_iRecvRecordStageBYTEm_byRecordData128Int
17、m_iIndexOfRecordData;Intm_iSubIndexOfRecordDataIntm_iBlockSizeOfRecordDataDalaLayer中增力口RecvFaultRecord(.)RecvNormalRecord(.)5.2 偽代碼1.對故障記錄數(shù)據(jù),界面調(diào)用g_DataLayer.RecvFaultRecord().g_DataLayer.RecvFaultRecord()勺工作:- 設(shè)置變量Can.m_iRecvRecordStage=BEGIN還是設(shè)置事件m_EventRecvRecord?M論- 設(shè)置Can.m_iRecvRecordType=FAULT_
18、RECORD對故障記錄數(shù)據(jù),界面調(diào)用g_DataLayer.RecvNormalRecord().g_DataLayer.RecvNormalRecord()勺工作:- 設(shè)置變量Can.m_iRecvRecordStage=BEGIN_RECORD還是設(shè)置事件m_EventRecvRecord?M論-設(shè)置Can.m_iRecvRecordType=NORMAL_RECOED初始化m_byRecordData128為0和m_byReacordData00為0xFF。2 .CanThread的代碼在適當(dāng)時刻檢查一系列變量(事件?),當(dāng)檢查到m_iRecvRecordStage=BEGIN_RECO
19、RD時,做:OpenRecordFile()/偽代碼后面提供- 設(shè)置m_iRecvRecordType=NORMAL_RECOED初始化m_byRecordData128為0和m_byReacordData00為0xFF。- 設(shè)置m_iReadRecordStage=SEND_SDO1- 設(shè)置If(m_iReadRecordType=FAULT_RECORD)m_iIndexOfRecordData=g_PdasConfig.m_iFirstIndexOfFaultRecordElse(m_iReadRecordType=NORMAL_RECORD)m_iIndexOfRecordData=g
20、_PdasConfig.m_iFirstIndexOfNormalRecord- 設(shè)置m_iSubIndexOfRecordData=0;m_iBlockSizeOfRecordData=128- 調(diào)用SendNmi(0x80)函數(shù)該函數(shù)組織報文(00,02,80,02,00,00,00,00,00,00然后調(diào)用VCI_Trasmit()3 .調(diào)用SendSdo1()函數(shù)SDO1IDDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte7DL0x6020x080xA4m_iIndexm_iSubIndexm_iBlockSize000然后調(diào)用VCI_Transmit
21、()-設(shè)置m_iReadRecordStage=RECV_SDO24 .CanThread等待接收報文Sdo2調(diào)用VCI_Receive(),超時時間用變量g_PdasConfig.CanRecvOnePacketTimeoutMsiState=ProcessPossibleTimeOut(.)返回PACKET_TIMEOUT或DEVICE_FAULTIf(iState=PACKET_TIMEOUT)超時處理?Elseif(iState=DEVICE_FAULT)g_DataLayer.iDeviceStateDEVICE_CAN=DEVICE_FAULT故障處理?-如果準(zhǔn)確,即收到的是SDO
22、2IDniDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x5820x080xC6IndexSub-indexsize000000調(diào)用SendSdo3()函數(shù)SDO3IDDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte7DL0x6020x080xA3000000然后調(diào)用VCI_Transm4()發(fā)送設(shè)置m_iReadRecordStage=RECV_DATA5 .接收報文調(diào)用VCI_Receive(),超時時間用變量g_PdasConfig.CanRecvOnePacketTimeoutMsiState=ProcessPo
23、ssibleTimeOut(.)返回PACKET_TIMEOUT或DEVICE_FAULTIf(iState=PACKET_TIMEOUT)超時處理?Elseif(iState=DEVICE_FAULT)g_DataLayer.iDeviceStateDEVICE_CAN=DEVICE_FAULT故障處理?-如果準(zhǔn)確,即收到的是SDOIDDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte7Bit7Bit6-010x5820x0800xxxxxxxxxxxxxx20x5820x0801xxxxxxxxxxxxxx30x5820x0802xxxxxxxxxxxxxx
24、N-10x5820x080N-1xxxxxxxxxxxxxxN0x5820x081Nxxxxxxxxxxxxxx根據(jù)ID,DL,Byte0的Bit6-0位把Byte0到Byte7放入m_byRecordData.If(Byte0的Bit7為1)m_iReadRecordStage=SEND_SDO4iLastBlockNo=Byte0的Bit6-0的值否則繼續(xù)56 .調(diào)用SendSdo4()函數(shù)該函數(shù)組織報文SDO4IDDLByte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x6020x080xA21blksize00000然后調(diào)用VCI_Transmit()-設(shè)
25、置m_iReadRecordStage=RECV_SDO57 CanThread等待接收報文Sdo5調(diào)用VCI_Receive(),超時時間用變量g_PdasConfig.CanRecvOnePacketTimeoutMsiState=ProcessPossibleTimeOut(.)/返回PACKET_TIMEOUT或DEVICE_FAULTIf(iState=PACKET_TIMEOUT)超時處理?Elseif(iState=DEVICE_FAULT)g_DataLayer.iDeviceStateDEVICE_CAN=DEVICE_FAULT故障處理?-如果準(zhǔn)確,即收到的是SDO5IDD
26、IDLByteOBytelByte2Byte3Byte4Byte5Byte6Byte70x5820x08byPacketCmdbyPacketCrc00000注:byPacketcmd=(0x06<<5)|(7-size%7)<<2)|0x01),其中size表示所要上傳的數(shù)據(jù)數(shù)量(字節(jié)數(shù))。byPacketCrc為整個數(shù)據(jù)的CRC校驗。/PC計算cmd和CRC(使用變量byMyCmd,byMyCrc)byMyCmd=CalCmd(&m_byRecordData,iLastBlockNo);byMyCrc=CalCrc(&m_byRecordData口口,iLastBlockNo);If(byMyCmd=byPacketCmd&&byMyCrc=byPacketCrc)貝Ufile.write(m_byRecordBuf,limit_block_nbytes)+m_iSubIndexOfRecordData;If(m_iSubIndexOfRecord=0)m_iIndexOfRecordData+;)設(shè)置m_iRecvRecordStage=REC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 溫室施工方案
- 現(xiàn)場實行豬舍施工方案
- 明渠導(dǎo)流施工方案
- 機(jī)場塔臺結(jié)構(gòu)施工方案
- 斜槽帆布更換施工方案
- 2025年度特色輔導(dǎo)班家長責(zé)任協(xié)議
- 二零二五年度歷年合同法司考備考資料定制合同
- 2025年度車輛抵押消費貸款合同范本
- 2025年度租賃合同解除與合同解除解除爭議訴訟起訴狀
- 二零二五年度農(nóng)家樂房屋租賃與鄉(xiāng)村旅游生態(tài)保護(hù)合同
- 港珠澳大橋及背后的故事中國建造課程組30課件講解
- 2025年吉林長白朝鮮族自治縣事業(yè)單位招聘16人歷年高頻重點提升(共500題)附帶答案詳解
- 初中歷史七年級上冊第8課 百家爭鳴
- 中國教育史課件
- 第18課排序計算有方法(教案)四年級全一冊信息技術(shù)人教版
- 規(guī)?;i場生物安全
- 2025年春節(jié)后復(fù)產(chǎn)復(fù)工方案及安全技術(shù)措施
- 維修基金使用合同范例
- 幼兒園小班美術(shù)欣賞《漂亮的糖紙》課件
- 互聯(lián)網(wǎng)接入服務(wù)提供商服務(wù)承諾
- 解除凍結(jié)及撤銷納入失信和限高令申請書(文本)
評論
0/150
提交評論