当前位置: 首页 > news >正文

厦门网页建站申请费用网站开发 jsp开发工具

厦门网页建站申请费用,网站开发 jsp开发工具,空中乘务专业简历制作,做网站常见问题模板上一文章主要了解下Modbus协议和事务处理流程#xff0c;本章则直接贴放代码实现qt 上位机与温控器通讯。项目主要实现定时读取温度、设置温度、开始加热和停止加热四个功能。 采用的是 Modbus Rtu 通信 1 Qt modbus 模块依赖 QT serialbus serialport 源代码 .h文件 #i…上一文章主要了解下Modbus协议和事务处理流程本章则直接贴放代码实现qt 上位机与温控器通讯。项目主要实现定时读取温度、设置温度、开始加热和停止加热四个功能。 采用的是 Modbus Rtu 通信 1 Qt modbus 模块依赖 QT serialbus serialport 源代码 .h文件 #ifndef MODBUSDEVICE_H #define MODBUSDEVICE_H#include QObject #include QModbusDevice #include QSerialPort #include QModbusPdu #include QModbusRtuSerialMaster #include QSerialPortInfo #include QTimer #define ADDR_READ_PV 0100 #define ADDR_READ_SV 0300 #define ADDR_SET_SV 0300 #define ADDR_RUN 0190 class ModbusDevice : public QObject {Q_OBJECT public:explicit ModbusDevice(QObject *parent nullptr);~ModbusDevice();void setAddresss(const QVectorquint8 addrs);Q_INVOKABLE void setCom(const QString com);Q_INVOKABLE QString getCom();void open(const QString portname);void closeAndDelete();Q_INVOKABLE void close();Q_INVOKABLE void connect(const QString com);Q_INVOKABLE void disconnect();Q_INVOKABLE bool state();void sendReadPV();void sendSetSV(const float v);void sendRun();void setStopSync(const quint8 addr);void sendStop();void sendSetSV(const quint8 addr,const float v);void sendReadPV(const quint8 addr);void sendReadSV(const quint8 addr);void sendRun(const quint8 addr);void sendStop(const quint8 addr);void stopTimer();signals:void sigError(const QString msg);void sigDisconnected();void sigConnected();void sigModbusSendError(const QString msg);void sigInfo(const QString msg);void sigGetPV(const int index,const float v);void sigGetSV(const int index,const float v); private slots:void onReplyTimeout(); private:void creatDevice();void reconnect();void creatTimer();void startTimer();void handleSerialPortDisconnected();void readValue(const quint8 address,const QString addr);void setRun(const quint8 address,const bool isRun);void startReplyTimer();void stopReplyTimer();QSerialPort::BaudRate baudRateQSerialPort::Baud9600;QSerialPort::DataBits dataBitsQSerialPort::Data8;QSerialPort::Parity parityQSerialPort::EvenParity;QSerialPort::StopBits stopBitsQSerialPort::TwoStop;QTimer m_pvTimer;QTimer m_replyTimer;QString m_strCom;QModbusClient *m_device nullptr;QVectorquint8 m_deviceAddrs;int m_errCount 0;int m_timeoutContinousCount 0; };#endif // MODBUSDEVICE_Hcpp文件 #include modbusdevice.h #include QDebug #include QModbusReply #include QCoreApplication #include QThread ModbusDevice::ModbusDevice(QObject *parent) : QObject(parent) {m_deviceAddrs 1 2;creatTimer();creatDevice(); }ModbusDevice::~ModbusDevice() {stopTimer();closeAndDelete(); }void ModbusDevice::setAddresss(const QVectorquint8 addrs) {m_deviceAddrs addrs; }void ModbusDevice::open(const QString portname) {if (!m_device){sigError(QString(串口连接失败,请排查线路));return;}m_device-setConnectionParameter(QModbusDevice::SerialPortNameParameter,portname);m_device-connectDevice(); }void ModbusDevice::closeAndDelete() {if (!m_device)return;m_device-disconnectDevice();m_device-disconnect();delete m_device;m_device nullptr; }void ModbusDevice::close() {if (!m_device)return;stopTimer();m_device-disconnectDevice(); }void ModbusDevice::connect(const QString com) {setCom(com);open(com); }void ModbusDevice::disconnect() {if (!m_device)return ;close(); }bool ModbusDevice::state() {if (!m_device)return false;return m_device-state() QModbusDevice::ConnectedState; }void ModbusDevice::sendReadPV() {for(auto v:m_deviceAddrs){sendReadPV(v);} }void ModbusDevice::sendSetSV(const float v) {for(auto addr:m_deviceAddrs){sendSetSV(addr,v);} }void ModbusDevice::sendRun() {for(auto addr:m_deviceAddrs){sendRun(addr);} }void ModbusDevice::setStopSync(const quint8 addr) {if (!m_device)return ;if(m_device-state() ! QModbusDevice::ConnectedState)return;QModbusReply *reply nullptr;const QByteArray pduData QByteArray::fromHex(01900000);quint16 fc 0x06;reply m_device-sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(fc), pduData),addr);while (!reply-isFinished()) {QCoreApplication::processEvents();if (QCoreApplication::instance()-closingDown()) {break;}QThread::msleep(10);}if (reply-error() QModbusDevice::NoError) {qDebug() Command sent successfully.;} else {qWarning() Failed to send command: reply-errorString();}reply-deleteLater(); }void ModbusDevice::sendStop() {for(auto addr:m_deviceAddrs){sendStop(addr);} }void ModbusDevice::sendSetSV(const quint8 addr,const float v) {if (!m_device)return ;if(m_device-state() ! QModbusDevice::ConnectedState)return;QModbusReply *reply nullptr;short tmp (v*10);QString msg QString(0300%1).arg(tmp, 4, 16, QLatin1Char(0)).toUpper();const QByteArray pduData QByteArray::fromHex(msg.toLatin1());quint16 fc 0x06;reply m_device-sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(fc), pduData),addr);startReplyTimer();if (!reply-isFinished()) {QObject::connect(reply, QModbusReply::finished, this, []() {stopReplyTimer();if (reply-error() QModbusDevice::NoError) {sigInfo(QString(设置指令发送成功));qDebug() setD1Value reveive: reply-rawResult();} else if (reply-error() QModbusDevice::ProtocolError) {QString msg QString(setValue response error: %1 Mobus exception: 0x%2).arg(reply-errorString()).arg(reply-rawResult().exceptionCode(), -1, 16);qDebug() msg;emit sigModbusSendError(msg);} else {QString msg (tr(setValue response error: %1 (code: 0x%2)).arg(reply-errorString()).arg(reply-error(), -1, 16));qDebug() msg;emit sigModbusSendError(msg);}reply-deleteLater();});} else {stopReplyTimer();// broadcast replies return immediatelyqDebug() Receive: Synchronous response pdu: reply-rawResult() Qt::endl;reply-deleteLater();} }void ModbusDevice::sendReadPV(const quint8 addr) {readValue(addr,ADDR_READ_PV); }void ModbusDevice::sendReadSV(const quint8 addr) {readValue(addr,ADDR_READ_SV); }void ModbusDevice::sendRun(const quint8 addr) {setRun(addr,true); }void ModbusDevice::sendStop(const quint8 addr) {setRun(addr,false); }void ModbusDevice::setCom(const QString com) {if(com ! m_strCom){m_strCom com;} }QString ModbusDevice::getCom() {return m_strCom; }void ModbusDevice::reconnect() {if (!m_device)return ;if (m_device-state() ! QModbusDevice::ConnectedState) {qInfo() Attempting to reconnect...;m_device-connectDevice();} }void ModbusDevice::creatDevice() {m_device new QModbusRtuSerialMaster;//m_device-setConnectionParameter(QModbusDevice::SerialPortNameParameter,portname);m_device-setConnectionParameter(QModbusDevice::SerialParityParameter, parity);m_device-setConnectionParameter(QModbusDevice::SerialDataBitsParameter,dataBits);m_device-setConnectionParameter(QModbusDevice::SerialStopBitsParameter,stopBits);m_device-setConnectionParameter(QModbusDevice::SerialBaudRateParameter,baudRate);m_device-setTimeout(1000);m_device-setNumberOfRetries(1);QObject::connect(m_device, QModbusDevice::errorOccurred, this, [](QModbusDevice::Error) {QString msg m_device-errorString();qDebug().noquote() QStringLiteral(Error: %1).arg(msg);emit sigError(msg);}, Qt::QueuedConnection);QObject::connect(m_device, QModbusDevice::stateChanged, [](QModbusDevice::State state) {switch (state) {case QModbusDevice::UnconnectedState:{qDebug().noquote() QStringLiteral(State: Entered unconnected state.);stopTimer();emit sigDisconnected();}break;case QModbusDevice::ConnectingState:qDebug().noquote() QStringLiteral(State: Entered connecting state.);break;case QModbusDevice::ConnectedState:{qDebug().noquote() QStringLiteral(State: Entered connected state.);sendReadPV();startTimer();emit sigConnected();}break;case QModbusDevice::ClosingState:qDebug().noquote() QStringLiteral(State: Entered closing state.);break;}}); }void ModbusDevice::handleSerialPortDisconnected(){qWarning() Serial port disconnected.;close();}void ModbusDevice::creatTimer() {m_pvTimer.setInterval(4000);QObject::connect(m_pvTimer,QTimer::timeout,this,[]{sendReadPV();});m_replyTimer.setInterval(3000);m_replyTimer.setSingleShot(true);QObject::connect(m_replyTimer,SIGNAL(timeout()),this,SLOT(onReplyTimeout())); }void ModbusDevice::startTimer() {m_pvTimer.start(); }void ModbusDevice::stopTimer() {m_pvTimer.stop(); }void ModbusDevice::onReplyTimeout() {m_timeoutContinousCount;qDebug() __func__;sigModbusSendError(QString(发包响应超时,请排查线路));if(m_timeoutContinousCount3){sigError(QString(通信超时,请排查线路));m_timeoutContinousCount0;close();} }void ModbusDevice::readValue(const quint8 address,const QString addr) {if (!m_device)return ;if(m_device-state() ! QModbusDevice::ConnectedState)return;QModbusReply *reply nullptr;QString msg addr0001;const QByteArray pduData QByteArray::fromHex(msg.toLatin1());//qDebug() Send: Sending PDU with predefined function code.;quint16 fc 0x03;reply m_device-sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(fc), pduData),address);startReplyTimer();if (!reply-isFinished()) {QObject::connect(reply, QModbusReply::finished, this, [](){stopReplyTimer();if (reply-error() QModbusDevice::NoError) {const QByteArray rawData reply-rawResult().data();//ex:0x030200dcQByteArray lastTwoBytes rawData.mid(rawData.size() - 2, 2);// 使用 QDataStream 进行字节序转换QDataStream stream(lastTwoBytes);quint16 shortValue;stream shortValue;if(addr ADDR_READ_PV){emit sigGetPV(address,(float)shortValue/10);}else if(addr ADDR_READ_SV){emit sigGetSV(address,(float)shortValue/10);}} else if (reply-error() QModbusDevice::ProtocolError) {QString msg QString(readValue response error: %1 Mobus exception: 0x%2).arg(reply-errorString()).arg(reply-rawResult().exceptionCode(), -1, 16);qDebug() msg;emit sigModbusSendError(msg);} else {QString msg (tr(readValue response error: %1 (code: 0x%2)).arg(reply-errorString()).arg(reply-error(), -1, 16));qDebug() msg;m_errCount ;if(m_errCount 3){emit sigError(QString(温控%1 连接已断开).arg(address));m_errCount 0;reconnect();}emit sigModbusSendError(msg);}reply-deleteLater();});} else {stopReplyTimer();// broadcast replies return immediatelyqDebug() Receive: Synchronous response pdu: reply-rawResult() Qt::endl;reply-deleteLater();} }void ModbusDevice::setRun(const quint8 address,const bool isRun) {if (!m_device)return ;if(m_device-state() ! QModbusDevice::ConnectedState)return;QModbusReply *reply nullptr;const QByteArray pduData isRun? QByteArray::fromHex(01900001):QByteArray::fromHex(01900000);quint16 fc 0x06;reply m_device-sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(fc), pduData),address);startReplyTimer();if (!reply-isFinished()) {QObject::connect(reply, QModbusReply::finished, this, []() {stopReplyTimer();if (reply-error() QModbusDevice::NoError) {if(isRun)sigInfo(QString(开始指令发送成功));else {sigInfo(QString(停止指令发送成功));}qDebug() setRun reveive: reply-rawResult();} else if (reply-error() QModbusDevice::ProtocolError) {QString msg QString(setRun response error: %1 Mobus exception: 0x%2).arg(reply-errorString()).arg(reply-rawResult().exceptionCode(), -1, 16);qDebug() msg;emit sigModbusSendError(msg);} else {QString msg (tr(setRun response error: %1 (code: 0x%2)).arg(reply-errorString()).arg(reply-error(), -1, 16));qDebug() msg;emit sigModbusSendError(msg);}reply-deleteLater();});} else {// broadcast replies return immediatelystopReplyTimer();qDebug() setRun Receive: Synchronous response pdu: reply-rawResult() Qt::endl;reply-deleteLater();} }void ModbusDevice::startReplyTimer() {m_replyTimer.start(); }void ModbusDevice::stopReplyTimer() {m_replyTimer.stop(); }异常处理 1. 通信断开异常检测 测试过程中发现拔掉串口线QModbusClient 并未检测到任何异常这时候发包也不会有任何异常提示所以在发包之后自己启动一个timer,来通过超时判断是否串口连接出现问题。有更好的方法可以分享下。 void ModbusDevice::sendSetSV(const quint8 addr,const float v) {if (!m_device)return ;if(m_device-state() ! QModbusDevice::ConnectedState)return;QModbusReply *reply nullptr;short tmp (v*10);QString msg QString(0300%1).arg(tmp, 4, 16, QLatin1Char(0)).toUpper();const QByteArray pduData QByteArray::fromHex(msg.toLatin1());quint16 fc 0x06;reply m_device-sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(fc), pduData),addr);startReplyTimer();if (!reply-isFinished()) {QObject::connect(reply, QModbusReply::finished, this, []() {stopReplyTimer();if (reply-error() QModbusDevice::NoError) {sigInfo(QString(设置指令发送成功));qDebug() setD1Value reveive: reply-rawResult();} else if (reply-error() QModbusDevice::ProtocolError) {QString msg QString(setValue response error: %1 Mobus exception: 0x%2).arg(reply-errorString()).arg(reply-rawResult().exceptionCode(), -1, 16);qDebug() msg;emit sigModbusSendError(msg);} else {QString msg (tr(setValue response error: %1 (code: 0x%2)).arg(reply-errorString()).arg(reply-error(), -1, 16));qDebug() msg;emit sigModbusSendError(msg);}reply-deleteLater();});} else {stopReplyTimer();// broadcast replies return immediatelyqDebug() Receive: Synchronous response pdu: reply-rawResult() Qt::endl;reply-deleteLater();} }其中 startReplyTimer() 和 stopReplyTimer() 来实现链路检测。 2. 程序关闭时需要发送一条指令等发送和响应结束后才能关闭App 因为是加热设备为了安全起见程序关闭时会主动停止加热。此时就需要实现一个同步发送的指令。等待返回后才能关闭App void ModbusDevice::setStopSync(const quint8 addr) {if (!m_device)return ;if(m_device-state() ! QModbusDevice::ConnectedState)return;QModbusReply *reply nullptr;const QByteArray pduData QByteArray::fromHex(01900000);quint16 fc 0x06;reply m_device-sendRawRequest(QModbusRequest(QModbusRequest::FunctionCode(fc), pduData),addr);while (!reply-isFinished()) {QCoreApplication::processEvents();if (QCoreApplication::instance()-closingDown()) {break;}QThread::msleep(10);}if (reply-error() QModbusDevice::NoError) {qDebug() Command sent successfully.;} else {qWarning() Failed to send command: reply-errorString();}reply-deleteLater(); }
http://www.zqtcl.cn/news/524135/

相关文章:

  • 建设报名系统是正规网站吗计算机培训班出来好找工作吗
  • 网站上的文章用秀米可以做吗宁波外客网络科技有限公司
  • 网站底部导航代码成品视频直播软件推荐哪个好一点ios
  • 上海电商网站开发公司垫江网站建设价格
  • 门户网站建设存在问题与不足商城网站开发项目文档
  • wordpress建站方便吗wordpress加入海报功能
  • 网站名称注册保护2018wordpress主题
  • 类似享设计的网站企业信息系统公示
  • 如何学习网站开发酒店网站源码
  • 怎么用nas做网站服务器WordPress云虚拟空间
  • 网站设计 ipad企业品牌推广宣传方案
  • 织梦网站怎么更换模板济南建设厅网站
  • 用wordpress仿站专业做俄语网站建设司
  • 做暧暧网站网站开发 思维导图
  • asp.net做登录注册网站苏醒的wordpress主题怎么样
  • 正能量不良网站推荐2020网站建设单位是什么
  • 固镇网站建设郑州网站seo顾问
  • 新建定制网站费用公司网站手机端和电脑端
  • 网站域名注册地址苏州建设培训中心网站
  • 高端娱乐网站建设沈阳seo专业培训
  • 做播放器电影网站需要多少钱6广州seo公司推荐
  • 笔记本可以做网站吗怎样查看网站是否备案
  • 千灯做网站网站静态和伪静态意思
  • 做境外碎片化旅游的网站wordpress wdcp
  • 整容医院网络建设公司seo实战技术培训
  • 免费服务器建立网站郑州seo线上推广系统
  • 医院网站建设的目的qq小程序源码
  • 郑州seo网站排名优化公司建站行业发展
  • 彭山住房和城乡建设局网站儒枫网网站建设
  • wap asp网站模板下载中企动力骗子公司