国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【產品應用】用 AWTK 和 AWPLC 快速開發嵌入式應用程序 (4)- 自定義功能塊(上)

ZLG致遠電子 ? 2022-11-02 09:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

AWPLC 是 ZLG 自主研發的 PLC 系統(兼容 IEC61131-3),本文用定時器為例介紹一下如何擴展自定義功能塊。

d64143d8-578f-11ed-b116-dac502259ad0.jpg 背景

AWTK 全稱 Toolkit AnyWhere,是 ZLG 開發的開源 GUI 引擎,旨在為嵌入式系統、WEB、各種小程序、手機和 PC 打造的通用 GUI 引擎,為用戶提供一個功能強大、高效可靠、簡單易用、可輕松做出炫酷效果的 GUI 引擎。

AWPLC 是 ZLG 自主研發的 PLC 系統(兼容 IEC61131-3),其中 AWPLC 的運行時庫(Runtime)基于 ZLG TKC 開發,可以移植到到任何主流 RTOS嵌入式系統。AWPLC 的集成開發環境(IDE)基于 AWTK 開發,可以運行在 Windows、MacOS 和 Linux 系統之上。AWPLC 的主要目標之一是把 PLC 中低代碼開發方法引入到嵌入式軟件,從而提高嵌入式軟件的開發效率和可靠性。

d64143d8-578f-11ed-b116-dac502259ad0.jpg 簡介

在前一篇文章中,我們說過,AWPLC 的重要特色之一就是高度可擴展,而且會內置 ZLG 多年在嵌入式系統開發中積累的功能塊,包括各種算法、協議和實用功能,這將大大簡化嵌入式軟件的開發。

那怎么去開發自定義的功能塊呢?本文以 ZTIMER 為例介紹一下開發自定義功能塊的方法。ZTIMER 是一個帶計數功能的定時器,在前一篇文章中,我們用它實現了一個走馬燈的演示,其使用方法如下:

d64dfbe6-578f-11ed-b116-dac502259ad0.png

在 AWPLC 中,自定義功能塊和內置功能塊具有同等待遇,因為它們都是按同樣的方式加入進來的。在進入正題前,我們先聊一下,系統的可擴展性以及實現方法。1.可擴展性的好處在設計一個復雜軟件的架構時,可擴展性是必須考慮的因素。可擴展性至少帶來以下幾個好處:

  • 可擴展性將軟件的框架與具體的實現分離開來,有助于降低系統的復雜度。系統的復雜性太高,會帶來一系列的問題,比如讓可理解性、可維護性和可靠性的降低,很多項目因此陷入無法掙脫的焦油坑里,最后士氣低落,人員流失,項目取消,公司蒙受巨大損失。在設計復雜軟件時,一定要存有敬畏之心;
  • 可擴展性將軟件變化的部分隔離開來,不但可以讓擴展的功能獨立變化,也可以方便的擴展新功能。在 AWPLC 中,以后會擴展各種協議和算法的功能塊,必須保證 AWPLC 框架和這些擴展的功能塊是獨立的,才能讓開發工作順利進行;
  • 可擴展性有利于團隊的協作。不同的通訊協議和算法,需要不同團隊的專家去開發,可擴展性讓大家只要按相應的接口去實現,就可以方便的集成起來,不需要太多跨團隊的交互。

2.如何保證可擴展性

讓軟件系統具有可擴展性,通常并不是什么難事,只要做到下面兩點就可以了:

  • 針對接口編程。這個是大家都知道的,在《軟件設計模式》等書里,都反復強調了,這里不再贅述;
  • 利用工廠模式隔離組件的創建。工廠模式也是人人都知道的,而且大家都覺得很"簡單"。但是能把工廠模式用好的程序員其實并不多見,一個主要原因就是很多人只會套用《軟件設計模式》的工廠模式,而《軟件設計模式》里幾個工廠模式在現實中并不實用。利用這些這些工廠模式,無法滿足 SOLID 原則中的開放封閉原則,增加一個新的擴展時,仍然需要修改對應的工廠。

d64143d8-578f-11ed-b116-dac502259ad0.jpg AWPLC功能塊的接口

要讓 AWPLC 支持擴展各種自定義的功能塊,首要條件條件是定義好功能塊的接口。

1.功能塊的基類在面向對象的 C 語言編程中,我們用結構(struct)來模擬類和接口。這里所說的接口是廣義的接口,而不是 C++或其它語言中只包含純虛函數的 interface,因為除了虛函數指針外,這里還有一些數據成員。

/**
*@classaw_plc_fb_t
* AWPLC 功能塊接口。
*/
struct_aw_plc_fb_t{
/**
*@property{bool_t}en
*是否啟用。
*/
uint8_ten:1;
/**
*@property{bool_t}eno
*是否啟用輸出。
*/
uint8_teno:1;

/*private*/
constaw_plc_fb_vtable_t*vt;

};

2.功能塊的虛函數

在功能塊的虛函數表中,還定義了一些描述性的常量,讓對象具有一點反射的能力,方便在運行時查詢它的一些狀態。順便說一下,在定義接口的虛函數時,通常不會有創建函數,因為創建之前對象之前,是拿不到這個虛表對象的。但也不是絕對的,有時為了方便 clone,也可能提供一個 clone 函數或者 create 函數。

任何接口都要定義析構函數(destroy),在對象需要銷毀時,框架可以以統一的方式銷毀它。

typedefstruct_aw_plc_fb_vtable_t{
/*功能塊的類型名*/
constchar*type;
/*輸入參數名稱列表,以NULL結束的字符串數組*/
constchar*const*ins;
/*輸出參數名稱列表,以NULL結束的字符串數組*/
constchar*const*outs;
/*輸入輸出參數名稱列表,以NULL結束的字符串數組*/
constchar*const*in_outs;
/*執行函數*/
aw_plc_fb_exec_texec;
/*執行函數(帶參數)*/
aw_plc_fb_exec_ex_texec_ex;
/*獲取屬性(輸入輸出參數)的值*/
aw_plc_fb_get_prop_tget_prop;
/*獲取輸出的值*/
aw_plc_fb_get_output_tget_output;
/*設置輸出的值*/
aw_plc_fb_set_input_tset_input;
/*析構函數*/
aw_plc_fb_destroy_tdestroy;

}aw_plc_fb_vtable_t;

* 這個虛函數表和 AWTK/TKC 中的 object 虛函數表很相似,考慮到 object 為了做得通用,有點臃腫了,所以決定重新定義一套。


d64143d8-578f-11ed-b116-dac502259ad0.jpg AWPLC功能塊的工廠

前面我們說過,可擴展性除了針對接口編程外,離不開工廠模式的支持。功能塊的工廠其任務當然是創建功能塊了,所以提供了一個創建功能塊的函數。參數 type 指定功能塊的類型,函數返回對應類型的功能塊:

/**
*@methodaw_plc_fb_factory_create_fb
*創建 fb。
*@param {const char*} type 類型。
*
*@return {aw_plc_fb_t*}返回 fb 對象。
*/

aw_plc_fb_t*aw_plc_fb_factory_create_fb(constchar*type);

有了這個創建函數,確實把創建任務與功能塊的實現分開了。但是請想一下,如果每次增加新的功能塊,都要修改這個創建函數,而這個函數又屬于框架的一部分,框架是不是還是依賴于具體實現了呢?為了解決這個問題,我們需要提供一種注冊機制來實現依賴倒置,讓功能塊的實現者主動將創建函數注冊進來:

/**
*@methodaw_plc_fb_factory_register
*注冊創建函數。
*@param {const char*} type 類型。
*@param {aw_plc_fb_create_t} create 創建函數。
*
*@return {ret_t}返回 RET_OK 表示成功,否則表示失敗。
*/

ret_taw_plc_fb_factory_register(constchar*type,aw_plc_fb_create_tcreate);

這種機制非常好用,真正滿足了 SOLID 原則中的開放封閉原則(OCP):擴展新的功能無需修改框架代碼。在 ZLG 開源 GUI 引擎中,也大量使用了這種帶注冊功能的工廠模式,有興趣的朋友可以去看看 AWTK 的代碼。


d64143d8-578f-11ed-b116-dac502259ad0.jpg ZTIMER

前面我們說過,可擴展性除了針對接口編程外,離不開工廠模式的支持。功能塊的工廠其任務當然是創建功能塊了,所以提供了一個創建功能塊的函數。參數 type 指定功能塊的類型,函數返回對應類型的功能塊:

1.ZTIMER的結構

在 C 語言中,一般用結構來模擬類,把基類作為結構的第一個成員來模擬繼承。這里必須讓 aw_plc_fb_t 作為 aw_plc_fb_ztimer_t 的第一個成員。

/**
*@classaw_plc_fb_ztimer_t
*@parentaw_plc_fb_t
*@annotation["fb"]
*循環定時器。
*
*>當輸入 IN 為 TRUE 時,開始計時,輸出 Q 為 FALSE,ET 開始記錄過去的時間。
*>定時時間到時,COUNT 增加 1,輸出 Q 在本次循環為 TRUE,ET 重置為0。
*>輸入 IN 為 FALSE 時重置定時器。
*/
typedefstruct_aw_plc_fb_ztimer_t{
aw_plc_fb_tfb;

/**
*@property{bool_t}in
*@annotation["in"]
*為 TRUE 開始計時,為 FALSE 時重置定時器。
*/
bool_tin:1;

/**
*@property{iec_time_t}pt
*@annotation["in"]
*預設時間(ms)。
*/
iec_time_tpt;

...

}aw_plc_fb_ztimer_t;

這里的 API 注釋采用了 AWTK 中定義的格式,但是對 annotation 做了一點擴展,增加了 3 個新的取值:

fb 表示這是一個功能塊;

in 表示這是一個輸入參數;

out 表示這是一個輸出參數。

2.ZTIMER的實現

每個功能塊必須提供虛函數表中定義的函數,不過主要代碼集中 exec 函數里(其它函數可以自動生成出來):

staticret_taw_plc_fb_ztimer_exec(aw_plc_fb_t*fb){
aw_plc_fb_ztimer_t*ztimer=AW_PLC_FB_ZTIMER(fb);

if(aw_plc_fb_before_exec(fb)==RET_OK){
ztimer->current_time=aw_plc_now_ms();
if(ztimer->state==0&&!ztimer->prev_in&&ztimer->in){
ztimer->state=1;
ztimer->q=FALSE;

ztimer->et=0;
ztimer->count=0;
ztimer->start_time=ztimer->current_time;
}else{
if(!ztimer->in){
ztimer->q=FALSE;
ztimer->state=0;

ztimer->et=0;
ztimer->count=0;
ztimer->start_time=ztimer->current_time;
}elseif(ztimer->state==1){
if((ztimer->start_time+ztimer->pt)<=?ztimer->current_time){
ztimer->q=TRUE;

ztimer->et=0;
ztimer->count++;
ztimer->start_time=ztimer->current_time;
}else{
ztimer->q=FALSE;
ztimer->et=ztimer->current_time-ztimer->start_time;
}
}
}
ztimer->prev_in=ztimer->in;
}

returnRET_OK;

}

3.注冊ZTIMER

功能塊需要注冊到前面介紹的功能塊工廠:

aw_plc_fb_factory_register(AW_PLC_FB_TYPE_ZTIMER,aw_plc_fb_ztimer_create);

坦白的講,本文只是介紹了實現自定義功能塊的關鍵步驟,實際工作要麻煩很多。如果手工去做這些工作,開發一個功能塊還覺得好玩,而開發幾十個甚至幾百個功能塊,人不會變瘋就會變傻。下一篇文章會我們介紹一下,如何用代碼生成器來完成這些單調的工作,讓開發自定義功能塊成為一項快樂的工作。

AWPLC 目前還處于開發階段的早期,寫這個系列文章的目的,除了用來驗證目前所做的工作外,還希望得到大家的指點和反饋。如果您有任何疑問和建議,請在評論區留言。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5198

    文章

    20442

    瀏覽量

    333978
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    電能質量在線監測裝置可自定義監測時段嗎?

    電能質量在線監測裝置 完全支持自定義監測時段 ,并提供 精細化、差異化 的配置能力。核心通過 嵌入式任務調度系統 結合 本地 / 遠程參數配置 實現,可靈活設定監測開始 / 結束時間、采樣頻率、數據
    的頭像 發表于 12-10 13:58 ?359次閱讀
    電能質量在線監測裝置可<b class='flag-5'>自定義</b>監測時段嗎?

    嵌入式系統的定義和應用領域

    開發方式各有差異,但它們都構成了一個片的完整計算機系統,這一點是毋庸置疑的。然而,嵌入式系統的定義則相對模糊,缺乏像單片機那樣明確的“
    發表于 11-17 06:49

    PYQT 應用程序框架及開發工具

    特點,已成為嵌入式領域的重要開發工具 PyQt 是一個創建 GUI 應用程序的工具包。它是 Python 編程語言和 Qt 庫的成功融合。因為可用的類有很多,他們被分成幾個模塊。QtCore 模塊
    發表于 10-29 07:15

    CYPD3171自定義應用程序在接收模式下工作,但在源模式下不通告任何協議是怎么回事?

    我在自定義應用程序中結合使用 CYPD3171 芯片和 sc8815。基本我只需要芯片協商電源角色、電壓和電流,然后將該信息發送給 MCU。我修改了示例移動電源代碼,禁用所有安全功能
    發表于 07-22 08:21

    LOTO示波器自定義解碼功能—CANFD解碼

    /?spm_id_from=333.1365.list.card_archive.click 。 視頻中僅對串口進行解碼演示,正好我們從客戶手中拿到了一USB轉CAN/CANFD模塊,如下圖所示, 本文借此對自定義解碼功能
    的頭像 發表于 07-11 10:34 ?1050次閱讀
    LOTO示波器<b class='flag-5'>自定義</b>解碼<b class='flag-5'>功能</b>—CANFD解碼

    嵌入式軟件開發常用的軟件有哪些?

    軟件功能。 2. Visual Studio 簡稱VS: 它是一個IDE,集成開發環境。驗證C程序或是進行c#程序開發,可以用它。一些與
    發表于 07-03 17:06

    【RA8D1-Vision Board】openmv實現鳥巢識別 | 技術集結

    ,并在邊緣設備運行這些模型,而無需互聯網連接。EdgeImpulse提供了一系列的工具和庫,使開發人員能夠快速有效地構建和部署自定義嵌入式
    的頭像 發表于 06-22 09:33 ?693次閱讀
    【RA8D1-Vision Board】openmv實現鳥巢識別 | 技術集結

    Linux嵌入式和單片機嵌入式的區別?

    新的應用程序和驅動程序來擴展功能。 6. 開發難度 : 單片機嵌入式開發難度相對較低,適
    發表于 06-20 09:46

    運行在嵌入式系統的emApps

    在當今快節奏的嵌入式系統世界中,靈活性和適應性是嵌入式系統實現的關鍵。SEGGER推出了其最新創新:Embedded apps(emApps)應用,類似于手機上的應用程序,可以運行在嵌入式
    的頭像 發表于 06-18 09:53 ?863次閱讀
    運行在<b class='flag-5'>嵌入式</b>系統<b class='flag-5'>上</b>的emApps

    KiCad 中的自定義規則(KiCon 演講)

    “ ?Seth Hillbrand 在 KiCon US 2025 為大家介紹了 KiCad 的規則系統,并詳細講解了自定義規則的設計與實例。? ” ? 演講主要圍繞 加強 KiCad 中的自定義
    的頭像 發表于 06-16 11:17 ?2123次閱讀
    KiCad 中的<b class='flag-5'>自定義</b>規則(KiCon 演講)

    HarmonyOS實戰:高德地圖自定義定位圖標展示

    前言 地圖定位功能基本已經成了日常應用程序的必備功能之一,在日常開發地圖定位的功能的時候難免會
    的頭像 發表于 06-09 14:59 ?741次閱讀
    HarmonyOS實戰:高德地圖<b class='flag-5'>自定義</b>定位圖標展示

    HarmonyOS應用自定義鍵盤解決方案

    自定義鍵盤是一種替換系統默認鍵盤的解決方案,可實現鍵盤個性化交互。允許用戶結合業務需求與操作習慣,對按鍵布局進行可視化重構、設置多功能組合鍵位,使輸入更加便捷和舒適。在安全防護層面,自定義鍵盤可以
    的頭像 發表于 06-05 14:19 ?2396次閱讀

    如何在不使用USB控制器的情況下對CYPD2119-24LQXI自定義配置進行編程?

    我想要編程(如果可能的話通過 SWD)一個自定義但相當基本的“Type-C 到 DP”AltMode 適配器功能,到安裝在自定義 PCB 的CYPD2119-24LQXI設備
    發表于 05-13 06:35

    嵌入式開發:高門檻的系統性工程與 996 的行業困局

    嵌入式開發的門檻,往往被培訓機構和表象所掩蓋。許多人誤以為 “ C 語言寫個跑在 ARM 程序” 就是嵌入式,實則連皮毛都未觸及。真正
    的頭像 發表于 04-09 11:06 ?980次閱讀
    <b class='flag-5'>嵌入式開發</b>:高門檻的系統性工程與 996 的行業困局

    如何添加自定義單板

    開發過程中,用戶有時需要創建自定義板配置。本節將通過一個實例講解用戶如何創建屬于自己的machine,下面以g2l-test.conf為例進行說明。
    的頭像 發表于 03-12 14:43 ?1349次閱讀