日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內(nèi)不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

fc17e518-5ab3-11ed-b116-dac502259ad0.jpg ?背景

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ā)效率和可靠性。

fc17e518-5ab3-11ed-b116-dac502259ad0.jpg ?簡介

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

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

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 和結(jié)構(gòu)的注釋。我們來看看 ZTIMER 的結(jié)構(gòu)注釋:

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

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

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

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

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

/**
*@property{uint8_t}state
*@annotation["private"]
*狀態(tài)。
*/
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 需要功能塊的描述信息,以方便把它呈現(xiàn)到界面上。比如 ZTIMER 的描述信息如下:

{
"type":"fb_zlg_misc.ztimer",
"real_type":"ZTIMER",
"helpUrl":"https://developer.zlg.cn",
"style":"fb",
"desc":"循環(huán)定時器。\n\n>當輸入 IN 為 TRUE 時,開始計時,輸出 Q 為 FALSE,ET 開始記錄過去的時間。
\n>定時時間到時,COUNT 增加 1,輸出 Q 在本次循環(huán)為 TRUE,ET 重置為0。\n>輸入 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":"定時時間是否到(僅在時間到的當次循環(huán)為 TRUE)。",
"data_type":"BOOL"
},
{
"name":"ET",
"desc":"過去時間(ms)。",
"data_type":"TIME"
},
{
"name":"COUNT",
"desc":"定時器時間到的次數(shù)。",
"data_type":"DWORD"
}
]

}

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

#ZTIMER

##功能

循環(huán)定時器。

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

##輸入

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

##輸出

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

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

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


fc17e518-5ab3-11ed-b116-dac502259ad0.jpg ?代碼生成器基本知識

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

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

這里所說的目標代碼,也并非一定是嚴格意義上的代碼,也可能是另外一些數(shù)據(jù)。當然,有時候要嚴格區(qū)分數(shù)據(jù)和代碼,本身就是一件困難的事情。不過,這不是我們要說的重點,重點是通過代碼生成器提升我們的工作效率。*一個人的數(shù)據(jù)就是另外一個人的代碼。--《編程珠璣 II》1.代碼生成器的分類要說分類,就要先說分類的標準,在不同的分類標準和分類依據(jù)下,分出的類別迥異?!冻绦騿T修煉之道》里提到的一個分類標準具有極強的實用意義,這里我們重點介紹一下。它根據(jù)生成的目標代碼是否需要二次修改來分類,將代碼生成器分為兩類:

被動代碼生成器目標代碼生成之后,需要進行修改和完善,然后獨立發(fā)展和維護,與代碼生成器再與關(guān)系。比如 IDE 的 Wizard 就是此例。前面提到的自定義控件生成器,代碼生成之后,你需要在上面添加需要的功能。如果過了一段時間,你想為控件添加一個新的屬性,可能會遇到一點麻煩,要么手工添加;要么重新生成代碼,然后把之前修改的代碼重新加上,無論哪種方式都不是愉快的方式。被動代碼生成器雖然有它的缺陷,但是仍然可以給我們帶來很大幫助。

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

2.基本形式fc2ae01e-5ab3-11ed-b116-dac502259ad0.png

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

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


fc17e518-5ab3-11ed-b116-dac502259ad0.jpg AWPLC中的代碼生成器

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

1.基本架構(gòu)

AWPLC 功能塊代碼生成器架構(gòu)如下圖所示。其中功能塊描述文件就是前面所說的元數(shù)據(jù),代碼生成器用它生成前面介紹的各種代碼和數(shù)據(jù)。fc37ec64-5ab3-11ed-b116-dac502259ad0.png

2.功能塊描述文件格式

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

2.1基本信息

基本信息包括:

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

示例:

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

2.2屬性描述對于每個屬性,又包括下列信息:

  • name 屬性名;
  • desc 屬性描述;
  • type 實際的數(shù)據(jù)類型;
  • data_type(可選)用于在 IDE 中時類型檢查,缺省為 type 對應的 IEC 的數(shù)據(jù)類型,但是有時可用 ANY_INT 和 ANY_NUM 等來放寬類型檢查;
  • annotation 用于額外的標識。目前主要用于指定輸入輸出等特性。

示例:

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

},

2.3使用方法

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

node gen.js 描述文件名。

如:

nodegen.jsinput/zlg/misc/ztimer.json

上面介紹了用 C 語言開發(fā)原生功能塊的方法。當然,也可以用 IEC 61131-3 中一些語言開發(fā)功能塊,除此之外,AWPLC 還會支持用 AWBlock 開發(fā)功能塊,在后續(xù)文章中,我們將一一介紹,敬請關(guān)注。AWPLC 目前還處于開發(fā)階段的早期,寫這個系列文章的目的,除了用來驗證目前所做的工作外,還希望得到大家的指點和反饋。如果您有任何疑問和建議,請在評論區(qū)留言。

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

    關(guān)注

    5210

    文章

    20680

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    探索 ATMega328 微控制器:嵌入式開發(fā)新選擇

    UNO(16MHz)引導加載程序,這意味著我們可以在自定義嵌入式項目中使用 Arduino 代碼,而無需使用實際的 Arduino 開發(fā)板。 2.
    的頭像 發(fā)表于 04-11 15:15 ?515次閱讀

    MCUXpresso SDK創(chuàng)建自定義清單

    概述 MCUXpresso SDK 24.12 介紹塞德恩漢CED支持自定義清單,使開發(fā)人員能夠精確定義其工作區(qū)中包含哪些組件、驅(qū)動程序、中間件和板支持包。此
    發(fā)表于 04-07 07:11

    02. 如何在 Allegro 中快速自定義字體?| 芯巧Allegro PCB 設計小訣竅

    :設置完成后,鼠標左鍵單選或框選要修改的絲印文字,即可對所選絲印字體進行修改。四、小結(jié)本節(jié)主要講述如何使用Allegro PCB設計工具的Text Setup功能和Change功能快速
    發(fā)表于 04-03 16:34

    什么是嵌入式應用開發(fā)

    概述 所謂的嵌入式應用開發(fā)就是在嵌入式操作系統(tǒng)進行開發(fā)、軟硬件綜合開發(fā) ?
    發(fā)表于 01-12 16:13

    電能質(zhì)量在線監(jiān)測裝置可自定義監(jiān)測時段嗎?

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

    無圖形界面模式下自定義檢查工具的應用

    此前文章已介紹 ANSA 中的自定義檢查工具。本文將探討該功能在無圖形界面(No-GUI)模式的應用,旨在滿足標準化工作流程的需求,適用于需要高度自動化的前處理場景。通過集成自定義
    的頭像 發(fā)表于 11-30 14:13 ?802次閱讀
    無圖形界面模式下<b class='flag-5'>自定義</b>檢查工具的應用

    嵌入式和FPGA的區(qū)別

    嵌入式系統(tǒng)與FPGA的核心差異:軟件定義功能VS硬件可重構(gòu)。嵌入式適合通用計算,開發(fā)門檻低;FPGA憑借并行處理實現(xiàn)納秒級響應,但成本高、
    發(fā)表于 11-19 06:55

    嵌入式系統(tǒng)的定義和應用領域

    。盡管有些嵌入式系統(tǒng)可能包含操作系統(tǒng),但大多數(shù)情況,它們僅由一個程序來控制整個邏輯。 從更專業(yè)的角度來看,嵌入式系統(tǒng)可以被定義為:以應用
    發(fā)表于 11-17 06:49

    PYQT 應用程序框架及開發(fā)工具

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

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

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

    Linux嵌入式和單片機嵌入式的區(qū)別?

    較高,需要較大的內(nèi)存和存儲空間來運行Linux系統(tǒng)和應用程序。 5. 可擴展性 : 單片機嵌入式 :擴展性有限,通常只能通過增加外設來擴展功能。 Linux
    發(fā)表于 06-20 09:46

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

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

    HarmonyOS實戰(zhàn):高德地圖自定義定位圖標展示

    前言 地圖定位功能基本上已經(jīng)成了日常應用程序的必備功能之一,在日常開發(fā)地圖定位的功能的時候難免會遇到很多意想不到的問題,本篇文章記錄日常
    的頭像 發(fā)表于 06-09 14:59 ?872次閱讀
    HarmonyOS實戰(zhàn):高德地圖<b class='flag-5'>自定義</b>定位圖標展示

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

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

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

    我想要編程(如果可能的話通過 SWD)一個自定義但相當基本的“Type-C 到 DP”AltMode 適配器功能,到安裝在自定義 PCB 上的CYPD2119-24LQXI設備上。 我已經(jīng)下載了
    發(fā)表于 05-13 06:35
    澄城县| 荥经县| 广宗县| 定襄县| 久治县| 吴川市| 金川县| 博白县| 丽江市| 云林县| 扶风县| 盐城市| 秦安县| 弥勒县| 遵化市| 临夏市| 河北省| 沙河市| 石棉县| 十堰市| 若尔盖县| 德令哈市| 尼玛县| 临潭县| 舒城县| 郓城县| 霸州市| 石城县| 洞口县| 石门县| 景德镇市| 北碚区| 大厂| 盐源县| 满洲里市| 台中县| 无为县| 城固县| 阿尔山市| 墨玉县| 榕江县|