• 沒有找到結果。

整合物聯網技術及微處理器於工廠資訊系統之研究

N/A
N/A
Protected

Academic year: 2021

Share "整合物聯網技術及微處理器於工廠資訊系統之研究"

Copied!
102
0
0

加載中.... (立即查看全文)

全文

(1)

國立高雄大學電機工程學系研究所

碩士論文

整合物聯網技術及微處理器於工廠資訊系統之研究

研究生:張峻瑋 撰

指導教授:曹永忠 博士

施明昌 博士

中華民國一零九年七月

(2)
(3)

iii

整合物聯網技術及微處理器於工廠資訊系統之研究

指導教授:施明昌 博士 國立高雄大學電機工程學系 指導教授:曹永忠 博士 國立暨南國際大學電機工程學系 學生:張峻瑋 國立高雄大學電機工程學系 摘要 台 灣 許 多 中 小 企 業 與 小 型 工 廠 大 量 地 使 用 比 例 積 分 微 分 控 制 器 (Proportional-Integral-Derivative Controller :PID Controller)於各類工廠設備之中,由於這些設備簡單、 穩定、便宜與易用,還可以二十四小時全年無休運作,帶來許多產業物超所值的效益。 數十年來,這些控制器一直默默在生產線上不間斷的工作,讓企業與工廠在許多產業系 統革新自動化升級時,幾乎忘記它們的存在。

本 研 究 透 過 整 合 工 業 互 聯 網 技 術 整 合 遙 測 傳 輸 協 議 (Message Queue Telemetry Transport: MQTT),建立雙向資訊擷取與遠端 PID 控制器設定,達到無痛升級的能力, 進而將整個 PID 控制器提升到雲端平台中央控制,並可以隨時提供給操作員、生產管理 者、企業管理者、設備維護者、決策管理者、或關鍵決策者,透過行動裝置與網際網路, 無遠弗屆地遠端設定與監控這些重要的 PID 控制器,實驗中使用具備 Wifi 無線網路的 連線機制的微處理機,透過 RS-485 與 Modbus 通訊協定連接 PID 控制器,進而透過通 訊命令與這些 PID 控制器溝通並擷取該裝置與感測器的相關設定,並透過無線熱點 (Access Point :AP)的橋接,連上網際網路,提升為具備物聯網功能的強大 PID 控制器。

關鍵字:比例積分微分控制器、無線熱點、物聯網、工業互聯網、遙測傳輸協議、雲端 平台。

(4)

iv

An Integrated Information System with MCU

for Factory Based Internet of Thing Technology

Advisor: Dr. Ming-Chang Shih Institute of Electrical Engineering National University of Kaohsiung Advisor: Dr. Yung-Chung Tsao Institute of Electrical Engineering

National Chi Nan University

Student: Jun-Wei Chang Institute of Electrical Engineering National University of Kaohsiung

Abstract

For many small and medium-sized enterprises and small factories in Taiwan, PID Controller (Proportional-Integral-Derivative Controller) is widely used in various factory equipment. Because these equipment are simple, stable, cheap, useful, and operating with their high cost–performance ratio feed-back all year round. For decades, these PID Controllers have been silently working uninterrupted on the production line, making enterprises and factories almost forget their existence under the factory automation revolution.

In this research, we try to integrate the industrial internet of thing and message queue telemetry transport telemetry transport protocol (MQTT) to establish a two-way information acquisition and remote PID controller settings to upgrade their capabilities painless, and the entire PID controllers can be upgraded to access the clouding platform. The clouding platform is centrally controlled and can be provided to top managers or decision-makers such as operators, production managers, business managers, equipment maintainers and decision managers at any time. Through mobile devices and Internet, it can be far-reaching remote

(5)

v

setting and monitoring of these upgraded PID controllers. This study uses the microprocessor, which can access WiFi wireless network, to connected to the PID controller via RS-485 standard interface and Modbus communication protocol, and then communicates with these PID controllers based on communication commands and retrieves the their settings of the devices and the sensors, and with the mechanism of connecting Internet via access Point: AP, they can be upgraded to a powerful wireless PID controllers.

Keywords: Proportional-Integral-Derivative Controller, Access Point, Industrial Internet of Thing, Message Queue Telemetry Transport, Clouding platform.

(6)

vi

致謝

國立高雄大學電機工程學系研究所的研究工作即將畫下句點,心裡一直明白,這會 是我求學生涯的最後一張畢業證書,所以一直抱著兢兢業業的態度一步一步地往下做。 首先感謝恩師施明昌教授,若不是恩師鍥而不捨地帶著我一起研究,恐怕我無法完成學 業,更謝謝恩師施明昌教授推薦曹永忠博士一同指導我研究。 在最後一年的學業期間,非常感謝指導教授曹永忠博士的悉心指導。期間完全可以 感受到曹永忠博士數十年深厚的學術底子,之前念大學時,就是把書本多念幾遍就能過 關,在曹永忠博士指引教導下,讓我明白研究生與大學生最大的差異,研究生是要真正 做出實體的東西,本論文中即使是一段文字或是一張圖片,都是花了幾小時或是幾天的 時間,把實體的東西做出來,才生出那些文字圖片。 感謝口試委員林祥和教授,畫龍點睛地幫我取了一個最佳的論文題目,並且對於論 文內容多次建議;感謝藍文厚教授對於論文一字不漏地進行修正,學生終身感激;感謝 恩師施明昌教授與曹永忠博士在口試上予以學生最後的肯定與支持,讓學生在專業研究 領域上有所增長並且具備紮實穩固之電機工程專業知識。 感謝研究室夥伴:景穗與宣為。兩位夥伴在修業繁忙的情況下,還多次點醒我學術、 程式、設備操作、行政流程上的卡點。如果不是有這兩位強而有力的實驗室夥伴,我應 該會卡在意想不到的地方卡很久。相信以他們兩位的學術能力、研究精神、人格品性, 日後可以找到很好的工作。 最後更要感謝懷孕未婚妻 Analyn 的諒解,這幾個月來沒有多陪陪她跟肚子裡面的 兒子,真是不好意思。未來等懷孕中的兒子長大後,想跟他說,這篇論文跟他差不多時 間誕生在這個世界上,希望他要重視他的學業,把握時間。 學生 張峻瑋 109 年 07 月於高雄大學實驗室

(7)

vii

目錄

摘要... iii Abstract ... iv 目錄... vii 圖目錄... ix 表目錄... xi 第一章 緒論... - 0 - 1.1 研究背景... - 0 - 1.2 研究假設... - 2 - 1.3 研究限制... - 3 - 第二章 文獻探討與現況分析... - 4 - 2.1 自動化與自動控制... - 4 - 2.2 PID 控制原理 ... - 5 - 2.3 PID 控制器之 FY900 型號介紹 ... - 7 - 2.4 FY900 工廠應用範例 ... - 17 - 第三章 系統建置架構... - 20 - 3.1 微處理機開發板... - 20 - 3.2 雲端平台之硬體架構... - 23 - 3.3 雲端平台之軟體架構... - 27 - 3.4 雲端網站... - 27 - 3.5 微控器主機連接 PID 控制器之電路圖 ... - 29 - 3.6 PID 控制器通訊設定 ... - 30 - 3.7 FY900 通訊指令: ... - 32 - 第四章 系統設計與實作... - 35 -

(8)

viii 4.1 系統設計... - 35 - 4.2 硬體系統實作... - 38 - 4.3 韌體系統實作... - 38 - 4.4 雲端 DB Agent 資料庫代理人實作 ... - 64 - 第五章 系統展示... - 67 - 5.1 雲端主頁... - 67 - 5.2 站台管理... - 69 - 5.3 設定裝置... - 71 - 第六章 結果與討論... - 74 - 附錄... - 76 - NodeMCU 32S 腳位一覽圖... - 76 - QNAP TS-431 伺服器服務一覽表 ... - 77 - 參考文獻... - 87 -

(9)

ix

圖目錄

圖 1 控制器流程圖... - 5 - 圖 2 PID 控制器流程圖 ... - 6 - 圖 3 PID 程序控制器/溫度控制器(FY900 正側面圖) ... - 8 - 圖 4 電腦與 FY900 連線圖 ... - 9 - 圖 5 電腦與 FY900 連線圖(含感測器) ... - 9 - 圖 6 FY900 操作面板各部位說明圖 ... - 10 - 圖 7 FY900 控制器背面各接點說明-1 ... - 12 - 圖 8 FY900 控制器背面各接點說明-2 ... - 13 - 圖 9 FY900 控制器背面各接點說明-3 ... - 14 - 圖 10 FY900 控制器背面各接點說明-4 ... - 15 - 圖 11 壓力控制應用範例架構圖... - 18 - 圖 12 壓力控制應用範例實體圖-1... - 18 - 圖 13 壓力控制應用範例實體圖-2... - 19 -

圖 14 NodeMCU-32S Lua WiFi 開發板正反面 ... - 20 -

圖 15 NodeMCU-32S Lua WiFi 開發板之 CP2102 晶片圖 ... - 21 -

圖 16 NodeMCU-32S Lua WiFi 開發板腳位圖 ... - 23 -

圖 17 QNAP TS-431 主機一覽圖 ... - 24 - 圖 18 雲端主頁畫面... - 28 - 圖 19 系統功能架構圖... - 29 - 圖 20 連接線路圖... - 29 - 圖 21 通訊協定(PSL) ... - 30 - 圖 22 通訊位元選擇(bitS) ... - 31 - 圖 23 通訊機號(IdNO) ... - 31 -

(10)

x 圖 24 通訊速率(bAUd) ... - 31 - 圖 25 CRC 生成網頁產生通訊內容之 CRC-16 檢查碼 ... - 33 - 圖 26 微處理機與 FY900 連線示意圖 ... - 36 - 圖 27 以微處理機為基礎之系統架構圖... - 36 - 圖 28 以工業互聯網為基礎之系統架構圖... - 37 - 圖 29 本研究微處理機電路板實作圖... - 38 - 圖 30 雲端主頁畫面... - 67 - 圖 31 系統功能圖... - 68 - 圖 32 站台管理... - 69 - 圖 33 顯示所有站台... - 69 - 圖 34 新增站台... - 70 - 圖 35 修改站台... - 71 - 圖 36 刪除站台... - 71 - 圖 37 設定控制器... - 72 - 圖 38 設定 SV ... - 72 - 圖 39 設定警示一... - 73 -

(11)

xi

表目錄

表 1 2019 年中小企業家數統計資料表... - 0 - 表 2 2019 年行業別就業人數統計資料... - 1 - 表 3 FY900 操作面板各部位參照圖... - 11 - 表 4 FY900 控制器基本規格表 ... - 15 - 表 5 FY900 控制器追加附屬功能規格表 ... - 16 - 表 6 QNAP TS-431 產品規格表 ... - 25 - 表 7 FY900 PID 控制器通訊參數一覽表 ... - 30 - 表 8 PID 控制器系統程式 ... - 38 - 表 9 PID 控制器系統程式(comlib.h) ... - 46 - 表 10 PID 控制器系統程式(command.h) ... - 50 - 表 11 PID 控制器系統程式(initPins.h) ... - 58 - 表 12 PID 控制器系統程式(crc16.h) ... - 60 - 表 13 雲端 DB Agent 資料庫代理人程式(dataadd.php) ... - 64 -

(12)

- 0 -

第一章 緒論

1.1 研究背景

台灣工業多年來,雖然經歷過大大小小工業化的過程,但是大部份的工廠仍 是中小企業,以家庭式廠房的方式經營。並無太多的資金及人力資源可以進行大 規模的半自動、全自動化廠房改革。但是自動化帶來的省時、省力與不間斷的服 務,也推動著這些企業革新前進。許多中小企業便針對廠內必要且需要不間斷的 機器或設備,透過市售或外包的方式來建立 24 小時不間斷的監控裝置來驅動機 器與設備,透過這些小成本的投資進而改善中小企業短缺的人力困境。由輔仁大 學管理學院與美國哥倫比亞大學 Vale 哥倫比亞研究中心(Vale Columbia

Center,簡稱 VCC)在 2011 年公布的「2011 台灣前二十大跨國企業排行榜」[1]。 以各公司的海外資產作排名。入榜的 20 家台灣跨國企業擁有將近 760 億美元海 外資產,聘用了 110 萬名海外員工,海外營業額達 2210 億美元,而 20 家企業共 有 1164 個海外子公司,分布於 42 個經濟體中。 然而中小企業總家數佔整體企業高達 97.7%,如表 1 所示。中小企業就業人 口數也佔整體就業人口數達 78.7%,如表 2 所示,足見中小企業對整體經濟發展 有巨大的貢獻[2-4] 。 表 1 2019 年中小企業家數統計資料表 年度 行業別 單位 全部企業 中小企業 百分比 2019 總計 家 1527272 1491420 97.7% 2019 農、林、漁、牧業 家 11409 11328 99.3% 2019 礦業及土石採取業 家 1051 1024 97.4% 2019 製造業 家 149769 143699 95.9% 2019 電力及燃氣供應業 家 1781 1616 90.7% 2019 用水供應及污染整治業 家 7885 7543 95.7% 2019 營建工程業 家 134242 132951 99.0% 2019 批發及零售業 家 714996 696666 97.4%

(13)

- 1 - 2019 運輸及倉儲業 家 34303 33055 96.4% 2019 住宿及餐飲業 家 168775 168112 99.6% 2019 出版、影音製作、傳播及資通 訊服務業 家 24234 23325 96.2% 2019 金融及保險業 家 21240 18485 87.0% 2019 不動產業 家 40958 38945 95.1% 2019 專業、科學及技術服務業 家 53674 52751 98.3% 2019 支援服務業 家 33202 32607 98.2% 2019 教育業 家 4401 4378 99.5% 2019 醫療保健及社會工作服務業 家 1219 1200 98.4% 2019 藝術、娛樂及休閒服務業 家 35963 35777 99.5% 2019 其他服務業 家 88170 87958 99.8% 資料來源:經濟部中小企業處:中小企業家數-按行業別 (https://www.moeasmea.gov.tw/article-tw-2344-5369) 表 2 2019 年行業別就業人數統計資料 年度 行業別 單位 全部 中小企業 百分比 2019 總計 千人 11500 9054 78.7% 2019 農、林、漁、牧業 千人 559 554 99.1% 2019 礦業及土石採取業 千人 4 3 75.0% 2019 製造業 千人 3066 2216 72.3% 2019 電力及燃氣供應業 千人 31 3 9.7% 2019 用水供應及污染整治業 千人 84 34 40.5% 2019 營建工程業 千人 907 893 98.5% 2019 批發及零售業 千人 1915 1846 96.4% 2019 運輸及倉儲業 千人 450 329 73.1% 2019 住宿及餐飲業 千人 848 826 97.4% 2019 出版、影音製作、傳播及資通 訊服務業 千人 262 200 76.3% 2019 金融及保險業 千人 434 343 79.0% 2019 不動產業 千人 108 103 95.4% 2019 專業、科學及技術服務業 千人 377 299 79.3% 2019 支援服務業 千人 297 272 91.6%

(14)

- 2 - 2019 公共行政及國防;強制性社會 安全 千人 368 1 0.3% 2019 教育服務業 千人 657 257 39.1% 2019 醫療保健及社會工作服務業 千人 461 231 50.1% 2019 藝術、娛樂及休閒服務業 千人 115 94 81.7% 2019 其他服務業 千人 557 551 98.9% 資料來源:經濟部中小企業處: 中小企業就業人數-按行業別 (https://www.moeasmea.gov.tw/article-tw-2344-5369)

1.2 研究假設

基於上述背景與動機,若能將這些數據送上雲端平台[5,6],若出現重大狀況, 主管人員可由透過行動裝置,快速查詢雲端平台來快速了解狀況之嚴重性,進行緊 急處理與即時監控。不用像以往只能透過操作人員的記憶與印象來了解事發經過。 畢竟這些事件一經轉述,或多或少會漏失相關訊息與不正確的資訊傳達,造成操作 人員各說各話的情況。 若能將上述資料存放在雲端平台,更便於長期保存、整合各項數據,例如:水 溫與油溫關係、氣候變化與蒸汽溫度關係、油品與燃燒後廢氣空汙關係。甚至是將 三組數據,四組數據可一併比對,可找出各項因素的相互關係。除了可看出平日正 常運作各因素的關係,在異常發生後,也可更清楚真正的原因。比方說若出現給水 溫度過低的狀況,藉由整合後的數據,可知道問題的癥結點是給水泵浦水壓不足、 或給水泵浦潤滑油溫過低、或管路破裂、或其他原因。 本論文基於這些概念,想要整合中小企業常用的控制器,並在微小投資下可以 即時透過網路將各項數據傳到雲端平台,操作人員可由行動裝置、公司資訊等設備 獲悉各項警報,更可以避免忙於手邊工作時,錯失處理警報的最佳時機,並可以依 照雲端平台的警報資訊,快速判斷事態的輕重緩急,以決定該做的應對工作程序優 先順序。

(15)

- 3 -

1.3 研究限制

本研究以台灣儀控股份有限公司開發之 FY900 產品為研究主體與相對應應用 為主,有下列研究限制:  以台灣儀控股份有限公司開發之 FY900 產品為 PID 控制器。  目前以兩台 FY900 並聯運作為研究標的,基本測試以一台 FY900 為 主。  控制主軸以溫度控制為主要研究主體。  所有通訊標準以 Modbus 通訊版本。

 連接 PID 控制器之開發板以 NodeMCU-32S Lua WiFi 開發板為主要控制 器。

 平台硬體以威聯通科技(QNAP)的 TS-431 NAS 主機為主。

 Apache 網站伺服器與 mySQL 資料庫以 TS-431 NAS 內建之版本為主。  Php 網頁程式語言以 TS-431 NAS 內建之版本為主。

基於有限研究資源所拘束,我們研究、實作、測試以上述限制為主要範圍,並 不另外比較更新、更多的軟硬體版本,唯獨在實作為完成整體的上線與測試,為權 宜起見,會動態做少許調整與變化,方面整個研究與實作之進行。

(16)

- 4 -

第二章 文獻探討與現況分析

本章主要針對文獻探討與現況分析進行論文撰寫。第一節介紹自動化與自動 控制;第二節介紹 PID 控制原理;第三節介紹 PID 控制器之 FY900 型號;第四節 介紹 FY900 工廠應用範例。

2.1 自動化與自動控制

自動化的精神是節省人力。讓機械裝置(受控體)經由非人類的其他動力(致 動器)自動運轉而取代人力。一方面將人力資源從繁瑣、單調、危險的工作釋放 出來,讓人力去從事機器不可取代的工作;一方面運用機械的高可靠性、高穩定 性、高耐操性來提升工作效能。古代常見的水車便是利用水流產生機械能,進行 取水灌溉、推動石磨等工作。而自動控制是將自動化更進一步,除了讓機械裝置 自動運轉以外,還可以控制機械裝置的運轉參數,以期更能精準控制機械的動 作。常見的自動控制由:(1)設定值、(2)實際值、(3)控制器、(4)致動器、 (5)受控體、(6)感測器所組成。 (1)設定值:整個系統的目標就是使受控體達到設定值。 (2)實際值:受控體實際的數值。 (3)控制器:感測器會將訊號傳遞到控制器,控制器使用演算法計算訊 號,再將處理過後的訊號發送給驅動器。 (4)致動器:機械裝置的動力來源。 (5)受控體:為接收命令、受到控制的被動部位。 (6)感測器:感測外界的訊號,並將訊號傳遞給其他部位。

(17)

- 5 - 圖 1 控制器流程圖

2.2 PID 控制原理

本章節參考維基百科之 PID 控制器,網址: https://zh.wikipedia.org/wiki/PID%E6%8E%A7%E5%88%B6%E5%99%A8,節錄其內 容,透過內容僅介紹 PID 控制器的大略原理,輔助本研究之相關文獻參考,其內 容僅供後期研究者索引與參考之用。 PID 控制器就是比例積分微分控制器(Proportional-Integral-Derivative

Controller : PID Controller)是一個在工業控制應用中常見的反饋迴路部件。本論文 所使用的控制器即為 PID 控制器。PID 控制器可以根據歷史數據與誤差的出現頻 率來調整輸入值,使系統更加準確而穩定[7]。

(18)

- 6 - 圖 2 PID 控制器流程圖 顧名思義,PID 代表了三種糾正算法:比例、積分、微分。系統輸出即為受 控變數,是三種算法相加後的結果;系統輸入為誤差值(設定值減去測量值後的 結果)或是由誤差值衍生的信號。 比例響應: 比例響應對應到目前誤差。比例元件僅會因設定值與目前值的差異而有所不 同,這項差異稱為誤差項。比例增益決定了誤差項對輸出響應的比例。例如,當誤 差項程度達到 10 時,7 的比例增益會產生 70 的比例響應。一般而言,增加比例 增益會同時增加控制系統響應速度。 積分響應: 積分響應對應到過去誤差。積分元件會在一段時間後將誤差項作加總。將小小 的誤差作加總的結果,會導致積分元件緩慢增加。積分響應會隨著時間經過持續增 加 (但誤差為零時,為例外),積分響應的作用在於讓穩態誤差趨近於零。 微分響應:

(19)

- 7 - 積分響應對應到未來誤差。當程序變數快速增加時,微分元件會讓輸出減少。 微分響應與程序變數的變更速率成比例增減。因為微分響應對於程序變數訊號中 的雜訊非常敏感。當感測器反饋訊號出現雜訊,或當控制迴圈速率太慢,微分響應 會讓控制系統變得不穩定。 資料來源:https://www.ni.com/zh-tw/innovations/white-papers/06/pid-theory-explained.html#section--1173989643

2.3 PID 控制器之 FY900 型號介紹

本節介紹台灣儀控股份有限公司設計、開發、生產的 PID 控制器功能,如圖 3 所示,介紹本研究採用測試的型號:FY900,其規格資料可以參閱網址: https://www.fa-taie.com.tw/admin/product/images/file/2014-12-31/54a354c18886e.pdf,本控制器可適用於溫度、溼度、流量、PH 值控制、可微 電腦 PID 控制、多樣化輸入/輸出信號類型選擇。 FY900 控制器具有可程式規劃功能,共 2 組 16 段可供設定用來規劃各種升溫、 降溫、持溫曲線。新增 MODBUS 通訊協定,可輕易地與人機介面及其他周邊裝置 通訊。新增加熱器斷線警報功能(HBA)提升系統整體安全,並有功能強大的其他周 邊功能可供選購。

(20)

- 8 - 圖 3 PID 程序控制器/溫度控制器(FY900 正側面圖) 資料來源:本研究拍攝、整理 如圖 4,可以看到 FY900 控制器與電腦通訊界面連接的圖,主要電腦可以透 過 RS-485 電氣通訊,透過 Modbus 通訊協定,傳輸控制命令給 Modbus 匯流排上 的每一台 FY900 控制器進行控制、設定、溝通與資料擷取。

(21)

- 9 - 圖 4 電腦與 FY900 連線圖 資料來源:本研究參考官方手冊而自行繪製。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=33) 如圖 5 所示,FY900 控制器會與對應感測或控制的感測器做電路連接,所以 在使用電腦可以透過 RS-485 電氣通訊,透過 Modbus 通訊協定,傳輸控制命令給 Modbus 匯流排上的每一台 FY900 控制器所搭配的感測裝置進行控制、設定、溝 通與資料擷取,達到特定的系統需求。 圖 5 電腦與 FY900 連線圖(含感測器)

(22)

- 10 - 資料來源:本研究參考官方手冊而自行繪製。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=33) 圖 6 FY900 操作面板各部位說明圖 資料來源:本研究參考官方手冊。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=33) 對於如圖 6 所示,可以看到 FY900 控制器機體正面之顯示元件與輸入元件之 每一項元件之名稱與功能說明,可以參考如表 3 所示,配合 FY900 控制器的操作 說明書,網址: https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=32的 FY/FA 系列詳細操作 手冊(新版),進行操作。

(23)

- 11 - 表 3 FY900 操作面板各部位參照圖

符號

名稱

功能說明

PV

① 程序值(PV)顯示

/參數名稱顯示

顯示程序值(PV)/參數名稱

SV

② 設定值(SV)顯示 顯示設定值。

SET

③ 設定鍵

切換參數顯示/設定參數值。

A/M

④ 自動/手動鍵

切換自動/手動模式。

⑤ 移位鍵

移動設定值的位數。

⑥ 減少鍵/程式暫

停鍵

減少設定值

/程式暫停,可程式控制器才有此功能。

︿

⑦ 增加鍵/程式執

行鍵

增加設定值

/程式執行,可程式控制器才有此功能。

OUT1 ⑧ OUT1 指示燈

第一組控制動作輸出時,此燈(綠色)亮。

OUT2 ⑨ OUT2 指示燈

第二組控制動作輸出時,此燈(綠色)亮。

AT

⑩ 自動演算指示燈 自動演算動作時,此燈(橙色)亮。

AL1

⑪ Alarm1 指示燈

第一組警報動作時,此燈(紅色)亮。

AL2

⑫ Alarm2 指示燈

第二組警報動作時,此燈(紅色)亮。

AL3

⑬ Alarm3 指示燈

第三組警報動作時,此燈(紅色)亮。

MAN

⑭ 手動輸出顯示燈 手動輸出時,此燈(橙色)亮。

PRO

⑮ 程式執行燈

程式執行時,此燈(橙色)亮。

可程式控制器才有此功能。

OUT%

⑯ OUT 輸出百分比

顯示

10 個 LED 對應顯示控制輸出百分比

資料來源:本研究參考官方手冊而自行繪製。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=33) 另外 FY900 控制器的對外硬體電路之各項電氣接腳,可以參考如圖 7、圖 8、圖 9、圖 10、並配合 FY900 控制器的操作說明書,網址: https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=32的 FY/FA 系列詳細操作 手冊(新版),再根據實際現場需求來進行對應的電路設計與安裝。

(24)

- 12 -

圖 7 FY900 控制器背面各接點說明-1

資料來源:本研究參考官方手冊。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=32)

(25)

- 13 -

圖 8 FY900 控制器背面各接點說明-2

資料來源:本研究參考官方手冊。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=32)

(26)

- 14 -

圖 9 FY900 控制器背面各接點說明-3

資料來源:本研究參考官方手冊。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=32)

(27)

- 15 - 圖 10 FY900 控制器背面各接點說明-4 資料來源:本研究參考官方手冊。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=32) 參考表 4 所示,可以了解 FY900 控制器的細部功能介紹與解說。 表 4 FY900 控制器基本規格表

機種

FY

機種

FY900

尺寸 96X96mm 第一組警報 1c 接點 電源電壓 AC 85~265V,DC 15~50V (Option) 3A , 220V , 電氣壽命 10 萬回 電源頻率 50 / 60 HZ 控制方式 PID、PI、PD、P、ON / OFF(P=0)、 FUZZY。

消耗功率 約 4VA PID 參數 P:0.0 ~ 200.0 % I:0~3600s D:0~900s 輸 入 顯示精度 0.2 % FS ± 1digit 第 一 組 控 制 輸 Relay 1c 接點 取樣時間 250ms 8A , 220V , 電氣壽命:10 萬回

(28)

- 16 - 熱電偶 (TC) K , J , R , S , B , E , N , T , W5Re/W26Re , PLII , U , L 出 SSR ON:24V , OFF:0V , 最大負荷電流 20mA 測溫電阻 (RTD) PT100 , JPT100 , JPT50 4~20mA 最大負載電阻 560 Ω 電流信號 4~20mA , 0~20mA 0~20mA 最大負載電阻 560 Ω 電壓信號 0~1V , 0~5V , 0~10V , 1~5V , 2~10V , -10~10mV 0~10mV ,0~20mV , 0~50mV , 10~50mV 0~5V、 0~10V 1~5V、 2~10V 最大負荷電流 20mA 小數點位 數 電流/電壓信號輸入時,PV 顯示的小數點 位數,可由設 定參數”DP”變換。 (0000、000.0、00.00、0.000) 耐壓 主迴路 ~ 外殼(對地) 1500V 1 分鐘 控制迴路 ~ 外殼(對地) 1000V 1 分鐘 絕緣電阻 主迴路 ~ 外殼(對地) DC500V > 10MΩ 控制迴路 ~ 外殼(對地) DC500V > 10MΩ 工作環境 0~50℃ , 20~90%RH 重量 300g 顯示數字高度 PV:14mm 、SV:10mm 資料來源:本研究參考官方手冊而自行繪製。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=33) 對於有更進階的需求,台灣儀控股份有限公司可以針對 FY-900 控制器,參 考表 5 所示,可以在購買時,或需求變更或需要更新較強大的功能時,表 5 可以 提供了解 FY-900 控制器進階的功能需求之介紹與解說。 表 5 FY900 控制器追加附屬功能規格表

機種

FY900

第二組控制輸出

Relay , SSR , 4~20mA , 0~20mA , 0~5V , 0~10V , 1~5V , 2~10V * 動作模式與第一組控制輸出相反。 傳送輸出 可傳送:PV 或 SV 4~20mA , 0~20mA , 0~1V , 0~5V , 0~10V , 1~5V , 2~10V 第二組警報 1c 接點 遙控輸入 4~20mA , 0~20mA , 0~1V , 0~5V , 0~10V , 1~5V , 2~10V 3A , 220V , 電氣壽命 10 萬回 第三組警報 1a 接點 通訊

通訊協定 : MODBUS RTU , MDOBUS ASCII , TAIE

(29)

- 17 - 加熱器斷線警報 (HBA) 電流顯示範圍:0.0~99.9A , 顯示精 度:1%FS 通訊速率:2400 , 4800 , 9600 , 19200 , 38400 bps 內含 CT:SC-80-T (0.0~80.0A) 插孔 直徑 5.8Φ 或 SC-100-T (0.0~99.9A) 插孔直徑 12Φ 資料位元:8bit , 同位元:偶同位或奇同 位 , 停止位元:1 或 2 bit 警報接點:AL1 特殊控制輸出 單相零位控制(1φSSR)、三相零位控制 (3φSSR)、三線 式比例馬達、單相相位控 制(1φSCR) 、三相相位控制 (3φSCR) 可程式規劃 2 組各 8 段,可串接成 16 段使用 防水防塵構造 IP65 資料來源:本研究參考官方手冊而自行繪製。 (https://www.fa-taie.com.tw/admin/download/front/down.php?c_id=33)

2.4 FY900 工廠應用範例

如圖 11 所示之壓力控制應用範例架構圖。紅色實線代表蒸汽路線。黑色虛線 代表電子訊號路線。控制閥的功能為:控制蒸汽流量大小;蒸汽分配胴的功能為: 負責存放蒸汽,並將蒸汽分配給負載;壓力傳送器的功能為:將分配胴的壓力數值 由電子訊號傳給 FY900。 10 噸鍋爐保持運轉,鍋爐的蒸汽經由控制閥接到蒸汽分配胴。分配胴內有壓 力傳送器,將壓力轉成 4∼20mA 類比訊號給 FY900,即為壓力的 PV。若 PV 大於 SV,則 FY900 送 4∼20mA 類比訊號給控制閥,以減少控制閥開度;若 PV 小於 SV,則 FY900 送 4∼20mA 類比訊號給控制閥,以增加控制閥開度。

(30)

- 18 -

圖 11 壓力控制應用範例架構圖

資料來源:研究訪查後,自行繪製。

圖 12 壓力控制應用範例實體圖-1

(31)

- 19 - 如圖 12 所示,為 10 噸鍋爐實體圖,負責提供蒸汽。 如圖 13 所示,左上方為控制閥,控制蒸汽流量大小。 如圖 13 所示,中間下方為蒸汽分配胴,負責存放蒸汽,並將蒸汽分配給負載。 如圖 13 所示,中間上方為壓力傳送器,將分配胴的壓力數值由電子訊號傳給 FY900。 圖 13 壓力控制應用範例實體圖-2 資料來源:研究訪查拍攝

(32)

- 20 -

第三章 系統建置架構

本章主要介紹系統建置架構。第一節介紹裝置控制開發板;第二節介紹雲端平 台之硬體架構;第三節介紹雲端平台之硬體架構;第四節介紹雲端網站;第五節介 紹微控器主機連接 PID 控制器電路圖;第六節介紹 PID 控制器通訊設定;第七節 介紹 FY900 通訊指令。

3.1 微處理機開發板

如圖 14 所示,NodeMCU-32S Lua WiFi 開發板是低成本的 WiFi+ 藍牙 4.2+ BLE /雙核 CPU 的開發板,為一個開放源始碼的物聯網平台[8-10]。

圖 14 NodeMCU-32S Lua WiFi 開發板正反面

(33)

- 21 -

NodeMCU-32S Lua WiFi 開發板也支持使用 Lua 腳本語言之程式設計, NodeMCU-32S Lua WiFi 開發板之開發平台基於 eLua 開源項目,例如 lua-cjson, spiffs.。NodeMCU-32S Lua WiFi 開發板具有為嵌入式系統開發的產品提供網際網 路的功能。

NodeMCU-32S Lua WiFi 開發板模組核心處理器 ESP32 晶片提供了一套完整 的 802.11 b/g/n/e/i 無線網路(WLAN)和藍牙 4.2 解決方案,具有最小尺寸。該 開發板專為低功耗和行動消費電子設備、可穿戴和物聯網設備而設計,並整合了 WLAN 和藍牙的所有功能,並且開發板設計者提供了一個開放原始碼的平台,支 持使用者自定義功能,用於不同的應用場景。無線通訊方面完全符合 WiFi 802.11b/g/n/e/i 和藍牙 4.2 的標準,並整合了 WiFi/藍牙/BLE 無線射頻和低功耗 技術,並且支持開放性的 RealTime 作業系統 RTOS。 開發板具有 3.3V 穩壓器,可降低輸入電壓,為開發板供電。它還附帶一個 CP2102 晶片(如圖 15 所示),允許 NodeMCU-32S Lua WiFi 開發板與電腦連接 後,可以在程式編輯、編譯後,直接透過串列埠傳輸程式,進而燒錄到開發板, 無須額外的下載器。

圖 15 NodeMCU-32S Lua WiFi 開發板之 CP2102 晶片圖

(34)

- 22 -

NodeMCU-32S Lua WiFi 開發板的功能,包括以下內容:  商品特色:

 WiFi+藍牙 4.2+BLE  雙核 CPU

 Arduino based 相容之 GPIO

 可以用 Nodejs 語法寫網路應用系統  商品規格:  尺寸:49*25*14mm  重量:10g  品牌:Ai-Thinker  芯片:ESP-32  Wifi:802.11 b/g/n/e/i  Bluetooth:BR/EDR+BLE  CPU:Xtensa 32-bit LX6 雙核心  RAM:520KBytes  電源輸入:2.3V~3.6V

如圖 16 所示,NodeMCU-32S Lua WiFi 開發板具有許多功能腳位,如 GPIO,Uart,SPI,I2C…等等。

(35)

- 23 -

圖 16 NodeMCU-32S Lua WiFi 開發板腳位圖

資料來源:https://dustinb.github.io/images/NodeMCU-32S.png

3.2 雲端平台之硬體架構

本研究之雲端系統之硬體,採用如圖 18 之 QNAP TS-431 為雲端主機之硬體 設備,由於研究資源限制,該主機託管於網址為:nuk.arduino.org.tw 之機房,並 受到該託管組織所管轄與管理。 NAS 系統和傳統的檔案儲存服務或直接儲存裝置(DAS)不同的地方,在於 NAS 裝置上面的作業系統和軟體只提供了資料儲存、資料存取、以及相關的管理 功能,並得以使得裝置連上網路才進行遠端存取;此外,NAS 裝置也提供了不只 一種檔案傳輸協定。NAS 系統通常有一個以上的硬碟,而且和傳統的檔案伺服器 一樣,通常會把它們組成 RAID 來提供服務,讓資料更不會遺失;有了 NAS 以 後,網路上的其他伺服器就可以不必再兼任檔案伺服器的功能。NAS 的型式很多 樣化,可以是一個大量生產的嵌入式裝置,也可以在一般的電腦上執行 NAS 的 軟體。

(36)

- 24 -

NAS 是以檔案為單位的通訊協定,例如 NFS(常用於 UNIX 系統)或是 SMB (常用於 Windows 系統)。儲存區域網路(SAN)則是以區塊為單位的通訊協 定、通常是透過 SCSI 再轉為光纖通道或是 iSCSI。還有其他各種不同的 SAN 通 訊協定,像是 ATA over Ethernet 和 HyperSCSI 等。

3Com 的 3Server 和 3+Share 軟體是第一個為了開放系統伺服器而設計的伺服 器,其中包括了專屬軟硬體及多台磁碟機。該公司也從 1985 年到 1990 年代初期 領導時代的潮流,3Com 和微軟在這個新市場上還合作開發了 LAN Manager 軟體 及其通訊協定[8]。

目前 NAS 可大略分為「專注儲存型」(Storage NAS)以及「整合平台型」 (Platform NAS)兩種,後者具備自身作業系統[11]。

如圖 17 所示,研究將使用威聯通科技(QNAP)的 NAS 產品來當為文章硬 體主題,由於威聯通科技股份有限公司 (QNAP Systems, Inc.),這幾年來針對優 質網路應用設備的產品發展迅速,企業目標以提供全面及先進的 NAS 網路儲存 裝置及 NVR 安全監控系統解決方案為最大核心事業。

(a). TS-431 正面圖 (b). TS-431 背面圖

(37)

- 25 -

資料來源:TS-431 產品介紹官網(https://www.qnap.com/zh-tw/product/ts-431)[12]

如表 6 所示。QNAP TS-431搭載高效節能的 Freescale™ ARM Cortex-A9 雙 核心 1.2GHz 處理器,提供高達 110MB/s 讀取速度和 80MB/s 寫入速度,讓家 用級 NAS 也能展現出驚人的極致效能。TS-431 提供完善的資料加密及解密機 制,透過 AES-256 bit 整機加密功能提供 30MB/s 的資料傳輸速度,在保護 TS-431 重要資料的同時,仍維持系統的高效能及安全性。TS-TS-431 亦可安裝高傳輸 速率的 USB 界面 802.11ac 及 2.4GHz/5GHz 802.11n 雙頻無線網卡,讓大量檔 案或耗頻寬的影音檔案傳輸時更加快速[12]。 表 6 QNAP TS-431 產品規格表

處理器 Freescale™ ARM®v7 Cortex®-A9 雙核心 1.2GHz 處理器

浮點運算 ✔ 硬體加密引擎 ✔ 記憶體 512MB 快閃記憶體 512MB 支援硬碟數量類 型 4 T Bytes 3.5" SATA 硬碟 硬碟架 支援 4 顆硬碟熱抽換 網路埠 2 x Gigabit RJ-45 網路埠 LED 指示燈 電源、狀態、網路、USB、硬碟 1-4 USB/eSATA

3 x USB 3.2 Gen 1 port (正面: 1;背面: 2) 1 x eSATA port (背面)

(38)

- 26 - UPS 等。 按鍵 電源、USB 單鍵備份、系統重置按鈕 警報器 系統警報 機種 桌上型 尺寸 169 (高) x 160(寬) x 219(深) mm 6.65(高) x 6.3(寬) x 8.62(深) inch 重量 淨重: 3 kg/ 6.61 lb; 毛重: 4.3 kg/ 9.48 lb 耗電量 (W) 硬碟休眠模式: 14.84W 運行中: 33.75W (含 2 顆 2TB 硬碟) 噪音值* 聲壓(LpAm): 17.5 dB(A) 溫度 0 - 40˚C / 32~104˚F 相對溼度 5 ~ 95% RH 不凝結, 濕球: 27˚C 電源 外接電源, 90W, 100-240V 安全設計 K-Lock 安全鎖 風扇 1 x 靜音風扇 (12 cm, 12V DC)

認證 FCC, CE, BSMI, VCCI, C-TICK

資料來源:QNAP TS-431 產品介紹官網(https://www.qnap.com/zh-tw/product/ts-431)[12] 許多文獻中的研究皆採用 QNAP TS-431 產品為雲端平台,如附錄之 QNAP TS-431 伺服器服務一覽表所示,其網站服務器與資料庫一併俱全,並可以整合 Php 伺服器端的 HTML 嵌入式的描述語言(Hypertext Preprocessor),更整合 FTP 檔案伺服器基本功能,虛擬主機等強大功能,所以許多中小型企業與學術單位與

(39)

- 27 - 碩博士研究相關研究都採用 QNAP 系列當為雲端主機[13,14,15,16,17,18,19]。

3.3 雲端平台之軟體架構

本研究之雲端系統之伺服器軟體內容與版本,對於雲端網站版本,其網頁伺 服器版本如下:  Apache

 資料庫用戶端版本: libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id: 76b08b24596e12d4553bd41fc93cccd5bac2fe7a $

 PHP 擴充套件: mysqli 說明文件 curl 說明文件 mbstring 說明文件  PHP 版本: 5.6.31

其資料庫採用 mySQL 伺服器,其資料庫伺服器版本如下:  伺服器: Localhost via UNIX socket

 伺服器類別: MariaDB

 Server connection: SSL is not being used 說明文件  伺服器版本: 5.5.57-MariaDB - MariaDB Server  協定版本: 10

 使用者: nukiot@localhost

 伺服器字元集: UTF-8 Unicode (utf8)

3.4 雲端網站

本研究之雲端主機託管於網址為:nuk.arduino.org.tw 之機房,網址為:

http://nuk.arduino.org.tw:8888/iot.php,進入雲端主機後,如圖 18 所示, 可以看到 FY900 PID 控制器的畫面。

(40)

- 28 -

圖 18 雲端主頁畫面

如圖 19 所示,整個功能可以分為二大主要功能加上回主頁(Home)的功能, 第一個主要功能為站台管理(Site Management),往下可以看到顯示所有站台 (Display Site)。

第二個主要功能為設定控制器(Device Setting),往下可以看到設定 SV(Set SV)與設定第一組警示(Set Alarm 1)等功能選項。

(41)

- 29 -

圖 19 系統功能架構圖

3.5 微控器主機連接 PID 控制器之電路圖

如圖 20,為連接線路圖

(42)

- 30 -

3.6 PID 控制器通訊設定

FY900 PID 控制器可以透過桌上型電腦,使用 RS-485 通訊協定進行控制, 在與電腦通訊之前,必先行手動使用 FY900 PID 控制器的按鈕將通訊規格設定 好。 如表 7 所示,可以看到 FY900 PID 控制器的通訊協定、通訊位元選擇、通訊 機號、通訊速率。手動按按鈕設定的同時,順便確認機器是否異常。 表 7 FY900 PID 控制器通訊參數一覽表 參數名稱 原廠通訊規格 新的通訊規格

通訊協定(PSL) : Modbus RTU 模式(rtu) Modbus RTU 模式(rtu) 通訊位元選擇 (bitS): 奇同位、 資料位元 8、 停止位元 1(o_81) 無同位、 資料位元 8、 停止位元 1(n_81) 通訊機號(IdNO): 1 號(1) 1 號(1) 通訊速率(bAUd) : 38400bps(384) 9600bps(96) 如圖 21 所示,在面板上進行通訊協定設定。 圖 21 通訊協定(PSL) 如圖 22 所示,進入通訊協定設定後,先行設定通訊位元。

(43)

- 31 - 圖 22 通訊位元選擇(bitS) 如圖 23 所示,接下來進行設定該 FY900 PID 控制器的通訊機號,也就是 Modbus 通訊協定的位址。 圖 23 通訊機號(IdNO) 如圖 24 所示,接下來進行設定該 FY900 PID 控制器的通訊速率,也就是 Modbus 通訊協定的的通訊速率。 圖 24 通訊速率(bAUd) 如此就完成 FY900 PID 控制器的通訊基礎設定。

(44)

- 32 -

3.7 FY900 通訊指令:

如圖 5 所示,使用電腦通訊界面連接 FY900 控制器,電腦可以透過 RS-485 電氣通訊,透過 Modbus 通訊協定,傳輸控制命令給 Modbus 匯流排上的每一台 FY900 控制器進行控制、設定等操作。下列介紹主本中主要的通訊協定之命令與 通訊內容。各串命令皆是使用十六進制(Hexadecimal)寫成,各串中的單筆命令為 2 Byte 組成。 3.5.1.寫入單筆參數資料:Master 送出資料(寫入 SV=100)。 Master send No. of Byte 1 2 3 4 5 6 7 8 Command 01H 06H 00H 00H 00H 64H 88H 21H Comment 通訊 機號 命令 碼 資料位址 資料內容 CRC-16 檢查碼 命令碼 命令碼說明 06H 寫入單筆資料 10H 寫入多筆資料 03H 讀取單筆/多筆資料 資料位址碼 資料位址碼說明 0000H SV 0003H 第一組警報 0004H 第二組警報 008AH PV CRC-16 檢查碼說明:

循環冗餘校驗(Cyclic redundancy check,通稱「CRC」)是一種根據網路資 料封包或電腦檔案等資料產生簡短固定位數驗證碼的一種雜湊函式[20],主要用 來檢測或校驗資料傳輸或者儲存後可能出現的錯誤。生成的數字在傳輸或者儲存 之前計算出來並且附加到資料後面,然後接收方進行檢驗確定資料是否發生變 化。由於本函式易於讓二進制的電腦硬體使用、容易進行數學分析並且尤其善於 檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。

(45)

- 33 - CRC-16 檢查碼生成: 如圖 25,本研究使用 CRC 自動生成的的線上服務,網址為 https://crccalc.com/,我們進到該網頁後,可以使用下列範例: 範例:輸入檢查碼之前的 01 06 00 00 00 64,選擇 HEX,點擊 CRC-16。 便可生成 CRC16 檢查碼。 圖 25 CRC 生成網頁產生通訊內容之 CRC-16 檢查碼 3.5.2.Master 送出資料(讀取 SV) Master send No. of Byte 1 2 3 4 5 6 7 8 Command 01H 03H 00H 00H 00H 01H 84H 0AH Comment 通訊 機號 命令 碼 資料位址 資料筆數 CRC-16 檢查碼 3.5.3.Controller 回傳資料(讀取 SV) Controller response No. of Byte 1 2 3 4 5 6 7 Command 01H 03H 02H 00H 64H B9H AFH Comment 通訊 機號 命令 碼 資料位元 組計數 資料內容 CRC-16 檢查碼 3.5.4.Master 送出資料(讀取 PV) Master send No. of Byte 1 2 3 4 5 6 7 8

Command 01H 03H 00H 8AH 00H 01H A5H E0H Comment 通訊 機號 命令 碼 資料位址 資料筆數 CRC-16 檢查碼 3.5.5.Controller 回傳資料(讀取 SV) Controller No. of 1 2 3 4 5 6 7

(46)

- 34 - response Byte

Command 01H 03H 02H 03H E8H B8H FAH Comment 通訊 機號 命令 碼 資料位元 組計數 資料內容 CRC-16 檢查碼 3.5.6.Controller 回傳資料(SV=100)。 Controller response No. of Byte 1 2 3 4 5 6 7 8 Command 01H 06H 00H 00H 00H 64H 88H 21H Comment 通訊 機號 命令 碼 資料位址 資料內容 CRC-16 檢查碼

(47)

- 35 -

第四章 系統設計與實作

本章主要介紹系統設計與實作進行。第一節介紹系統設計;第二節介紹硬體 系統實作;第三節介紹韌體系統實作;第四節介紹雲端 DB Agent 資料庫代理人 實作。

4.1 系統設計

在第二章之 2.3 節之 PID 控制器之 FY900 一文中,可以看到圖 4 電腦與 FY900 連線圖,由於使用桌上型電腦會佔有極大體積與消耗極高電力與產生高發 熱量的缺點;並且由於位於工廠生產線上,導致桌上型電腦常常因困苦環境而處 於低穩定度的狀態,而且桌上型工業電腦的價位與維護費用更是一大筆的開銷, 所以多個研究皆提出微控裝置是較佳的解決方案[21,22,23,24,25,26]。 所以本研究提出圖 26 之想法,如果將工業型電腦或桌上型電腦,置換成微 處理機(Micro Processor : MCU),中間使用轉板,將 PID 的 RS485 通訊方法轉為 微控裝置的 TTL 通訊方式,是一個較佳且成本效益(C/P 值)極高的解決方案。

(48)

- 36 -

圖 26 微處理機與 FY900 連線示意圖

圖 27 以微處理機為基礎之系統架構圖

參考圖 27 之想法,研究中透過如圖 14 所示的物聯網功能的微處理機: NodeMCU-32S Lua WiFi 開發板,該微處理機具備 Wifi 無線網路的連線功能,並可 以透過無線熱點(Access Point :AP)的橋接,連接上網際網路,則整體系統架構就可

(49)

- 37 -

以將 PID 控制器與連接的感測裝置等資訊送到雲端[27, 28]。

由於參考圖 27 之的技術概念,我們需要透過雲端主機的雲端服務,設定 PID 控制器的相關設定或設定的感測裝置等資訊,透過 NodeMCU-32S Lua WiFi 開發 板(如圖 14 所示)與雲端主機進行雙向連線,由於網頁伺服器的保密與安全性機制, 無法輕易主動與微處理機進行連線功能,一般都是等待微處理機進行連線,所以本 研究參考許多學者相關研究[29,30,31,32],透過無線熱點(Access Point : AP)的橋 接,連上網際網路,則整體系統架構就可以將 PID 控制器與連接的感測裝置等資 訊送到雲端。

(50)

- 38 -

4.2 硬體系統實作

根據圖 27 之技術概念與圖 26 之連線圖,本研究實際透過實驗洞洞板,焊接 組立如圖 29 所示之硬體系統,進行系統開發。 圖 29 本研究微處理機電路板實作圖

4.3 韌體系統實作

將開發板的驅動程式安裝好之後,打開 Arduino 開發板的開發工具:Sketch IDE 整合開發軟體(軟體下載:https://www.arduino.cc/en/Main/Software),撰 寫如表 8、表 9、表 10、表 11、表 12 所示之 PID 控制器系統程式[11, 33],並 透過開發工具將整個程式編譯後,上傳燒錄到 NodeMCU-32S Lua WiFi 開發板, 進行測試。

表 8 PID 控制器系統程式

PID 控制器系統程式(PID 控制器系統程式) //---

(51)

- 39 - PID 控制器系統程式(PID 控制器系統程式) #include "initPins.h" #include "comlib.h" #include "command.h" #include "crc16.h" WiFiMulti wifiMulti; WiFiClient pvclient; /////////////////////////////////////////////////////// //http://140.127.205.165/lab203_iot/fy_900/dataadd.php?t=01asda01ds asd01 void sendNAS() { // connectstr = "t="+d; Serial.println(connectstr) ; if (client.connect(iotserver, iotport)) { Serial.println("Make a HTTP request ... "); String strHttpGet = strGet + connectstr + strHttp; Serial.println(strHttpGet); //### Send to Server client.println(strHttpGet); client.println(); } } void initAll()

(52)

- 40 - PID 控制器系統程式(PID 控制器系統程式) { Serial.begin(9600); Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); Serial.println("System Start") ; } void ShowInternet() { ShowMAC() ; ShowIP() ; }

void ShowAP(String apname) { } void ClearShow() { } void ShowMAC() { } void ShowIP() { }

(53)

- 41 - PID 控制器系統程式(PID 控制器系統程式) void ShowString(String ss) { } void setup() {

//Initialize serial and wait for port to open: initAll() ;

WiFi.disconnect(true); WiFi.setSleep(false);

// --- wifi connection start wifiMulti.addAP("Brucetsao", "12345678"); wifiMulti.addAP("IOT", "0123456789"); wifiMulti.addAP("Brucetsao2", "12345678"); Serial.println("Connecting Wifi..."); wifiMulti.run() ;

while (WiFi.status() != WL_CONNECTED) //WiFi.status() ==網路狀 態,WL_CONNECTED ==連線狀態成功 { delay(500); Serial.print("."); //等待連線印出符號 } Serial.println(""); Serial.println("WiFi connected"); Serial.print("Access AP: "); Serial.println(WiFi.SSID());

(54)

- 42 - PID 控制器系統程式(PID 控制器系統程式) Serial.print("IP address: "); Serial.println(WiFi.localIP()); printWiFiStatus(); MacData = GetMacAddress() ; Serial.print("MAC is :(") ; Serial.print(MacData) ; Serial.print(")\n") ; ShowInternet() ;

// --- wifi connection end phasestage=1 ; flag1 = false ; flag2 = false ; //---MQTT Process mqttclient.begin("broker.shiftr.io", mqclient); mqttclient.onMessage(messageReceived);

fillCID(MacData); // generate a random clientid based MAC Serial.print("MQTT ClientID is :(") ; Serial.print(clintid) ; Serial.print(")\n") ; connectMQTT(); } void loop() { pvflag = false ; svflag = false ; requestdata(&Read_PV[0],8); delay(200); if (Serial2.available()>0) { Serial.println("Controler Respones") ; cmmstatus = Get_PV(&retdata) ;

(55)

- 43 - PID 控制器系統程式(PID 控制器系統程式) if (cmmstatus == 1) { DisplayPVData(&retdata) ; PV = GETPV(); pvflag = true ; // sendPV(); } else { pvflag = false ; Serial.print("Status:(") ; Serial.print(cmmstatus) ; Serial.print(")\n") ; } } //---SV requestdata(&Read_SV[0],8); delay(200); if (Serial2.available()>0) { Serial.println("Controler Respones") ; cmmstatus = Get_SV(&retdata) ; if (cmmstatus == 1) { DisplaySVData(&retdata) ; SV = GETSV(); svflag = true ; //sendSV(); } else { svflag = false ; Serial.print("Status:(") ; Serial.print(cmmstatus) ; Serial.print(")\n") ; }

(56)

- 44 -

PID 控制器系統程式(PID 控制器系統程式) }

if (pvflag && svflag) { sendPV(); } delay(10000) ; } // END Loop

//void sendPV(Word pvvalue) void sendPV() { //http://nuk.arduino.org.tw:8888/pid/dataadd.php?MAC=CC50E3B6B808&i d=1&pv=23.4&sv=23.1 connectstr = "?MAC="+MacData+"&id="+String(deviceid)+"&pv="+String(PV)+"&sv="+St ring(SV); // connectstr = "?MAC='"; Serial.println(connectstr) ; if (pvclient.connect(iotserver, iotport)) { Serial.println("Make a HTTP request ... "); String strHttpGet = strPVGet + connectstr + strHttp; Serial.println(strHttpGet); //### Send to Server //---Http GET 用法--- pvclient.println(strHttpGet);//送到 URL pvclient.println(strHost); //告知用 Http GET pvclient.println(); //結束碼 //---Http GET 用法----end-- } if (pvclient.connected())

(57)

- 45 -

PID 控制器系統程式(PID 控制器系統程式) {

pvclient.stop(); // DISCONNECT FROM THE SERVER }

}

void fillCID(String mm) {

// generate a random clientid based MAC //compose clientid with "tw"+MAC

clintid[0]= 't' ; clintid[1]= 'w' ; mm.toCharArray(&clintid[2],mm.length()+1) ; clintid[2+mm.length()+1] = '\n' ; } //---

void messageReceived(String &topic, String &payload) { //CarNumber = payload ; Serial.println("Msg:"+payload) ; Serial.println("MSG:" +payload); // msgDecode(payload) ; /* if (ValueDecode(payloadcount,rfidnum)==CarNumber) { ShowString("Para Count:"+String(payloadcount)) ; } */ } void connectMQTT() { Serial.print("MQTT ClientID is :(") ; Serial.print(clintid) ; Serial.print(")\n") ;

(58)

- 46 -

PID 控制器系統程式(PID 控制器系統程式)

while (!mqttclient.connect(clintid, "try", "try")) { Serial.print("-"); delay(1000); } Serial.print("\n"); mqttclient.subscribe("/nuk/pid/#"); Serial.println("\n MQTT connected!"); // client.unsubscribe("/hello"); } 表 9 PID 控制器系統程式(comlib.h) PID 控制器系統程式(comlib.h) long POW(long num, int expo) ; String SPACE(int sp) ;

String strzero(long num, int len, int base) ; unsigned long unstrzero(String hexstr, int base) ; String print2HEX(int number) ;

//---

long POW(long num, int expo) {

long tmp =1 ; if (expo > 0) {

for(int i = 0 ; i< expo ; i++) tmp = tmp * num ; return tmp ; } else { return tmp ; } }

(59)

- 47 -

PID 控制器系統程式(comlib.h)

String SPACE(int sp) {

String tmp = "" ;

for (int i = 0 ; i < sp; i++) {

tmp.concat(' ') ; }

return tmp ; }

String strzero(long num, int len, int base) {

String retstring = String(""); int ln = 1 ;

int i = 0 ; char tmp[10] ; long tmpnum = num ; int tmpchr = 0 ; char hexcode[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D',' E','F'} ; while (ln <= len) { tmpchr = (int)(tmpnum % base) ; tmp[ln-1] = hexcode[tmpchr] ; ln++ ; tmpnum = (long)(tmpnum/base) ; } for (i = len-1; i >= 0 ; i --) {

(60)

- 48 - PID 控制器系統程式(comlib.h) retstring.concat(tmp[i]); } return retstring; }

unsigned long unstrzero(String hexstr, int base) {

String chkstring ;

int len = hexstr.length() ;

unsigned int i = 0 ; unsigned int tmp = 0 ; unsigned int tmp1 = 0 ; unsigned long tmpnum = 0 ;

String hexcode = String("0123456789ABCDEF") ; for (i = 0 ; i < (len ) ; i++)

{

// chkstring= hexstr.substring(i,i) ; hexstr.toUpperCase() ;

tmp = hexstr.charAt(i) ; // give i th char and return this char

tmp1 = hexcode.indexOf(tmp) ;

tmpnum = tmpnum + tmp1* POW(base,(len -i -1) ) ;

}

return tmpnum; }

String print2HEX(int number) {

(61)

- 49 -

PID 控制器系統程式(comlib.h) if (number >= 0 && number < 16) { hhh = String("0") + String(number,HEX); } else { hhh = String(number,HEX); } hhh.toUpperCase() ; return hhh ; } void ClearSerial2() { if (Serial2.available() >0) { while ((Serial2.available() >0)) { Serial2.read() ; } } } //--- void printWiFiStatus() {

// print the SSID of the network you're attached to: Serial.print("SSID: ");

Serial.println(WiFi.SSID());

// print your WiFi shield's IP address: ip = WiFi.localIP();

Serial.print("IP Address: "); Serial.println(ip);

// print the received signal strength: rssi = WiFi.RSSI();

(62)

- 50 -

PID 控制器系統程式(comlib.h)

Serial.print("signal strength (RSSI):"); Serial.print(rssi);

Serial.println(" dBm"); }

String GetMacAddress() {

// the MAC address of your WiFi shield String Tmp = "" ;

byte mac[6];

// print your MAC address: WiFi.macAddress(mac); for (int i=0; i<6; i++) { Tmp.concat(print2HEX(mac[i])) ; } Tmp.toUpperCase() ; return Tmp ; } 表 10 PID 控制器系統程式(command.h) PID 控制器系統程式(command.h) long POW(long num, int expo) ; String SPACE(int sp) ;

String strzero(long num, int len, int base) ; unsigned long unstrzero(String hexstr, int base) ; String print2HEX(int number) ;

//--- boolean pvflag = false ; boolean svflag = false ; long temp , humid ; byte cmd ;

(63)

- 51 - PID 控制器系統程式(command.h) int receivedlen = 0 ; byte StrTemp[] = {0x01,0x04,0x00,0x01,0x00,0x02,0x20,0x0B} ; byte Str1[] = {0x01,0x03,0x00,0x8A,0x00,0x01,0xA5,0xE0} ; //讀取單 筆參數資料:Master 送出資料(讀取 PV 現在資料) byte Str2[] = {0x01,0x04,0x00,0x02,0x00,0x01,0x90,0x0A} ; //---SV

byte Read_PV[8] = {0x01,0x03,0x00,0x8A,0x00,0x01,0xA5,0xE0} ; //讀 取單筆參數資料:Master 送出資料(讀取 PV 現在資料)

byte Read_SV[8] = {0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A} ; //讀 取單筆參數資料:Master 送出資料(讀取 SV 現在資料

//--- typedef struct Word {

byte HI; byte LO; } ;

typedef struct Word DATA;

typedef struct ANSData { byte DeviceID; byte Cmd; byte Len; Word Data; Word CRC16; } ;

typedef struct ANSData pvdata; ANSData retdata ;

//---

void requestdata(byte *sendstr, int len) ; void requesttemperature() ;

void requesthumidity() ; int GetDHTdata(byte *dd) ;

(64)

- 52 -

PID 控制器系統程式(command.h) int Get_PV(ANSData *devdata) ; int Get_SV(ANSData *devdata) ;

void DisplayPVData(ANSData *devdata) ; void DisplaySVData(ANSData *devdata) ; unsigned int WordValue(Word *twobyte) ; String WordHex(Word *twobyte) ;

float GETPV() ; float GETSV() ; //---

unsigned int WordValue(Word *twobyte) {

return ((*twobyte).HI *256+(*twobyte).LO) ; }

String WordHex(Word *twobyte) {

return (print2HEX((byte)(*twobyte).HI)+ print2HEX((byte)(*twobyte).LO)) ;

}

void requestdata(byte *sendstr, int len) {

Serial.println("now send data to device") ; Serial2.write(sendstr,len);

Serial.println("end sending") ; }

void requesttemperature() {

Serial.println("now send data to device") ; Serial2.write(Str1,8);

Serial.println("end sending") ; }

void requesthumidity() {

Serial.println("now send data to device") ; Serial2.write(Str2,8);

(65)

- 53 - PID 控制器系統程式(command.h) Serial.println("end sending") ; } int GetDHTdata(byte *dd) { int count = 0 ;

long strtime= millis() ;

while ((millis() -strtime) < 2000) { if (Serial2.available()>0) { Serial.println("Controler Respones") ; while (Serial2.available()>0) { Serial2.readBytes(&cmd,1) ; Serial.print(print2HEX((int)cmd)) ; *(dd+count) =cmd ; count++ ; } Serial.print("\n---\n") ; } return count ; } } //---

int Get_PV(ANSData *devdata) { int stage = 0 ; Serial.println("Enter Get_PV--While") ; while (Serial2.available()>0) { if (stage == 0) {

(66)

- 54 - PID 控制器系統程式(command.h) Serial.println("Enter Stage0") ; Serial2.readBytes(&cmd,1) ; (*devdata).DeviceID = cmd ; stage = 1 ; continue ; } if (stage == 1) { Serial.println("Enter Stage1") ; Serial2.readBytes(&cmd,1) ; (*devdata).Cmd = cmd ; stage = 2 ; continue ; } if (stage == 2) { Serial.println("Enter Stage2") ; Serial2.readBytes(&cmd,1) ; (*devdata).Len = cmd ; stage = 3 ; continue ; } if (stage == 3) { Serial.println("Enter Stage3") ; Serial2.readBytes(&cmd,1) ; (*devdata).Data.HI = cmd ; Serial2.readBytes(&cmd,1) ; (*devdata).Data.LO = cmd ; stage = 4 ; continue ; } if (stage == 4) { Serial.println("Enter Stage4") ; Serial2.readBytes(&cmd,1) ;

(67)

- 55 - PID 控制器系統程式(command.h) (*devdata).CRC16.HI = cmd ; Serial2.readBytes(&cmd,1) ; (*devdata).CRC16.LO = cmd ; return 1 ; } } // return -1 ==> CRC16 ERROR return 1 ; } //---

void DisplayPVData(ANSData *devdata) { Serial.print("Device ID:(") ; Serial.print((*devdata).DeviceID) ; Serial.print(")\n") ; Serial.print("Command:(") ; Serial.print((*devdata).Cmd) ; Serial.print(")\n") ; Serial.print("Length:(") ; Serial.print((*devdata).Len) ; Serial.print(")\n") ; Serial.print("Data:(") ; Serial.print(WordValue(&(*devdata).Data)) ; Serial.print(")\n") ; Serial.print("CRC:(") ; Serial.print(WordHex(&(*devdata).CRC16)) ; Serial.print(")\n") ;

(68)

- 56 -

PID 控制器系統程式(command.h) }

int Get_SV(ANSData *devdata) { int stage = 0 ; Serial.println("Enter Get_SV--While") ; while (Serial2.available()>0) { if (stage == 0) { Serial.println("Enter Stage0") ; Serial2.readBytes(&cmd,1) ; (*devdata).DeviceID = cmd ; stage = 1 ; continue ; } if (stage == 1) { Serial.println("Enter Stage1") ; Serial2.readBytes(&cmd,1) ; (*devdata).Cmd = cmd ; stage = 2 ; continue ; } if (stage == 2) { Serial.println("Enter Stage2") ; Serial2.readBytes(&cmd,1) ; (*devdata).Len = cmd ; stage = 3 ; continue ; } if (stage == 3) { Serial.println("Enter Stage3") ; Serial2.readBytes(&cmd,1) ;

(69)

- 57 - PID 控制器系統程式(command.h) (*devdata).Data.HI = cmd ; Serial2.readBytes(&cmd,1) ; (*devdata).Data.LO = cmd ; stage = 4 ; continue ; } if (stage == 4) { Serial.println("Enter Stage4") ; Serial2.readBytes(&cmd,1) ; (*devdata).CRC16.HI = cmd ; Serial2.readBytes(&cmd,1) ; (*devdata).CRC16.LO = cmd ; return 1 ; } } // return -1 ==> CRC16 ERROR return 1 ; } //---

void DisplaySVData(ANSData *devdata) { Serial.print("Device ID:(") ; Serial.print((*devdata).DeviceID) ; Serial.print(")\n") ; Serial.print("Command:(") ; Serial.print((*devdata).Cmd) ; Serial.print(")\n") ; Serial.print("Length:(") ; Serial.print((*devdata).Len) ; Serial.print(")\n") ;

(70)

- 58 - PID 控制器系統程式(command.h) Serial.print("Data:(") ; Serial.print(WordValue(&(*devdata).Data)) ; Serial.print(")\n") ; Serial.print("CRC:(") ; Serial.print(WordHex(&(*devdata).CRC16)) ; Serial.print(")\n") ; } float GETPV() { long gg = WordValue(&retdata.Data) ; return gg/10+0.1*(gg%10) ; } float GETSV() { long gg = WordValue(&retdata.Data) ; return gg/10+0.1*(gg%10) ; } 表 11 PID 控制器系統程式(initPins.h) PID 控制器系統程式(initPins.h) #include <String.h>

#include <WiFi.h> // WIFI NEED THIS

#include <WiFiMulti.h> //設定多 AP 資料與密碼

//WiFiMulti wifiMulti; //設定多 AP 資料與密碼 物件 #include <String.h>

(71)

- 59 - PID 控制器系統程式(initPins.h) #define RXD2 16 #define TXD2 17 int cmmstatus = 0 ; char clintid[20]; char Oledchar[30] ; #define maxfeekbacktime 5000 int phasestage=1 ;

boolean flag1 = false ; boolean flag2 = false ; String d,s;

////////////////////////////////////////////////////// // control parameter

boolean systemstatus = false ; boolean Reading = false ; boolean Readok = false ; // int trycount = 0 ; int wifierror = 0 ;

boolean btnflag = false ; //---

int keyIndex = 0; // your network key Index number (needed only for WEP)

IPAddress ip ; long rssi ;

(72)

- 60 -

PID 控制器系統程式(initPins.h)

char iotserver[] = "nuk.arduino.org.tw" ; // name address for Google (using DNS)

int iotport = 8888 ;

// Initialize the Ethernet client library // with the IP address and port of the server

// that you want to connect to (port 80 is default for HTTP): String strPVGet="GET /pid/dataadd.php";

String strGet="GET /pid/dataadd.php"; String strHttp=" HTTP/1.1";

String strHost="Host: nuk.arduino.org.tw"; //OK String connectstr ; String MacData ; WiFiClient client; WiFiClient mqclient; MQTTClient mqttclient; int deviceid=1 ; float PV = 0.0 ; float SV = 0.0 ; float AL1 = 0.0 ; float AL2 = 0.0 ; 表 12 PID 控制器系統程式(crc16.h) PID 控制器系統程式(crc16.h)

void requestdata(byte *sendstr, int len) ; void requesttemperature() ;

void requesthumidity() ; int GetDHTdata(byte *dd) ; int Parsing_PV(byte idno) ;

unsigned int WordValue(Word *twobyte) ; //---

(73)

- 61 - PID 控制器系統程式(crc16.h) 0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241, 0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440, 0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40, 0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841, 0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40, 0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41, 0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641, 0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040, 0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240, 0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441, 0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41, 0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,

0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,

0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,

0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,

0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,

0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,

0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,

(74)

- 62 -

PID 控制器系統程式(crc16.h)

0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,

0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840, 0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41, 0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40, 0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640, 0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041, 0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241, 0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440, 0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40, 0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841, 0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40, 0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41, 0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641, 0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040 };

unsigned int ModbusCRC16 (byte *nData, int wLength) {

byte nTemp;

(75)

- 63 -

PID 控制器系統程式(crc16.h) while (wLength--)

{

nTemp = *nData++ ^ wCRCWord; wCRCWord >>= 8;

wCRCWord ^= wCRCTable[nTemp]; }

return wCRCWord; } // End: CRC16

boolean CompareCRC16(unsigned int stdvalue, uint8_t Hi, uint8_t Lo) { if (stdvalue == Hi*256+Lo) { return true ; } else { return false ; } }

boolean CRC16Compare(Word *srcvalue, Word *cmpvalue) { //long aa = WordValue(srcvalue); // long bb = WordValue(cmpvalue); if (WordValue(srcvalue) == WordValue(cmpvalue)) { return true ; } else { return false ; }

數據

圖 7 FY900 控制器背面各接點說明-1
圖 8 FY900 控制器背面各接點說明-2
圖 9 FY900 控制器背面各接點說明-3
圖 12 壓力控制應用範例實體圖-1
+7

參考文獻

相關文件

• Environmental Report 2020 of Transport Department, Hong Kong: to provide a transport system in an environmentally acceptable manner to align with the sustainable development of

a) Describe the changing trend of daily patronage of different types of public transport modes in Hong Kong from 2000 to 2015.. b) Discuss the possible reasons leading to

Apart from actively taking forward the &#34;Walk in HK&#34; programme announced by the Transport and Housing Bureau in January this year to encourage people to walk more, we

This research intent to establish the ecosystem system database and ecosystem potentials analysis to evaluate the modal, being provided for programming of coastal and ocean

After teaching the use and importance of rhyme and rhythm in chants, an English teacher designs a choice board for students to create a new verse about transport based on the chant

For the proposed algorithm, we establish a global convergence estimate in terms of the objective value, and moreover present a dual application to the standard SCLP, which leads to

圖4 1 整合資訊系統風險 圖4.1 整合資訊系統風險..

Despite significant increase in the price index of air passenger transport (+16.97%), the index of Transport registered a slow down in year-on-year growth from +12.70% in July to