一種APF系統信息的顯示方案
基于拓普微智能顯示模塊
一、引言
科技的進步影響了所有產業的發展,其中電力發展速度是前所未有的,基本所有行業都需要電力支持。目前用電安全、節能、環保、經濟等關鍵詞不斷被重申,這使得APF有源濾波器的應用更加普遍。
與此同時,隨著APF應用廣泛,市場拓展,需要面對的使用場景也更復雜。其中用戶對機器的界面交互體驗尤為重視。迫使我們對APF產品的交互設計有新的要求。目前接觸了拓普微的智能顯示模塊HMT070ETD-1D,是一款高分辨率,高性能組態設計的串口屏。我們將通過該屏幕優化APF系統信息交互,提升用戶體驗。
二、目標
基于HMT070ETD-1D的APF系統的界面開發,我們將優化所有參數的顯示,讓數據更迅速、直觀且準確的呈現在用戶面前。不同于傳統項目開發,此次設計僅針對界面交互進行優化,因此我們需要縮短常規開發周期,加快開發速度,并且有利于后續升級管理。主要實現以下目標:
1、實時顯示APF各項參數的數據
在有源濾波器運行過程中,系統的運行狀態以及各項參數信息需要進行實時上報供用戶查閱。屏幕可以根據信息類別、重要程度,優先等級等,調整顯示格式。
2、便捷交互,方便控制、切換、修改參數
用戶可以通過屏幕控制切換顯示APF中不同種類的參數信息,并且可以對某些參數進行設置,例如開關切換、長按賦值、滑動切換、滑動賦值、鍵盤輸入修改等操作。
3、部分數據信息需要有圖形化顯示,
為了給用戶更直觀的顯示效果,屏幕可以支持將數據以柱狀圖、趨勢曲線圖、餅狀圖、表盤的形式顯示出來。
4、支持遠程數據查詢,遠程顯示工程更新
APF系統上屏幕顯示的數據信息,可以支持遠程查詢,或者遠程控制。同時屏幕中顯示工程也可以通過遠程進行更新升級。
三、功能需求分析
此次設計將通過智能顯示模塊HMT070ETD-1D和官方提供的上位機軟件SGTools。開發設計APF系統信息的顯示部分。將所有界面信息顯示,交互操作都集中在屏幕中實現。為了實現以上目標功能,APF系統信息顯示部分有如下功能需求:
1、變量數據刷新與數據格式化顯示
通過上位機開發工具SGTools,可以預先定義APF中各項參數的數字變量地址,添加數字控件到頁面中進行顯示。數字控件通過關聯數字變量后,底層通過協議指令,將數據發送到屏幕顯示。同時數字控件支持設置顯示的字體類型,顯示字體的大小,顯示字體的顏色,格式化顯示如小數點、浮點數等進行顯示。示意圖如下:
圖3-1 變量數據刷新與數據格式化顯示示意圖
?
2、屏幕便捷控制與控制數據下發
智能顯示模塊HMT070ETD-1D自帶電容觸摸屏,在開發工具SGTools中,有不同功能的觸摸鍵控件,通過添加這些控件可以在屏幕中實現相應的功能,例如切換頁面、開關切換、長按賦值、滑動切換、滑動賦值、鍵盤輸入等。觸摸鍵進行的變量賦值,數據操作,彈出鍵盤(菜單)的數據輸入會實時下發到串口中,供APF底層MCU判斷執行對應任務。示意圖如下:
圖3-2 屏幕便捷控制與控制數據下發示意圖
?
3、屏幕對數據的圖形化顯示
SGTools開發工具中,有進度條,曲線,表盤這三個我比較常用的控件。三類控件都可以在屬性欄中進行顯示模式的配置,進度條支持顏色模式,圖標模式,圖標填充模式;曲線控件支持顯示點、線、頂部、底部、區域填充模式;表盤控件支持環形變色、混色、變盤指針、表盤旋轉等模式。以上控件可以更直觀的體現APF中的相關數據。實現方式與變量數據刷新一致。
圖3-3 屏幕對數據的圖形化顯示
?
4、遠程屏幕的數據控制與訪問,工程更新升級
智能顯示模塊HMT070ETD-1D支持網絡TCP/IP通信,在開發工具中可以定義屏幕的IP地址信息,TCP端口,TFTP端口號等信息。下載到屏幕中后IP信息會自動生效,然后可以在局域網內連接相應的IP進行APF遠程協議的數據交互。并且可以通過IP信息對遠程屏幕進行TFTP文件上載,從而實現遠程APF系統界面升級。
圖3-4 遠程屏幕的數據控制與訪問以及工程更新升級
?
四、設計實現
1、變量數據刷新與數據格式化顯示
APF的系統參數信息在我們底層有相應的寄存器的進行存儲,因此刷新到屏幕中的數據可以直接通過底層調用獲取。定義數據指針“Buf”。
構建底層數據刷新函數“topway_value()”;
說明:函數可以根據傳入的APF變量地址(Address)、參數類型(Type)、數據長度(Length)、寄存器數據指針(Buf),將信息實時通過串口刷新至屏幕對應位置進行顯示。
/******************************************************************************* * Function Name ?: topway_value * Description ???: 刷新變量數據 * Input ??????????: Address 變量地址?Type?變量類型?Length?數據長度?Buf?數據指針 * Output ??????? ?: None? * Return ?????? ??: None *******************************************************************************/ void topway_value(uint16_t Address,uint8_t Type,uint8_t Length,uint16_t *Buf) {? uint16_t len; if(Type == TOPWAY_VALUE_ADRESS)//16位數據地址 { ??topway_buf[0] = TOPWAY_DATA_START;// AA頭數據幀 ??topway_buf[1] = TOPWAY_VALUE_FNCCODE;// 82 功能碼 ??topway_buf[2] = TOPWAY_PARAMETER_ID1;// 00 地址ID高8位 ??topway_buf[3] = TOPWAY_PARAMETER_ID0;// 08 地址ID低8位 ??topway_buf[4] = (Address & 0xff00) >> 8;//地址高8位 ??topway_buf[5] = Address & 0xff; ????????//地址低8位 ??topway_buf[6] = Length;//數據長度 ? for(len=0;len ? { ?topway_buf[len + 7] = (*Buf & 0xff00) >> 8;//數據高8位 ?topway_buf[len + 8] = (*Buf & 0xff);//數據低8位 ????? ??? Buf++; ??? ? } ??topway_buf[7+Length*2] = TOPWAY_DATA_END_1;//尾數據幀1:0xCC ??topway_buf[8+Length*2] = TOPWAY_DATA_END_2;//尾數據幀2:0x33 ??topway_buf[9+Length*2] = TOPWAY_DATA_END_3;//尾數據幀3:0xC3 ??topway_buf[10+Length*2] = TOPWAY_DATA_END_4;//尾數據幀4:0x3C ??BufPut(&topway,topway_buf,11+Length*2); ?? ?}? ????else if(Type == TOPWAY_VALUE_POINT)//圖標地址 { ? for(len=0;len ? { uint16_t Write_value = *Buf + len; topway_buf[0] = TOPWAY_DATA_START;// AA頭數據幀 ?????topway_buf[1] = TOPWAY_VALUE_FNCCODE_1;// 3D 功能碼 ?????topway_buf[2] = TOPWAY_PARAMETER_ID1;// 00 地址ID高8位 ?????topway_buf[3] = TOPWAY_PARAMETER_ID0;// 08 地址ID低8位 ?????topway_buf[4] = (Address & 0xff00) >> 8;//地址高8位 ?????topway_buf[5] = Address & 0xff; ????????//地址低8位 topway_buf[6] = (Write_value & 0xff00) >> 8;//數據高8位 ?????topway_buf[7] = (Write_value & 0xff);//數據低8位 topway_buf[8] = TOPWAY_DATA_END_1;//尾數據幀1:0xCC ?????topway_buf[9] = TOPWAY_DATA_END_2;//尾數據幀2:0x33 ?????topway_buf[10] = TOPWAY_DATA_END_3;//尾數據幀3:0xC3 ?????topway_buf[11] = TOPWAY_DATA_END_4;//尾數據幀4:0x3C ?Address+=0x2;//取下一個地址 ?BufPut(&topway,topway_buf,12); } } else if(Type == TOPWAY_VALUE_32BIT)?//32位數據地址 {??topway_buf[0] = TOPWAY_DATA_START;// AA頭數據幀 ??topway_buf[1] = TOPWAY_VALUE_FNCCODE;// 82 功能碼 ??topway_buf[2] = TOPWAY_PARAMETER_ID1;// 00 地址ID高8位 ??topway_buf[3] = TOPWAY_PARAMETER_ID0;// 08 地址ID低8位 ??topway_buf[4] = (Address & 0xff00) >> 8;//地址高8位 ??topway_buf[5] = Address & 0xff; ????????//地址低8位 ??topway_buf[6] = Length/2;//數據長度 ? for(len=0;len { ?topway_buf[len+7] = (*Buf & 0xff);//數據低8位 ????? ??? Buf++; ??? ?? } ??topway_buf[7+Length] = TOPWAY_DATA_END_1;//?尾數據幀1:0xCC ??topway_buf[8+Length] = TOPWAY_DATA_END_2;// 尾數據幀2:0x33 ??topway_buf[9+Length] = TOPWAY_DATA_END_3;// 尾數據幀3:0xC3 ??topway_buf[10+Length] = TOPWAY_DATA_END_4;//尾數據幀4:0x3C ??BufPut(&topway,topway_buf,11+Length);? } } |
測試屏幕數據刷新如下顯示,其中有對部分參數進行格式化顯示,控制字符間距。
2、屏幕便捷控制與控制數據下發
APF系統的屏幕通過觸摸鍵進行的VP控制操作,按鍵信息返回操作都會下發數據到串口,因此我們需要對屏幕發出的串口數據進行甄別,獲取目標數據實現APF的控制。
構建串口的協議解析函數“queue_find_cmd()”
說明:函數用于監視串口的數據接收,并將接收的信息篩選獲取符合協議的指令,返回有效指令數組(buffer),供控制程序進行判斷處理,執行相應功能。?
/****************************************************************************** * 函數名稱: ?queue_find_cmd * 函數功能: ?獲取串口接收隊列中一個完整的幀 * 輸入參數: ?緩存地址和大小 * 輸出參數: ?無 * 返 回 值: ?無 *******************************************************************************/ INT16U queue_find_cmd(INT8U *buffer,INT16U buf_len) { ????INT16U cmd_size = 0; ????INT8U _data = 0; ????while(queue_size()>0)??//判斷隊列是否為空 ????{ ????????queue_pop(&_data);??//非空則提取數據 ????????if(cmd_index==0&&_data!=CMD_HEAD)??//幀頭出錯,跳過 ????????{ ????????????continue; ????????} ????????if(cmd_index ????????{ ????????????buffer[cmd_index++] = _data; ????????}? ????????if(_data==CMD_TAIL_CC)?//判斷是否為0xCC ????????{ ????????????//如果檢查0xCC成功,則下一步檢查0x33 ??//否則重新檢查? ????????????if(cmd_state==CMD_CHECK_TAIL_CC) ????????????{ ????????????????cmd_state=CMD_CHECK_TAIL_33; ????????????} ????????????else?{?cmd_state=CMD_CHECK_TAIL_CC;?} ????????} ????????else if(_data==CMD_TAIL_33) ????????{ ????????????//如果檢查0x33成功,則下一步檢查0xc3 ?//否則重新檢查 ????????????if(cmd_state==CMD_CHECK_TAIL_33) ????????????{ ????????????????cmd_state=CMD_CHECK_TAIL_C3; ????????????} ??????????? else?{?cmd_state=CMD_CHECK_TAIL_CC;} ????????} ????????else if(_data==CMD_TAIL_C3) ????????{ ????????????//如果檢查0xC3成功,則下一步檢查0x3C ?//否則重新檢查 ????????????if(cmd_state==CMD_CHECK_TAIL_C3) ????????????{ ????????????????cmd_state=CMD_CHECK_TAIL_3C; ????????????} ????????????else?{?cmd_state=CMD_CHECK_TAIL_CC;} ????????} ????????else if(_data==CMD_TAIL_3C) ????????{ ????????????//如果檢查0x3C成功,則幀尾正確,否則重新檢查 ????????????if(cmd_state==CMD_CHECK_TAIL_3C) ????????????{ ????????????????cmd_state=CMD_CHECK_TAIL_OK; ????????????} ????????????else?{?cmd_state=CMD_CHECK_TAIL_CC;} ????????} ????????else ????????{ ????????????cmd_state = CMD_CHECK_TAIL_CC; ????????} ????????//得到正確的一幀指令 ????????if(cmd_state==CMD_CHECK_TAIL_OK) ????????{??//重置標志位,返回數據長度 ????????????cmd_size = cmd_index; ????????????cmd_state = CMD_CHECK_TAIL_CC; ????????????cmd_index = 0; ????????????que._head = 0; ????????????que._tail = 0; ????????????return cmd_size; ????????} ????} ????return 0; } |
?
3、屏幕對數據的圖形化顯示
屏幕對數據的圖形化顯示與數據顯示實現的方式一致,主要通過底層實時刷新數據,屏幕接收變量數據后將會依據控件的屬性設置顯示對應效果的圖形。
底層的數據刷新類似第1點。這里不作設計解析。圖形化顯示效果如圖:
圖4-2 曲線顯示
圖4-3 功率狀態顯示
?
4、遠程屏幕的數據控制與訪問,工程更新升級
屏幕的網絡IP、TCP端口、TFTP端口、網關設置如圖:
?圖4-4 網絡設置
①屏幕支持RJ45網口,可以通過該接口實現TCP/IP協議通信,網絡的通信設計類似第1點的串口設計。以下不作詳細解析,根據屏幕的IP信息,網絡端口做以下設置。測試如圖:
圖4-5 TCP/IP協議通信測試
②遠程文件更新測試,首先遠程通過TCP/IP協議發送屏幕復位指令,讓屏幕進入遠程更新模式。然后通過命令行“cmd”執行tftp應用的相關上載命令,進行顯示工程升級,我的測試結果如圖4-6。期間工程文件傳輸都成功完成,在網絡連接正常的情況下沒有出現錯誤。
圖4-6 遠程TFTP文件傳輸測試1
另外也可以通過拓普微官方提供的“遠程升級工具”進行TFTP文件上載。測試如圖:
圖4-7 遠程TFTP文件傳輸測試2
?
五、總結
智能顯示模塊HMT070ETD-1D顯示方案綜合測試下來比較順利,期間進行的測試都能通過。圖像數據顯示流暢,按鍵反饋迅速,功能測試正常。在官方提供的上位機軟件SGTools中,可以很方便的設計出數據相關的UI顯示效果。上位機軟件也很直觀,資源欄、屬性欄、控件區、工具欄、輸出欄視圖排布接近主流軟件使用習慣,個人比較容易上手。
此次基于拓普微平臺的智能模塊開發還算比較成功,滿足了我們開發的設計需求。并且官方提供的技術支持也非常及時,加速了我們整個項目組的開發進程。
審核編輯:湯梓紅
評論
查看更多