亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        PLC手持編程器編譯系統(tǒng)的設(shè)計(jì)*

        2012-03-11 07:41:28未慶超蔡啟仲李克儉謝從澀
        自動(dòng)化與信息工程 2012年6期
        關(guān)鍵詞:指令

        未慶超 蔡啟仲 李克儉 謝從澀

        (廣西工學(xué)院電氣與信息工程學(xué)院)

        0 引言

        近幾年,隨著計(jì)算機(jī)、網(wǎng)絡(luò)、微處理器等技術(shù)的迅速發(fā)展,PLC編程器所用硬件平臺(tái)的核心由8位微處理器轉(zhuǎn)變?yōu)?2位微處理器,軟件平臺(tái)所用操作系統(tǒng)由DOS、Windows系統(tǒng)轉(zhuǎn)變?yōu)長(zhǎng)inux嵌入式系統(tǒng)或者uC/OS-II實(shí)時(shí)操作系統(tǒng)。目前編程器的編譯系統(tǒng)主要有翻譯性和解釋性兩種。其中翻譯型的編譯過程是將源代碼程序翻譯為目標(biāo)機(jī)器可識(shí)別的語言(通常為二進(jìn)制機(jī)器碼),并由硬件執(zhí)行的過程[1]。其優(yōu)點(diǎn)是生成目標(biāo)代碼后,目標(biāo)機(jī)器執(zhí)行效率高,占用資源小。解釋型的編譯過程是將源代碼程序在目標(biāo)機(jī)器上直接逐條解釋執(zhí)行,無需先將其翻譯為目標(biāo)機(jī)器代碼。該型編譯需要將編譯器直接植入硬件,其缺點(diǎn)是源代碼程序運(yùn)行的每一步都要對(duì)其進(jìn)行解釋,使得程序運(yùn)行效率相對(duì)低下,占用資源高,無法滿足工業(yè)控制過程的高效性、高實(shí)時(shí)性要求。

        針對(duì)自主研制的基于ARM+FPGA組成的小型可編程控制器,設(shè)計(jì)一種PLC手持編程器的翻譯型編譯系統(tǒng),選用32位ARM微控制器LPC2478和uC/OS-II實(shí)時(shí)操作系統(tǒng)作為設(shè)計(jì)平臺(tái)的核心。

        圖1 手持編程器總體框架

        1 手持編程器的總體設(shè)計(jì)

        手持編程器由硬件和軟件兩部分組成。硬件設(shè)計(jì)以32位微控制器LPC2478為核心。LPC2478微控制器內(nèi)部集成多種資源,包括 CAN控制器、SDRAM控制器、液晶顯示屏控制器、UART控制器、外部存儲(chǔ)控制器等,減少了系統(tǒng)外圍元件數(shù)量,使系統(tǒng)的硬件最小化。軟件設(shè)計(jì)選擇uC/OS-II作為系統(tǒng)的核心。uC/OS-II實(shí)時(shí)操作系統(tǒng)是一個(gè)完整、可移植、可固化、可裁剪、可剝奪、搶占式實(shí)時(shí)多任務(wù)內(nèi)核的嵌入式操作系統(tǒng),可以管理64個(gè)任務(wù),具有信號(hào)量、事件標(biāo)志組、消息郵箱、任務(wù)管理和內(nèi)存塊管理等系統(tǒng)功能。手持編程器利用CAN總線與PLC主機(jī)通信;用LCD屏顯示編譯系統(tǒng)的相關(guān)信息;用存儲(chǔ)器存儲(chǔ) PLC程序及相關(guān)數(shù)據(jù)。手持編程器的總體框架如圖1所示。

        2 編譯系統(tǒng)的設(shè)計(jì)

        PLC手持編程器的編譯系統(tǒng)由源代碼編制、編譯、存儲(chǔ)、顯示、通訊五大模塊組成,總框架如圖2所示,執(zhí)行流程如圖3所示。

        圖2 編譯系統(tǒng)的總框架圖

        圖3 編譯系統(tǒng)的執(zhí)行流程圖

        2.1 源代碼編制模塊的設(shè)計(jì)

        IEC61131-3是PLC編程語言的國(guó)際標(biāo)準(zhǔn)[2],它定義了梯形圖、順序功能圖、功能模塊、結(jié)構(gòu)化文本和指令表5種PLC編程語言規(guī)范。其中,指令表是一種較“低級(jí)”的編程語言,它類似于計(jì)算機(jī)的匯編語言,其代碼由一系列的指令行組成,常作為其它文本化語言和圖形語言轉(zhuǎn)譯過程的中間語言。因此,選用指令表作為程序的編程語言,比較直接,不用其它語言轉(zhuǎn)換。

        PLC源代碼編制模塊用來完成對(duì)PLC源代碼指令表程序的新建、插入、修改、添加、刪除、查找、替換、復(fù)制、粘貼、保存等功能。

        2.2 存儲(chǔ)模塊的設(shè)計(jì)

        存儲(chǔ)模塊主要將編譯生成的PLC主機(jī)能識(shí)別的二進(jìn)制目標(biāo)代碼及 PLC的源代碼指令表等數(shù)據(jù)存儲(chǔ)起來,以便查看使用。設(shè)計(jì)中采用數(shù)組的形式存放編譯生成的二進(jìn)制目標(biāo)代碼,采用鏈表的形式存放PLC源代碼指令表程序。在鏈表處理過程中每條指令用一個(gè)結(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)來表示,該結(jié)點(diǎn)的結(jié)構(gòu)帶有兩個(gè)指針,分別指向左右兩個(gè)有相鄰邏輯關(guān)系的其它結(jié)點(diǎn),其結(jié)構(gòu)如圖4所示。

        圖4 指令結(jié)點(diǎn)存儲(chǔ)結(jié)構(gòu)

        程序設(shè)計(jì)中采用結(jié)構(gòu)體來表示結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu),其定義如下:

        struct node{ char data;

        struct node *left;

        struct node *right;

        int flag;

        };

        其中,data存放該結(jié)點(diǎn)的關(guān)鍵值,可以是操作數(shù)的編號(hào)或操作碼的代碼號(hào);flag存放結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)的標(biāo)志位,表示該結(jié)點(diǎn)存放的是操作數(shù)或操作碼;結(jié)點(diǎn)指針分別指向該結(jié)點(diǎn)的上層和下層結(jié)點(diǎn),這樣結(jié)點(diǎn)之間可通過指針連接,進(jìn)行掃描和結(jié)點(diǎn)元素的插入、刪除、修改等操作。在掃描PLC源程序指令表過程中,以空格作為分隔界限,將各獨(dú)立字符取出,再將該獨(dú)立字符與系統(tǒng)關(guān)鍵字對(duì)照來識(shí)別該字符。對(duì)已識(shí)別的關(guān)鍵字字符,系統(tǒng)申請(qǐng)結(jié)點(diǎn)struct node數(shù)據(jù)結(jié)構(gòu)空間,將該關(guān)鍵字存放入data。根據(jù)關(guān)鍵字為指令操作符或者操作軟元件,分別將flag標(biāo)志位置0或1;同時(shí)設(shè)置結(jié)點(diǎn)的指針指向。

        在 PLC指令表程序中用二叉樹的結(jié)構(gòu)[3]表示指令的邏輯關(guān)系,其結(jié)構(gòu)如圖5所示。每個(gè)二叉樹的根結(jié)點(diǎn)為系統(tǒng)的指令操作符,葉子結(jié)點(diǎn)表示系統(tǒng)的操作軟元件。對(duì)該二叉樹的邏輯結(jié)構(gòu)進(jìn)行后序遍歷后可以得到對(duì)應(yīng)的指令表程序。

        圖5 結(jié)點(diǎn)相互連接方式

        2.3 編譯模塊的設(shè)計(jì)

        PLC指令主要分為基本指令和應(yīng)用指令。基本指令是使用較多的指令,完成位邏輯運(yùn)算功能;而應(yīng)用指令完成特定運(yùn)算的功能。以字為單位對(duì) PLC指令進(jìn)行編碼,每條 PLC指令包含操作碼和操作數(shù)兩部分,其中操作碼有1個(gè),操作數(shù)有1個(gè)、2個(gè)、3個(gè)或者更多,例如應(yīng)用指令的源操作數(shù)和目的操作數(shù)。所以,根據(jù)操作數(shù)的個(gè)數(shù)不同,將 PLC指令分為三類:第一類是LD、LDR、OR、AND;第二類是基本指令中無操作數(shù)指令、單操作數(shù)指令和步進(jìn)指令;第三類是應(yīng)用指令。用 32位中的最高四位 D31~D28區(qū)別這三類指令。其中,第二類指令對(duì)應(yīng)的是0110;第三類指令對(duì)應(yīng)的是 0111;第一類指令對(duì)應(yīng)的是 4位二進(jìn)制數(shù)的其它組合。

        位單元軟元件PLC指令共有8種,分為X、Y、T、C和M1、M2、M3、S兩類。對(duì)每種軟元件進(jìn)行編碼,從0開始編號(hào)。M是各類軟元件中編號(hào)最多的軟元件,故將 M 以 1024個(gè)軟元件為一個(gè)單位分為M1、M2和M3三種類型。其中,X、Y、T、C用2位二進(jìn)制數(shù)編碼(稱為軟元件的基地址)區(qū)分,4種軟元件各自最多有256個(gè),所以用8位二進(jìn)制數(shù)(稱為軟元件的位地址)進(jìn)行編碼,共用10位二進(jìn)制數(shù)判斷4種軟元件及其編號(hào);對(duì)M1、M2、M3、S用2位二進(jìn)制數(shù)區(qū)分,分別用10位二進(jìn)制數(shù)進(jìn)行編號(hào),即共用12位二進(jìn)制數(shù)判斷4種軟元件及其個(gè)數(shù);系統(tǒng)中有常開、常閉、上升沿微分、下降沿微分四種接點(diǎn)類型,用2位二進(jìn)制數(shù)進(jìn)行編碼區(qū)分。

        對(duì)第一類指令進(jìn)行編碼時(shí)又將LD、LDR、OR、AND分為L(zhǎng)D、LDR和OR、AND兩類。D31~D28從0000~0101表示LD、LDR,若D27是0,則表示LD;若D27是1,則表示LDR。D31~D28從1000~1101表示AND、OR,若D27是0,則表示AND;若D27是1,則表示OR。若它們只有1個(gè)操作數(shù),則 D26~D17依次是軟元件的基地址和位地址,D16~D15表示接點(diǎn)類型,D14~D13表示指令結(jié)束標(biāo)志,其它為無關(guān)項(xiàng)置1;若它們有2個(gè)操作數(shù),則第 1個(gè)操作數(shù)和第 2個(gè)操作數(shù)分別占 D26~D15、D14~D1,最后1位表示指令結(jié)束。標(biāo)志位,0表示未結(jié)束,1表示結(jié)束。

        對(duì)第二類指令進(jìn)行編碼時(shí)比較簡(jiǎn)單,8種軟元件編碼,詳見表1、表2。

        對(duì)第三類指令進(jìn)行編碼時(shí)僅涉及 48條應(yīng)用指令,分別給其編號(hào),編號(hào)的范圍是0~47,采用7位二進(jìn)制代碼對(duì)D27~D21編碼,編碼值等于各自的編號(hào)。用D20區(qū)分是否為脈沖執(zhí)行方式,若是,則D20為1;否則,D20為0。而其它應(yīng)用指令的操作數(shù)有源操作數(shù)和目的操作數(shù),有些應(yīng)用指令沒有操作數(shù)。對(duì)有操作數(shù)的應(yīng)用指令,用2個(gè)或3個(gè)32位二進(jìn)制數(shù)表示,將應(yīng)用指令的編號(hào)、脈沖執(zhí)行方式位和源操作數(shù)用一個(gè)32位編碼,目的操作數(shù)用另外一個(gè)32位編碼。將操作數(shù)分為軟元件的編號(hào)和轉(zhuǎn)移地址,轉(zhuǎn)移地址就是軟元件的位地址,源操作數(shù)占20位,目的操作數(shù)占32位,無關(guān)項(xiàng)都置為1。源操作數(shù)有T、C、D、K(十進(jìn)制整數(shù))、H(十六進(jìn)制整數(shù))、V、Z、KnX、KnY、KnS、KnM1、KnM2、KnM3共 13種軟元件,用4位二進(jìn)制數(shù)進(jìn)行編碼區(qū)分,從0000到1100;目的操作數(shù)有T、C、D、V、Z、KnY、KnS、KnM1、KnM2、KnM3共10種軟元件,用4位二進(jìn)制數(shù)進(jìn)行編碼區(qū)分,從0000到1001。對(duì)無操作數(shù)的應(yīng)用指令(如CJ、CALL、SRET等)用一個(gè)32位二進(jìn)制數(shù)表示,D27~D21用來指令編碼,從0000000開始,需要脈沖執(zhí)行方式位的指令仍用D20位表示,需要轉(zhuǎn)移地址的指令用D19至后面的位表示,無關(guān)項(xiàng)都置1。

        表1 第二類指令編碼表

        表2 第二類指令編碼表

        編譯模塊的功能是對(duì) PLC源代碼指令表進(jìn)行詞法分析、語法分析、語義分析、代碼優(yōu)化[4],若出現(xiàn)錯(cuò)誤則進(jìn)行錯(cuò)誤處理;反之,則生成 PLC主機(jī)能識(shí)別的二進(jìn)制目標(biāo)代碼。詞法分析和語法分析的實(shí)質(zhì)是檢查源程序的整個(gè)輸入是否構(gòu)成一個(gè)完整的 PLC指令程序。

        詞法分析采用有限自動(dòng)機(jī)的原理來實(shí)現(xiàn)掃描功能,從 PLC源文件中逐個(gè)讀取字符,再對(duì)各個(gè)字符進(jìn)行識(shí)別,分離出關(guān)鍵字、變量、數(shù)字、常量等。將軟元件(如X、Y、S)和指令符(如基本指令)設(shè)置為關(guān)鍵字。同時(shí)檢查源程序指令中操作符和操作數(shù)的關(guān)系是否正確。例如,對(duì)系統(tǒng)的位單元元件S不能使用ORB、ANB等塊操作符,對(duì)數(shù)據(jù)寄存器軟元件D、V、Z使用SET等位操作指令等類似的錯(cuò)誤。當(dāng)對(duì)應(yīng)的操作符與操作軟元件不相符時(shí)系統(tǒng)提示錯(cuò)誤,停止相應(yīng)程序的處理。

        語法分析則是針對(duì)詞法分析階段中產(chǎn)生的單詞序列進(jìn)行檢查,判斷是否符合指令表語言的語法規(guī)則,確定整個(gè)輸入字符串是否構(gòu)成一個(gè)在語法上正確的程序等等。將詞法分析階段識(shí)別的關(guān)鍵字分類為表達(dá)式、語句等語法單元。再根據(jù)關(guān)鍵字的意義將該源程序的二叉樹的邏輯結(jié)構(gòu)轉(zhuǎn)換為布爾表達(dá)式。根據(jù)語法規(guī)則的描述,確定該布爾表達(dá)式的邏輯結(jié)構(gòu)是否與PLC程序的語法規(guī)則相符。

        語義分析則分析整個(gè)句子是否符合 PLC指令編程規(guī)則、數(shù)據(jù)的類型是否匹配、程序在邏輯上是否有錯(cuò)誤等。

        代碼優(yōu)化就是在 PLC編程規(guī)則下將多余的空格符、制表符、注釋等字符過濾掉,減少代碼的存儲(chǔ)空間。錯(cuò)誤處理則是在編譯過程中自動(dòng)加入冗余容錯(cuò)邏輯,提高容錯(cuò)能力,增強(qiáng)系統(tǒng)的自適應(yīng)能力。

        經(jīng)過以上階段,可生成結(jié)構(gòu)和邏輯上正確的PLC源指令代碼。對(duì) PLC源指令代碼進(jìn)行遍歷,根據(jù)樹狀結(jié)構(gòu)對(duì)其存儲(chǔ)。對(duì)PLC源指令代碼通過后序遍歷,從后序遍歷根結(jié)點(diǎn)的各個(gè)子樹,然后訪問根結(jié)點(diǎn)。將操作碼的編譯代碼和操作軟元件的編譯代碼移位相加就構(gòu)成了最終的二進(jìn)制目標(biāo)代碼。

        3 實(shí)例測(cè)試

        編譯一段 PLC源程序指令,進(jìn)行測(cè)試,以驗(yàn)證編譯系統(tǒng)編譯PLC指令的正確性。

        LD X001

        OR X003

        OUT Y002

        LDI X001

        OUT Y003

        LDI X001

        ORI X003

        OUT Y004

        END

        輸入PLC指令代碼時(shí)規(guī)定:指令符和軟元件之間只有一個(gè)空格符,若多個(gè)或者沒有空格符,則會(huì)出現(xiàn)輸入代碼錯(cuò)誤;各類軟元件與其編號(hào)之間不能有任何符號(hào),否則提示錯(cuò)誤。

        將這段 PLC代碼通過外圍按鍵輸入,通過代碼掃描函數(shù) Code_Scan(),返回該段代碼的總行數(shù)。由編譯函數(shù)Compile Code()編譯該段PLC源代碼,將編譯結(jié)果顯示在液晶顯示屏上,如表3所示。第1列是PLC源程序指令,第2列是以十六進(jìn)制形式表示的目標(biāo)代碼。

        表3 PLC源代碼及編譯結(jié)果顯示

        編譯每行代碼時(shí),分辨出指令符和軟元件之間的空格符;根據(jù)空格符的位置找出軟元件編號(hào)的起始位置;利用截取子字符串函數(shù)substr()分別讀取指令符、軟元件和軟元件的編號(hào),利用字符串處理函數(shù)strcmp()判斷指令符與可編程控制器的指令符是否相同。若相同,則判斷軟元件具體類別。結(jié)合軟元件編號(hào),整行PLC指令代碼被編譯成十六進(jìn)制代碼,再通過十六進(jìn)制數(shù)轉(zhuǎn)變?yōu)槎M(jìn)制數(shù)函數(shù) Sieteen To Bin(),生成相應(yīng)的二進(jìn)制代碼;若沒有一個(gè)相同,則提示錯(cuò)誤。

        讀取指令符和軟元件之間空格符的位置函數(shù)如下:

        int Read_Space (char *tempstr,char c)

        {

        int i=0;

        for(i=0;i

        {

        if (tempstr[i]==c) return i;

        }

        }

        截取子字符串函數(shù)substr()如下:

        char * substr(char *s,int p,int size)

        {

        int i;

        char *temp=(char *)malloc(size+1);

        for(i=0;i

        temp[i]=s[p-1+i];

        temp[i]='

        在线观看av国产自拍| 国产精品网站在线观看免费传媒| 国产国语熟妇视频在线观看 | 国产我不卡在线观看免费| 日韩精品人妻久久久一二三| 国产精品美女久久久久久| 亚洲区在线| 一区二区三区四区亚洲综合| 激情久久黄色免费网站| 香港三日本三级少妇三级视频| 国产乱子伦精品免费无码专区| 午夜无码熟熟妇丰满人妻| 国产丝袜美腿中文字幕| 97se亚洲国产综合自在线观看| 欧美mv日韩mv国产网站| 国产精品无码久久久久久久久作品| 一区二区三区一片黄理论片| 极品粉嫩嫩模大尺度无码视频 | 少妇愉情理伦片丰满丰满午夜 | 天干天干天啪啪夜爽爽av| 国产91网| 久久蜜桃一区二区三区| 国产无套内射又大又猛又粗又爽| 色多多a级毛片免费看| 日本一区二区啪啪视频| 男女性生活视频免费网站| 久久精品夜色噜噜亚洲a∨| 大香伊蕉国产av| 国产黑色丝袜在线观看视频| 国产免费成人自拍视频| 少妇高潮无套内谢麻豆传| 国内揄拍国内精品| 成年女人18毛片毛片免费| 国产在线一区二区三区四区不卡| 久久精品国产久精国产| 在线播放国产女同闺蜜| 国产盗摄一区二区三区av| 欧美老肥婆牲交videos| 国产精品天天狠天天看| 中文字幕一区二区网站| 日本不卡的一区二区三区中文字幕|