项目实战:数字孪生可视化大屏幕,实现生产过程实时监控

本文主要是介绍项目实战:数字孪生可视化大屏幕,实现生产过程实时监控,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目介绍

智慧工厂数据可视化系统,融合工业大数据、物联网、人工智能等各类信息技术,整合厂区现有信息系统的数据资源,实现数字孪生工厂、设备运维监测、智能管网监测、综合安防监测、便捷通行监测、能效管理监测、生产管理监测、仓储物流监测等多种功能,有效提高厂区综合监管能力、降低企业厂区运营成本,实现管理精细化、决策科学化和服务高效化。

项目展示

我们使用canvas,echarts,three.js开发绘制数字孪生工厂、设备运维监测、能效管理监测等页面,下面是项目中的一些案例

1.数字孪生工厂案例

2.设备运维监测案例

3.能效管理监测

项目开发

下面我们将通过项目实战教会大家如何利用canvas绘制一个智慧工厂数据可视化场景页面。

本文章以设备运维监测页面为案例讲解

1.场景画布绘制

针对智慧工厂数据可视化系统各种场景的绘制,首先我们使用canvas绘制一个画布,然后定义全局的canvas和ctx对象。

<canvas id="canvas" width="1880" height="900"></canvas>let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
2.场景元素绘制

首先我们把模型的图片准备好,然后我们写一个函数createPic可以传入模型的坐标位置,模型的大小和模型的路径。

2.1 绘制模型

createPic前2个参数是坐标xy轴的位置,我们这边坐标点是10,10 就会在画布的左上角绘制模型。createPic第3个第四个参数是模型的大小,我们这边定义模型的大小是222,232 。createPic最后一个参数数模型图片的位置。

createPic(10,10,222,232,'../scanboard4/model/水池.png');//调节池
2.2 createPic函数实现

创建一个Image对象,把图片的路径src赋值给Image对象,在Image的onload方法中拿到Image图片并通过ctx对象(canvas上下文对象)的drawImage的方法把模型加载到画布上

2.3 绘制标签

给模型添加名称,实际设备参数

createPic(50,50,222,232,'../scanboard4/model/水池.png');//调节池
drawLabel(125,40,'pH:3.21');
drawTitle(125,159,'调节池');

2.4 drawTitle和drawLabel函数实现

我们使用canvasAPI中的fillText绘制文字,设备参数是动态参数经常会变,我们需要每次绘制的时候把上一次的文字抹除掉,这边我们通过clearRect方法把上一次的文字抹除,因为文字大小和长度不一样的,每次抹除的范围不一样,我们通过canvasAPI中的measureText(text)可以得到文字的长度和高度去抹除

//绘制标题
function drawTitle(x,y,title,color,font){ctx.beginPath();if(!font){ctx.font="18px Arial";}else{ctx.font = font; }if(!color){ctx.fillStyle = "#F6DC2C"; }else{ctx.fillStyle = color; }ctx.textAlign="left";ctx.fillText(title,x,y); ctx.closePath();  ctx.restore();    
}//绘制指标
function drawLabel(x,y,text,color,font){ctx.beginPath();if(!font){ctx.font="14px Arial";}else{ctx.font = font; }if(!color){ctx.fillStyle = "#fff"; }else{ctx.fillStyle = color; }var textWidth = ctx.measureText(text).width +50;var hangingBaseline = ctx.measureText(text).hangingBaseline;ctx.clearRect(x-3,y-(hangingBaseline+3),textWidth,(hangingBaseline+8));ctx.textAlign="left";ctx.fillText(text,x,y);ctx.closePath();      
}
2.5绘制管道

设备与设备之间会有管道转接,我们这边有金属风格、蓝色风格、绿色风格的管子,我们这边通过

drawTunnelLine和drawTunnelInterface 2个函数分别绘制管道和管道转接。

createPic(50,50,222,232,'../scanboard4/model/水池.png');//调节池
drawLabel(125,40,'pH:3.21');
drawTitle(125,159,'调节池');
//金属风格管道
drawTunnelLine(271, 87,387,87);
drawTunnelInterface(386,86,3);
drawTunnelLine(387,86,387,56);
//蓝色风格管道
drawTunnelLine1(271, 165,387,165);
//绿色风格管道
drawTunnelLine2(271, 256,387,256);
drawTunnelInterface2(387,267,2);
drawTunnelLine2(398,267,398,356);

2.6 drawTunnelLine和drawTunnelInterface函数实现

drawTunnelLine函数传入4个函数,分别是起点坐标和终点坐标。我们通过canvasAPI中fillRect绘制管道,通过createLinearGradient设置渐变色实现金属风格的渐变效果。

drawTunnelInterface函数传入3个函数,转接管的坐标点以及转接管的朝向。我通过canvasAPI中arc绘制圆弧,然后通过createRadialGradient设置渐变色实现金属风格的渐变效果。

// 绘制金属管道
function drawTunnelLine(x1, y1, x2, y2) {lineWidth = 10;  // 设置线条宽度// 计算线条的矩形范围let dx = x2 - x1;let dy = y2 - y1;let length = Math.sqrt(dx*dx + dy*dy);  // 线段长度let angle = Math.atan2(dy, dx);  // 线段的角度// 绘制矩形ctx.save();  // 保存当前上下文状态ctx.translate(x1, y1);  // 平移到起始点ctx.rotate(angle);  // 旋转到线段的角度var g1 = ctx.createLinearGradient(0, 0, 0,  lineWidth);g1.addColorStop(0.2, '#7A8383'); g1.addColorStop(0.6, '#fff');g1.addColorStop(0.8, '#7A8383'); ctx.fillStyle = g1;ctx.fillRect(0, 0, length, lineWidth);  // 绘制矩形ctx.restore();  // 恢复上下文状态
}// 绘制金属管道转接口
function drawTunnelInterface(x,y,rotate){var RADIUS = 11;ctx.beginPath();ctx.lineWidth=0.01;ctx.moveTo(x, y);var rotate = (Math.PI/2) *rotate;ctx.arc(x, y, RADIUS, Math.PI / 2 + rotate, Math.PI + rotate); //sAngle 90 ,eAngle 180var g1 = ctx.createRadialGradient(x, // 内圆中心的 x 坐标y, // 内圆中心的 y 坐标0, // 内圆的半径x, // 外圆中心的 x 坐标y, // 外圆中心的 y 坐标RADIUS // 外圆的半径,这里设置为整个 Canvas 的一半);g1.addColorStop(0.2, '#7A8383'); g1.addColorStop(0.6, '#fff');g1.addColorStop(0.8, '#7A8383'); ctx.fillStyle = g1;ctx.fill();ctx.restore();ctx.stroke();
}

项目结束

以上我们一个简单的案例基础功能就完成了,通过此案例简单的介绍了一下canvas的一些功能,大家可以根据自己的需求场景绘制自己的可视化场景。

最后给大家看一下我在工作中绘制的一些别的场景

这篇关于项目实战:数字孪生可视化大屏幕,实现生产过程实时监控的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576320

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端