在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

基于AWTK和AWPLC開發(fā)自定義功能塊

AGk5_ZLG_zhiyua ? 來源:ZLG致遠電子 ? 作者:ZLG開發(fā)者社區(qū) ? 2022-10-26 11:50 ? 次閱讀

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

背景

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

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

簡介

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

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

58d4e62c-54e0-11ed-a3b6-dac502259ad0.png

在 AWPLC 中,自定義功能塊和內置功能塊具有同等待遇,因為它們都是按同樣的方式加入進來的。在進入正題前,我們先聊一下,系統(tǒng)的可擴展性以及實現(xiàn)方法。

1.可擴展性的好處

在設計一個復雜軟件的架構時,可擴展性是必須考慮的因素。可擴展性至少帶來以下幾個好處:

可擴展性將軟件的框架與具體的實現(xiàn)分離開來,有助于降低系統(tǒng)的復雜度。系統(tǒng)的復雜性太高,會帶來一系列的問題,比如讓可理解性、可維護性和可靠性的降低,很多項目因此陷入無法掙脫的焦油坑里,最后士氣低落,人員流失,項目取消,公司蒙受巨大損失。在設計復雜軟件時,一定要存有敬畏之心;

可擴展性將軟件變化的部分隔離開來,不但可以讓擴展的功能獨立變化,也可以方便的擴展新功能。在 AWPLC 中,以后會擴展各種協(xié)議和算法的功能塊,必須保證 AWPLC 框架和這些擴展的功能塊是獨立的,才能讓開發(fā)工作順利進行;

可擴展性有利于團隊的協(xié)作。不同的通訊協(xié)議和算法,需要不同團隊的專家去開發(fā),可擴展性讓大家只要按相應的接口去實現(xiàn),就可以方便的集成起來,不需要太多跨團隊的交互。

2.如何保證可擴展性

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

針對接口編程。這個是大家都知道的,在《軟件設計模式》等書里,都反復強調了,這里不再贅述;

利用工廠模式隔離組件的創(chuàng)建。工廠模式也是人人都知道的,而且大家都覺得很"簡單"。但是能把工廠模式用好的程序員其實并不多見,一個主要原因就是很多人只會套用《軟件設計模式》的工廠模式,而《軟件設計模式》里幾個工廠模式在現(xiàn)實中并不實用。利用這些這些工廠模式,無法滿足 SOLID 原則中的開放封閉原則,增加一個新的擴展時,仍然需要修改對應的工廠。

AWPLC功能塊的接口

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

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

/**
*@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.功能塊的虛函數(shù)

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

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

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

}aw_plc_fb_vtable_t;

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

AWPLC功能塊的工廠

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

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

aw_plc_fb_t*aw_plc_fb_factory_create_fb(constchar*type);

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

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

ret_taw_plc_fb_factory_register(constchar*type,aw_plc_fb_create_tcreate);

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

ZTIMER

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

1.ZTIMER的結構

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

/**
*@classaw_plc_fb_ztimer_t
*@parentaw_plc_fb_t
*@annotation["fb"]
*循環(huán)定時器。
*
*>當輸入 IN 為 TRUE 時,開始計時,輸出 Q 為 FALSE,ET 開始記錄過去的時間。
*>定時時間到時,COUNT 增加 1,輸出 Q 在本次循環(huán)為 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 表示這是一個輸入參數(shù);

out 表示這是一個輸出參數(shù)。

2.ZTIMER的實現(xiàn)

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

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);

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

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

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • plc
    plc
    +關注

    關注

    5031

    文章

    13781

    瀏覽量

    472486
  • 定時器
    +關注

    關注

    23

    文章

    3289

    瀏覽量

    117345
  • zlg
    zlg
    +關注

    關注

    1

    文章

    69

    瀏覽量

    38551
  • 功能塊
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6170

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

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何使用BMLang開發(fā)自定義的算子?

    如何使用BMLang開發(fā)自定義的算子
    發(fā)表于 09-18 06:57

    1602自定義字符

    1602液晶能夠顯示自定義字符,能夠根據(jù)讀者的具體情況顯示自定義字符。
    發(fā)表于 01-20 15:43 ?1次下載

    怎么樣去開發(fā)自定義應用程序?

    Atmel小貼士 如何開發(fā)自定義應用程序
    的頭像 發(fā)表于 07-11 00:05 ?2548次閱讀

    如何用AWTKAWPLC快速開發(fā)嵌入式應用程序

    AWPLC 是 ZLG 自主研發(fā)的 PLC 系統(tǒng)(兼容 IEC61131-3),本文用一個簡單的溫度控制系統(tǒng),來演示如何用 AWTKAWPLC 快速開發(fā)嵌入式應用程序。
    的頭像 發(fā)表于 09-26 11:46 ?1616次閱讀

    基于AWTKAWPLC開發(fā)走馬燈程序

    AWPLC 是 ZLG 自主研發(fā)的 PLC 系統(tǒng)(兼容 IEC61131-3),本文用一個簡單的走馬燈程序,來演示如何用 AWTKAWPLC 快速開發(fā)嵌入式應用程序。
    的頭像 發(fā)表于 10-12 11:48 ?1331次閱讀

    AWTKAWPLC快速開發(fā)自定義功能塊

    AWPLC 是 ZLG 自主研發(fā)的 PLC 系統(tǒng)(兼容 IEC61131-3),本文以定時器為例介紹一下如何擴展自定義功能塊,以及代碼生成器的用法。
    的頭像 發(fā)表于 11-02 13:22 ?1303次閱讀

    【產品應用】用 AWTKAWPLC 快速開發(fā)嵌入式應用程序 (8)- AWBlock

    AWBlock是ZLG開發(fā)的可視化編程語言,具有功能塊圖的易用性和結構文本語言的靈活性,支持AWBlock是AWPLC的一個重要特色,充分利用AWBlock,可以大大提高開發(fā)效率。 ?
    的頭像 發(fā)表于 12-02 11:45 ?822次閱讀

    【產品應用】用 AWTKAWPLC 快速開發(fā)嵌入式應用程序 (9)- 模塊化

    AWPLC 為模塊化編程提供了良好支持,本文以簡化版的紅綠燈為例,把狀態(tài)轉換邏輯封裝成獨立的功能塊,演示了AWPLC模塊化編程的基本方法。 ?? 背景 AWTK ?全稱 Toolkit
    的頭像 發(fā)表于 12-07 11:40 ?980次閱讀

    自定義算子開發(fā)

    一個完整的自定義算子應用過程包括注冊算子、算子實現(xiàn)、含自定義算子模型轉換和運行含自定義op模型四個階段。在大多數(shù)情況下,您的模型應該可以通過使用hb_mapper工具完成轉換并順利部署到地平線芯片上……
    的頭像 發(fā)表于 04-07 16:11 ?3247次閱讀
    <b class='flag-5'>自定義</b>算子<b class='flag-5'>開發(fā)</b>

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

    AWPLC是ZLG自主研發(fā)的PLC系統(tǒng)(兼容IEC61131-3),本文用定時器為例介紹一下如何擴展自定義功能塊。背景AWTK全稱ToolkitAnyWhere,是ZLG
    的頭像 發(fā)表于 11-02 09:56 ?1095次閱讀
    【產品應用】用 <b class='flag-5'>AWTK</b> 和 <b class='flag-5'>AWPLC</b> 快速<b class='flag-5'>開發(fā)</b>嵌入式應用程序 (4)- <b class='flag-5'>自定義</b><b class='flag-5'>功能塊</b>(上)

    【產品應用】用 AWTKAWPLC 快速開發(fā)嵌入式應用程序 (5)- 自定義功能塊(下)

    AWPLC是ZLG自主研發(fā)的PLC系統(tǒng)(兼容IEC61131-3),本文以定時器為例介紹一下如何擴展自定義功能塊,以及代碼生成器的用法。背景AWTK全稱ToolkitAnyWhere,
    的頭像 發(fā)表于 11-04 10:12 ?1219次閱讀
    【產品應用】用 <b class='flag-5'>AWTK</b> 和 <b class='flag-5'>AWPLC</b> 快速<b class='flag-5'>開發(fā)</b>嵌入式應用程序 (5)- <b class='flag-5'>自定義</b><b class='flag-5'>功能塊</b>(下)

    【產品應用】用 AWTKAWPLC 快速開發(fā)嵌入式應用程序 (8)- AWBlock

    AWBlock是ZLG開發(fā)的可視化編程語言,具有功能塊圖的易用性和結構文本語言的靈活性,支持AWBlock是AWPLC的一個重要特色,充分利用AWBlock,可以大大提高開發(fā)效率。背景
    的頭像 發(fā)表于 12-05 15:26 ?737次閱讀
    【產品應用】用 <b class='flag-5'>AWTK</b> 和 <b class='flag-5'>AWPLC</b> 快速<b class='flag-5'>開發(fā)</b>嵌入式應用程序 (8)- AWBlock

    【產品應用】用 AWTKAWPLC 快速開發(fā)嵌入式應用程序 (9)- 模塊化

    AWPLC為模塊化編程提供了良好支持,本文以簡化版的紅綠燈為例,把狀態(tài)轉換邏輯封裝成獨立的功能塊,演示了AWPLC模塊化編程的基本方法。背景AWTK全稱ToolkitAnyWhere,
    的頭像 發(fā)表于 12-09 11:11 ?952次閱讀
    【產品應用】用 <b class='flag-5'>AWTK</b> 和 <b class='flag-5'>AWPLC</b> 快速<b class='flag-5'>開發(fā)</b>嵌入式應用程序 (9)- 模塊化

    AWTK 開源串口屏開發(fā)(18) - 用 C 語言自定義命令

    編寫代碼即可實現(xiàn)常見的應用。但是,有時候我們需要自定義一些命令,以實現(xiàn)一些特殊的功能。本文檔介紹如何使用C語言自定義命令。1.實現(xiàn)hmi_model_cmd_t接口
    的頭像 發(fā)表于 05-11 08:24 ?686次閱讀
    <b class='flag-5'>AWTK</b> 開源串口屏<b class='flag-5'>開發(fā)</b>(18) - 用 C 語言<b class='flag-5'>自定義</b>命令

    AWTK使用經驗】如何自定義combo_box下拉框樣式

    AWTK是基于C語言開發(fā)的跨平臺GUI框架。《AWTK使用經驗》系列文章將介紹開發(fā)AWTK過程中一些常見問題與解決方案,例如:如何加載外部資
    的頭像 發(fā)表于 05-23 08:25 ?752次閱讀
    【<b class='flag-5'>AWTK</b>使用經驗】如何<b class='flag-5'>自定義</b>combo_box下拉框樣式
    主站蜘蛛池模板: 老汉色视频 | 久久中出 | 人人射人人插 | 69堂在线观看国产成人 | 四虎影院观看视频在线观看 | 日韩特黄特色大片免费视频 | 免费无毒片在线观看 | 手机在线看 | 欧美亚洲综合图区在线 | 色秀视频免费网站在线观看 | 日本天堂影院在线播放 | 亚洲激情综合 | 色干干 | 伊人网99 | 天天干天天拍天天射天天添天天爱 | 美脚连裤袜老师正在播放 | 亚洲午夜精品一区二区 | 四虎影库在线播放 | 四虎国产精品影库永久免费 | 国产精品久久久久久久久 | 欧美日韩啪啪 | 亚洲怡红院在线观看 | 手机看片福利日韩 | 亚洲免费视频播放 | 在线观看视频免费 | 欧美一区二区三区在线 | 国产二区三区 | 国产免费爽爽视频免费可以看 | 亚洲va中文字幕 | 久久深夜福利 | 日韩欧美亚洲综合一区二区 | 日本国产视频 | 美日韩中文字幕 | 日韩欧美在线第一页 | 精品三级内地国产在线观看 | 亚洲午夜视频在线观看 | 日本一二区视频 | 成人小视频在线 | 色爽女视频 | 欧美.亚洲.日本一区二区三区 | 亚洲视频一 |