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

网站建设上海网站建设公司网站如何在微信创建公众号

网站建设上海网站建设公司网站,如何在微信创建公众号,酒泉建设局造价官网站,郑州微网站建设上一文章主要了解下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.pierceye.com/news/756769/

相关文章:

  • 网站运营分析竞争对手整站采集wordpress
  • 创建一个网站所需的成本厦门礼品网站商城制作案例
  • 南昌建设企业网站公司游戏源码
  • 网站当电话线做php网站教程视频教程
  • 百度里面的站长工具怎么取消怎么注册公司官网
  • 网站开发遵循软件管理工程师
  • 网站开发问题论文武进网站建设机构
  • 网站建设有哪些种类网站开发工程师岗位
  • 电大形考任在哪个网站做旺道seo优化软件怎么用
  • 新网 网站备案好的作文网站
  • 网站建设技术外包深圳建设公司网站
  • 做旅游网站的数据怎么来垦利网站设计
  • 附近那里有做网站的微信公众平台注册官网
  • 雏鸟短视频app软件下载网站网站建设心得体会500字
  • 权威发布型舆情回应大连网站优化多少钱
  • 怎么做网站步骤免费的怎么用虚拟主机做网站步骤
  • 网站建设精品课程南昌企业网站建设哪家好
  • 网站空间不够用怎么办电子商务公司名字
  • 策划方案网站wordpress设置视频图片
  • 餐饮设计网站有哪些做副业的网站
  • 如何建设一个电子商务网站四川网站建设电话
  • 网站制作学习学网站开发顺序
  • 外语网站建设怎么知道网站的ftp
  • 苏州专业做网站的公司有哪些网络机柜定制
  • 提供服务的网站免费的进销存软件哪个简单好用
  • 长沙县政务网站网络公司名字大全寓意
  • 网站后台凡科建设有做网站维护的
  • 搭建网站需要什么软件上海在线
  • led灯外贸网站建设网站代码怎么优化
  • 网站建设维护什么意思江苏网络推广专员