Qt modbus slave 从站 封装好的类直接使用

2023-11-15

实现基本的功能

QT+= serialport serialbus

modbusSlove_.h

#ifndef MODBUSSLOVE__H
#define MODBUSSLOVE__H

#include <QObject>
#include <QModbusServer>
#include <QModbusRtuSerialSlave>
#include <QModbusTcpServer>
#include <QSerialPort>

/*
*
*
*       modbus slave 从站
*
*       modbusSlove_* m_slave = new modbusSlove_(this);
*
*       initModbusSerialSlove()
*
*       connectDevice()
*
*       //寄存器值发生改变,连接这个信号
        void registerData_signal(int address,int value);
*
*/


class modbusSlove_ : public QObject
{
    Q_OBJECT
public:
    explicit modbusSlove_(QObject *parent = nullptr);

    /**
* @projectName   testMyClass
* @brief         初始化串口modbusSlave
* 其他参数 波特率 数据位 校验位 停止位
* @author        SMY
* @date          2019-03-27
*/
    bool initModbusSerialSlove(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits,
                         QSerialPort::Parity parity, QSerialPort::StopBits stopBits);
    /**
* @projectName   testMyClass
* @brief         初始化网口modbusSlave
* ip地址,端口号
* @author        SMY
* @date          2019-03-27
*/
    bool initModbusNetworkSlove(QString address,int port);

    /**
* @projectName   testMyClass
* @brief         连接设备
* @author        SMY
* @date          2019-03-27
*/
    bool connectDevice();
    /**
* @projectName   testMyClass
* @brief         网口还是串口连接
* @author        SMY
* @date          2019-03-26
*/
    enum modbusConnection
    {
        Serial,
        Tcp
    };

signals:
    //寄存器值发生改变
    void registerData_signal(int address,int value);
    //发生错误
    void error_signal(QString errorString);
    /*state :1 connect ,0:unconnect
    *状态发生改变
    */
    void stateChanged_signal(int state);
public slots:
private slots:
    /**
* @projectName   testMyClass
* @brief         更新寄存器数据
* @author        SMY
* @date          2019-03-26
*/
    void updateData(QModbusDataUnit::RegisterType table, int address, int size);
    /**
* @projectName   testMyClass
* @brief         device error
* @author        SMY
* @date          2019-03-27
*/
    void handleDeviceError(QModbusDevice::Error newError);
    /**
* @projectName   testMyClass
* @brief         连接状态改变
* @author        SMY
* @date          2019-03-27
*/
    void onStateChanged(int state);
private:
    modbusConnection m_mode;
    QModbusServer* m_slove;
};

#endif // MODBUSSLOVE__H

modbusSlove_.cpp

#include "modbusslove_.h"
#include <QDebug>
modbusSlove_::modbusSlove_(QObject *parent) : QObject(parent)
{

}

bool modbusSlove_::initModbusSerialSlove(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits,
                                   QSerialPort::Parity parity,
                                   QSerialPort::StopBits stopBits)
{
//    if(m_slove != nullptr)
//    {
//        m_slove->disconnect();
//        delete m_slove;
//        m_slove = nullptr;
//    }

    //串口

    m_slove = new QModbusRtuSerialSlave(this);

    m_mode = Serial;

    if(!m_slove)
    {
        qDebug()<<"could not create modbus slave";
        return 0;
    }

    QModbusDataUnitMap reg;
    reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
    reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
    reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 });
    reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });

    m_slove->setMap(reg);

    m_slove->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
                                    portName);
    m_slove->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
                                    baudRate);
    m_slove->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,
                                    dataBits);
    m_slove->setConnectionParameter(QModbusDevice::SerialParityParameter,
                                    parity);
    m_slove->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
                                    stopBits);


    //更新寄存器值
    connect(m_slove,&QModbusServer::dataWritten,this,
            &modbusSlove_::updateData);
    //更新连接状态
    connect(m_slove, &QModbusServer::stateChanged,
            this, &modbusSlove_::onStateChanged);
    //错误发生
    connect(m_slove, &QModbusServer::errorOccurred,
            this, &modbusSlove_::handleDeviceError);
    return  1;

}

bool modbusSlove_::initModbusNetworkSlove(QString address, int port)
{
//    if(m_slove)
//    {
//        m_slove->disconnect();
//        delete m_slove;
//        m_slove = nullptr;
//    }

    //网口

    m_slove = new QModbusTcpServer(this);

    m_mode = Tcp;

    if(!m_slove)
    {
        qDebug()<<"could not create modbus slave";
        return 0;
    }

    QModbusDataUnitMap reg;
    reg.insert(QModbusDataUnit::Coils, { QModbusDataUnit::Coils, 0, 10 });
    reg.insert(QModbusDataUnit::DiscreteInputs, { QModbusDataUnit::DiscreteInputs, 0, 10 });
    reg.insert(QModbusDataUnit::InputRegisters, { QModbusDataUnit::InputRegisters, 0, 10 });
    reg.insert(QModbusDataUnit::HoldingRegisters, { QModbusDataUnit::HoldingRegisters, 0, 10 });

    m_slove->setMap(reg);

    m_slove->setConnectionParameter(QModbusDevice::NetworkAddressParameter,address);
    m_slove->setConnectionParameter(QModbusDevice::NetworkPortParameter,port);

    //更新寄存器值
    connect(m_slove,&QModbusServer::dataWritten,this,
            &modbusSlove_::updateData);
    //更新连接状态
    connect(m_slove, &QModbusServer::stateChanged,
            this, &modbusSlove_::onStateChanged);
    //错误发生
    connect(m_slove, &QModbusServer::errorOccurred,
            this, &modbusSlove_::handleDeviceError);

}

bool modbusSlove_::connectDevice()
{
    return m_slove->connectDevice();
}

void modbusSlove_::updateData(QModbusDataUnit::RegisterType table, int address, int size)
{
    for (int i = 0; i < size; ++i) {
        quint16 value;
        QString text;
        switch (table) {
        case QModbusDataUnit::Coils:
            m_slove->data(QModbusDataUnit::Coils, address + i, &value);

            break;
        case QModbusDataUnit::HoldingRegisters:
            m_slove->data(QModbusDataUnit::HoldingRegisters, address + i, &value);

            break;
        default:
            break;
        }

        emit registerData_signal(address+i,value);

    }
}

void modbusSlove_::handleDeviceError(QModbusDevice::Error newError)
{
    if(newError == QModbusDevice::NoError || !m_slove)
        return;
    emit error_signal(m_slove->errorString());
}

void modbusSlove_::onStateChanged(int state)
{
    if(state == QModbusDevice::UnconnectedState)
        emit stateChanged_signal(0);
    else if(state == QModbusDevice::ConnectedState)
        emit stateChanged_signal(1);
}

MASTER 主站

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt modbus slave 从站 封装好的类直接使用 的相关文章

  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho
  • 从脚本内更改自动热键托盘图标

    如何从 Autohotkey 脚本中将托盘图标更改为 my ico 例如 当脚本暂停时 为此 我在托盘菜单中提出了自己的 暂停脚本 菜单项 SingleInstance ignore Menu Tray Tip AutoCase 0 11
  • 我们什么时候应该在 Django 中使用“db_index=True”?

    当我们应该定义db index True在模型字段上 我正在尝试优化应用程序并且我想了解更多信息db index 什么情况下我们应该使用它 文档说使用db index True在模型字段上用于加速查找 但在存储和内存方面略有缺点 我们应该使
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Python 中的字符串slugification

    我正在寻找 slugify 字符串的最佳方法 蛞蝓 是什么 https stackoverflow com questions 427102 in django what is a slug 我当前的解决方案基于这个食谱 http code
  • 如何在 kubernetes 中将秘密标记为可选?

    来自文档 除非将秘密标记为可选 否则必须先创建秘密 然后再将其作为环境变量在 pod 中使用 引用不存在的 Secret 将阻止 pod 启动 如何将秘密标记为可选 您正在寻找的是 name ENV NAME valueFrom secre
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo
  • svn 强制迁移

    我正在考虑将我们的 svn 代码库迁移到 perforce 看看谷歌搜索结果 我确实找到了两个具有相同功能的工具 P4转换ftp ftp perforce com pub perforce tools p4convert docs inde
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用
  • PLS-00103:遇到符号“;”当预期出现以下情况之一时:

    我正在尝试插入用户安全问题的答案 以用于密码重置功能 Ellucian 横幅 v8 提供了一个用于运行此 API 的 API 我对他们的 API 非常陌生 从下面的错误消息来看 我还远远没有正确运行它 任何帮助表示赞赏 我尝试在 Oracl
  • 自定义字符串查询操作的 Linq to NHibernate 可扩展性?

    我希望能够在 NHibernate Linq 表达式中使用自定义字符串查询 举例来说 这只是一个例子 我希望能够选择包含属性的实体 该属性是特定字符串的字谜 var myEntities EntityRepository AllEntiti
  • Keystore getEntry 在 Android 9 上返回 NULL

    c我已对存储在 Android 密钥库中的登录密码进行了加密和解密 在 Android 9 上 我观察到应用程序在尝试解密密码时崩溃 我无法重现它 但拥有 Pixel 3 的用户是崩溃的设备之一 下面是我如何从密钥库解密密码 private
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐

  • Idea:applicationcontext in module file is included in 5 contexts

    今天使用IDEA做项目的时候出现了这个东西 经过查询资料 应该是编译器自动导入配置文件的时候发生了某些错误 提示修正 解决方法 依次打开 Project Settings gt Modules gt Spring 按减号删除右侧所有文件 然
  • 国产ChatGpt、AI模型盘点

    个人中心 DownLoad 一 百度 文心一言 百度的文心一言是一款基于深度学习技术的自然语言生成模型 能够生成各种类型的文本 包括新闻 小说 诗歌等 它采用了Transformer模型和GPT 2模型 能够生成高质量的文本 并且速度非常快
  • 2022-1-12 java运算符的学习记录

    2022 1 12 java运算符的学习记录 算数运算符 在java中有i 和 i俩种操作 前一种是先使用变量再自增 后一种是先自增再使用变量 因为java是强运算符号 所以不同的类型的变量加减 最终会趋向于高等级的类型的运算类型 是取整符
  • vggNet网络学习(网络架构及代码搭建)

    原论文 翻译链接 VERY DEEP CONVOLUTIONAL NETWORKSFOR LARGE SCALE IMAGE RECOGNITION VGGnet论文翻译 附原文 机器学习我不学习的博客 CSDN博客 网络架构 vggnet
  • 巨人互动

    游戏出海是指将原本面向国内市场的游戏产品进行调整和优化 以适应海外市场的需求 并进行推广和销售 下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点 1 市场扩大 通过游戏出海 可以将游戏产品的目标受众从国内扩展到全球范围内 从而获得更多
  • 前后端node设置art-template,以及express后端搭建

    前后端node设置art template 以及express后端搭建 首先全局安装express generator yarn add express generator g express e npm i yarn add cross
  • 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一 配置问题分析及解决方案 1 问题分析 2 解决方案 二 Spring Cloud Config 介绍 1 Spring Cloud Config特性 2 Spring Cloud Config作用 3 Spring Cloud C
  • 希尔排序(ShellSort)

    最后分析的基于比较的排序 之所以放在前面几个排序算法之后主要是因为虽然希尔排序很容易编写却很难分析 尤其是它的时间复杂度 希尔排序思想的提出是有原因的 在那个排序还基本都是2次型 插入 选择 冒泡 的年代 当人们经常使用 插入排序时发现有时
  • Kafka实战——简单易懂的生产者消费者demo

    单线程版本适合本地调试 多线程版本适合做压测 1 引入maven依赖
  • 泊松分布的矩母函数与特征函数

    矩母函数与特征函数 矩 母 函 数 与 特 征 函 数
  • 【企业了解】人人都是产品经理、鸟哥笔记、CSDN、稀土掘金(2020年11月稀土掘金被字节跳动,金融与科技)

    企业了解 人人都是产品经理 鸟哥笔记 CSDN 稀土掘金 前言 今天早上看 今日热榜官网 的时候 被一篇文章吸引 中国成功学迭代史 内容挺有意思的 然后发现这篇文章来自一个网站 人人都是产品经理 和我上次写 企业分析 鸟哥笔记 一样 我因为
  • Hive三种不同的数据导出的方式

    Hive三种不同的数据导出的方式 1 导出到本地文件系统 insert overwrite local directory home anjianbing soft export data app order city d row form
  • 2021-09-22

    linux防火墙查看状态 操作防火墙的命令 查看防火墙状态 systemctl status firewalld 让防火墙可用 systemctl enable firewalld 让防火墙不可用 systemctl disable fir
  • 信号——产生、处理、捕捉、接收、阻塞

    一个信号是一条小消息 它通知系统进程中发生了一个某种类型的事件 提供了一种处理异步事件的方法 每一种信号都有一个名字 在头文件
  • 用Matlab作函数的图像

    函数简介 1 作图函数是plot 其调用格式如下 plot y plot x y plot x y LineSpec plot x1 y1 s1 x2 y2 s2 x3 y3 s3 说明 1 plot y 绘出以向量y为纵坐标 y的个元素的
  • IPV6基本报头

    version 版本号 值为6 与ipv4作用相同 4bit Traffic class 流分类 相当于ipv4的TOS字段 用于qos 表示报文的类或者优先级 8bit Flow label 流标签 用于区分实时流量 标签 源地址可以确定
  • 使用vue-amap实现地图经纬度显示、具体地址显示、卫星图、路网路况、在鼠标按下的地方添加标注点和添加多个标注点

    文章目录 写在开头 一 本文目的 二 版本信息 三 在App vue中调用其他 vue文件 四 点击地图显示经纬度和具体地址 五 添加卫星图和路网路况 六 在鼠标按下的地方添加标注点 七 在地图上显示多个标注点 写在最后 写在开头 我的上篇
  • LeetCode每日一题之209长度最小的子数组

    文章目录 问题描述 方法一 暴力求解 方法二 滑动窗口 问题描述 方法一 暴力求解 暴力求解法 时间复杂度O n 2 空间复杂度O 1 暴力求解法的思想 每一次遍历数组 然后更新result的值 一个for循环作为起始位置 一个for循环作
  • 使用JavaScript实现MQTT客户端的创建

    随着物联网的快速发展 实现设备之间的可靠和高效通信变得至关重要 MQTT作为一种轻量级的 开放的消息传输协议 被广泛应用于物联网领域 本文将为您介绍如何使用MQTT实现物联网设备之间的通信 MQTT基本概念 MQTT是一种基于发布 订阅模型
  • Qt modbus slave 从站 封装好的类直接使用

    实现基本的功能 QT serialport serialbus modbusSlove h ifndef MODBUSSLOVE H define MODBUSSLOVE H include