未慶超 蔡啟仲 李克儉 謝從澀
(廣西工學院電氣與信息工程學院)
近幾年,隨著計算機、網絡、微處理器等技術的迅速發展,PLC編程器所用硬件平臺的核心由8位微處理器轉變為32位微處理器,軟件平臺所用操作系統由DOS、Windows系統轉變為Linux嵌入式系統或者uC/OS-II實時操作系統。目前編程器的編譯系統主要有翻譯性和解釋性兩種。其中翻譯型的編譯過程是將源代碼程序翻譯為目標機器可識別的語言(通常為二進制機器碼),并由硬件執行的過程[1]。其優點是生成目標代碼后,目標機器執行效率高,占用資源小。解釋型的編譯過程是將源代碼程序在目標機器上直接逐條解釋執行,無需先將其翻譯為目標機器代碼。該型編譯需要將編譯器直接植入硬件,其缺點是源代碼程序運行的每一步都要對其進行解釋,使得程序運行效率相對低下,占用資源高,無法滿足工業控制過程的高效性、高實時性要求。
針對自主研制的基于ARM+FPGA組成的小型可編程控制器,設計一種PLC手持編程器的翻譯型編譯系統,選用32位ARM微控制器LPC2478和uC/OS-II實時操作系統作為設計平臺的核心。

圖1 手持編程器總體框架
手持編程器由硬件和軟件兩部分組成。硬件設計以32位微控制器LPC2478為核心。LPC2478微控制器內部集成多種資源,包括 CAN控制器、SDRAM控制器、液晶顯示屏控制器、UART控制器、外部存儲控制器等,減少了系統外圍元件數量,使系統的硬件最小化。軟件設計選擇uC/OS-II作為系統的核心。uC/OS-II實時操作系統是一個完整、可移植、可固化、可裁剪、可剝奪、搶占式實時多任務內核的嵌入式操作系統,可以管理64個任務,具有信號量、事件標志組、消息郵箱、任務管理和內存塊管理等系統功能。手持編程器利用CAN總線與PLC主機通信;用LCD屏顯示編譯系統的相關信息;用存儲器存儲 PLC程序及相關數據。手持編程器的總體框架如圖1所示。
PLC手持編程器的編譯系統由源代碼編制、編譯、存儲、顯示、通訊五大模塊組成,總框架如圖2所示,執行流程如圖3所示。

圖2 編譯系統的總框架圖

圖3 編譯系統的執行流程圖
IEC61131-3是PLC編程語言的國際標準[2],它定義了梯形圖、順序功能圖、功能模塊、結構化文本和指令表5種PLC編程語言規范。其中,指令表是一種較“低級”的編程語言,它類似于計算機的匯編語言,其代碼由一系列的指令行組成,常作為其它文本化語言和圖形語言轉譯過程的中間語言。因此,選用指令表作為程序的編程語言,比較直接,不用其它語言轉換。
PLC源代碼編制模塊用來完成對PLC源代碼指令表程序的新建、插入、修改、添加、刪除、查找、替換、復制、粘貼、保存等功能。
存儲模塊主要將編譯生成的PLC主機能識別的二進制目標代碼及 PLC的源代碼指令表等數據存儲起來,以便查看使用。設計中采用數組的形式存放編譯生成的二進制目標代碼,采用鏈表的形式存放PLC源代碼指令表程序。在鏈表處理過程中每條指令用一個結點的數據結構來表示,該結點的結構帶有兩個指針,分別指向左右兩個有相鄰邏輯關系的其它結點,其結構如圖4所示。

圖4 指令結點存儲結構
程序設計中采用結構體來表示結點數據結構,其定義如下:
struct node{ char data;
struct node *left;
struct node *right;
int flag;
};
其中,data存放該結點的關鍵值,可以是操作數的編號或操作碼的代碼號;flag存放結點數據結構的標志位,表示該結點存放的是操作數或操作碼;結點指針分別指向該結點的上層和下層結點,這樣結點之間可通過指針連接,進行掃描和結點元素的插入、刪除、修改等操作。在掃描PLC源程序指令表過程中,以空格作為分隔界限,將各獨立字符取出,再將該獨立字符與系統關鍵字對照來識別該字符。對已識別的關鍵字字符,系統申請結點struct node數據結構空間,將該關鍵字存放入data。根據關鍵字為指令操作符或者操作軟元件,分別將flag標志位置0或1;同時設置結點的指針指向。
在 PLC指令表程序中用二叉樹的結構[3]表示指令的邏輯關系,其結構如圖5所示。每個二叉樹的根結點為系統的指令操作符,葉子結點表示系統的操作軟元件。對該二叉樹的邏輯結構進行后序遍歷后可以得到對應的指令表程序。

圖5 結點相互連接方式
PLC指令主要分為基本指令和應用指令。基本指令是使用較多的指令,完成位邏輯運算功能;而應用指令完成特定運算的功能。以字為單位對 PLC指令進行編碼,每條 PLC指令包含操作碼和操作數兩部分,其中操作碼有1個,操作數有1個、2個、3個或者更多,例如應用指令的源操作數和目的操作數。所以,根據操作數的個數不同,將 PLC指令分為三類:第一類是LD、LDR、OR、AND;第二類是基本指令中無操作數指令、單操作數指令和步進指令;第三類是應用指令。用 32位中的最高四位 D31~D28區別這三類指令。其中,第二類指令對應的是0110;第三類指令對應的是 0111;第一類指令對應的是 4位二進制數的其它組合。
位單元軟元件PLC指令共有8種,分為X、Y、T、C和M1、M2、M3、S兩類。對每種軟元件進行編碼,從0開始編號。M是各類軟元件中編號最多的軟元件,故將 M 以 1024個軟元件為一個單位分為M1、M2和M3三種類型。其中,X、Y、T、C用2位二進制數編碼(稱為軟元件的基地址)區分,4種軟元件各自最多有256個,所以用8位二進制數(稱為軟元件的位地址)進行編碼,共用10位二進制數判斷4種軟元件及其編號;對M1、M2、M3、S用2位二進制數區分,分別用10位二進制數進行編號,即共用12位二進制數判斷4種軟元件及其個數;系統中有常開、常閉、上升沿微分、下降沿微分四種接點類型,用2位二進制數進行編碼區分。
對第一類指令進行編碼時又將LD、LDR、OR、AND分為LD、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個操作數,則 D26~D17依次是軟元件的基地址和位地址,D16~D15表示接點類型,D14~D13表示指令結束標志,其它為無關項置1;若它們有2個操作數,則第 1個操作數和第 2個操作數分別占 D26~D15、D14~D1,最后1位表示指令結束。標志位,0表示未結束,1表示結束。
對第二類指令進行編碼時比較簡單,8種軟元件編碼,詳見表1、表2。
對第三類指令進行編碼時僅涉及 48條應用指令,分別給其編號,編號的范圍是0~47,采用7位二進制代碼對D27~D21編碼,編碼值等于各自的編號。用D20區分是否為脈沖執行方式,若是,則D20為1;否則,D20為0。而其它應用指令的操作數有源操作數和目的操作數,有些應用指令沒有操作數。對有操作數的應用指令,用2個或3個32位二進制數表示,將應用指令的編號、脈沖執行方式位和源操作數用一個32位編碼,目的操作數用另外一個32位編碼。將操作數分為軟元件的編號和轉移地址,轉移地址就是軟元件的位地址,源操作數占20位,目的操作數占32位,無關項都置為1。源操作數有T、C、D、K(十進制整數)、H(十六進制整數)、V、Z、KnX、KnY、KnS、KnM1、KnM2、KnM3共 13種軟元件,用4位二進制數進行編碼區分,從0000到1100;目的操作數有T、C、D、V、Z、KnY、KnS、KnM1、KnM2、KnM3共10種軟元件,用4位二進制數進行編碼區分,從0000到1001。對無操作數的應用指令(如CJ、CALL、SRET等)用一個32位二進制數表示,D27~D21用來指令編碼,從0000000開始,需要脈沖執行方式位的指令仍用D20位表示,需要轉移地址的指令用D19至后面的位表示,無關項都置1。

表1 第二類指令編碼表

表2 第二類指令編碼表
編譯模塊的功能是對 PLC源代碼指令表進行詞法分析、語法分析、語義分析、代碼優化[4],若出現錯誤則進行錯誤處理;反之,則生成 PLC主機能識別的二進制目標代碼。詞法分析和語法分析的實質是檢查源程序的整個輸入是否構成一個完整的 PLC指令程序。
詞法分析采用有限自動機的原理來實現掃描功能,從 PLC源文件中逐個讀取字符,再對各個字符進行識別,分離出關鍵字、變量、數字、常量等。將軟元件(如X、Y、S)和指令符(如基本指令)設置為關鍵字。同時檢查源程序指令中操作符和操作數的關系是否正確。例如,對系統的位單元元件S不能使用ORB、ANB等塊操作符,對數據寄存器軟元件D、V、Z使用SET等位操作指令等類似的錯誤。當對應的操作符與操作軟元件不相符時系統提示錯誤,停止相應程序的處理。
語法分析則是針對詞法分析階段中產生的單詞序列進行檢查,判斷是否符合指令表語言的語法規則,確定整個輸入字符串是否構成一個在語法上正確的程序等等。將詞法分析階段識別的關鍵字分類為表達式、語句等語法單元。再根據關鍵字的意義將該源程序的二叉樹的邏輯結構轉換為布爾表達式。根據語法規則的描述,確定該布爾表達式的邏輯結構是否與PLC程序的語法規則相符。
語義分析則分析整個句子是否符合 PLC指令編程規則、數據的類型是否匹配、程序在邏輯上是否有錯誤等。
代碼優化就是在 PLC編程規則下將多余的空格符、制表符、注釋等字符過濾掉,減少代碼的存儲空間。錯誤處理則是在編譯過程中自動加入冗余容錯邏輯,提高容錯能力,增強系統的自適應能力。
經過以上階段,可生成結構和邏輯上正確的PLC源指令代碼。對 PLC源指令代碼進行遍歷,根據樹狀結構對其存儲。對PLC源指令代碼通過后序遍歷,從后序遍歷根結點的各個子樹,然后訪問根結點。將操作碼的編譯代碼和操作軟元件的編譯代碼移位相加就構成了最終的二進制目標代碼。
編譯一段 PLC源程序指令,進行測試,以驗證編譯系統編譯PLC指令的正確性。
LD X001
OR X003
OUT Y002
LDI X001
OUT Y003
LDI X001
ORI X003
OUT Y004
END
輸入PLC指令代碼時規定:指令符和軟元件之間只有一個空格符,若多個或者沒有空格符,則會出現輸入代碼錯誤;各類軟元件與其編號之間不能有任何符號,否則提示錯誤。
將這段 PLC代碼通過外圍按鍵輸入,通過代碼掃描函數 Code_Scan(),返回該段代碼的總行數。由編譯函數Compile Code()編譯該段PLC源代碼,將編譯結果顯示在液晶顯示屏上,如表3所示。第1列是PLC源程序指令,第2列是以十六進制形式表示的目標代碼。

表3 PLC源代碼及編譯結果顯示
編譯每行代碼時,分辨出指令符和軟元件之間的空格符;根據空格符的位置找出軟元件編號的起始位置;利用截取子字符串函數substr()分別讀取指令符、軟元件和軟元件的編號,利用字符串處理函數strcmp()判斷指令符與可編程控制器的指令符是否相同。若相同,則判斷軟元件具體類別。結合軟元件編號,整行PLC指令代碼被編譯成十六進制代碼,再通過十六進制數轉變為二進制數函數 Sieteen To Bin(),生成相應的二進制代碼;若沒有一個相同,則提示錯誤。
讀取指令符和軟元件之間空格符的位置函數如下:
int Read_Space (char *tempstr,char c)
{
int i=0;
for(i=0;i { if (tempstr[i]==c) return i; } } 截取子字符串函數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]='
主站蜘蛛池模板:
美女视频黄频a免费高清不卡|
欧美日韩在线亚洲国产人|
高潮毛片无遮挡高清视频播放|
国产乱论视频|
国产精品熟女亚洲AV麻豆|
美女国内精品自产拍在线播放
|
国产国产人在线成免费视频狼人色|
国产成人欧美|
国产午夜福利片在线观看|
欧美国产日本高清不卡|
色偷偷一区二区三区|
蝴蝶伊人久久中文娱乐网|
91精品啪在线观看国产60岁|
毛片一级在线|
污视频日本|
亚洲an第二区国产精品|
在线观看免费国产|
国内熟女少妇一线天|
国产成人综合久久精品下载|
狠狠色综合网|
九九热精品视频在线|
日韩黄色大片免费看|
精品精品国产高清A毛片|
日韩无码黄色|
在线日韩日本国产亚洲|
四虎影视库国产精品一区|
五月综合色婷婷|
久久中文无码精品|
国产毛片高清一级国语
|
99久久婷婷国产综合精|
国产乱人伦精品一区二区|
日韩激情成人|
国产浮力第一页永久地址|
福利在线一区|
午夜视频日本|
呦女精品网站|
成人亚洲视频|
精品一区二区三区水蜜桃|
国产精品亚洲а∨天堂免下载|
午夜欧美在线|
欧美日韩亚洲综合在线观看|
88国产经典欧美一区二区三区|
久久福利片|
成年网址网站在线观看|
97视频在线观看免费视频|
色综合中文|
凹凸国产熟女精品视频|
国产成人在线无码免费视频|
欧美a√在线|
人妻中文久热无码丝袜|
精品欧美日韩国产日漫一区不卡|
黄色片中文字幕|
国产在线观看高清不卡|
国产精品xxx|
亚洲欧美一区二区三区图片|
久久综合丝袜日本网|
久久这里只有精品国产99|
九色在线观看视频|
99在线视频免费|
亚洲另类色|
蜜臀AVWWW国产天堂|
国产精品女人呻吟在线观看|
成人在线观看不卡|
日韩精品亚洲一区中文字幕|
久一在线视频|
萌白酱国产一区二区|
亚洲日韩精品欧美中文字幕|
日韩成人在线一区二区|
国产福利2021最新在线观看|
凹凸国产分类在线观看|
黄色污网站在线观看|
欧美日韩国产高清一区二区三区|
高清无码手机在线观看|
美女啪啪无遮挡|
老司机aⅴ在线精品导航|
99久久无色码中文字幕|
精品欧美日韩国产日漫一区不卡|
国产香蕉97碰碰视频VA碰碰看|
精品无码视频在线观看|
成人国产免费|
夜夜操狠狠操|
激情无码字幕综合|