基于 Modbus 的工业数据采集、控制(part 2)

基本处理流程

服务器

parse_and_process(char * input)//input :post请求发送的正文
{
    ...
    // 请求 modbus 数据
    else if(strstr(input, "modbus_get"))
    {
        return handle_get(sock, input);
    }
    // 控制 modbus 设备
    else if(strstr(input, "modbus_set"))
    {
        return handle_set(sock, input);
    }
....
}

static int handle_get(int sock, const char *input)
{
    // 1.创建 key
    // 2.创建或打开共享内存
    // 3.映射
    // 4.读取共享内存中的数据
    // 5.发送
}

static int handle_set(int sock, const char *input)
{
    // 1.创建key
    // 2.创建或打开消息队列
    // 3.将 postman 中下发指令添加到消息队列
    // 4.发送
}

采集控制程序

// 采集传感器数据线程
void *info(void *arg)
{
    // 创建或打开共享内存、映射
    while(1)
    {
        // 读寄存器的数据
        // 写入共享内存
        sleep(1);
    }
}

// 控制设备线程
void *control(void *arg)
{
    // 创建或打开消息队列
    while(1)
    {
        // 读消息队列
        // 控制设备
    }
}

VsCode 开发环境

安装库“open in browser”

库安装完成后,编写 html 文件。
在编写文本位置右击 ——> open in other browser ——> 选择合适的浏览器,
即可在网页显示 html 标签内容。
在这里插入图片描述

Html 简介

HTML(Hyper Text Markup Language),中文译为“超文本标记语言”。是用来描述网页的一种语言。所谓超文本,是因为它可以加入图片、声音、动画、多媒体等内容,不仅如此,它还可以从一个文件跳转到另一个文件,与世界各地主机的文件连接。
HTML 不是一种编程语言,而是一种标记语言(markup language)。
Web 浏览器的作用是读取 HTML 文档,并以网页的形式显示出它们。浏览器不会显示 HTML 标签,而是使用标签来解释页面的内容。

Html标签

标签格式

1、有尖括号包围的关键字,如:<html>;
2、通常成对存在,如:<body></body>;
3、上面的标签前面是开始标签,后面是结束标签。

标签分类

1、单标签:也称空标签 <标签名 /> 如:

2、双标签:成对存在 <标签名> 内容 </标签名>

常用标签

h1-h6 标题标签

格式:<hn> 标题文本 </hn>

举例:
<h1>这是标题标签</h1>
<h2>这是标题标签</h2>
<h3>这是标题标签</h3>
<h4>这是标题标签</h4>
<h5>这是标题标签</h5>
<h6>这是标题标签</h6>

p 段落标签

格式:<p> 文本内容 </p>
一个段落中会根据浏览器窗口的大小自动换行。

br 换行标签

格式:<br />

div 标签

一个块级元素,可以把文档分割为独立的、不同的部分,可以在 div 中嵌套标签。
举例:
<div class=“news”>
<h2>News headline 1</h2>
<p>some text. some text. some text…</p>
</div>
注:可以给 div 设置 class 或 id,通过选择器设置属性,则内部成员具有相同属性。

input 表单标签

格式:<input type=”” name=”” value=”” id=””…>
在这里插入图片描述

当 type 为 text,表示文本输入框,用法如下:

<input type=“text” value=“文本框默认值”>

当 type 为 radio,表示单选框,用法如下:

<input type=“radio” name=“控件名称” value=“提交的数值” οnclick=“处理函数” checked=“checked”>

解释:name:控件名称,同一组单选框设置相同名称
value:必须要有,是当点击时会提交的数据
onclick:点击时会执行双引号中的处理函数
checked:默认选中,同一组中只设置一个即可

代码示例

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
      function fun(obj)
        {
          if(obj == 'man')
          {
            console.log("I am man!");
          }
          else{
            console.log("I am woman!");
          }
        }
      function get_info()
        {
          // 获取标签为usrname的标签,赋值给v
          var v = document.getElementsByName("usrname");
          // v[0].value="hello";
          var xhr = new XMLHttpRequest();//创建XMLHttpRequest对象
          var url="";

          xhr.open("post",url,true);

          xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200)//请求完成且成功
            {
              v[0].value = xhr.responseText;//响应正文
            }
          };
          xhr.send("modbus_get");//发送正文
        }
    </script>
  </head>

  <body>
    hello world!
    <!-- br表示换行 -->
    <br>
    你好
    <h1>一级标题</h1>
    <div style="color: hotpink;background: ivory">
      <h2>二级标题</h2>
      <!-- p是段落标签 -->
      <p>
        HTML(英文Hyper Text Markup Language的缩写)中文译为“超文本标记语言”。是用来描述网页的一种语言。
        所谓超文本,因为它可以加入图片、声音、动画、多媒体等内容,不仅如此,它还可以从一个文件跳转到另一个文件,与世界各地主机的文件连接。
        HTML 不是一种编程语言,而是一种标记语言 (markup language)
        Web 浏览器的作用是读取 HTML 文档,并以网页的形式显示出它们。浏览器不会显示 HTML 标签,而是使用标签来解释页面的内容
      </p>
    </div>

    123456
    <br>
    学习新思想,争做新青年!
    <br>
    <!-- input表单标签,type类型为text,表示文本输入,value为默认值 -->
    用户名:
    <input type="text" name="usrname" value="admin">
    刷新
    <input type="button" name="flash" onclick="get_info()">
    <br>
    <!-- type类型为radio表示单选框,表示同一类型的单选框name必须相同 ,checked表示默认选中-->
    男:
    <input type="radio" name="sex" id="man" checked="checked" onclick="fun(id)">
    女:
    <input type="radio" name="sex" id="woman" onclick="fun(id)">
  </body>

</html>

补充:当请求被发送到服务器时,我们需要执行一些基于响应的任务。
每当 readyState 改变时,就会触发 onreadystatechange 事件。
readyState 属性存有 XMLHttpRequest 的状态信息。
下面是 XMLHttpRequest 对象的三个重要的属性:
在这里插入图片描述

如果想要用多个文本框显示数据:

var response = xhr.responseText;	//获取响应数据
var v = response.split(',');			//用,拆分响应字符串
     // v[0]:表示第一个数据
     // v[1]: 表示第二个数据
     ....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/180712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【OpenAI】经营权争夺战关系图

《OpenAI新模型曝重大飞跃&#xff1a;AGI雏形或威胁人类&#xff0c;也成Altman被解雇导火索&#xff01;》摘要如下: [一句话总结] OpenAI的Q*项目取得突破&#xff0c;解决了以前未见过的数学问题&#xff0c;为AI发展带来重要的技术里程碑。 [文章概览要点] OpenAI内部研…

redis运维(十四) hash缓存案例

一 缓存案例 ① 需求 ② 个人理解 策略&#xff1a;不更新缓存&#xff0c;而是删除缓存大部分观点认为&#xff1a;1、做缓存不应该是去更新缓存,而是应该删除缓存2、然后由下个请求去缓存,发现不存在后再读取数据库,写入redis缓存 高并发场景下,到底先更新缓存还是先更…

完美解决RuntimeError: implement_array_function method already has a docstring

文章目录 一、报错原因--numpy版本太低二、更新numpy总结 一、报错原因–numpy版本太低 当收到 "RuntimeError: implement_array_function method already has a docstring" 错误时&#xff0c;这可能是由于在numpy的某个版本中&#xff0c;该方法的文档字符串&…

vue3-生命周期

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-生命周期 目录 vue3生命周期 vue3生命周期钩子 1.1 onMounted() 1.2 onUpdated() 1.3 onU…

2024年天津专升本招生计划及其收费标准

2024年天津专升本招生计划及其收费标准 天津农学院 文史类 人力资源管理 20 4400 文史类 物流管理 20 4400 理工类 人力资源管理 10 4400 理工类 物流管理 10 4400 理工类 水文与水资源工程 30 5400 有专业限制 理工类 水产养殖学 20 4400 有专业限制 天津…

ui5使用echart

相关的代码已经发布到github上。 展示下相关的实现功能 1、柱状图-1 2、柱状图-2 3.折线图 4.饼状图 如何使用&#xff1a; 使用git clone项目到本地 git clone https://github.com/linhuang0405/com.joker.Zechart找到index.html。在vscode里右键选择Open with Live Serve…

我的创业之路:3个月的经历与回顾

从金山办公离职到现在已过去差不多3个月的时间&#xff0c;自己开发的产品也逐步稳定&#xff0c;是时候总结和回顾一下这三个月的心路历程了 起点 离职后&#xff0c;我思考过很多个创业项目&#xff0c;最后还是选择了做一款在线打字练习的网站。其主要原因如下&#xff1a…

杨传辉:从一体化架构,到一体化产品,为关键业务负载打造一体化数据库

在刚刚结束的年度发布会上&#xff0c;OceanBase正式推出一体化数据库的首个长期支持版本 4.2.1 LTS&#xff0c;这是面向 OLTP 核心场景的全功能里程碑版本&#xff0c;相比上一个 3.2.4 LTS 版本&#xff0c;新版本能力全面提升&#xff0c;适应场景更加丰富&#xff0c;有更…

关于APP备案的通知以及APP备案的常见问题

前言 众所周知今年8月份&#xff0c;工信部出台了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;APP开发者的影晌是显而易见的。开发者需要按照要求提交相关材料进行备案&#xff0c;这无疑增加了开发者的时间和精力成本。虽然备案制度会增加开发者…

探针台的应用领域

探针台&#xff08;Probe Station&#xff09;是一种用于对半导体器件进行电性能测试的重要设备。它通常由精密的机械结构、高性能的探针针头和电性能测试仪器组成。探针台可以对半导体芯片、集成电路和其他微电子器件进行直接的电性能测试&#xff0c;从而为研究和生产提供有价…

Docker部署Vue+Springboot项目

一、部署Springboot项目 1.1先将本地的java项目打成jar包。 再右上角进行maven操作。 1.2将jar包上传到服务器当中。 先再目录/home 下创建一个文件夹&#xff08;classRoom&#xff09;用于存放后端打镜像时需要的文件。 如果是服务器的话可以直接将文件拖拽到想要转移的地方…

python数据结构与算法-15_堆与堆排序

堆(heap) 前面我们讲了两种使用分治和递归解决排序问题的归并排序和快速排序&#xff0c;中间又穿插了一把树和二叉树&#xff0c; 本章我们开始介绍另一种有用的数据结构堆(heap)&#xff0c; 以及借助堆来实现的堆排序&#xff0c;相比前两种排序算法要稍难实现一些。 最后我…

Unity UI设计 软件构造实验报告

实验1: 仿真系统的UI主界面设计 1.实验目的 &#xff08;1&#xff09;熟悉Unity中UI界面的设计与编写&#xff1b; &#xff08;2&#xff09;熟悉UI界面中场景转换,UI与场景内容相互关联的方式。 &#xff08;3&#xff09;熟悉Unity中MySQL数据库的操作 2.实验内容 新建…

分布式锁之基于redis实现分布式锁(二)

2. 基于redis实现分布式锁 2.1. 基本实现 借助于redis中的命令setnx(key, value)&#xff0c;key不存在就新增&#xff0c;存在就什么都不做。同时有多个客户端发送setnx命令&#xff0c;只有一个客户端可以成功&#xff0c;返回1&#xff08;true&#xff09;&#xff1b;其他…

在线视频课程教育系统源码/网课网校/知识付费/在线教育系统/在线课程培训系统源码

源码简介&#xff1a; 在线视频课程教育系统源码&#xff0c;作为网课/网校/知识付费/在线教育系统&#xff0c;它有文章付费阅读在线点播自动发货付费阅读VIP会员系统等功能。它是实用的在线课程培训系统源码。 发货100-在线视频课程教育系统&#xff0c;它是一款功能实用的…

PC8250(CC-CV控制)5V/8A同步降压恒流恒压软启动带EN功能只需极少外围元件

概述 PC8250是一个同步降压转换器输出电流至8A。它的设计允许操作电源电压范围从9V到42V。外部关闭功能可以通过逻辑电平来控制COMP/EN引脚下降&#xff0c;然后进入待机模式。外部补偿使反馈控制具有良好的线路和负载调节&#xff0c;外部设计灵活。PC8250在CC&#xff08;恒定…

【C语言】深入解开指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

基于Pytorch框架多人多摄像头摔倒跌倒坠落检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在计算机视觉领域的应用已经取得了显著的进展&#xff0c;特别是在多人多摄像头场景下的摔倒跌倒检测。通过…

OpenSearch开发环境安装Docker和Docker-Compose两种方式

文章目录 简介常用请求创建映射写入数据查询数据其他 安装Docker方式安装OpenSearch安装OpenSearchDashboard Docker-Compose方式Docker-Compose安装1.设置主机环境2.下载docker-compose.yml文件3.启动docker-compose4.验证 问题问题1&#xff1a;IPv4 forwarding is disabled.…

给数据库查询结果添加一个额外的自增编号

1、在mysql数据库可以执行的sql SELECT( i : i 1 ) num,M.* FROMuser M,( SELECT i : 0 ) AS ID GROUP BYM.ID ORDER BYM.create_time SELECT (i :i 1) 是为了生成自增的序列号字段 SELECT i : 0 是为了将i进行初始化每次查询的序列号都会从1开始进行排序生成序列号 在…