ZPC是ZLG全新研发的显控一体机。开源AWTK,版权无忧!AWFlow流图编程,开发很简单!多种通信协议,设备互联超便捷!更有ZWS,数据上云很轻松!本文将介绍ZPC轻松拿捏数据上云。
ZPC简介
ZPC系列显控一体机 是广州致远电子全新研发的集“显示”+“控制”一体化的高性能显控终端产品。外框采用铝合金材质,简洁耐用;产品集成了多路隔离RS485、多路隔离CAN总线、多路千兆以太网等丰富外设。一触即发,随心控制。产品支持多种工业通信协议,工业互联超便捷!支持拖拽式开源AWTK GUI,版权无忧!支持AWFlow流图编程,应用开发很简单!还支持ZWS云,数据上云很轻松!
ZPC系列显控一体机
• RK3568处理器
• 显控一体机
• 国产显控
• 工业自动化
ZWS简介
ZWS IoT-PaaS云平台 ,是一个开放的物联网云平台,可以为用户提供多种协议设备的快速接入、设备管理、事件告警、数据统计分析等功能,帮助企业快速实现低成本搭建行业SaaS应用系统,助力企业实现数字化转型。
原理介绍
ZPC拥有多路隔离RS485、多路隔离CAN总线、多路DI/DO以及多路千兆以太网等丰富的外设接口资源。为了避免大家手头没有RS485传感器,本次我们将演示ZPC一机搞定数据轻松上云。原理是我们在ZPC上编程从RS-485-3接口输出1~100的数据,RS-485-4接口采集这些数据然后通过以太网接口采用MQTT协议上传到ZWS云。
准备工作
ZPC-101Q55RTW-01显控一体机1台;
安装Ubuntu虚拟机或Ubuntu系统的PC机1台;
USB转RS232调试串口1个;
12V@2A的电源适配器1个;
双公头网线1根;
杜邦线若干。
在开始前,我们先使用杜邦线将RS485-3和RS485-4接口连通,如下图所示位置(A3接A4,B3接B4)。
调试串口连接到ZPC,网线连接到可以上网的电脑,然后给ZPC插上适配器上电。通过MobaXterm或者其它串口调试上位机登录ZPC,波特率为115200,8位数据位,1位停止位,无奇偶校验,无流控。超级用户账号密码同为root。然后使用ping指令进行测试对外网的连通情况,如下图所示即为可以上网。
ZWS建模
首先,需要准备一个ZWS云平台账号,注册并登录进入官网后,可以看到类似界面如下图所示。ZWS云平台官网链
接: https://www.zlgcloud.com/website/home/main(注册账号的过程在这里暂不展开,需要可以联系对应的销售工程师)
接着需要对设备进行建模,建模的意义在于创建一个设备类型,方便后续对同一类型设备和数据的管理。我们可以将ZPC一体机视为一个网关设备,也可以作为一个普通设备。如下图所示,依次点击设备建模、设备类型、自定义、添加设备类型。
如下图所示填写所需的设备类型信息。其中类型名称只可为英文、数字或者一些特殊符号。
填写完成后,即可在界面看到所创建的设备类型。
创建完成设备类型后,还需要添加一个实际的设备。如下图所示,我们依次点击设备管理、设备列表、添加设备。
然后这里需要填写设备类型、设备名称、设备ID和设备密钥。其中,ID和密钥我们可以通过串口助手使用openssl rand -hex 16命令在ZPC一体机上生成一个长度为32的十六进制随机数来使用,如下图所示。
最后填写完毕设备信息如下图所示。(实际生产过程中,推荐使用机器序列号或其他唯一标识作为ID)
填写完成并确认后,可以在设备列表中看到创建完成的设备。
接下来,需要对上报的数据进行编辑。我们点击设备建模、设备类型、自定义,找到刚才创建的设备类型,点击编辑。
这里显示有两个功能组,其中common_fn是全局通用功能模块,其中包含上报原始数据(raw_data)的功能(本文不涉及,暂不展开);ZPC_101Q55RTW_01_fn是针对本次创建的设备类型的功能模块,点击ZPC_101Q55RTW_01_fn的编辑按钮。
创建对应的数据组和数据字段。
数据组可以将所有的同类型数据作为一个数据组。比如使用ZPC一体机进行检测被测设备的压力值,在此将压力值(pressure)作为一个数据组如下图所示。
而数据字段代表了数据组下的一个数据字段内容。比如检测多个被测设备时,可以将某一节点作为一个字段,在此模拟将节点1的压力值作为一个pressure_node1数据字段,并将其设置为int类型数据,如下图所示。
至此,在ZWS上的准备工作完毕。
应用编程
1. 搭建数据上云
首先下载ZWS SDK包到Ubuntu虚拟机下(建议使用ubuntu20.04),并安装gcc-aarch64-linux-gnu包。解压SDK包到工作目录后,进入到zws_sdk_r2/mqttproto_V2.0.3.240626目录。在根目录下创建一个新的zpc.mk文件,用于构建工程使用,程序清单如下。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内添加以下内容,用于调用上文中的zpc.mk。
...
#内置对zpc-101q55rtw-01/zpc-101q55rtw-02的支持
if(ZPC)
#ADD_DEFINITIONS(-DARM_LINUX=1) #经验证ADD_DEFINITIONS定义的变量,然后同一个文件引用该变量是无效的
set(ARM_LINUX 1)
execute_process(COMMAND ln -svf zpc.mk cross-linux.mk)
endif()
...
创建测试代码文件,路径为demos/src/zpc_test.c,详见在线文档https://manual.zlg.cn/web/#/331/13023 程序清单2的内容,实现了从RS-485-4(对应串口/dev/ttyS8)读取数据,并上报到ZWS,详细可以参考代码注释。
并在demos/src/CMakeLists.txt中添加如下内容用于编译测试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})
...
接下来执行cmake . -DZPC=1,构建编译工程。
执行make指令,编译工程。可以看到成功构建zpc_test文件(如果不成功,请检查上述步骤)。
2. 搭建模拟数据
接下来,还需要实现从RS-485-3生成随机数据并传输。另外创建一个文件夹(最好和前文的工程分开),在文件夹下创建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;
}
// 设置波特率
cfsetospeed(&tty, B9600);
cfsetispeed(&tty, B9600);
// 设置字符大小、无奇偶校验、一个停止位
tty.c_cflag &= ~PARENB; // 无奇偶校验
tty.c_cflag &= ~CSTOPB; // 一个停止位
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8; // 8个数据位
// 设置为非规范模式
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;
// 设置读取阻塞行为
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 0;
// 刷新串口设置
if (tcsetattr(fd, TCSANOW, &tty) != 0) {
perror("tcsetattr");
return -1;
}
return 0;
}
int main() {
int fd;
int random_number;
char buffer[4];
// 打开串口设备
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;
}
// 初始化随机数生成器
srand(time(NULL));
while (1) {
// 生成 1 到 100 之间的随机数
random_number = rand() % 100 + 1;
snprintf(buffer, sizeof(buffer), "%dn", random_number);
// 向串口发送随机数
if (write(fd, buffer, sizeof(buffer)) == -1) {
perror("write");
close(fd);
return -1;
}
// 延时 1 秒
sleep(1);
}
// 关闭串口设备
close(fd);
return 0;
}
保存文件后,执行aarch64-linux-gnu-gcc main.c -o rs485_test生成测试文件。
验证数据上云
将上文中生成的测试程序zpc_test和rs485_test拷贝至ZPC一体机,并执行./rs485_test &,该程序将从RS485-3随机发送1~100的数据。由于RS-485-3(/dev/ttyS7)和RS-485-4(/dev/ttyS8)短接,可以直接使用cat /dev/ttyS8查看采集的数据,如下图所示。
最后执行./zpc_test,便开始将RS-485-4读取到的数据上报到ZWS。下图中标注的两点,为采集到的数据。
打开ZWS IoT设备管理平台界面,并按下图所示选择对应类别,即可看到上报的实时数据。
也可以使用历史数据功能查看历史数据。