小 T 導(dǎo)讀:科大智能(CSG)是全國領(lǐng)先的工業(yè)智能化解決方案供應(yīng)商之一。SCARM是CSG開發(fā)的遠程監(jiān)控與維護管理平臺,是典型的物聯(lián)網(wǎng)應(yīng)用,開發(fā)團隊在評估不同的物聯(lián)網(wǎng)開發(fā)框架后,選用了TDengine Database。
設(shè)備監(jiān)測與預(yù)測性維護業(yè)務(wù)場景介紹
設(shè)備預(yù)測性維護是在物流裝備/機臺等生產(chǎn)設(shè)備上加裝物聯(lián)網(wǎng)傳感器,實時采集設(shè)備運行過程中的狀態(tài)數(shù)據(jù),運用邊緣端/云端的設(shè)備維保知識庫,管理設(shè)備維保作業(yè),預(yù)警設(shè)備故障發(fā)生風(fēng)險;形成物聯(lián)采集端—邊緣計算端—云端大數(shù)據(jù)端的管理閉環(huán)。這個閉環(huán)產(chǎn)生的行業(yè)價值是巨大的:
- 按計劃保養(yǎng)設(shè)備,有效延長設(shè)備使用壽命;
- 預(yù)警設(shè)備故障風(fēng)險,保障生產(chǎn)安全;
- 提供遠程故障診斷工具,沉淀維保經(jīng)驗到知識庫,為設(shè)備廠商創(chuàng)造增值服務(wù),指導(dǎo)第三方維保服務(wù);
- 量化管理維保作業(yè),為第三方維保服務(wù)質(zhì)量提供管理依據(jù);
- 運用實時監(jiān)控和數(shù)據(jù)分析等技術(shù)手段,借助邊緣策略,及時處理現(xiàn)場宕機、來料短缺等突發(fā)情況。
SCARM是CSG開發(fā)的遠程監(jiān)控與維護管理平臺。運用物聯(lián)網(wǎng)技術(shù),實時監(jiān)控堆垛機、穿梭車、提升機等物流設(shè)備的運行狀態(tài),結(jié)合維保作業(yè)管理數(shù)據(jù),計算設(shè)備故障風(fēng)險,指導(dǎo)用戶采取適當(dāng)措施排除設(shè)備故障風(fēng)險,降低設(shè)備由于維護不當(dāng)所致的停機風(fēng)險。
實現(xiàn)目標(biāo)如下:
- 采集和存儲堆垛機、穿梭車、提升機等設(shè)備實時運行數(shù)據(jù);
- 實時展示儲堆垛機、穿梭車、提升機等運行情況,比如電機的電壓、電流、行走速度、異常噪音等;
- 預(yù)防性維護,綜合分析設(shè)備運行與維護作業(yè)數(shù)據(jù),推算設(shè)備故障風(fēng)險;
- 按期生成檢查和維護保養(yǎng)計劃,管理維保作業(yè),保障生產(chǎn)安全。
設(shè)計系統(tǒng)的業(yè)務(wù)流程
SCARM是典型的物聯(lián)網(wǎng)應(yīng)用,邊緣計算節(jié)點推送的數(shù)據(jù)經(jīng)消息隊列分發(fā)給流式計算模塊及日志存儲模塊,物化模型與以關(guān)系數(shù)據(jù)庫為中心的模型有很大區(qū)別,開發(fā)團隊在評估不同的物聯(lián)網(wǎng)開發(fā)框架后,選用了TDengine Database。我們以一個例子來展示TDengine簡單易用的編程接口,及如何用它解決物聯(lián)網(wǎng)特有的流式計算問題。例子的編程思路如下:
- 采集服務(wù)采集設(shè)備數(shù)據(jù),并傳遞到MQTT Server進行數(shù)據(jù)推送;
- 數(shù)據(jù)處理服務(wù)訂閱MQTTServer的最新數(shù)據(jù),進行協(xié)議解析,將具體的字段進行處理,并調(diào)用TDengine的JDBC標(biāo)準(zhǔn)接口寫入數(shù)據(jù);
- 再往上的架構(gòu)就是標(biāo)準(zhǔn)的MVC架構(gòu):應(yīng)用層調(diào)用服務(wù)層獲取到數(shù)據(jù)層(TDengine時序數(shù)據(jù)庫)中設(shè)備的統(tǒng)計及分析數(shù)據(jù),并返回進行展示和操作;
- 通過Grafana直接連接數(shù)據(jù)層TDengine數(shù)據(jù)庫,在應(yīng)用層展示設(shè)備的實時數(shù)據(jù)情況。
這里需要注意的是,TDengine是一個設(shè)備一張表的設(shè)計思路,因此在步驟2的數(shù)據(jù)處理服務(wù)中,我們根據(jù)項目及設(shè)備類型在TDengine時序數(shù)據(jù)庫中先建好超級表(每類設(shè)備一個超級表,定義好該類設(shè)備要采集的字段,以及一些靜態(tài)標(biāo)簽如設(shè)備ID、分組等)和每個設(shè)備對應(yīng)的子表。在MQTT協(xié)議解析后,每臺設(shè)備的數(shù)據(jù)應(yīng)存到其對應(yīng)的子表中。子表的名字和設(shè)備ID之間要建立一種映射關(guān)系,這樣在寫入數(shù)據(jù)時可以根據(jù)上報數(shù)據(jù)中的設(shè)備ID信息直接找到要寫的表名。當(dāng)然整個平臺的業(yè)務(wù)數(shù)據(jù)還是存儲在關(guān)系數(shù)據(jù)庫MySQL中;一些用戶最常用的數(shù)據(jù)我們也放到了Redis中。TDengine可以解決最新采集數(shù)據(jù)的緩存問題,省去了一些Redis的內(nèi)存開銷。
系統(tǒng)的整體架構(gòu)如下圖。

TDengine配置使用
一、安裝和配置TDengine數(shù)據(jù)庫集群
1. 安裝
在一臺Linux服務(wù)器上安裝TDengine的過程非常簡單,只需要執(zhí)行install.sh腳本,然后執(zhí)行命令啟動taosd服務(wù)即可(更多可參考 TDengine官網(wǎng)):
sudo systemctl start taosd
2. 配置數(shù)據(jù)庫集群
項目中采用3臺服務(wù)器配置TDengine數(shù)據(jù)庫集群。TDengine的分布式架構(gòu)中分為虛擬數(shù)據(jù)節(jié)點和虛擬管理節(jié)點兩種不同的虛擬化節(jié)點。虛擬節(jié)點是對物理服務(wù)節(jié)點的虛擬化分,其中數(shù)據(jù)節(jié)點的分布是完全去中心化的,而管理節(jié)點則是遵循Master-Slave的方式。因此再集群配置時,要配置一下管理節(jié)點主節(jié)點所在服務(wù)器的IP地址(MasterIP),以及第一備選節(jié)點的IP(SecondIP)。
首先在3臺服務(wù)器均完成TDengine安裝后,先不要啟動服務(wù),在每臺服務(wù)器的taos.cfg文件中添加MasterIP、SecondIP以及PrivateIP的配置信息。之后,啟動3臺服務(wù)器上的taosd服務(wù),并用taos客戶端連入主節(jié)點所在服務(wù)執(zhí)行
create dnode <DataNodeIP>
其中<DataNodeIP>是具體的第二臺服務(wù)器的通信IP地址。這樣這臺服務(wù)器就被加入到了集群中。
仿照上述操作配置第三臺服務(wù)器后,通過show dnodes命令可查詢配置的集群節(jié)點如下:

到此,集群配置成功。
二、創(chuàng)建Spring Boot項目,配置taos依賴及參數(shù)
在SpringBoot項目的pom.xml文件中加入taos的jdbc依賴:
<dependency>
<groupId>com.taosdata.jdbc</groupId>
<artifactId>taos-jdbcdriver</artifactId>
<version>1.0.1</version>
</dependency>
在SpringBoot項目的.yml文件中配置公共的taos數(shù)據(jù)庫連接url:
spring:
taos:
enable: true
jdbcUrl: jdbc:TAOS://192.168.12.28:6020/demo?user=root&password=taosdata
database: demo
三、實現(xiàn)taos相關(guān)業(yè)務(wù)
打開taos數(shù)據(jù)庫連接
try {
if(connection == null)
connection = DriverManager.getConnection(url);
}catch (Exception e){
e.printStackTrace();
}
創(chuàng)建超級表及設(shè)備的子表
Statement smt = connection.createStatement();
String sql = String.format(CREATE_SUPER_TABLE, s_name);
smt.executeUpdate(sql);
sql = String.format(CREATE_TABLE, t_name, s_name, paras[0], paras[1]);
smt.executeUpdate(sql);
設(shè)備信息的插入
Statement smt = null;
try{
smt = connection.createStatement();
return smt.executeUpdate("import into " + sqlBody);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(smt != null)
? smt.close();
}catch (Exception e){
e.printStackTrace();
}
}
設(shè)備信息的查詢
Statement smt = null;
List<T> list = new ArrayList<>();
try{
smt = connection.createStatement();
result = smt.executeQuery(sql);
Field[] fields = clazz.getDeclaredFields();
T t = null;
while (result.next()){
t = clazz.newInstance();
for (Field field : fields){
field.setAccessible(true);
field.set(t, result.getObject(field.getName(), field.getType()));
}
list.add(t);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try{
if(smt != null)
smt.close();
}catch (SQLException se){
se.printStackTrace();
}
}
四、配合Grafana的可視化展示
實際效果圖如下圖

使用TDengine的體會
相比關(guān)系型數(shù)據(jù)庫,時序數(shù)據(jù)庫對量級龐大的時序數(shù)據(jù)能高效的進行存儲和查詢,而且在存儲空間的節(jié)省上也有很大的優(yōu)勢。特別是使用TDengine數(shù)據(jù)庫,相較于一開始使用的OpenTSDB時序數(shù)據(jù)庫,在I/O的操作會更快,數(shù)據(jù)存儲空間占用少。再加上TDengine數(shù)據(jù)庫輕量、集成簡單的優(yōu)勢,使用方式靈活,可發(fā)揮空間很大。后續(xù)期望能通過數(shù)據(jù)庫自帶的流式計算來分擔(dān)業(yè)務(wù)上的一些計算壓力。
作者簡介:
張少華(第一作者),安徽科大智能物聯(lián)高級軟件開發(fā)工程師,目前負(fù)責(zé)物聯(lián)網(wǎng)應(yīng)用方向研發(fā)工作。
黃一多,安徽科大智能物聯(lián)軟件總工程師,目前主要負(fù)責(zé)物聯(lián)網(wǎng)、大數(shù)據(jù)等核心技術(shù)研究工作。
公司介紹:
科大智能物聯(lián)技術(shù)有限公司作為科大智能科技股份有限公司(股票代碼:300222)的重要成員,是面向工業(yè)智能物聯(lián)解決方案的先驅(qū)者和領(lǐng)軍企業(yè)。公司在“引領(lǐng)行業(yè)發(fā)展,促進工業(yè)進步”的愿景下,秉承“創(chuàng)造價值、交付價值”的經(jīng)營理念,致力于將智能算法、大數(shù)據(jù)技術(shù)、物聯(lián)網(wǎng)技術(shù)等應(yīng)用在物流與供應(yīng)鏈、生產(chǎn)工藝優(yōu)化、智能加工、產(chǎn)品質(zhì)量檢測與追溯等工業(yè)生產(chǎn)的不同領(lǐng)域和環(huán)節(jié),將新技術(shù)賦能各類制造業(yè)企業(yè),實現(xiàn)智能制造,提升客戶企業(yè)競爭力,推動行業(yè)轉(zhuǎn)型升級。



互聯(lián)網(wǎng).png)



-1.png)







證.png)


伙伴.png)
伙伴.png)
伙伴.png)



