ZPC是ZLG全新研發(fā)的顯控一體機(jī)。開(kāi)源AWTK,版權(quán)無(wú)憂!AWFlow流圖編程,開(kāi)發(fā)很簡(jiǎn)單!多種通信協(xié)議,設(shè)備互聯(lián)超便捷!更有ZWS,數(shù)據(jù)上云很輕松!本文將介紹ZPC輕松拿捏數(shù)據(jù)上云。
ZPC簡(jiǎn)介
ZPC系列顯控一體機(jī) 是廣州致遠(yuǎn)電子全新研發(fā)的集“顯示”+“控制”一體化的高性能顯控終端產(chǎn)品。外框采用鋁合金材質(zhì),簡(jiǎn)潔耐用;產(chǎn)品集成了多路隔離RS485、多路隔離CAN總線、多路千兆以太網(wǎng)等豐富外設(shè)。一觸即發(fā),隨心控制。產(chǎn)品支持多種工業(yè)通信協(xié)議,工業(yè)互聯(lián)超便捷!支持拖拽式開(kāi)源AWTK GUI,版權(quán)無(wú)憂!支持AWFlow流圖編程,應(yīng)用開(kāi)發(fā)很簡(jiǎn)單!還支持ZWS云,數(shù)據(jù)上云很輕松!
ZPC系列顯控一體機(jī)
? RK3568處理器
? 顯控一體機(jī)
? 國(guó)產(chǎn)顯控
??ZWS簡(jiǎn)介
ZWS IoT-PaaS云平臺(tái)?,是一個(gè)開(kāi)放的物聯(lián)網(wǎng)云平臺(tái),可以為用戶提供多種協(xié)議設(shè)備的快速接入、設(shè)備管理、事件告警、數(shù)據(jù)統(tǒng)計(jì)分析等功能,幫助企業(yè)快速實(shí)現(xiàn)低成本搭建行業(yè)SaaS應(yīng)用系統(tǒng),助力企業(yè)實(shí)現(xiàn)數(shù)字化轉(zhuǎn)型。
原理介紹
ZPC擁有多路隔離RS485、多路隔離CAN總線、多路DI/DO以及多路千兆以太網(wǎng)等豐富的外設(shè)接口資源。為了避免大家手頭沒(méi)有RS485傳感器,本次我們將演示ZPC一機(jī)搞定數(shù)據(jù)輕松上云。原理是我們?cè)赯PC上編程從RS-485-3接口輸出1~100的數(shù)據(jù),RS-485-4接口采集這些數(shù)據(jù)然后通過(guò)以太網(wǎng)接口采用MQTT協(xié)議上傳到ZWS云。
準(zhǔn)備工作
ZPC-101Q55RTW-01顯控一體機(jī)1臺(tái);
安裝Ubuntu虛擬機(jī)或Ubuntu系統(tǒng)的PC機(jī)1臺(tái);
USB轉(zhuǎn)RS232調(diào)試串口1個(gè);
12V@2A的電源適配器1個(gè);
雙公頭網(wǎng)線1根;
杜邦線若干。
在開(kāi)始前,我們先使用杜邦線將RS485-3和RS485-4接口連通,如下圖所示位置(A3接A4,B3接B4)。
調(diào)試串口連接到ZPC,網(wǎng)線連接到可以上網(wǎng)的電腦,然后給ZPC插上適配器上電。通過(guò)MobaXterm或者其它串口調(diào)試上位機(jī)登錄ZPC,波特率為115200,8位數(shù)據(jù)位,1位停止位,無(wú)奇偶校驗(yàn),無(wú)流控。超級(jí)用戶賬號(hào)密碼同為root。然后使用ping指令進(jìn)行測(cè)試對(duì)外網(wǎng)的連通情況,如下圖所示即為可以上網(wǎng)。
?ZWS建模
首先,需要準(zhǔn)備一個(gè)ZWS云平臺(tái)賬號(hào),注冊(cè)并登錄進(jìn)入官網(wǎng)后,可以看到類(lèi)似界面如下圖所示。ZWS云平臺(tái)官網(wǎng)鏈
接:?https://www.zlgcloud.com/website/home/main(注冊(cè)賬號(hào)的過(guò)程在這里暫不展開(kāi),需要可以聯(lián)系對(duì)應(yīng)的銷(xiāo)售工程師)
接著需要對(duì)設(shè)備進(jìn)行建模,建模的意義在于創(chuàng)建一個(gè)設(shè)備類(lèi)型,方便后續(xù)對(duì)同一類(lèi)型設(shè)備和數(shù)據(jù)的管理。我們可以將ZPC一體機(jī)視為一個(gè)網(wǎng)關(guān)設(shè)備,也可以作為一個(gè)普通設(shè)備。如下圖所示,依次點(diǎn)擊設(shè)備建模、設(shè)備類(lèi)型、自定義、添加設(shè)備類(lèi)型。
如下圖所示填寫(xiě)所需的設(shè)備類(lèi)型信息。其中類(lèi)型名稱(chēng)只可為英文、數(shù)字或者一些特殊符號(hào)。
填寫(xiě)完成后,即可在界面看到所創(chuàng)建的設(shè)備類(lèi)型。
創(chuàng)建完成設(shè)備類(lèi)型后,還需要添加一個(gè)實(shí)際的設(shè)備。如下圖所示,我們依次點(diǎn)擊設(shè)備管理、設(shè)備列表、添加設(shè)備。
然后這里需要填寫(xiě)設(shè)備類(lèi)型、設(shè)備名稱(chēng)、設(shè)備ID和設(shè)備密鑰。其中,ID和密鑰我們可以通過(guò)串口助手使用openssl?rand?-hex?16命令在ZPC一體機(jī)上生成一個(gè)長(zhǎng)度為32的十六進(jìn)制隨機(jī)數(shù)來(lái)使用,如下圖所示。
最后填寫(xiě)完畢設(shè)備信息如下圖所示。(實(shí)際生產(chǎn)過(guò)程中,推薦使用機(jī)器序列號(hào)或其他唯一標(biāo)識(shí)作為ID)
填寫(xiě)完成并確認(rèn)后,可以在設(shè)備列表中看到創(chuàng)建完成的設(shè)備。
接下來(lái),需要對(duì)上報(bào)的數(shù)據(jù)進(jìn)行編輯。我們點(diǎn)擊設(shè)備建模、設(shè)備類(lèi)型、自定義,找到剛才創(chuàng)建的設(shè)備類(lèi)型,點(diǎn)擊編輯。
這里顯示有兩個(gè)功能組,其中common_fn是全局通用功能模塊,其中包含上報(bào)原始數(shù)據(jù)(raw_data)的功能(本文不涉及,暫不展開(kāi));ZPC_101Q55RTW_01_fn是針對(duì)本次創(chuàng)建的設(shè)備類(lèi)型的功能模塊,點(diǎn)擊ZPC_101Q55RTW_01_fn的編輯按鈕。
創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)組和數(shù)據(jù)字段。
數(shù)據(jù)組可以將所有的同類(lèi)型數(shù)據(jù)作為一個(gè)數(shù)據(jù)組。比如使用ZPC一體機(jī)進(jìn)行檢測(cè)被測(cè)設(shè)備的壓力值,在此將壓力值(pressure)作為一個(gè)數(shù)據(jù)組如下圖所示。
而數(shù)據(jù)字段代表了數(shù)據(jù)組下的一個(gè)數(shù)據(jù)字段內(nèi)容。比如檢測(cè)多個(gè)被測(cè)設(shè)備時(shí),可以將某一節(jié)點(diǎn)作為一個(gè)字段,在此模擬將節(jié)點(diǎn)1的壓力值作為一個(gè)pressure_node1數(shù)據(jù)字段,并將其設(shè)置為int類(lèi)型數(shù)據(jù),如下圖所示。
至此,在ZWS上的準(zhǔn)備工作完畢。
? 應(yīng)用編程
1. 搭建數(shù)據(jù)上云
首先下載ZWS SDK包到Ubuntu虛擬機(jī)下(建議使用ubuntu20.04),并安裝gcc-aarch64-linux-gnu包。解壓SDK包到工作目錄后,進(jìn)入到zws_sdk_r2/mqttproto_V2.0.3.240626目錄。在根目錄下創(chuàng)建一個(gè)新的zpc.mk文件,用于構(gòu)建工程使用,程序清單如下。ZWS SDK包下載地址:
https://zlgcloud.oss-cn-shenzhen.aliyuncs.com/zws_sdk_r2.zip
MESSAGE(STATUS "BUILD FOR ZPC")
#across compiler setting
#include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
#set(CMAKE_FIND_ROOT_PATH ${TOOL_CHAIN_DIR})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
在工程根目錄的CMakeLists.txt內(nèi)添加以下內(nèi)容,用于調(diào)用上文中的zpc.mk。
...
#內(nèi)置對(duì)zpc-101q55rtw-01/zpc-101q55rtw-02的支持
if(ZPC)
#ADD_DEFINITIONS(-DARM_LINUX=1) #經(jīng)驗(yàn)證ADD_DEFINITIONS定義的變量,然后同一個(gè)文件引用該變量是無(wú)效的
set(ARM_LINUX 1)
execute_process(COMMAND ln -svf zpc.mk cross-linux.mk)
endif()
...
創(chuàng)建測(cè)試代碼文件,路徑為demos/src/zpc_test.c,詳見(jiàn)在線文檔https://manual.zlg.cn/web/#/331/13023 程序清單2的內(nèi)容,實(shí)現(xiàn)了從RS-485-4(對(duì)應(yīng)串口/dev/ttyS8)讀取數(shù)據(jù),并上報(bào)到ZWS,詳細(xì)可以參考代碼注釋。
并在demos/src/CMakeLists.txt中添加如下內(nèi)容用于編譯測(cè)試demo。
...
set(PRJ zpc_test)
add_executable(${PRJ} "")
target_sources(${PRJ} PRIVATE zpc_test.c ${shared_src})
set_target_properties(${PRJ} PROPERTIES FOLDER "demos")
target_link_libraries(${PRJ} client network ${SYS_LIBS})
...
接下來(lái)執(zhí)行cmake . -DZPC=1,構(gòu)建編譯工程。
執(zhí)行make指令,編譯工程??梢钥吹匠晒?gòu)建zpc_test文件(如果不成功,請(qǐng)檢查上述步驟)。
2. 搭建模擬數(shù)據(jù)
接下來(lái),還需要實(shí)現(xiàn)從RS-485-3生成隨機(jī)數(shù)據(jù)并傳輸。另外創(chuàng)建一個(gè)文件夾(最好和前文的工程分開(kāi)),在文件夾下創(chuàng)建main.c文件,程序清單如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
// 配置串口
int configure_serial_port(int fd) {
struct termios tty;
if (tcgetattr(fd, &tty) != 0) {
perror("tcgetattr");
return -1;
}
// 設(shè)置波特率
cfsetospeed(&tty, B9600);
cfsetispeed(&tty, B9600);
// 設(shè)置字符大小、無(wú)奇偶校驗(yàn)、一個(gè)停止位
tty.c_cflag &= ~PARENB; // 無(wú)奇偶校驗(yàn)
tty.c_cflag &= ~CSTOPB; // 一個(gè)停止位
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8; // 8個(gè)數(shù)據(jù)位
// 設(shè)置為非規(guī)范模式
tty.c_lflag &= ~ICANON;
tty.c_lflag &= ~ECHO;
tty.c_lflag &= ~ECHOE;
tty.c_lflag &= ~ISIG;
// 禁用軟件流控制
tty.c_iflag &= ~(IXON | IXOFF | IXANY);
// 禁用硬件流控制
tty.c_cflag &= ~CRTSCTS;
// 設(shè)置讀取阻塞行為
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 0;
// 刷新串口設(shè)置
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
perror("tcsetattr");
return -1;
}
return 0;
}
int main() {
int fd;
int random_number;
char buffer[4];
// 打開(kāi)串口設(shè)備
fd = open("/dev/ttyS7", O_WRONLY | O_NOCTTY);
if (fd == -1) {
perror("open");
return -1;
}
// 配置串口
if (configure_serial_port(fd) != 0) {
close(fd);
return -1;
}
// 初始化隨機(jī)數(shù)生成器
srand(time(NULL));
while (1) {
// 生成 1 到 100 之間的隨機(jī)數(shù)
random_number = rand() % 100 + 1;
snprintf(buffer, sizeof(buffer), "%dn", random_number);
// 向串口發(fā)送隨機(jī)數(shù)
if (write(fd, buffer, sizeof(buffer)) == -1) {
perror("write");
close(fd);
return -1;
}
// 延時(shí) 1 秒
sleep(1);
}
// 關(guān)閉串口設(shè)備
close(fd);
return 0;
}
保存文件后,執(zhí)行aarch64-linux-gnu-gcc main.c -o rs485_test生成測(cè)試文件。
驗(yàn)證數(shù)據(jù)上云
將上文中生成的測(cè)試程序zpc_test和rs485_test拷貝至ZPC一體機(jī),并執(zhí)行./rs485_test &,該程序?qū)腞S485-3隨機(jī)發(fā)送1~100的數(shù)據(jù)。由于RS-485-3(/dev/ttyS7)和RS-485-4(/dev/ttyS8)短接,可以直接使用cat /dev/ttyS8查看采集的數(shù)據(jù),如下圖所示。
最后執(zhí)行./zpc_test,便開(kāi)始將RS-485-4讀取到的數(shù)據(jù)上報(bào)到ZWS。下圖中標(biāo)注的兩點(diǎn),為采集到的數(shù)據(jù)。
打開(kāi)ZWS IoT設(shè)備管理平臺(tái)界面,并按下圖所示選擇對(duì)應(yīng)類(lèi)別,即可看到上報(bào)的實(shí)時(shí)數(shù)據(jù)。
也可以使用歷史數(shù)據(jù)功能查看歷史數(shù)據(jù)。