【正文】
作是非常困難的。價格便宜,通信方式簡單,可掛載的節(jié)點數目多,其中最為重要的一點是抗干擾,可以從CAN總線的電氣特點上了解到,詳細介紹在1. 2 CAN總線簡介此系統的安全性也是十分可靠的,為了獲得盡可能高的數據傳輸安全性,在每一個CAN節(jié)點中均設有錯誤檢測,標定和自檢的強有力措施,而且CAN節(jié)點有能力識別永久性的的故障和暫時擾動,如果CAN節(jié)點在錯誤嚴重的情況下具有自動關閉輸出功能,以使總線上其他節(jié)點的操作不受影響。所以,這個課題有非常大的開發(fā)意義。陶瓷是黏土原料,貧瘠性原料及熔性原料經過適當的配比,粉碎、成型并加以高溫燒制,經過一系列的物理化學反應后形成的堅硬物質。其中燒制是陶瓷生產工藝過程中最為重要的階段,不但與產品質量密切相關,還占用著全程60%70%的消耗。陶瓷的燒制窯是一種連續(xù)窯,他用許多平行排列的不停轉動的滾輪構成通道,陶瓷坯件就放在滾輪上被帶動著經歷預熱、燒成、冷卻、最后出窯。他具有工藝先進、設計合理、易操作、易維修等優(yōu)點,在建筑陶瓷工業(yè)中作為燒成設備,已經得到廣泛的應用。溫度要達到設定值,要波動小,要左右平衡,上下溫差穩(wěn)定,產品的質量才能達到標準。所以綜上所述陶瓷燒成窯的控制系統包括溫度控制和氣氛控制。如果在燒成的過程中使用那些傳統的控制系統,就要先將分布于整個窯體的傳感器、執(zhí)行器和控制器相連,這樣的話如何布線將是一個很大問題,其中布線的成本還不低,在管道中的各個方面的干擾還非常的強,控制器和傳感器的模擬信號都受到了很大影響,特別是對溫度傳感器的影響,由于他的信號是毫伏級的,其精度要達到幾十個毫伏,在這樣強干擾存在的條件下,傳輸距離有比較長(幾十到一百多米),是一個很難徹底解決的問題,這樣的話陶瓷產品的質量要想提高就非常的困難。所有溫度、壓力、含氧量、對風機變頻器控制等的模擬量信號以及各種檢測信號、報警信號和對燒嘴供油閥控制的角執(zhí)行器的控制信號等開關量信號都可以通過CAN網絡和主控制器實現全數字化通信,避免長距離的傳輸模擬量而造成的信號的精度損失。6.2 CAN總線系統與其他總線系統的介紹現場總線是20世紀80年代發(fā)展起來的。因此必須設計出一種能在工業(yè)環(huán)境運行的、性能可靠的、造價低廉的通信系統,形成工廠底層網絡,完成現場自動化設備之間的多點數字通信,實現底層現場設備之間以及生產現場與外界之間的信息交換。他作為過程自動化、制造自動化、樓宇、交通等領域現場智能設備之間的互聯通信網絡,溝通了生產過程現場控制設備之間及其更高控制管理層網絡之間的聯系。每一種現場總線都在其支持公司或者組織多年產品技術研發(fā)成果積累的基礎上產生的,其技術側重點不一樣,各有特色,主要的應用領域也不盡相同。DP型用于分散外射間的高速數據傳輸,適合于加工 自動化領域的應用。而PA型則是用于過程自動化的總線類型,他遵從IEC11582的標準,是由西門子公司為主的十幾家德國公司、研究所共同推出的。DeviceNET是由ALLEN公司開發(fā)的一種基于CAN的開放的現場總線標準。DeviceNET用戶組織負責發(fā)布規(guī)范及對標準進行維護。因此,這種通信是基于面向連接的(點對點或多點傳送)通信模式建立的。CANopen是基于CAN串行總線系統的網絡系統。interBUS作為IEC61158標準之一,廣泛的應用于制造業(yè)和機械加工行業(yè)中,用于連接傳感器/執(zhí)行器的信號到計算機控制站,是一種開放的串行系統。interBUS總線上的主要設備有BT上的BK模塊、IO模塊和安裝在PC或PLC等上位主設備中的總線控制板。IO模塊實現在總線控制板和傳感器/執(zhí)行器之間接受和傳輸數據,可處理的數據類型包括機械制造和流程工業(yè)的所有標準信號。它可以連接拖動裝置、穿并行裝置、PC、人機界面等。 從目前各種現場總線的技術來看,還沒有一種現場總線能夠完全適用于所有的應用領域。結束語本系統經過開發(fā)與設計后,基本實現畢業(yè)設計任務書中所需要完成的功能。 主控設備與從控設備已經可以進行通信并以發(fā)送字符的方式來控制從控設備的開關等狀態(tài)。在完成通信之后,可以通過CAN總線把從控設備節(jié)點的狀態(tài)信息反饋給主控,使主控設備及時的了解到被控設備的情況。這些都有待進一步改善。致謝在本次畢業(yè)設計中,我從指導老師沈勇老師身上學到了很多。他無論在理論上還是在實踐中,都給與我很大的幫助,特別是讓我知道遇到問題時如何去有效的解決它,而不是束手無策。具有一個好的思考方式帶給我的絕對比拿優(yōu)要多得多。另外,在系統開發(fā)過程中實驗室中的張老師也給于我很大的幫助,幫助解決了不少的難點,使得系統能及時開發(fā)完成,還有同組的同學同樣給與我不少幫助,這里一并表示感謝。define DEBUGifdef DEBUGdefine DPRINTF(x...) printf(Debug:x)elsedefine DPRINTF(x...)endifinclude include include include sys/include include //MINIGUI應用程序頭文件//include minigui/include minigui/include minigui/include minigui/include minigui/include include include include sys/define DCM_IOCTRL_SETPWM (0x10)define DCM_TCNTB0 (16384)define IDC_1 101define IDC_2 102define IDC_3 103define IDC_4 104define IDC_5 105define IDC_6 110define IDC_7 111define IDC_PROMPT 200define BUFFER_SIZE 16static int dcm_fd = 1。 /* the actual data */ pthread_mutex_t lock。 /* positions for reading and writing */ pthread_cond_t notempty。 /* signaled when buffer is not full */}。char *DCM_DEV=/dev/dcm/0raw。 for(。t) for(i=0。i++)。 int status = 1。 int factor = DCM_TCNTB0/1024。 return 1。){ for (i=400。 i++) { if(status == 1) setpwm = i。 //電機速度調整// ioctl(dcm_fd, DCM_IOCTRL_SETPWM, (setpwm * factor))。 printf(setpwm = %d \n, setpwm)。 } close(dcm_fd)。}static void* canRev(void* t){ CanData data。 DPRINTF(can recieve thread begin.\n)。){ read(can_fd, amp。 for(i=0。i++) { //當受到字符‘a’的時候調用dcm()程序// putchar([i])。a39。 } fflush(stdout)。}define MAX_CANDATALEN 8static void CanSendString(char *pstr){ CanData data。 memset(amp。 =0x124。 for(。len=MAX_CANDATALEN){ memcpy(, pstr, 8)。 write(can_fd, amp。 pstr+=8。 memcpy(, pstr, len)。 write(can_fd, amp。}//CAN的接受和發(fā)送程序//void *can(){ int i。 static char str[256]。 void * retval。 char usrname[100]={0,}。 return 1。 ioctl(can_fd, UPCAN_IOCTRL_SETID, id)。endif /* Create the threads */ pthread_create(amp。 printf(\nPress \%s\ to quit!\n, quitcmd)。 for(。 scanf(%s, str)。 } len=strlen(str)。\n39。 CanSendString(str)。retval)。 close(can_fd)。}//建立界面窗口//static DLGTEMPLATE DlgYourTaste ={ WS_BORDER | WS_CAPTION, WS_EX_NONE, 0, 0, 240, 280, MY HOME, 0, 0, 12, NULL, 0}。//按鈕輸出字符//static char* prompts [] = { 1 IS READY,PLEASE WAIT, 2 IS READY,PLEASE WAIT, 3 IS READY,PLEASE WAIT, 4 IS READY,PLEASE WAIT, 5 IS READY,PLEASE WAIT,}。 }}pthread_t th_a。 switch (message) { case MSG_CREATE: init(amp。 pthread_create(amp。 break。 for (i = IDC_LAMIAN。 i++) SetNotificationCallback (GetDlgItem (hDlg, i), my_notif_proc)。 //界面按鈕調用程序// case MSG_COMMAND: switch (wParam) { case IDOK:dcm()。 case IDCANCEL: case IDC_LAMIAN:pthread_create(amp。break。 break。 } return DefaultDialogProc (hDlg, message, wParam, lParam)。block, NULL)。bnotempty, NULL)。bnotfull, NULL)。 bwritepos = 0。 endif = CtrlYourTaste。DlgYourTaste, HWND_DESKTOP, DialogBoxProc2, 0L)。}ifndef _LITE_VERSIONinclude minigui/endif/* //建立兩個進程//int main(void){ pthread_t th_a, th_b。buffer)。th_a, NULL, can, 0)。 }*/附錄B 英文翻譯原文Controller Area Network1 How CAN worksPrincipleData messages transmitted from any node on a CAN bus do not contain addresses of either the transmitting node, or of any intended receiving node. Instead, the content of the message (. Revolutions Per Minute, Hopper Full, Xray Dosage, etc.) is labelled by an identifier that is unique throughout the network. All other nodes on the network receive the message and each performs an acceptance test on the identifier to determine if the message, and thus its content, is relevant to that particular node. If the message is relevant, it will be processed。Error Handlin