欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

實現(xiàn)層次狀態(tài)圖的裝置和對其有用的方法及設備的制作方法

文檔序號:6412719閱讀:295來源:國知局
專利名稱:實現(xiàn)層次狀態(tài)圖的裝置和對其有用的方法及設備的制作方法
技術領域
本發(fā)明領域本發(fā)明關于計算機代碼和用于生成計算機代碼的設備及方法。
本發(fā)明背景David Harel的“狀態(tài)圖,通往復雜系統(tǒng)的直觀途徑”(Science ofComputer Programming,1987)中介紹有層次狀態(tài)圖。
此說明書中所提到的所有出版物和其中所引用的出版物的公開內(nèi)容在此均被結(jié)合作為參考。
本發(fā)明概述本發(fā)明試圖提供改進的計算機代碼和用于生成計算機代碼的改進的設備及方法。
根據(jù)本發(fā)明一優(yōu)選實施例提供實現(xiàn)層次狀態(tài)圖的設備,它包括運行來執(zhí)行一系統(tǒng)的工況指令表的狀態(tài)機具(SME);運行來以計算機代碼形式復制描述系統(tǒng)的工況指令表的用戶定義的層次狀態(tài)圖的狀態(tài)圖編碼器,此編碼器運行來以第一數(shù)據(jù)結(jié)構(gòu)維持狀態(tài)圖的層次結(jié)構(gòu)完整;運行來為指令表內(nèi)多個事件中的各個別事件生成與此個別事件相關的狀態(tài)圖的狀態(tài)間至少一變遷的清單的事件清單發(fā)生器,此事件清單發(fā)生器運行來以第二數(shù)據(jù)結(jié)構(gòu)維持清單;和運行來激活系統(tǒng)以執(zhí)行其指令表中的每個操作的工況實現(xiàn)器。
按照本發(fā)明一優(yōu)選實施例,此系統(tǒng)還包括硬件和軟件中至少一種。
另外按照本發(fā)明優(yōu)選實施例,此第一數(shù)據(jù)結(jié)構(gòu)的大小與此層次結(jié)構(gòu)中的轉(zhuǎn)移數(shù)成正比地線性增加。
此外,按照本發(fā)明一優(yōu)選實施例,此第二數(shù)據(jù)結(jié)構(gòu)的大小與至少一變遷的清單中的變遷數(shù)成正比地線性增加。
而且按照本發(fā)明一優(yōu)選實施例,每一清單的至少一變遷的順序?qū)谟蓪哟螤顟B(tài)圖所定義的變遷評價順序。
另外按照本發(fā)明的優(yōu)選實施例,事件清單發(fā)生器為其生成清單的多個事件包括至少一外部輸入事件。
再有按照本發(fā)明的優(yōu)選實施例,事件清單發(fā)生器為其生成清單的多個事件包括至少一內(nèi)部數(shù)據(jù)值變化事件,此設備還包括數(shù)據(jù)值變化事件通告器,該通告器運行來向狀態(tài)機具生成各數(shù)據(jù)值變化事件的通知。
按照本發(fā)明的一優(yōu)選實施例另外還提供實現(xiàn)層次狀態(tài)圖的方法,此方法包括提供一可運行來執(zhí)行一系統(tǒng)的工況指令表的狀態(tài)機具(SME),以計算機代碼形式復制描述系統(tǒng)的工況指令表的用戶定義的層次狀態(tài)圖,此復制步驟可運行來保持此狀態(tài)圖的層次結(jié)構(gòu)完整,對此指令表內(nèi)多個事件中的各個別事件生成一與此個別事件相關的狀態(tài)圖的狀態(tài)間的至少一變遷的清單,和激活系統(tǒng)來執(zhí)行其指令表中的每一個操作過程。
按照本發(fā)明的優(yōu)選實施例另外還提供自動代碼生成方法,包括自動生成在存儲器中構(gòu)成維持圖的層次結(jié)構(gòu)的層次狀態(tài)圖的復制體的代碼,自動生成為第一多個輸入事件的每一個構(gòu)成受該輸入事件作用的變遷的清單的代碼,自動生成為第二多個內(nèi)部數(shù)據(jù)變量的每一個構(gòu)成受該內(nèi)部數(shù)據(jù)變量中的變化作用的變遷的清單的代碼,自動生成向狀態(tài)機具通知內(nèi)部數(shù)據(jù)變量中的變化的代碼,和自動生成評估條件和實現(xiàn)動作和活動的代碼。
按照本發(fā)明優(yōu)選實施例此方法還包括提供狀態(tài)機具的步驟,該狀態(tài)機具運行來根據(jù)接收的有關發(fā)生事件的通知評估受此事件作用的變遷清單以便能選擇要進行的變遷,并進行這些變遷。
另外按照本發(fā)明的優(yōu)選實施例還提供用于為層次狀態(tài)機計算狀態(tài)的方法,此方法包括提供一運行來接收關于至少一事件的發(fā)生的狀態(tài)機具,提供描述一系統(tǒng)的工況指令表的層次狀態(tài)圖,為每一事件提供與其相關的狀態(tài)圖的狀態(tài)間的至少一變遷的清單,評估此至少一變遷清單以便能根據(jù)此至少一事件選擇欲進行的變遷,和評估層次狀態(tài)圖來計算對應于所選變遷的狀態(tài)。
附圖的簡要說明由以下結(jié)合附圖的詳細說明將會理解本發(fā)明,其中

圖1為按照本發(fā)明的優(yōu)選實施例所構(gòu)成的和運行的軟件系統(tǒng)的簡化方框圖,此系統(tǒng)包括與狀態(tài)機具(SME)接口的自動生成的代碼;圖2為對圖1的狀態(tài)機具的優(yōu)選操作方法的簡化流程圖說明;圖3為從層次狀態(tài)圖生成高級計算機代碼的優(yōu)選方法的簡化流程圖說明;圖4為一特定例中從層次狀態(tài)圖自動生成計算機代碼的過程中所生成計算機屏幕的圖形說明;圖5為在處理圖4例的過程中所生成的計算機屏幕的圖形說明,它表示構(gòu)成此例的狀態(tài)圖的所有模式;圖6為在處理圖4例的過程中所生成的計算機屏幕的圖形說明,它表示圖5狀態(tài)圖的可替換表述;和圖7為可按照本發(fā)明優(yōu)選實施例運行的自動代碼生成技術的簡化流程圖說明。
優(yōu)選實施例的詳細說明現(xiàn)在參看圖1的按照本發(fā)明一優(yōu)選實施例構(gòu)成和運行的軟件系統(tǒng)的簡化方框圖,此系統(tǒng)包括與狀態(tài)機具(SME)20接口的自動生成的代碼10。還設置有對基礎硬件(未圖示)的任選接口30。
狀態(tài)機具20為動態(tài)或靜態(tài)地鏈接到自動生成的代碼和接口程度庫的預設目標碼模塊。
此狀態(tài)機具實現(xiàn)最好僅由與其相連接的自動生成的代碼所定義的軟件系統(tǒng)的工況。即就是這樣的情況,狀態(tài)機具代碼通常僅以目標碼形式一次提供,而無需每一軟件系統(tǒng)加以改變。
狀態(tài)機具實現(xiàn)這種工況是依靠將輸入事件和數(shù)據(jù)值的變化變換成層次狀態(tài)圖內(nèi)的變遷,然后實現(xiàn)這些變遷。它這樣來完成,即計算與這種變遷相關的新狀態(tài),去活化老狀態(tài)的相關部分和最后激活新狀態(tài)的相關部分。
以圖2的流程圖說明對狀態(tài)機具(SME)20的優(yōu)選操作方法。
SME通過根據(jù)由自動生成的代碼30所提供的數(shù)據(jù)建立初始數(shù)據(jù)結(jié)構(gòu)來開始操作。這些數(shù)據(jù)結(jié)構(gòu)通常包括一對一表述層次狀態(tài)圖的數(shù)據(jù)結(jié)構(gòu);使任何輸入事件與由這些輸入事件觸發(fā)的變遷耦合到一起的數(shù)據(jù)結(jié)構(gòu);使應用程序中的任何數(shù)據(jù)變量與由這些數(shù)據(jù)變量的值或狀態(tài)的變化所觸發(fā)的變遷、和與在這些數(shù)據(jù)變量改變時必須加以評估的表達式耦合到一起的數(shù)據(jù)結(jié)構(gòu);和指向自動生成的代碼中的所有邏輯和活動功能的指針。
SME進入它等待任何輸入事件或數(shù)據(jù)值中的任何變化的正常操作狀態(tài)。應當理解的是,輸入事件可能源自于硬件例如后面參照圖4更詳細說明的燈,或者來自軟件過程例如過程間消息。
當來自自動生成的代碼的輸入事件通知或數(shù)據(jù)變化通知到達時,SME20檢查觸發(fā)此通知的事件或數(shù)據(jù)結(jié)構(gòu)是否具有與其相關的變遷或邏輯表達式的清單。如果沒有,它放棄此通知并返回到其正常的操作狀態(tài)。
如果此通知源具有與之相關的這樣的清單,則SME檢驗清單中的各項以選擇那些屬于當前活動的狀態(tài)的項。所有其它項均忽略。
然后SME重復通過此被選擇的清單和校驗各項。
如果一項為變遷,而且該變遷的源狀態(tài)仍然為活動的,則SME這樣進行變遷,即計算與此變遷相關的新狀態(tài),去活化在新狀態(tài)中將不再活動的當前狀態(tài)的那些部分,而后激活新狀態(tài)中的那些在當前狀態(tài)原非活動的所有元素。然后此新狀態(tài)成為當前狀態(tài)。
如果此項為邏輯表達式而不是一變遷,SME通過調(diào)用所生成的代碼中的對應功能來評估這一表達式。
一旦SME處理了清單中的所有項,它返回其正常操作模式等待下一通知。
再回頭參看圖1,自動生成的代碼10為一系統(tǒng)的層次狀態(tài)圖描述的翻譯,以及系統(tǒng)中的所有數(shù)據(jù)元素,它在經(jīng)編譯后連同SME和接口程序庫一起運行來實現(xiàn)原始系統(tǒng)的運行功能。
自動生成的代碼10典型地包括下列組分的某些或全部用于在存儲器中一對一地生成包括所定義的變遷和活動的原始狀態(tài)圖的復制體的代碼;用于生成將輸入事件源與在SME接收到這些事件的通知時要加以評估的變遷相鏈接的清單的代碼;用于生成將數(shù)據(jù)變量與在SME接收到改變這些數(shù)據(jù)變量的通知時要加以評估的變遷和邏輯表達式相鏈接的清單的代碼;
每當數(shù)據(jù)變量改變時生成對SME的通知的代碼;用于評估條件和實現(xiàn)說明由原始狀態(tài)圖描述的系統(tǒng)的工況的動作和活動的代碼,包括用于激活狀態(tài)圖所指定的硬件或軟件元素的代碼;和在需要時將上述任一個代碼傳遞到SME的代碼。
對基礎硬件的目標碼接口程序庫30為使狀態(tài)機和自動生成的代碼中的一個或二者能與這些元素所依賴運行的硬件交互作用的可選預設目標碼。
這種目標碼接口程序庫是對系統(tǒng)要依賴運行的硬件專用的。
用于以狀態(tài)圖生成高級代碼的通常技術必須生成如狀態(tài)圖所描述的所有可能變遷和狀態(tài)的靜態(tài)表述,還要生成用于激活這些不同狀態(tài)的狀態(tài)機的代碼。一般,狀態(tài)和狀態(tài)機在這樣生成的代碼中是無法分開的。
能用于完成這一點的二個主要技術有由嵌套轉(zhuǎn)移語句構(gòu)成的狀態(tài)機和圍繞狀態(tài)變遷表建立的狀態(tài)機。
在第一技術中,利用轉(zhuǎn)移語句生成代碼,狀態(tài)圖形被變換成大量通常很深的嵌套的轉(zhuǎn)移語句,此時各轉(zhuǎn)移語句代表可能的變遷之一。嵌套深度至少與狀態(tài)圖中最深層次結(jié)構(gòu)的深度相同,并作為狀態(tài)圖中所有轉(zhuǎn)移的深度、轉(zhuǎn)移的寬度和可能的輸入事件數(shù)量的函數(shù)非線性地增加。
轉(zhuǎn)移語句是“if-else(如果-否則)”或“switch-case(轉(zhuǎn)移-理由)”型式的語句。
對于簡單程序這可能是足夠的,但通常由于為編碼嵌套轉(zhuǎn)移語句需要大量的代碼,這一技術產(chǎn)生太大的程序。
每一可能的輸入事件典型地以某種標記來表述。當發(fā)生一輸入事件時,設置對應標記來指明這一情況。狀態(tài)機機理就是連續(xù)不斷地通過所有轉(zhuǎn)移語句進行循環(huán),搜尋任何包括可能已在當前循環(huán)之前設置的標記以及由于改變值的變量而成為真的條件語句的轉(zhuǎn)移。這具有無法避免的結(jié)果,即這樣的代碼非常緩慢,特別是因為每一循環(huán)均必須通過組成代碼的深度嵌套的轉(zhuǎn)移點。這使得這種類型的代碼很大而對任何要求快速響應時間或適度存儲器需求的應用程序來說太慢。
在第二技術中,利用狀態(tài)變遷表生成代碼,對每一可能的變遷和狀態(tài)生成一過程或功能,連同由所生成的狀態(tài)機所用的狀態(tài)變遷表來為每一可能的外部輸入選擇哪一過程加以調(diào)用。實際上,這種狀態(tài)變遷表是一其下標為“輸入事件”和“當前狀態(tài)”,而其值為新狀態(tài)的二維陣列。
這里的狀態(tài)不是層次狀態(tài)而是一正常線性狀態(tài)圖中的狀態(tài),后者依靠“平整”原始狀態(tài)圖從狀態(tài)圖推演得到。
當一輸入事件到達狀態(tài)機,狀態(tài)機利用它連同當前狀態(tài)一起來查找下一狀態(tài)。這種表的利用取得較之嵌套轉(zhuǎn)移語句對輸入好得多的響應時間。另一方面,仍然必須以循環(huán)通過所有條件語句以尋求任何評估為“真”者來對這樣的語句進行評價。自然這仍然是很慢的。
另外,由于需要“平整”或線性化原始狀態(tài)圖,表的大小作為可能的輸入事件數(shù)量、狀態(tài)圖的深度和各個轉(zhuǎn)移的寬度的函數(shù)成指數(shù)地急劇增大。因此,這樣所生成的程序通常大到使所生成的代碼不能實用于市場產(chǎn)品。
相反,本發(fā)明的代碼生成技術最好具有下列某些或全部特點它不致力于在所生成的代碼中再現(xiàn)層次狀態(tài)機,而是生成在編譯和連接后由預設的優(yōu)化狀態(tài)機具運行的代碼;它不生成狀態(tài)圖中所有的可能狀態(tài)和變遷的靜態(tài)表述,而是生成再現(xiàn)原始狀態(tài)圖的實際層次狀態(tài)結(jié)構(gòu)的代碼。然后此預設狀態(tài)機具響應于每一個輸入事件或條件中的變化來動態(tài)計算所需的新狀態(tài);它完全由事件驅(qū)動,即使依賴于條件。每一事件源和每一個變量均具有一與之相關的邏輯清單。這一清單指向任一如果或當該事件被觸發(fā)或該變量改變值時必須加以評價的語句。一般,此清單中的語句表示變遷,語句的順序表明對這些變遷的評價的順序。一旦輸入事件到達或一變量改變值,立即辨識取決于它的變遷并加以評價;和所生成代碼的大小在轉(zhuǎn)移數(shù)量和轉(zhuǎn)移間的變遷數(shù)量方面是線性的。此大小與轉(zhuǎn)移的寬度和可能輸入事件的數(shù)量無關。
本發(fā)明的代碼生成技術和本發(fā)明的代碼結(jié)構(gòu)具有下列某些或全部優(yōu)點最后所生成的代碼連同預設狀態(tài)機具很小,而所需存儲器可以與由程序員手工開發(fā)的等同代碼相當;雖然所生成代碼對輸入事件的響應時間與通常的自動生成的代碼同樣令人滿意,對變量中的變化的響應時間則優(yōu)于自動生成的代碼,而事實上類似于對輸入事件的響應時間;和保證所生成代碼反映它由之推演的狀態(tài)圖,而不是它的變換版本。結(jié)果,所生成代碼即如原始狀態(tài)圖所描述那樣運行操作。另外,由于狀態(tài)圖形式體系本身的清晰性,與等同的手工開發(fā)代碼相比較,所生成代碼更有可能按所需的運行操作。
實例圖3說明將一用于生成這里所表示和說明的代碼的系統(tǒng)結(jié)合進Rapid S/W工具(Emnltek Ltd,Misgav 20179,Isreal提供的商品)。
現(xiàn)在說明圖3的步驟。
建立接口程序庫接口程序庫由自動生成的代碼用來與系統(tǒng)要被開發(fā)來運行的硬件交互作用。例如,此程序庫代碼可被用來從操作系統(tǒng)請求存儲器分配,或者,如果此硬件控制一裝置例如一個燈,此程序庫可含有例如通過訪問此硬件上特定的地址來接通或斷開此燈的代碼。此程序庫可以任何適當?shù)恼Z言編寫而最好在Rapid開發(fā)之前作預測試。
將組分映射到仿真目標在Rapid中,通過在屏幕上匯編仿真硬件和/或軟件組分和從由目標仿真提供的功能建立邏輯表達式來建立應用程序。這些被提供的功能激勵目標仿真的運行性能。例如在一Lamp(燈)目標的情況下,功能“Switch On(接通)”將使得屏幕上被仿真的燈改變到“On”色彩。為了使邏輯表達式能與實際組分交互作用,設置所提供功能與接口程序庫間的映射。這一映射可被硬編碼成被仿真的目標碼。另一方面也可采用外部的逐句映射文件。
打開一新的Rapid應用程序這是建立Rapid應用程序中的第一步,提供要在其上建立此應用程序的“清除狀態(tài)”。
建立系統(tǒng)的仿真這一仿真的建立是依靠從Layout Editor(格式編輯程序)中的工具盤中拖曳目標并將它們按要求布置于被仿真的裝置的圖形表述上。各目標可按圖形定制,和在某種程度上按功能定制。
Rapid狀態(tài)圖Rapid應用程序中的邏輯由狀態(tài)圖描述。Rapid中的狀態(tài)圖由稱之為“modes(模式)”的單元建立。模式為系統(tǒng)的功能性狀態(tài),而任何模式均可被分層次地嵌套在任何其他模式中。因此,模式描述一層次結(jié)構(gòu)樹。模式具有二種“風格”排他的和并存的。對于排他模式,在任一給定時間僅能有一個“兄弟”為活動狀態(tài),而對于并存模式所有“兄弟”必定同時活動。當一特定模式為活動的時,這就意味著它的所有先輩均為活動的。如果此模式的子輩為排他式,這也意味著其子輩至少一個為活動的,而如果此模式的子輩為并存模式,這就意味著所有子輩為活動的。狀態(tài)圖中的狀態(tài)為所有當前活動的模式的清單。一模式可具有活動和變遷的多個清單。活動描述系統(tǒng)在一特定狀態(tài)時做什么?;顒涌梢允沁M入活動,退出活動或模式活動。進入活動是在包含它們的模式成為激活的時所進行的活動。退出活動是在包含它們的模式成為不活動的時所進行的活動。模式活動是在模式成為活動時進行和只要模式仍然為活動的、每當描述它們的數(shù)據(jù)變量改變值時即自動重新被評價的活動。變遷定義系統(tǒng)如何由一狀態(tài)演變到另一狀態(tài)。變遷典型地具有一目的模式。變遷還必須有一輸入事件清單,或條件表達式或兩者。變遷還可能具有動作清單。如果接收到由一變遷所保持的輸入事件之一的通告,和該變遷屬于一當前活動的模式,以及條件表達式如果任一個評價為真,則屬于此變遷的模式被去激活(連同其子輩和任何相關的先輩)和此變遷的目的模式被激活(連同其子輩等)。在原先模式的去激活與目的模式的激活之間進行變遷中的任何動作。
建立狀態(tài)圖典型地利用二種Rapid中的工具來建立仿真Mode TreeEditor(模式樹編輯程序)和Logic Editor(邏輯編輯程序)。模式樹編輯程序使用戶能借助選擇新模式的父代、指定新模式的類型、和給新模式命名來定義和增加模式到模式的層次結(jié)構(gòu)樹。在這一過程期間,可利用邏輯編輯程序來增加和編輯變遷和活動。在各邏輯表達式被加到狀態(tài)圖時就被編譯成用于被用來運行系統(tǒng)仿真的虛擬機的字節(jié)代碼。
運行仿真在此開發(fā)過程期間的任何時間,在開發(fā)中的系統(tǒng)仿真均可理想地運行。這使得能遞增地開發(fā)系統(tǒng)和驗證系統(tǒng)工況是如所期望的。
生成代碼一旦開發(fā)者滿意此系統(tǒng),Rapid即自動為具有上述特性的系統(tǒng)生成C++代碼。應理解,除C++外的編程語言也可用于此自動生成的代碼。
編譯所生成的代碼可對自動生成的代碼進行編譯來產(chǎn)生目標碼。
與狀態(tài)機和接口程序庫連接由編譯此自動生成的代碼所產(chǎn)生的目標碼然后被與SME目標碼和接口程序庫連接來為目標系統(tǒng)產(chǎn)生可執(zhí)行代碼。
這種可執(zhí)行代碼可被裝載到目標系統(tǒng)并運行。
示例應用程序以下是Rapid中的一示例應用程序和為其自動生成的代碼。
圖4為表明目標格式的Layout Editor(格式編輯程序)中的應用程序的一屏幕俘獲。
如可看到的,此應用程序包含有5個燈和5個按鈕目標RAPID應用程序TRANSITN 12/12/96 160908目標數(shù)據(jù)報告參數(shù)域子樹順序?qū)哟谓Y(jié)構(gòu)內(nèi)容活動的目標,非圖形目標,目標參數(shù),目標性能1.目標transitn父代無 類型根目標參數(shù)位置(pxl)’0@0’ 大小(pxl)’393@403’ 動態(tài)’false’拖放’false’2.目標燈H父代transitn 類型圓燈參數(shù)中心(pxl)’300@139’ 半徑(pxl)’15@15’ 動態(tài)’false’拖放’false’性能2.1.名稱閃爍周期 類型數(shù)據(jù)參數(shù)值5003.目標燈G父代transitn 類型圓燈參數(shù)中心(pxl)’243@139’ 半徑(pxl)’15@15’ 動態(tài)’false’拖放’false’性能3.1.名稱閃爍周期類型數(shù)據(jù)參數(shù)值5004.目標燈A父代transitn 類型圓燈參數(shù)中心(pxl)’72@140’ 半徑(pxl)’15@15’ 動態(tài)’false’
拖放’false’性能4.1.名稱閃爍周期 類型數(shù)據(jù)參數(shù)值5005.目標燈E父代transitn 類型圓燈參數(shù)中心(pxl)’129@139’ 半徑(pxl)’15@15’ 動態(tài)’false’拖放’false’性能5.1.名稱閃爍周期 類型數(shù)據(jù)參數(shù)值5006.目標燈F父代transitn 類型圓燈參數(shù)中心(pxl)’186@139’ 半徑(pxl)’15@15’ 動態(tài)’false’拖放’false’性能6.1.名稱閃爍周期 類型數(shù)據(jù)參數(shù)值5007.目標B to A父代transitn 類型平按鈕參數(shù)位置:’(pxl)’57@199’ 大小(pxl)’40@40’ 動態(tài)’false’拖放’false’ 瞬時’true’ 自動重復’false’自動重復周期5008.目標Default父代transitn 類型平按鈕參數(shù)位置(pxl)’131@199’ 大小(pxl)’40@40’ 動態(tài)’false’拖放’false’ 瞬時’true’ 自動重復’false’自動重復周期5009.目標History父代transitn類型平按鈕參數(shù)位置(pxl)’206@199’ 大小(pxl)’40@40’ 動態(tài)’false’
拖放’false’ 瞬時’true’ 自動重復’false’自動重復周期50010.目標DeepHistory父代transitn 類型平按鈕參數(shù)位置(pxl)’276@199’ 大小(pxl)’40@40’ 動態(tài)’false’拖放’false’ 瞬時’true’ 自動重復’false’自動重復周期50011.目標History父代transitn 類型標簽參數(shù)位置(pxl)’198@244’ 大小(pxl)’58@15’ 動態(tài)’false’拖放’false’ 文本’History’ 方向’Horizontal’字體’Fixedsys’ 行寬112.目標Next父代transitn 類型平按鈕參數(shù)位置(pxl)’167@282’ 大小(pxl)’40@40’ 動態(tài)’false’拖放’false’ 瞬時’true’ 自動重復’false’自動重復周期500
圖5為表明構(gòu)成這一示例應用程序的狀態(tài)圖的所有模式的Mode TreeEditor(模式樹編輯程序)的屏幕俘獲。
在圖6中所示Logic Chart(邏輯圖)工具的屏幕俘獲中可看到此狀態(tài)圖的另一替換視圖。圖6表示各模式為矩形和各變遷為弧形??汕宄闯鰻顟B(tài)的層次結(jié)構(gòu)性質(zhì)。
現(xiàn)在參看圖7,可按照本發(fā)明優(yōu)選實施例運行的自動代碼生成技術的簡化流程圖說明。所得代碼可結(jié)合一能進行下列功能的狀態(tài)機具應用,其中包括a、在接收到發(fā)生輸入事件的通報后,SME訪問對該輸入事件所形成的清單和評價該清單上的各個變遷以便根據(jù)當前狀態(tài)來確定要進行哪些變遷;和b、在接收到內(nèi)部數(shù)據(jù)變量發(fā)生變化的通報后,SME訪問對該內(nèi)部數(shù)據(jù)變量所形成的清單和評價該清單上的各個變遷以便根據(jù)當前狀態(tài)確定要進行哪些變遷。
為進行一變遷,SME通過轉(zhuǎn)到變遷的目的地查找并激活所有先輩而計算與此變遷相關的新狀態(tài)。在適宜時例如按預先定義的缺省值還查找和激活所有的子輩。將當前狀態(tài)的那些在新狀態(tài)中不再為活動的部分去激活。新狀態(tài)中的那些在當前狀態(tài)中原本非活動的元素被激活。然后此新狀態(tài)成為當前狀態(tài)被存入SME中。
另一方面,也可不設置上述清單中的一個或兩者。例如,系統(tǒng)可周期地輪詢內(nèi)部事件而不是由其驅(qū)動。或者還可以,系統(tǒng)可周期地輪詢外部事件而不是由其驅(qū)動。狀態(tài)圖中的邏輯RAPID應用程序TRANSITN 12/12/96 160732模式數(shù)據(jù)報告參數(shù)域子樹順序?qū)哟谓Y(jié)構(gòu)包括用戶功能,活動,變遷,觸發(fā),動作用戶功能1.模式transitn父代無 類型根注釋2.模式A父代transitn 類型排他進入活動a.燈A接通退出活動a.燈A斷開變遷
a.目的地B 項目類型Defaulta1.觸發(fā)Default in &
b.目的地B 項目類型Historyb1.觸發(fā)History in &
c.目的地B 項目類型Deep Historyc1.觸發(fā)DeepHistory in &amp;3.模式B父代transitn 類型排他變遷a.目的地A 項目類型Defaulta1.觸發(fā)B to A in &amp;4.模式C父代B類型排他5.模式E父代C類型排他進入活動a.燈E接通退出活動a.燈E斷開變遷a.目的地F 項目類型Defaulta1.觸發(fā)Next in &amp;6.模式F父代C 類型排他進入活動a.燈F接通退出活動a.燈F斷開變遷a.目的地G 項目類型Defaulta1.觸發(fā)Next in &amp;7.模式D父代B 類型排他8.模式G父代D 類型排他進入活動a.燈G接通退出活動a.燈G斷開變遷a.目的地H 項目類型Defaulta1.觸發(fā)Next in &amp;9.模式H父代D 類型排他進入活動a.燈H接通退出活動a.燈H斷開變遷a.目的地E 項目類型Defaulta1.觸發(fā)Next in &amp;生成的代碼<pre listing-type="program-listing"><![CDATA[ Header File #ifndef_include_transitn #define_include_transitn #include"applic.h" #include"task.h"#include "object.h"#include "mode.h"class Application;class myApplication;typedef bool(myApplication∷*MyApplicationMethod)();#define cNumberDependencies 8#define cNumberDependencyIndices 6#define cNumberChildren 18#define cNumberObjects 20#define cNumberTriggers 5#define cNumberTransitions 8#define cNumberModes9#define cNumberActivities 10class myApplicationpublic Application{private∥Objectsenum objectID{cOB_RootObject=0,∥PushButtonscOB_Default,∥1cOB_History,∥2cOB_DeepHistory,∥3cOB_BToA,∥4cOB_Next,∥5∥LampscOB_LampA, ∥6cOB_LampE, ∥7cOB_LampF, ∥8cOB_LampG, ∥9cOB_LampH, ∥10∥ModescOB_RootMode,∥11cOB_ModeA, ∥12cOB_ModeB, ∥13cOB_ModeC, ∥14cOB_ModeD, ∥15cOB_ModeE, ∥16cOB_ModeF, ∥17cOB_ModeG, ∥18cOB_ModeH, ∥19};enum modeID{cMO_RootMode=0,cMO_ModeA,∥1cMO_ModeB,∥2cMO_ModeC,∥3cMO_ModeD,∥4cMO_ModeE,∥5cMO_ModeF,∥6cMO_ModeG,∥7cMO_ModeH,∥8};enum ActivityIndices{cAC_ModeA_entry,cAC_ModeA_exit,cAC_ModeE_entry,cAC_ModeE_exit,cAC_ModeF_entry,cAC_ModeF_exit,cAC_ModeG_entry,cAC_ModeG_exit,cAC_ModeH_entry,cAC_ModeH_exit,};enum ConcreteIndices{cConcrete1=0,cConcrete2,cConcrete3,cConcrete4,cConcrete5,cConcrete6,cConcrete7,cConcrete8,cConcrete9,cConcrete10,};public void init(RapidTask*t);∥ObjectsRootObjectrootObject;PushButtonpbDefault;PushButtonpbHistory;PushButtonpbDeepHistory;PushButtonpbNext;PushButtonpbBToA;RapidLamp LampA;RapidLamp LampE;RapidLamp LampF;RapidLamp LampG;RapidLamp LampH;∥ModesRootMode rootMode;XMode ModeA;XMode ModeB;XMode ModeC;XMode ModeD;XMode ModeE;XMode ModeF;XMode ModeG;XMode ModeH;∥Logic Methodsbool ModeA_entry();bool ModeA_exit();bool ModeE_entry();bool ModeE_exit();bool ModeF_entry();bool ModeF_exit();bool ModeG_entry();bool ModeG_exit();bool ModeH_entry();bool ModeH_exit();∥Dynamic State Machine DataRapidObject*FrameTable[cNumberObjects];ModeP buffer1[cNumberModes];ModeP buffer2[cNumberModes];ModeP buffer3[cNumberModes];unsigned char_ModeFlags[3*cNumberModes][1];∥Static State Machine Data∥Each object has a list of dependency records,sorted∥by property and event,and referencing pairs of∥(modes,activity/condition,index),or a transition indexstatic DependencyRecord dependencies[cNumberDependencies];∥For each object/property pair,there is a dependency index record∥that includes the first &amp; last dependency record pertaining to the∥object/property pair.static DependencyIndexRecord dependencyIndicies[cNumberDependencyIndices];∥Each transition has an index and an associated record that includes∥the indices of the source and destination,type,condition,and actionstatic TransitionRecord transitionRecords[cNumberTransitions];∥Each transition has an index and an associated record that includes∥the indices of the source and destination,type,condition,and actionstatic TriggerRecord triggerRecords[cNumberTriggers];∥Activity methods are indexed through the following array∥subroutine methods are NOT indexed here.static MyApplicationMethod activityRecords[cNumberActivities];∥Each mode record includes entry and exit activities,if any,∥and the start index and length of the mode activities. Can the mode activities∥be merged?Also,the number of transitions,to facilitate flag allocation.static ModeRecord modeRecords[cNumberModes];∥Each object record includesstatic ObjectRecord objectRecords[cNumberObjects];∥Array to hold all of the children for the objectsstatic int childrenArray[cNumberChildren]; ∥General Data on this APplication static ApplicationRecord applicationRecord;};class myTaskpublic RapidTask { public myTask(); ~myTask(){removeContext(&amp;_mainApp);};privatemyApplication_mainApp; };#endifBody File/*Rapid ApplicationObjects Transitn |-->BToA(Square Pushbutton) |-->Default(Square Pushbutton) |-->History(Square Pushbutton) |-->DeepHistory(Square Pushbutton) |-->Next(Square Pushbutton) |-->LampA(Round Lamp) |-->LampE(Round Lamp) |-->LampF(Round Lamp) |-->LampG(Round Lamp) |-->LampH(Round Lamp)Modes Transitn |-->A(D) | |---B |-->C(D) ||-->E(D) | | | |---F ||---D|-->G(D) | |---H]]></pre>邏輯1.模式Transitn父代無 類型根注釋2.模式A父代Transitn 類型排他進入活動a.燈A接通退出活動a.燈A斷開變遷a.目的地B 項目類型Defaulta1.觸發(fā)Default in &amp;
b.目的地B 項目類型Historyb1.觸發(fā)History in &amp;
c.目的地B 項目類型Deep Historyc1.觸發(fā)DeepHistory in &amp;3.模式B父代Transitn 類型排他變遷a.目的地A 項目類型Defaulta1.觸發(fā)B to A in &amp;4.模式C父代B 類型排他5.模式D父代B 類型排他6.模式E父代C 類型排他進入活動a.燈E接通退出活動a.燈E斷開變遷a.目的地F 項目類型Defaulta1.觸發(fā)Next in &amp;6.模式F父代C 類型排他進入活動a.燈F接通退出活動a.燈F斷開變遷a.目的地G 項目類型Defaulta1.觸發(fā)Next in &amp;6.模式G父代D 類型排他進入活動a.燈G接通退出活動a.燈G斷開變遷a.目的地H 項目類型Default
a1.觸發(fā)Next in &amp;6.模式H父代D 類型排他進入活動a.燈H接通退出活動a.燈H斷開變遷a.目的地E 項目類型Defaulta1.觸發(fā)Next in &amp;生成的代碼
<pre listing-type="program-listing"><![CDATA[*/#include "transitn.h"#include "emtrace.h"#include "ekernel.h"/*struct DependencyRecord{DependencyClass dependencyClass;∥event,condition,mode activityint mode; ∥Frame Table indexint eventID; ∥eventID,if anyint index;∥Index of transition or mode Activity};*/DependencyRecord myApplication∷dependencies[cNumberDependencies]={{cEvent, cOB_ModeA,cPushButtonIn,0},∥0 A->B on Default in{cEvent, cOB_ModeA,cPushButtonIn,1},∥1 A->B on History in{cEvent, cOB_ModeA,cPushButtonIn,2},∥2 A->B on DeepHistory in{cEvent, cOB_ModeB,cPushButtonIn,0},∥3 B->A on BToA in{cEvent, cOB_ModeE,cPushButtonIn,0},∥4 E->F on Next in{cEvent, cOB_ModeF,cPushButtonIn,0},∥5 F->G on Next in{cEvent, cOB_ModeG,cPushButtonIn,0},∥6 G->H on Next in{cEvent, cOB_ModeH,cPushButtonIn,0},∥7 H->E on Next in};/*struct DependencyIndexRecord{ PropertyEntry_propertyId; int flags=0; unsigned int_firsElement;}*/DependencyIndexRecord myApplication∷dependencyIndicies[cNumberDependencyIndices]={ {cSelf,0,0}, ∥pbDefault self {cSelf,0,1}, ∥pbHistory self {cSelf,0,2}, ∥pbDeepHistor self {cSelf,0,3}, ∥pbBToA self {cSelf,0,4}, ∥pbNext self {cNone,O,cNumberDependencies} ∥Sentinel for last index record};∥children listed grouped by common parentint myApplication∷childrenArray[cNumberChildren]={ cOB_Default, ∥0 cOB_History, ∥1 cOB_DeepHistory, ∥2 cOB_BToA, ∥3 cOB_Next,∥4 ∥Lamps cOB_LampA,∥5 cOB_LampE,∥6 cOB_LampF,∥7 cOB_LampG,∥8 cOB_LampH,∥9∥ModescOB_ModeA,∥10cOB_ModeB,∥11cOB_ModeC,∥12cOB_ModeD,∥13cOB_ModeE,∥14cOB_ModeF,∥15cOB_ModeG,∥16cOB_ModeH ∥17 };/*struct ObjectRecord { ObjectIdentifier name; int parent; int id;∥Id within type...e,g,modes are numbered l-n,concretes are numbered l-m int numChildren; int firstChild; int firstDependentIndex; int numDependentIndex; };*/ObjectRecord myApplication∷objectRecords[cNumberObjects]= { cNone, 10, 0,0,0}, cOB_RootObject, cConcrete1, 0,cNone,0, 1},cOB_RootObject,cConcrete2, 0,cNone,1, 1}, cConcrete3, 0,cNone,2, 1}, cOB_RootObject,cConcrete5, 0,cNone,3, 1},cOB_RootObject, cConcrete4, 0,cNone, 4,4}, cConcrete6, 0,cNone,0, 0}, cConcrete7, 0,cNone,0, 0}, cConcrete8, 0,cNone,0, 0}, cConcrete9, 0,cNone,0, 0}, cConcrete10,0,cNone,0, 0}, cMO_RootMode, 7,11, 0,0}, cMO_ModeA, 0,cNone,0, 0}, cMO_ModeB, 6,10, 0,0}, cMO_ModeC, 2, 14, 0,0}, cMO_ModeD, 2, 16, 0,0}, cMO_ModeE, 0, cNone, 0,0},cMO_ModeF, 0,cNone,0,0},cMO_ModeG, 0,cNone,0,0},cMO_ModeH, 0,cNone,0,0}};ApplicationRecord myApplication∷applicationRecord={cNumberModes,cNumberActivities};/*struct TriggerRecord{int objectID;int propertyID;int eventID;};*/∥NOTECould get sophisticated,and reuse trigger records...TriggerRecord myApplication∷triggerRecords[cNumberTriggers]={{cOB_Default,cSelf,cPushButtonIn}, ∥0{cOB_History,cSelf,cPushButtonIn}, ∥1{cOB_DeepHistory,cSelf,cPushButtonIn},∥2{cOB_BToA,cSelf,cPushButtonIn}, ∥3{cOB_Next,cSelf,cPushButtonIn}, ∥4};/*struct TransitionRecord{int triggerStart; ∥index of first trigger recordint triggerLength; ∥number of trigger recordsint sourceMode; ∥object index of source modeint destinationMode;∥object index of destination modeint condition;∥index of condition methodint action; ∥index of action methodunsigned int type3;unsigned int IsConditionOnly1;unsigned int toAncestor1;unsigned int toDescendant1;unsigned int sourceEqualsDestination1;};*/TransitionRecord myApplication∷transitionRecords[cNumberTransitions]={{0,1,cOB_ModeA,cOB_ModeB,cNone,cNone,cDefaultTransition,false,false,false,false},∥A->B #1{1,1,cOB_ModeA,cOB_ModeB,cNone,cNone,cHistoryTransition,false,false,false,false},∥A->B #2{2,1,cOB_ModeA,cOB_ModeB,cNone,cNone,cDeepHistoryTransition,false,false,false,false},∥A->B #3{3,1,cOB_ModeB,cOB_ModeA,cNone,cNone,cDefaultTransition,false,false,false,false},∥B->A #1{4,1,cOB_ModeE,cOB_ModeF,cNone,cNone,cDefaultTransition,false,false,false,false},∥E->F #1{4,1,cOB_ModeF,cOB_ModeG,cNone,cNone,cDefaultTransition, false,false,false,false},∥F->G #1{4,1,cOB_ModeG,cOB_ModeH,cNone,cNone,cDefaultTransition, false,false,false,false},∥G->H #1{4,1,cOB_ModeH,cOB_ModeE,cNone,cNone,cDefaultTransition, false,false,false,false},∥H->E #1};/*struct ModeRecord{ObjectIdentifier name;int defaultChildID;∥ObjectID of default child,cNone if none ∥For parents of AndModes,first childint entry;int exit;int modeActivityStart;int numModeActivities; ∥N/A,condition index,activity indexint transitionStart;∥First transition record pertaining to this modeint numTransitions;∥Number of transitions};*/ModeRecord myApplication∷modeRecords[cNumberModes]=∥def child entry exit modeStart numMode transSartnumTrans{"RootMode",cOB_ModeA,cNone,cNone, cNone, 0, cNone, 0}, 0, 0,3},{"ModeB",cOB_ModeC,cNone, cNone, cNone, 0, 3, 1},{"ModeC",cOB_ModeE,cNone, cNone, cNone, 0. cNone, 0},{"ModeD",cOB_ModeG,cNone, cNone, cNone, 0, cNone,0}, cAC_ModeE_entry,cAC_ModeE_exit,cNone, 0, 4, 1},cAC_ModeF_entry,cAC_ModeF_exit,cNone, 0, 5, 1},cAC_ModeG_entry,cAC_ModeG_exit,cNone, 0, 6, 1},cAC_ModeH_entry,cAC_ModeH_exit,cNone, 0, 7, 1}};MyApplicationMethod myApplication∷activityRecords[cNumberActivities]={&amp;myApplication∷ModeA_entry,&amp;myApplication∷ModeA_exit,&amp;myApplication∷ModeE_entry,&amp;myApplication∷ModeE_exit,&amp;myApplication∷ModeF_entry,&amp;myApplication∷ModeF_exit,&amp;myApplication∷ModeG_entry,&amp;myApplication∷ModeG_exit,&amp;myApplication∷ModeH_entry,&amp;myApplication∷ModeH_exit,};bool myApplication∷ModeA_entry(){LampA.turn_on();∥LampA onreturn false;}bool myApplication∷ModeA_exit(){LampA.turn_off();∥LampA offreturn false;}bool myApplication∷ModeE_entry(){LampE.turn_on();∥LampA onreturn false;}bool myApplication∷ModeE_exit(){LampE.turn_off();∥LampA offreturn false;}bool myApplication∷ModeF_entry(){LampF.turn_on();∥LampA onreturn false;}bool myApplication∷ModeF_exit(){LampF.turn_off();∥LampA offreturn false;}bool myApplication∷ModeG_entry(){LampG.turn_on();∥LampA onreturn false;}bool myApplication∷ModeG_exit(){LampG.turn_off();∥LampA offreturn false;}bool myApplication∷ModeH_entry()LampH.turn_on();∥LampA onreturn false;}bool myApplication∷ModeH_exit(){LampH.turn_off();∥LampA offreturn false;}void myApplication∷init(RapidTask*t){setTask(t);Application∷dependencies=dependencies;Application∷dependencyIndicies=dependencyIndicies;Application∷transitionRecords=transitionRecords;Application∷triggerRecords=triggerRecords;Application∷activityRecords=(ApplicationMethod*)activityRecords;Application∷objectRecords=objectRecords;Application∷modeRecords=modeRecords;Application∷objects=FrameTable;Application∷applicationRecord=&amp;applicationRecord;Application∷children=childrenArray;rootObject.init(cOB_RootObject,this);pbDefault.init(cOB_Default,this);pbHistory.init(cOB_History,this);pbDeepHistory.init(cOB_DeepHistory,this);pbBToA.init(cOB_BToA,this);pbNext.init(cOB_Next,this);LampA.init(cOB_LampA,this);LampE.init(cOB_LampE,this);LampF.init(cOB_LampF,this);LampG.init(cOB_LampG,this);LampH.init(cOB_LampH,this);rootMode.init(cOB_RootMode,this, _ModeFlags[(3*cMO_RootMode)], _ModeFlags[(3*cMO_RootMode)+1], _ModeFlags[(3*cMO_RootMode)+2]);ModeA.init(cOB_ModeA,this, _ModeFlags[(3*cMO_ModeA)], _ModeFlags[(3*cMO_ModeA)+1], _ModeFlags[(3*cMO_ModeA)+2]);ModeB.init(cOB_ModeB,this, _ModeFlags[(3*cMO_ModeB)], _ModeFlags[(3*cMO_ModeB)+1], _ModeFlags[(3*cMO_ModeB)+2]);ModeC.init(cOB_ModeC,this,_ModeFlags[(3*cMO_ModeC)],_ModeFlags[(3*cMO_ModeC)+1],_ModeFlags[(3*cMO_ModeC)+2]);ModeD.init(cOB_ModeD,this,_ModeFlags[(3*cMO_ModeD)],_ModeFlags[(3*cMO_ModeD)+1],_ModeFlags[(3*cMO_ModeD)+2]);ModeE.init(cOB_ModeE,this,_ModeFlags[(3*cMO_ModeE)],_ModeFlags[(3*cMO_ModeE)+1],_ModeFlags[(3*cMO_ModeE)+2]);ModeF.init(cOB_ModeF,this,_ModeFlags[(3*cMO_ModeF)],_ModeFlags[(3*cMO_ModeF)+1],_ModeFlags[(3*cMO_ModeF)+2]);ModeG.init(cOB_ModeG,this, _ModeFlags[(3*cMO_ModeG)], _ModeFlags[(3*cMO_ModeG)+1], _ModeFlags[(3*cMO_ModeG)+2]);ModeH.init(cOB_ModeH,this, _ModeFlags[(3*cMO_ModeH)], _ModeFlags[(3*cMO_ModeH)+1], _ModeFlags[(3*cMO_ModeH)+2]);rootMode.initActiveChild();ModeA.initActiveChild();ModeB.initActiveChild();ModeC.initActiveChild();ModeD.initActiveChild();ModeE.initActiveChild();ModeF.initActiveChild();ModeG.initActiveChild();ModeH.initActiveChild();_currentState.init(buffer1,cNumberModes);_nextState.init(buffer2,cNumberModes);_tempState.init(buffer3,cNumberModes);Application∷rootMode=&amp;rootMode;Application∷rootObject=&amp;rootObject;} myTask∷myTask() { _mainApp.init(this); setMainApplication(&amp;_mainApp); setupKernelTask(this); }; ∥declare one task myTask GlobalTask;]]></pre>應理解,本發(fā)明的軟件組分如果希望的活可以ROM(只讀存儲器)形式實現(xiàn)??偟恼f軟件組分如果希望可利用通常技術以硬件來實現(xiàn)。
應理解,為清楚起見,在分開的實施例的上下文中所描述的本發(fā)明的各種特點也可合在一單個實施例中組合地提供。相反,為概略起見在單個實施例上下文中所描述的本發(fā)明的各種特點也可分開地或在任何適當?shù)淖咏M合中達到。
熟悉本技術領域的人士將會理解本發(fā)明并不局限于以上所具體表示和說明的一切。而是本發(fā)明的范疇僅由所列權(quán)利要求加以規(guī)定。
權(quán)利要求
1.實現(xiàn)層次狀態(tài)圖的設備,包括狀態(tài)機具(SME),運行來執(zhí)行一系統(tǒng)的工況指令表;狀態(tài)圖編碼器,運行來以計算機代碼形式復制描述所述系統(tǒng)的工況指令表的用戶定義的層次狀態(tài)圖,所述編碼器運行來以第一數(shù)據(jù)結(jié)構(gòu)保持所述狀態(tài)圖的層次結(jié)構(gòu)的完整性;事件清單發(fā)生器,運行來為指令表內(nèi)的多個事件中的各個別事件生成與所述個別事件相關的所述狀態(tài)圖的狀態(tài)間的至少一變遷的清單,所述事件清單發(fā)生器運行來以第二數(shù)據(jù)結(jié)構(gòu)保持所述清單;和工況實現(xiàn)器,運行來激活所述系統(tǒng)以執(zhí)行其指令表中的每一操作過程。
2.按照權(quán)利要求1的設備,其特征是所述系統(tǒng)包括至少硬件和軟件之一。
3.按權(quán)利要求1的設備,其特征是所述第一數(shù)據(jù)結(jié)構(gòu)的大小與所述層次結(jié)構(gòu)中的轉(zhuǎn)移數(shù)成正比地線性增大。
4.按照權(quán)利要求1的設備,其特征是所述第二數(shù)據(jù)結(jié)構(gòu)的大小與所述至少一變遷的清單中的變遷數(shù)據(jù)正比地線性增大。
5.按照權(quán)利要求1的設備,其特征是每一所述清單的所述至少一變遷的順序?qū)谟伤鰧哟螤顟B(tài)圖所定義的對所述變遷的評價順序。
6.按照權(quán)利要求1的設備,其特征是所述事件清單發(fā)生器對之生成清單的所述多個事件包括至少一外部輸入事件。
7.按照權(quán)利要求1的設備,其特征是所述事件清單發(fā)生器對之生成清單的所述多個事件包括至少一內(nèi)部數(shù)據(jù)值變化事件,此設備還包括有運行來對狀態(tài)機具生成各數(shù)據(jù)值變化事件的通知的數(shù)據(jù)值變化事件通告器。
8.實現(xiàn)層次狀態(tài)圖的方法,此方法包括設立運行來執(zhí)行一系統(tǒng)的工況指令表的狀態(tài)機具(SME);以計算機代碼形式復制描述所述系統(tǒng)的工況指令表的用戶定義的層次狀態(tài)圖,所述復制步驟運行以保持所述狀態(tài)圖的層次結(jié)構(gòu)的完整性;為此指令表內(nèi)的多個事件中的各個別事件生成所述狀態(tài)圖的與所述個別事件相關的狀態(tài)間的至少一變遷的清單;和激活所述系統(tǒng)來執(zhí)行其指令表中的每一操作過程。
9.自動代碼生成方法,包括自動生成在存儲器中構(gòu)成保持所述圖的層次結(jié)構(gòu)的層次狀態(tài)圖的復制體的代碼;自動生成為第一多個輸入事件中的每一個構(gòu)成受該輸入事件影響的變遷的清單的代碼;自動生成為第二多個內(nèi)部數(shù)據(jù)變量的每一個構(gòu)成受該內(nèi)部數(shù)據(jù)變量中的變化影響的變遷的清單的代碼;自動生成向狀態(tài)機具通報內(nèi)部數(shù)據(jù)變量中的變化的代碼;和自動生成評價條件和實現(xiàn)動作和活動的代碼。
10.按照權(quán)利要求9的方法,包括如下步驟提供一運行來在接收到關于發(fā)生一事件的通報時評價受所述事件影響的變遷清單以便選擇要進行的變遷并進行所述變遷的狀態(tài)機具。
11.用于計算層次狀態(tài)機的狀態(tài)的方法,此方法包括提供運行來接收關于至少一事件的發(fā)生的通報的狀態(tài)機具;提供描述一系統(tǒng)的工況指令表的層次狀態(tài)圖;提供對每一所述事件的所述狀態(tài)圖的狀態(tài)間與之相關的至少一變遷的清單;評價所述至少一變遷的清單以便響應于所述至少一事件選擇要進行的變遷;和評價所述層次狀態(tài)圖來計算對應于所述被選擇變遷的狀態(tài)。
全文摘要
能使用戶實現(xiàn)層次狀態(tài)圖的設備。此設備包括:運行來執(zhí)行一系統(tǒng)的工況指令表的狀態(tài)機具(SME)(20);運行來以計算機代碼形式復制描述系統(tǒng)工況指令表的用戶定義的層次狀態(tài)圖的狀態(tài)圖編碼器(10),此編碼器運行來以第一數(shù)據(jù)結(jié)構(gòu)維持狀態(tài)圖層次結(jié)構(gòu)的完整性;運行來對指令表內(nèi)的多個事件中的各個別事件生成與此個別事件相關的狀態(tài)圖的狀態(tài)之間的至少一變遷的清單的事件清單發(fā)生器,此事件清單發(fā)生器運行以第二數(shù)據(jù)結(jié)構(gòu)維持此清單;和運行來激活系統(tǒng)以執(zhí)行其指令表中的每一操作的工況實現(xiàn)器。
文檔編號G06F9/44GK1249045SQ97181804
公開日2000年3月29日 申請日期1997年12月22日 優(yōu)先權(quán)日1996年12月25日
發(fā)明者弗里德里克·C·羅特巴爾 申請人:埃米爾泰克有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
清涧县| 呼图壁县| 准格尔旗| 肇东市| 沂源县| 博客| 广元市| 定结县| 句容市| 天全县| 琼中| 阳原县| 嘉义市| 博兴县| 凌海市| 教育| 龙里县| 克山县| 新民市| 焉耆| 克拉玛依市| 尚义县| 静安区| 鄂州市| 常宁市| 西吉县| 若羌县| 漳浦县| 石台县| 河北省| 揭阳市| 郸城县| 菏泽市| 赫章县| 宁波市| 池州市| 新和县| 嵊州市| 余干县| 民和| 青冈县|