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

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

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

3天內不再提示

如何擴展自定義功能塊,以及代碼生成器的用法

AGk5_ZLG_zhiyua ? 來源:ZLG致遠電子 ? 作者:ZLG致遠電子 ? 2022-11-02 13:26 ? 次閱讀

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

70e5e40e-5a63-11ed-a3b6-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 中低代碼開發方法引入到嵌入式軟件,從而提高嵌入式軟件的開發效率和可靠性。

70e5e40e-5a63-11ed-a3b6-dac502259ad0.jpg簡介

在前一篇文章中,我們介紹了自定義 AWPLC 功能塊的基本方法,但是有些部分的內容并沒有提到,比如:

1. 功能塊的部分虛函數的實現。這些函數在不同功能塊中的實現是不同的,所以要做成虛函數,但是在各個功能塊中的實現又是相似的,不得不去寫一遍。比如 get_prop 這個函數,它在 ZTIMER 中的實現如下:

staticret_taw_plc_fb_ztimer_get_prop(aw_plc_fb_t*fb,constchar*name,value_t*v){
aw_plc_fb_ztimer_t*ztimer=AW_PLC_FB_ZTIMER(fb);

if(tk_str_eq(name,AW_PLC_FB_ZTIMER_PROP_IN)){
value_set_bool(v,ztimer->in);
returnRET_OK;
}

if(tk_str_eq(name,AW_PLC_FB_ZTIMER_PROP_PT)){
value_set_uint64(v,ztimer->pt);
returnRET_OK;
}

if(tk_str_eq(name,AW_PLC_FB_ZTIMER_PROP_Q)){
value_set_bool(v,ztimer->q);
returnRET_OK;
}

if(tk_str_eq(name,AW_PLC_FB_ZTIMER_PROP_ET)){
value_set_uint64(v,ztimer->et);
returnRET_OK;
}

if(tk_str_eq(name,AW_PLC_FB_ZTIMER_PROP_COUNT)){
value_set_uint32(v,ztimer->count);
returnRET_OK;
}

returnRET_NOT_FOUND;

}

*這樣的代碼看起來很簡單,但是恰恰容易出錯,更容易讓人厭倦,沒有什么樂趣。

2. API 和結構的注釋。我們來看看 ZTIMER 的結構注釋:

/**
*@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;

/**
*@property{bool_t}q
*@annotation["default","out"]
*定時時間是否到(僅在時間到的當次循環為 TRUE)。
*/
bool_tq:1;

/**
*@property{iec_time_t}et
*@annotation["out"]
*過去時間(ms)。
*/
iec_time_tet;

/**
*@property{uint32_t}count
*@annotation["out"]
*定時器時間到的次數。
*/
uint32_tcount;

/**
*@property{bool_t}prev_in
*@annotation["private"]
*前一次的輸入。
*/
bool_tprev_in:1;

/**
*@property{uint8_t}state
*@annotation["private"]
*狀態。
*/
uint8_tstate;

/**
*@property{iec_time_t}current_time
*@annotation["private"]
*當前時間(ms)。
*/
iec_time_tcurrent_time;

/**
*@property{iec_time_t}start_time
*@annotation["private"]
*開始時間(ms)。
*/
iec_time_tstart_time;

}aw_plc_fb_ztimer_t;

*上面的代碼看起來很美觀,讀起來很舒服,但是寫起來卻是有些費勁。3. IDE 需要功能塊的描述信息,以方便把它呈現到界面上。比如 ZTIMER 的描述信息如下:

{
"type":"fb_zlg_misc.ztimer",
"real_type":"ZTIMER",
"helpUrl":"https://developer.zlg.cn",
"style":"fb",
"desc":"循環定時器。 >當輸入 IN 為 TRUE 時,開始計時,輸出 Q 為 FALSE,ET 開始記錄過去的時間。
>定時時間到時,COUNT 增加 1,輸出 Q 在本次循環為 TRUE,ET 重置為0。 >輸入 IN 為 FALSE 時重置定時器。",
"ins":[
{
"name":"IN",
"desc":"為 TRUE 開始計時,為 FALSE 時重置定時器。",
"min_connections":1,
"max_connections":1,
"data_type":"BOOL"
},
{
"name":"PT",
"desc":"預設時間(ms)。",
"min_connections":1,
"max_connections":1,
"data_type":"TIME"
}
],
"outs":[
{
"name":"Q",
"desc":"定時時間是否到(僅在時間到的當次循環為 TRUE)。",
"data_type":"BOOL"
},
{
"name":"ET",
"desc":"過去時間(ms)。",
"data_type":"TIME"
},
{
"name":"COUNT",
"desc":"定時器時間到的次數。",
"data_type":"DWORD"
}
]

}

*這個 JSON 文件中的內容,和前面結構的注釋很相似,除了呈現的格式不同,同時還加了一些新內容。4. IDE 需要的文檔。功能塊需要提供一個 markdown 文檔,這個文檔會被轉換成 html,在用戶查看幫助時顯示給用戶。ZTIMER 的文檔內容如下:

#ZTIMER

##功能

循環定時器。

>當輸入 IN 為 TRUE 時,開始計時,輸出 Q 為 FALSE,ET 開始記錄過去的時間。
>定時時間到時,COUNT 增加 1,輸出 Q 在本次循環為 TRUE,ET 重置為0。
>輸入 IN 為 FALSE 時重置定時器。

##輸入

* IN **BOOL**為 TRUE 開始計時,為 FALSE 時重置定時器。
* PT **TIME**預設時間(ms)。

##輸出

* Q **BOOL**定時時間是否到(僅在時間到的當次循環為 TRUE)。
* ET **TIME**過去時間(ms)。

* COUNT **DWORD**定時器時間到的次數。 *這個文檔的內容和前面結構的注釋,除了形式不同,內容是差不多的。很抱歉貼了這么代碼,希望您并沒仔細去讀它們。不要被這些代碼嚇到,它們都是自動生成的。如果手工去寫這些代碼,一天能寫一個功能塊就不錯了,不但辛苦而且容易出錯。這些工作必須自動完成!所以 AWPLC 中提供了一個代碼生成器,實測這個代碼生成器讓工作效率提高 10倍,幸福指數提高 10倍。

在進入正題前,我們先聊一下代碼生成器的基本知識。

70e5e40e-5a63-11ed-a3b6-dac502259ad0.jpg代碼生成器基本知識

* 編寫能編寫代碼的代碼。-- 《程序員修煉之道》

代碼生成器是一個普通程序,它能夠生成另外的目標代碼。可以不要代碼生成器,直接編寫目標代碼嗎?通常情況下是可以的,但是這違背了優秀程序員的第一美德-懶惰。因為懶惰,所以能讓計算機做的事,優秀程序員是不會自己去做的。

這里所說的目標代碼,也并非一定是嚴格意義上的代碼,也可能是另外一些數據。當然,有時候要嚴格區分數據和代碼,本身就是一件困難的事情。不過,這不是我們要說的重點,重點是通過代碼生成器提升我們的工作效率。*一個人的數據就是另外一個人的代碼。--《編程珠璣 II》1.代碼生成器的分類要說分類,就要先說分類的標準,在不同的分類標準和分類依據下,分出的類別迥異。《程序員修煉之道》里提到的一個分類標準具有極強的實用意義,這里我們重點介紹一下。它根據生成的目標代碼是否需要二次修改來分類,將代碼生成器分為兩類:
  • 被動代碼生成器目標代碼生成之后,需要進行修改和完善,然后獨立發展和維護,與代碼生成器再與關系。比如 IDE 的 Wizard 就是此例。前面提到的自定義控件生成器,代碼生成之后,你需要在上面添加需要的功能。如果過了一段時間,你想為控件添加一個新的屬性,可能會遇到一點麻煩,要么手工添加;要么重新生成代碼,然后把之前修改的代碼重新加上,無論哪種方式都不是愉快的方式。被動代碼生成器雖然有它的缺陷,但是仍然可以給我們帶來很大幫助。

  • 主動代碼生成器目標代碼生成之后,不需要進行修改和完善,每次都重新生成,如果需要修改,修改元數據和代碼生成器。比如編譯器就是此例。前面提到的 MVVM 的 ViewModel 和 AWFlow 應用代碼生成也屬于此類。如果可以,優先使用主動代碼生成器。

2.基本形式71186a28-5a63-11ed-a3b6-dac502259ad0.png

這是代碼生成器的基本形式:代碼生成器讀取元數據,生成目標代碼。元數據是描述數據的數據,這里是描述目標代碼的數據,也就是控制目標代碼的參數。一般情況下,目標代碼整體結構由代碼生成器決定,而變化的部分由元數據決定。

代碼生成器本身一個很有意思的話題,有機會可以專門來聊聊,本文就不扯遠了。

70e5e40e-5a63-11ed-a3b6-dac502259ad0.jpgAWPLC中的代碼生成器

按前面代碼生成器的分類方式,AWPLC 里實現了一個主動代碼生成器,實現成主動代碼生成器是很重要的,AWPLC 還在快速迭代中,有些接口可能會變化,主動代碼生成器保證,即使接口有變化,也只需要運行一些腳本,重新生成目標文件即可。

1.基本架構

AWPLC 功能塊代碼生成器架構如下圖所示。其中功能塊描述文件就是前面所說的元數據,代碼生成器用它生成前面介紹的各種代碼和數據。713afc82-5a63-11ed-a3b6-dac502259ad0.png

2.功能塊描述文件格式

描述文件用標準的 JSON 格式,其內容包括兩個部分:

2.1基本信息

基本信息包括:

  • name 功能塊的名稱。英文小寫,必須是合格的 C 語言變量名;
  • category 功能塊所屬的分類。各層級之間用/分隔,它決定了生成文件的位置;
  • is_function_block true 表示功能塊,false 表示函數;
  • impl 具體實現的源文件;
  • author 作者聯系方式;
  • version 版本號;;
  • date 更新時間;
  • desc 功能描述;
  • properties 屬性列表。具體定義如下。

示例:

"name":"ztimer",
"category":"zlg/misc",
"is_function_block":true,
"impl":"input/zlg/misc/ztimer.c",
"author":"LiXianJing",
"desc":"循環定時器。 >當輸入 IN 為 TRUE 時,開始計時,輸出 Q 為 FALSE,ET 開始記錄過去的時間>。 >定時時間到時,COUNT 增加 1,輸出 Q 在本次循環為 TRUE,ET 重置為0。 >輸入 IN 為 FALSE 時重
置定時器。",

2.2屬性描述對于每個屬性,又包括下列信息:
  • name 屬性名;
  • desc 屬性描述;
  • type 實際的數據類型;
  • data_type(可選)用于在 IDE 中時類型檢查,缺省為 type 對應的 IEC 的數據類型,但是有時可用 ANY_INT 和 ANY_NUM 等來放寬類型檢查;
  • annotation 用于額外的標識。目前主要用于指定輸入輸出等特性。
示例:

{
"name":"count",
"desc":"定時器時間到的次數。",
"type":"uint32_t",
"annotation":{
"out":true
}

},

2.3使用方法

代碼生成器用 nodejs 編寫,需要安裝 nodejs。具體用法如下:

node gen.js 描述文件名。

如:

nodegen.jsinput/zlg/misc/ztimer.json

上面介紹了用 C 語言開發原生功能塊的方法。當然,也可以用 IEC 61131-3 中一些語言開發功能塊,除此之外,AWPLC 還會支持用 AWBlock 開發功能塊,在后續文章中,我們將一一介紹,敬請關注。AWPLC 目前還處于開發階段的早期,寫這個系列文章的目的,除了用來驗證目前所做的工作外,還希望得到大家的指點和反饋。


審核編輯 :李倩


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

    關注

    5126

    文章

    19453

    瀏覽量

    313412
  • plc
    plc
    +關注

    關注

    5028

    文章

    13610

    瀏覽量

    471117
  • 生成器
    +關注

    關注

    7

    文章

    322

    瀏覽量

    21577

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何添加自定義單板

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

    Python中的迭代器與生成器

    Python迭代器與生成器 列表生成式 列表生成式也叫做列表推導式,它本身還是列表,只不過它是根據我們定義的規則來生成一個真實的列表。 ?
    的頭像 發表于 02-20 10:43 ?250次閱讀

    開源隨機數生成器庫OpenRNG助力實現移植到Arm平臺時的最佳性能

    OpenRNG 實現了多種生成器和分布方式。生成器算法可生成“看似隨機”并具有某些統計特性的序列,我們將在下文進行討論。分布方式會將序列映射到常見的概率分布概念,如高斯分布或二項分布
    的頭像 發表于 02-08 09:24 ?1060次閱讀
    開源隨機數<b class='flag-5'>生成器</b>庫OpenRNG助力實現移植到Arm平臺時的最佳性能

    Altium Designer 15.0自定義元件設計

    電子發燒友網站提供《Altium Designer 15.0自定義元件設計.pdf》資料免費下載
    發表于 01-21 15:04 ?0次下載
    Altium Designer 15.0<b class='flag-5'>自定義</b>元件設計

    自定義Modbus通信指令的搭建教程

    和歐姆龍E5EZ的智能溫控儀表作為從站為例,為大家分享如何使用自定義的Modbus RTU的通信程序,來實現快速高效的Modbus通信程序設計。同時在本文的結尾會為大家提供參考程序和打包好的Modbus RTU通信的庫指令,
    的頭像 發表于 01-20 10:37 ?850次閱讀
    <b class='flag-5'>自定義</b>Modbus通信<b class='flag-5'>塊</b>指令的搭建教程

    超詳細!FMU生成器用戶手冊來啦~

    生成器用戶手冊和相關示例,超詳細介紹,速來圍觀!本文關鍵詞:TSMaster,FMU,FMI目錄Catalog1.關于手冊介紹2.FMU功能概要3.Windows
    的頭像 發表于 01-17 20:02 ?643次閱讀
    超詳細!FMU<b class='flag-5'>生成器</b>用戶手冊來啦~

    think-cell:自定義think-cell(四)

    C.5 設置默認議程幻燈片布局 think-cell 議程可以在演示文稿中使用特定的自定義布局來定義議程、位置和議程幻燈片上的其他形狀,例如標題或圖片。通過將此自定義布局添加到模板,您可以為整個組織
    的頭像 發表于 01-13 10:37 ?358次閱讀
    think-cell:<b class='flag-5'>自定義</b>think-cell(四)

    think-cell;自定義think-cell(一)

    布局介紹了如何創建自定義議程幻燈片布局,第六部分 C.6 功能自定義 介紹了如何使用 PowerPoint 的功能自定義選項
    的頭像 發表于 01-08 11:31 ?519次閱讀
    think-cell;<b class='flag-5'>自定義</b>think-cell(一)

    EE-322:面向SHARC處理器的專家代碼生成器

    電子發燒友網站提供《EE-322:面向SHARC處理器的專家代碼生成器.pdf》資料免費下載
    發表于 01-07 14:04 ?0次下載
    EE-322:面向SHARC處理器的專家<b class='flag-5'>代碼</b><b class='flag-5'>生成器</b>

    創建自定義的基于閃存的引導加載程序(BSL)

    電子發燒友網站提供《創建自定義的基于閃存的引導加載程序(BSL).pdf》資料免費下載
    發表于 09-19 10:50 ?0次下載
    創建<b class='flag-5'>自定義</b>的基于閃存的引導加載程序(BSL)

    Freepik攜手Magnific AI推出AI圖像生成器

    近日,設計資源巨頭Freepik攜手Magnific AI,共同推出了革命性的AI圖像生成器——Freepik Mystic,這一里程碑式的發布標志著AI圖像創作領域邁入了一個全新的高度
    的頭像 發表于 08-30 16:23 ?1413次閱讀

    NVIDIA AI Foundry 為全球企業打造自定義 Llama 3.1 生成式 AI 模型

    Foundry 提供從數據策管、合成數據生成、微調、檢索、防護到評估的全方位生成式 AI 模型服務,以便部署自定義 Llama 3.1 NVIDIA NIM 微服務和新的 NVIDIA NeMo
    發表于 07-24 09:39 ?822次閱讀
    NVIDIA AI Foundry 為全球企業打造<b class='flag-5'>自定義</b> Llama 3.1 <b class='flag-5'>生成</b>式 AI 模型

    HarmonyOS開發案例:【 自定義彈窗】

    基于ArkTS的聲明式開發范式實現了三種不同的彈窗,第一種直接使用公共組件,后兩種使用CustomDialogController實現自定義彈窗
    的頭像 發表于 05-16 18:18 ?1725次閱讀
    HarmonyOS開發案例:【 <b class='flag-5'>自定義</b>彈窗】

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

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

    TSMaster 自定義 LIN 調度表編程指導

    LIN(LocalInterconnectNetwork)協議調度表是用于LIN總線通信中的消息調度的一種機制,我們收到越來越多來自不同用戶希望能夠通過接口實現自定義LIN調度表的需求。所以在
    的頭像 發表于 05-11 08:21 ?980次閱讀
    TSMaster <b class='flag-5'>自定義</b> LIN 調度表編程指導
    主站蜘蛛池模板: 国产尤物在线视频 | 一级片在线免费 | 天天爱天天操天天干 | 四虎影院最新网址 | 免费一级特黄特色大片 | 五月婷婷六月合 | 中国china体内裑精亚洲毛片 | 最近最新免费视频 | 日韩毛片大全免费高清 | 午夜影院普通 | 国产三级在线观看 | 日黄网站| 五月天婷婷在线观看视频 | 亚洲人的天堂男人爽爽爽 | 日本黄色大片在线观看 | 久久精品亚洲一区二区三区浴池 | 欧美精品黑人性xxxx | 狠狠色噜噜 | 在线永久免费播放视频 | 日本一区视频 | 亚洲另类电击调教在线观看 | 免费毛片网站 | 特黄一级毛片 | 操你啦在线视频 | 香蕉爱爱视频 | 日本网络视频www色高清免费 | 成人免费看黄网站yyy456 | 男啪女色黄无遮挡免费视频 | 一级毛片在线不卡直接观看 | 国产女乱淫真高清免费视频 | 国产农村妇女毛片精品久久 | 黄色毛片免费进入 | h网站在线观看 | 黄 色美 女人| аⅴ资源天堂8在线 | 国产精品超清大白屁股 | 狠狠干狠狠鲁 | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 | 国产精品久久久久免费 | 午夜免费啪在线观看视频网站 | 亚洲国产成人久久 |