继电器介绍及qt操作继电器实战

news2024/11/30 0:43:17

一.继电器基础介绍

32路继电器通常用于自动化控制系统中,能够同时控制多达32个不同的电气设备。以下是对32路继电器的一些详细介绍:

1. 基本概念

  • 继电器:一种电气控制装置,当输入信号(通常是电流或电压)达到一定标准时,继电器会启动并控制电路的打开或关闭。
  • 路数:指可控制的通道数量,32路继电器意味着该设备可以独立控制32个负载。

2. 工作原理

  • 电气原理:当继电器的线圈通电时,内部的机械开关闭合(或断开),从而控制负载的电流流通。
  • 控制信号:通常采用微控制器、PLC、计算机等控制设备来发送控制信号。

3. 构成部分

  • 继电器模块:包括多个继电器和电路的集成,通常设计为插拔式或模块化,便于扩展和维护。
  • 控制接口:可以是USB、串口、GPIO等,用于与控制系统进行通信。
  • 电源供应:需要提供适当的工作电压(如5V、12V、24V等),以保证继电器正常工作。

4. 应用领域

  • 工业自动化:用于机器设备的控制,如电机启停、灯光控制等。
  • 家居自动化:用于智能家居系统中,控制家居设备如灯光、空调等。
  • 安防系统:用于监控设备或警报系统的控制。
  • 实验室设备:在实验过程中实现对不同设备的精准控制。
    5. 优缺点
  1. 优点:
  • 同时控制多个设备,提高工作效率。
  • 提供远程控制和自动化功能。
  • 适应性强,模块化设计便于扩展。
  1. 缺点:
  • 可能需要额外的电源管理。
  • 对电路的要求较高,确保不出现故障。
  • 如果控制信号不稳定,可能导致误动作。

6. 注意事项

  • 在选择和使用32路继电器时,需要注意电气参数(如负载电压和电流),确保其适用性和安全性。
  • 适当的散热必须考虑,尤其在同时控制多个高功率负载时。
  • 有些继电器需要额外的保护电路(如瞬时保护、延时启动等)。

7. 协议
在这里插入图片描述

二.项目相关展示

在这里插入图片描述

1. 继电器的选择

  • 这里的继电器选择的是32路继电器
  • 对应继电器的通信不需要进行引入多余的库,使用本地的 QSerialPort 模块就行,不过如果有modbus当然更建议使用modbus库。
    在这里插入图片描述

三.项目代码

  • 我这个代码写的很粗糙,仅供参考。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<Windows.h>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Init();
}

MainWindow::~MainWindow()
{
    if (serial.isOpen()) {
        serial.close();
    }
    delete ui;
}

void MainWindow::Init()
{

    // 对串口进行初始化
    serial.setPortName("COM3");
    serial.setBaudRate(QSerialPort::Baud9600); // 设置波特率
    serial.setDataBits(QSerialPort::Data8);    // 设置数据位
    serial.setParity(QSerialPort::NoParity);    // 设置奇偶校验
    serial.setStopBits(QSerialPort::OneStop);    // 设置停止位
    serial.setFlowControl(QSerialPort::NoFlowControl); // 设置流控制
    if (serial.open(QIODevice::ReadWrite)) {
        qDebug() << "Serial port opened successfully.";
    } else {
        qDebug() << "Failed to open serial port.";
    }
    //          01                69
    // 命令:55 %1 13 00 00 00 00 %2
    //55 01 13 00 00 00 00 69
}


void MainWindow::on_pushButton_open_clicked()
{
    // 将和转换为十六进制字符串
    //QString hexString = QString::number(sum, 16).toUpper();

    int last=0x88;// 打开 继电器 前面 指令 字节 数 之和
    // 计算 最后一个 数
    last+=ui->spinBox_open->value();
    QString hexString = QString::number(last, 16).toUpper();

    // 组装 指令
    QString commend="55 01 32 00 00 00";
    if(ui->spinBox_open->value()>0&&ui->spinBox_open->value()<10)
    {
        // 添加 零
        commend+=" ";
        commend+=("0"+QString::number(ui->spinBox_open->value()));
        commend+=" ";
        commend+=hexString;

        ui->textEdit->append("open commend = "+commend);
    } else
    {
        // 不 添加0
        commend+=" ";
        if(ui->spinBox_open->value()>=10&&ui->spinBox_open->value()<16)
        {
            commend+="0";
        }
        commend+=(QString::number(ui->spinBox_open->value(),16).toUpper());
        commend+=" ";
        commend+=hexString;
        ui->textEdit->append("open commend = "+commend);
    }
    serial.write(QByteArray::fromHex(commend.toLatin1().data())); // 发送指令打开继电器


}

void MainWindow::on_pushButton_close_clicked()
{
    // 将和转换为十六进制字符串
    //QString hexString = QString::number(sum, 16).toUpper();

    int last=0x87;// 打开 继电器 前面 指令 字节 数 之和
    // 计算 最后一个 数
    last+=ui->spinBox_close->value();
    QString hexString = QString::number(last, 16).toUpper();

    // 组装 指令
    QString commend="55 01 31 00 00 00";
    if(ui->spinBox_close->value()>0&&ui->spinBox_close->value()<10)
    {
        // 添加 零
        commend+=" ";
        commend+=("0"+QString::number(ui->spinBox_close->value()));
        commend+=" ";
        commend+=hexString;

        ui->textEdit->append("close commend = "+commend);
    } else
    {
        // 不 添加0
        commend+=" ";
        if(ui->spinBox_close->value()>=10&&ui->spinBox_close->value()<16)
        {
            commend+="0";
        }
        commend+=(QString::number(ui->spinBox_close->value(),16).toUpper());
        commend+=" ";
        commend+=hexString;
        ui->textEdit->append("open commend = "+commend);
    }
    serial.write(QByteArray::fromHex(commend.toLatin1().data())); // 发送指令打开继电器

}




void MainWindow::on_pushButton_req_clicked()
{
//    serial.write("1");
//    ui->textEdit->append("继电器请求状态");
    serial.write("?");
    ui->textEdit->append("request");
    if (serial.waitForReadyRead(1000))
    {
         QByteArray responseData = serial.readAll();
         while (serial.waitForReadyRead(100))
         {
             responseData += serial.readAll();
         }
         qDebug() << "接收到响应: " << responseData;
    } else
    {
         qDebug() << "没有接收到数据!";
    }

}

void MainWindow::on_pushButton_read_clicked()
{
    QByteArray data = serial.readAll();
    if (!data.isEmpty())
    {
        ui->textEdit->append(data);
    } else
    {
        ui->textEdit->append("读取信息为空");
    }
}

void MainWindow::on_pushButton_send_clicked()
{
    //QString command=ui->lineEdit_send->text();
    QString _qstrData=ui->lineEdit_send->text();


    //QByteArray commandBytes = command.toUtf8();
    serial.write(QByteArray::fromHex(_qstrData.toLatin1().data()));
    if (serial.waitForBytesWritten(1000))
    {
        ui->textEdit->append("send:"+_qstrData);
    }

    // 全部闭合 55 01 33 FF FF FF FF 85
    // 全部断开 55 01 33 00 00 00 00 89

}

四.协议详细分析

1. 55 01 32 00 00 00 01 89

  • 32路每一路代表一位,这里01代表的十六进制,总共是有8位。

  • 这里高位字节在前,低位字节在后。

  • 前面的01代表的是 0000 0001,低位的这一个字节以表示所有的位。0x32这个功能码代表闭合某一路。

2. 55 01 35 00 00 00 15 A0(同时打开1,3,5)‬

  • 假如我要打开135路的开关,这里要使用功能码0x35,则低位部分为0001 0101,此时组合成16进制为0x15,所以打开135命令为55 01 35 00 00 00 15 A0
  • 对于校验位:是前面几位十六进制的和A0
  • 0000 0000

3. 大端序(Big-Endian)和 小端序(Little-Endian)

在十六进制表示中,通常高位和低位的顺序取决于具体的上下文,特别是数据的存储格式(例如大端序和小端序)。

  • 大端序(Big-Endian): 最高有效位(高位)在前面,最低有效位(低位)在后面。
  • 小端序(Little-Endian): 最高有效位(高位)在后面,最低有效位(低位)在前面。

对于你的例子 00 00 00 01:

  1. 大端序存储:
    • 表示为:00 00 00 01
    • 高位在前,低位在后。
    • 高位是 00,低位是 01
  2. 小端序存储:
    • 表示为:01 00 00 00
    • 高位在后,低位在前。
    • 高位是 01,低位是 00
  • 结论

如果没有特定的上下文来指明是使用大端还是小端,单独看 00 00 00 01 这个序列,一般可以认为第一个 00 是高位(在大端序的情况下),而 01 是低位。若用于存储或传输,需确认具体的字节序以便正确解析。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浏览器请求无缝导入apifox(无需客户端,在线使用)方法

不用下载客户端浏览器在线模拟请求&#xff0c;方便快捷&#xff01; 废话不多少&#xff0c;只需三步&#xff0c;往下看&#xff01; 一步&#xff1a; 打开F12 -> 网络 -> 找到你要模拟的请求&#xff0c;右键以cURL格式复制 二步&#xff1a; Apifox 访问Apifox的w…

“浙里办”统一用户组件-接入 基于单点登录票据换取请求 token

基于单点登录票据换取请求 token 1. 请求地址 政务外网地址: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007/ uc/sso/access_token 互联网地址: https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220329000007 /uc/sso/access_token 2. 入参…

AFSim 仿真系统----集成指南

引言 本文档描述了将新功能扩展和集成到 AFSIM 中的有限方法。允许并描述多种方法&#xff0c;以及在 AFSIM 社区标准和指南中引入集成作为可共享资源的要求。 概述 核心可执行文件 基于 AFSIM 的可执行文件通常由单个 AFSIM “应用程序” 组成。该应用程序维护脚本类型、扩…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

SAP EWM 包装

目录 1 简介 2 业务流程 3 主数据 4 后台配置 1 简介 SAP S4 HANA 里 EWM 包装功能使用 PS&#xff08;packaging specification&#xff09;代替原有的包装功能 PM&#xff08;packaging management&#xff09;, PI&#xff08;packaging instruction&#xff09;。PS 生…

UNiapp之微信小程序导出Excel

效果如下 参考小程序&#xff1a;日常记一记 ---账单页面 主要功能是根据筛选条件导出账单明细列表&#xff0c;实现该功能主要借助一个工具(excel.js)&#xff0c;可在文章顶部下载或者一下网盘下载 https://pan.baidu.com/s/1RLisuG4_7FGD0Cnwewyabg?pwdpd2a 提取码: pd2a…

C# 判断

|判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;| | |-------------------------------------------------------------|–| | | | 下面是…

HormonyOS踩坑JSON.stringfy

前两天发现一个问题 就是一个值 用as string就可以打印出来 用JSON.stringfy()就不行 百思不得其解 想破了脑袋&#xff01;&#xff01;&#xff01;终于被我发现了 原因就在于上边那个包&#xff01;&#xff01;&#xff01;&#xff01;把那个包删除了就好了&#xff…

勇闯机器学习(第二关-数据集使用)

以下内容&#xff0c;皆为原创&#xff0c;重在无私分享高质量知识&#xff0c;制作实属不易&#xff0c;请点点关注。 好戏开场了~~~(这关涉及到了加载数据集的代码&#xff0c;下一关&#xff0c;教你们安装机器学习库) 一.数据集 这一关的目标 知道数据集被分为训练集和测…

一款搭载远翔FP5207芯片的大功率音箱,蓝牙音箱的组成和拆解展示

一款搭载远翔FP5207芯片的大功率音箱&#xff0c;蓝牙音箱的组成和拆解展示&#xff1a; 它主要以电池、功放、蓝牙、外壳结构组成。音箱放电需内置升压芯片FP5207或5217进行电池升压给功放供电。 为同时满足便携性需求并提供足够的功率&#xff0c;音箱通常配备了12V铅酸电池…

MySQL中的DML操作()

一、添加数据(INSERT) 1.1 选择插入 INSERT INTO 表名(列名 1 &#xff0c;列名 2 &#xff0c;列名 3.....) VALUES(值 1 &#xff0c;值 2 &#xff0c;值 3......); 1.2 默认值处理(DEFAULT) 在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入数据时并未指定该…

【C++】OJ习题(初阶)

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1、字符串&#x1f4a5;1.1 字符串相加&#x1f4a5;1.2 验证回文字符串&#x1f4a5;1.3 反转…

单例模式 详解

单例模式 简介: 让类只初始化一次, 然后不同的地方都能获取到同一个实例 这是非常常用的一种模式, 系统稍微大一点基本上都会用到. 在系统中, 不同模块的总管理类都已单例模式居多 这里我们不仅使用c实现单例模式, 也会用python2实现一遍 python代码 想要看更详细的python单…

【Python机器学习】NLP——一个简陋的聊天机器人

目录 正则表达式 一个简答的聊天机器人 另一种方法 正则表达式就是一种FSM&#xff0c;同时它也给出了一种可能的NLP方法&#xff0c;即基于模式的方法。 正则表达式 现实生活中&#xff0c;密码锁其实就是一台简单的语言处理机。密码锁不能阅读和理解课本&#xff0c;但是…

高性能web服务器nginx

目录 nginx简介 服务端 I/O 流程 Nginx 进程结构 Nginx启动流程 nginx的源码编译下载 nginx命令常见参数 nginx的配置文件详解 全局配置优化 nginx的平滑升级和回滚 nginx目录匹配优先级测试&#xff08;因为只支持访问文件&#xff0c;所有不比对匹配目录优先级&…

STM32GPIO引脚八种工作模式

1. GPIO简述 GPIO&#xff08;General-purpose input/output&#xff09;&#xff0c;通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚&#xff0c;统称为GPIO。 GPIO存在的意义就是用程序控制或读取它们的输出或输入。 2. 功能描述 每个GPI/O端口有两个32位配…

代码随想录算法训练营day50:图论01:图论理论基础;深度优先搜索理论基础;98. 所有可达路径;广度优先搜索理论基础

图论理论基础 分类&#xff1a;有向图&#xff0c;无向图&#xff0c;有无权重 度&#xff1a;【无向图】&#xff1a;有几条边连接该节点&#xff0c;该节点就有几度。 【有向图】&#xff1a;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xf…

.net maui安卓开发中适用明文传输(一)

背景:最近在做一个pad上的项目,目的是执行每日点检功能(就是检查设备的各项保养指标);前期用HBuilder做了一个,但是现场的触摸屏选用的是TouchPie 安卓版本是6.0版本,上次开发的软件可以在安卓7.0上完美兼容,但由于触摸屏安卓版本太低不能兼容;询问厂商才知道这款触摸…

前端性能优化的指标

性能优化指标的出现,谷歌在2020年提出的Core Web Vitals 和 Web Vitals 了解谷歌浏览器自带的性能调试工具DCL、L、FP、FCP、LCP,图层(有layout布局就是回流,painting绘制就是重绘) 回流和重绘的理解 页面第一次打开一定回流和重绘,回流一定重绘,回流出现一般是位置改变…

BEV世界:通过统一的BEV潜在空间实现自动驾驶的多模态世界模型

BEVWorld: A Multimodal World Model for Autonomous Driving via Unified BEV Latent Space BEV世界&#xff1a;通过统一的BEV潜在空间实现自动驾驶的多模态世界模型 Abstract World models are receiving increasing attention in autonomous driving for their ability t…