• QT5串口读取宇电温控器温度


    宇电温控器AI5.X系列

    类库运行环境:win10+qt5+vs2017

    类说明:TempControl,提供获取当前温控器温度值,PV,SV,MV等值,调用公有函数接口,获得返回值。

    附带测试用例

    #ifndef _TEMPCONTROL_H_
    #define _TEMPCONTROL_H_

    #pragma execution_character_set("utf-8")
    #include <QObject>
    #include <iostream>
    #include <QSerialPort>
    #include <QSerialPortInfo>
    #include <QTime>
    #include <QTimer>
    #include <qDebug>
    #include <QEventLoop>
    using namespace std;
    class TempControl : public QObject
    {
    Q_OBJECT

    public:
    TempControl(QString portName,
    QIODevice::OpenModeFlag mode,
    qint32 baudRate,
    QSerialPort::DataBits dataBits,
    QSerialPort::Parity parity,
    QSerialPort::FlowControl flowControl,
    QSerialPort::StopBits stopBits);
    ~TempControl();
    int Init();
    void deinit();
    void printHex(QByteArray cmd);
    float getCrtTemp();
    float getTemp();//获取当前温度
    float getProNum();
    float getSc();
    float getCrtTempTime();
    float getSpr();
    float getStepNum();
    float getPonp();
    float getPaf();
    float getStepState();
    float getPonTime();
    float getAt(); //自整定

    void setTemp( float Val, float CrtVal, int Proid = 0 , int AddressIde = 1 );
    void setSc(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setProNum(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setCrtTempTime(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setSPr(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setStepNum(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setPonP(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);// 上电控制参数 Cont,
    void setPaf(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setStepState(float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void SetAt(int AtVal, int Proid , int AddressIde );

    private:
    QString portName;
    QIODevice::OpenModeFlag mode;
    qint32 baudRate;
    QSerialPort::DataBits dataBits;
    QSerialPort::Parity parity;
    QSerialPort::FlowControl flowControl;
    QSerialPort::StopBits stopBits;
    QSerialPort *m_serialport;

    void delayMs(int value);
    int send(QByteArray &cmd);
    int recieve(QByteArray &cmd, int timeout);
    void recieve(QByteArray &cmd);
    int Udian_CheckRc(QByteArray ReadBytes, int AddressIde);
    char HexH(int v);
    char HexL(int v);
    int GetHexVal(char v);
    void getCrtTempCmd(QByteArray &WriteBytes, float Val, int Proid= 0, int AddressIde = 1);//控制温度
    void getTempCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid = 0, int AddressIde = 1);//当前温度
    void getProNumCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void getScCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void getCrtTempTimeCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);
    void getSprCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);
    void getStepNumCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);
    void getPonpCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);//上电控制参数
    void getPafCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);
    void getStepStateCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);
    void getPonTimeCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1);
    void getAtCmd(QByteArray &WriteBytes, float Val, int Proid = 0, int AddressIde = 1); //自整定

    float getCrtTempValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getTempValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getProNumValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getScValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getCrtTempTimeValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getSprValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getStepNumValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getPonpValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getPafValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getStepStateValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getPonTimeValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1);
    float getAtValue(QByteArray ReadBytes, int Proid = 0, int AddressIde = 1); //自整定

    void setTempCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setScCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setProNumCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setCrtTempTimeCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setSPrCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setStepNumCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setPonPCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid = 0, int AddressIde = 1);// 上电控制参数 Cont,
    void setPafCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void setStepStateCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid = 0, int AddressIde = 1);
    void SetAtCmd(QByteArray &WriteBytes, int AtVal, int Proid = 0, int AddressIde = 1);


    };
    #endif // !_TEMPCONTROL_H_

    #include "TempControl.h"

    TempControl::TempControl(QString portName,
    QIODevice::OpenModeFlag mode,
    qint32 baudRate,
    QSerialPort::DataBits dataBits,
    QSerialPort::Parity parity,
    QSerialPort::FlowControl flowControl,
    QSerialPort::StopBits stopBits)
    : QObject()
    {
    this->portName = portName;
    this->mode = mode;
    this->baudRate = baudRate;
    this->dataBits = dataBits;
    this->flowControl = flowControl;
    this->stopBits = stopBits;
    m_serialport = new QSerialPort();
    }
    TempControl::~TempControl()
    {

    delete m_serialport;
    }
    void TempControl::printHex(QByteArray cmd)
    {
    qDebug() << cmd.toHex() << endl;

    }

    int TempControl::Init()
    {

    m_serialport->setPortName(portName);
    //以读写方式打开串口
    if (m_serialport->open(mode))
    {
    //设置波特率
    m_serialport->setBaudRate(baudRate);
    //设置数据位
    m_serialport->setDataBits(dataBits);
    //设置校验位
    m_serialport->setParity(QSerialPort::NoParity);
    //设置流控制
    m_serialport->setFlowControl(QSerialPort::NoFlowControl);
    //设置停止位
    m_serialport->setStopBits(QSerialPort::OneStop);
    m_serialport->clearError();
    m_serialport->clear();
    m_serialport->setDataTerminalReady(true);
    //每秒读一次
    return 0;
    }
    else
    {
    return -1;
    }
    }


    void TempControl::deinit()
    {
    m_serialport->close();
    }

    int TempControl::send(QByteArray &cmd) //ms
    {
    qDebug() << "send cmd:" << cmd.toHex() << endl;
    m_serialport->clear();
    m_serialport->write(cmd);
    bool ret = m_serialport->flush();
    qDebug() << "flush:" << ret << endl;
    delayMs(100);
    return ret;
    }
    void TempControl::recieve(QByteArray &cmd)
    {
    QByteArray readComData = m_serialport->readAll();
    if (readComData != "")
    {
    qDebug() << "receive cmd:" << readComData << endl;
    }
    cmd = readComData;

    readComData.clear();


    }
    int TempControl::recieve(QByteArray &cmd, int timeout)
    {

    int numRead = 0, numReadTotal = 10;
    char buff[10];
    cmd.clear();

    QTime startTime = QTime::currentTime();
    while (1)
    {
    QTime endTime = QTime::currentTime();
    if (((((endTime.hour() - startTime.hour()) * 60 + (endTime.minute() - startTime.minute())) * 60 +
    (endTime.second() - startTime.second())) * 1000 + endTime.msec() - startTime.msec()) > timeout)
    {
    break;
    }

    int ret = m_serialport->waitForReadyRead(1000);
    int num = m_serialport->bytesAvailable();
    if (!ret && num != 0)
    {
    QByteArray recieve = m_serialport->read(num);
    if (recieve.size())
    {
    m_serialport->clear();
    qDebug() << "recieve:" << recieve.toHex() << endl;
    cmd.append(recieve);
    recieve.clear();
    numRead += num;
    qDebug() << "num:" << numRead << endl;
    }
    if (numRead == 10)
    {
    break;
    }
    }
    else
    {
    QEventLoop eventloop;
    QTimer::singleShot(100, &eventloop, SLOT(quit()));
    eventloop.exec();
    }
    }

    qDebug() << "cmd:" << cmd.toHex() << endl;
    return 0;


    }

    void TempControl::delayMs(int value)
    {
    QEventLoop eventloop;
    QTimer::singleShot(value, &eventloop, SLOT(quit()));
    eventloop.exec();


    }
    float TempControl::getCrtTemp()
    {
    float fValue;
    QByteArray cmd,getCmd;
    cmd.resize(8);
    getCrtTempCmd(cmd, 1,0,1);
    send(cmd);
    recieve(getCmd,1000*100);
    fValue = getCrtTempValue(getCmd,0,1);
    return fValue;
    }
    float TempControl::getTemp()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getTempCmd(cmd, 1,1,0,1);
    send(cmd);
    recieve(getCmd,1000*100);
    fValue = getTempValue(getCmd);
    return fValue;
    }
    float TempControl::getProNum()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getProNumCmd(cmd, 1,1,0,1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getProNumValue(getCmd);
    return fValue;
    }
    float TempControl::getSc()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getScCmd(cmd, 1, 1,0,1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getScValue(getCmd);
    return fValue;
    }
    float TempControl::getCrtTempTime()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getCrtTempTimeCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getCrtTempValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getSpr()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getSprCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getSprValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getStepNum()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getStepNumCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getStepNumValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getPonp()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getPonpCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getStepNumValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getPaf()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getPafCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getPafValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getStepState()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getStepStateCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getStepStateValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getPonTime()
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getPonTimeCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getPonTimeValue(getCmd, 0, 1);
    return fValue;
    }
    float TempControl::getAt() //自整定
    {
    float fValue;
    QByteArray cmd, getCmd;
    cmd.resize(8);
    getAtCmd(cmd, 1, 0, 1);
    send(cmd);
    recieve(getCmd, 1000 * 100);
    fValue = getAtValue(getCmd, 0, 1);
    return fValue;
    }

    void TempControl::setTemp(float Val, float CrtVal, int Proid, int AddressIde )
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setTempCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);
    }
    void TempControl::setSc(float Val, float CrtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setScCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);

    }
    void TempControl::setProNum(float Val, float CrtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setProNumCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);

    }
    void TempControl::setCrtTempTime(float Val, float CrtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setCrtTempTimeCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);

    }
    void TempControl::setSPr(float Val, float CrtVal, int Proid, int AddressIde)
    {

    QByteArray cmd, getCmd;
    cmd.resize(8);
    setSPrCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);
    }
    void TempControl::setStepNum(float Val, float CrtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setStepNumCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);

    }
    void TempControl::setPonP(float Val, float CrtVal, int Proid, int AddressIde)// 上电控制参数 Cont,
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setPonPCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);

    }
    void TempControl::setPaf(float Val, float CrtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setPafCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);

    }
    void TempControl::setStepState(float Val, float CrtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    setStepStateCmd(cmd, Val, CrtVal, 0, 1);
    send(cmd);
    }
    void TempControl::SetAt(int AtVal, int Proid, int AddressIde)
    {
    QByteArray cmd, getCmd;
    cmd.resize(8);
    SetAtCmd(cmd, AtVal, 0, 1);
    send(cmd);

    }


    char TempControl::HexH(int v)
    {
    switch ((v >> 4) & 0xF)
    {
    case 0: return '0';
    case 1: return '1';
    case 2: return '2';
    case 3: return '3';
    case 4: return '4';
    case 5: return '5';
    case 6: return '6';
    case 7: return '7';
    case 8: return '8';
    case 9: return '9';
    case 10: return 'A';
    case 11: return 'B';
    case 12: return 'C';
    case 13: return 'D';
    case 14: return 'E';
    case 15: return 'F';
    default: return '0';
    }
    }
    char TempControl::HexL(int v)
    {
    switch (v & 0xF)
    {
    case 0: return '0';
    case 1: return '1';
    case 2: return '2';
    case 3: return '3';
    case 4: return '4';
    case 5: return '5';
    case 6: return '6';
    case 7: return '7';
    case 8: return '8';
    case 9: return '9';
    case 10: return 'A';
    case 11: return 'B';
    case 12: return 'C';
    case 13: return 'D';
    case 14: return 'E';
    case 15: return 'F';
    default: return '0';
    }
    }
    int TempControl::GetHexVal(char v)
    {
    if (v >= '0' && v <= '9')
    {
    return v - '0';
    }
    if (v >= 'A' && v <= 'F')
    {
    return v + 10 - 'A';
    }
    return 0;
    }
    int TempControl::Udian_CheckRc(QByteArray ReadBytes, int AddressIde)
    {

    unsigned char DatPv = ReadBytes[0] + ReadBytes[1] * 0x100;
    unsigned char DatSv = ReadBytes[2] + ReadBytes[3] * 0x100;
    unsigned char DatMv = ReadBytes[4];
    unsigned char DatAl = ReadBytes[5];
    unsigned char DatFun = ReadBytes[6] + ReadBytes[7] * 0x100;
    unsigned char DatRc = ReadBytes[8] + ReadBytes[9] * 0x100;
    unsigned char cRc =( DatPv + DatSv + DatMv + DatAl * 0x100 + DatFun + AddressIde);
    cRc &= 0xffff;
    qDebug() << "datPv:" << DatPv
    << "datSv:" << DatSv
    << "datMv:" << DatMv
    << "datAI:" << DatAl
    << "datFun:" << DatFun
    << "datRc" << DatRc
    << "cRc" << cRc << endl;
    if (DatRc == cRc)
    {
    return 1;
    }
    else
    {
    return 0;
    }

    }
    void TempControl::getCrtTempCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc;

    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x52;
    if (Proid == 0)
    {
    WriteBytes[3] = 0;
    }
    else
    {
    WriteBytes[3] = 0x50 + Proid * 2;
    }

    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;
    }
    float TempControl::getCrtTempValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7] * 256);
    Val = LongVal / 10.0f;
    return Val;
    }
    else
    {
    return -1;

    }

    }
    void TempControl::getTempCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid, int AddressIde)
    {
    int cRc = 0, ret = 0;
    int ucRc = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] =(ucRc & 0xFF);
    WriteBytes[7] = (ucRc >> 8);
    }
    float TempControl::getTempValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    float CrtVal;
    ushort LongVal = 0;

    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {
    LongVal = (unsigned char)ReadBytes[0] + (unsigned char)(ReadBytes[1]) * 256;
    qDebug() << "longVal:" << LongVal << endl;
    Val = LongVal / 10.0f;
    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    CrtVal = LongVal / 10.0f;
    return Val;

    }
    else
    {
    return -1;

    }

    }
    void TempControl::setTempCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    if (Val >= 0)
    {
    LongVal = (int)(Val * 10 + 0.001f);
    }
    else
    {
    LongVal = 65536 - (int)(0 - Val * 10.0f + 0.001f);
    }
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x43;
    WriteBytes[3] = 0x50 + Proid * 2;
    WriteBytes[4] = LongVal % 256;
    WriteBytes[5] = LongVal / 256;
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF; ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;

    }


    void TempControl::setScCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid, int AddressIde)
    {
    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    if (Val >= 0)
    {
    LongVal = (int)(Val * 10 + 0.001f);
    }
    else
    {
    LongVal = 65536 - (int)(0 - Val * 10.0f + 0.001f);
    }
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x43;
    WriteBytes[3] = 0x10;
    WriteBytes[4] = LongVal % 256;
    WriteBytes[5] = LongVal / 256;
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde;
    cRc &= 0xFFFF;
    ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;

    }

    void TempControl::setProNumCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid, int AddressIde)
    {
    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x43;
    WriteBytes[3] = 0x2B;
    WriteBytes[4] = Val % 256;
    WriteBytes[5] = Val / 256;
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF;
    ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;

    }
    void TempControl::getScCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0x10;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff;
    ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;
    }
    float TempControl::getScValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal / 10.0f;
    return Val;
    }
    else
    {
    return -1;

    }


    }
    void TempControl::getProNumCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0x2B;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff;
    ucRc = cRc;
    WriteBytes[6] = (ucRc % 256);
    WriteBytes[7] = (ucRc / 256);
    }
    float TempControl::getProNumValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {
    Val = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    return Val;
    }
    else
    {
    return -1;

    }


    }
    void TempControl::setCrtTempTimeCmd(QByteArray &WriteBytes, float Val, float CrtVal, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    if (Val >= 0)
    {
    LongVal = (int)(Val * 10 + 0.001f);
    }
    else
    {
    LongVal = 65536 - (int)(0 - Val * 10.0f + 0.001f);
    }
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x43);
    WriteBytes[3] = (0x51 + Proid * 2);
    WriteBytes[4] = (LongVal % 256);
    WriteBytes[5] = (LongVal / 256);
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF;
    ucRc = cRc;
    WriteBytes[6] = (ucRc % 256);
    WriteBytes[7] = (ucRc / 256);
    }
    void TempControl::getCrtTempTimeCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x52);
    WriteBytes[3] = 0x51 + Proid * 2;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff;
    ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;
    }
    float TempControl::getCrtTempTimeValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;

    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal / 10.0f;
    return Val;
    }
    else
    {
    return -1;

    }


    }
    void TempControl::setSPrCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid, int AddressIde)
    {

    int ret = 0;
    ushort ucRc = 0;
    int cRc = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x43);
    WriteBytes[3] = (0x2A);
    WriteBytes[4] = (Val % 256);
    WriteBytes[5] = (Val / 256);
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF;
    ucRc = cRc;
    WriteBytes[6] = (ucRc % 256);
    WriteBytes[7] = (ucRc / 256);

    }
    void TempControl::getSprCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    long LongVal = 0;
    ushort ucRc = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0x2A;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff;
    ucRc = cRc;
    WriteBytes[6] = (ucRc & 0xFF);
    WriteBytes[7] = (ucRc >> 8);

    }
    float TempControl::getSprValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {

    float Val;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = (int)LongVal;
    return Val;
    }
    else
    {
    return -1;
    }


    }
    void TempControl::setStepNumCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x43);
    WriteBytes[3] = (0x2E);
    WriteBytes[4] = (Val % 256);
    WriteBytes[5] = (Val / 256);
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF;
    ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;
    }

    void TempControl::getStepNumCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x52);
    WriteBytes[3] = (0x2E);
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;
    }
    float TempControl::getStepNumValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;

    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal;
    return Val;
    }
    else

    {
    return -1;
    }


    }
    void TempControl::setPonPCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid, int AddressIde)// 上电控制参数 Cont,
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x43);
    WriteBytes[3] = (0x2C);
    WriteBytes[4] = (Val % 256);
    WriteBytes[5] = (Val / 256);
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF; ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;

    }
    void TempControl::getPonpCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)//上电控制参数
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x52);
    WriteBytes[3] = (0x2C);
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;
    }
    float TempControl::getPonpValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {

    float Val;
    long LongVal = 0;

    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal;
    return Val;
    }
    return -1;


    }
    void TempControl::setPafCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid, int AddressIde)// A=1 B=0/1 C=0:分钟 D=0 E=0 F =0 PAF=A+2B+4C+8D+16E+32F 推荐值 PAF=1 / 3
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x43;
    WriteBytes[3] = 0x2D;
    WriteBytes[4] = Val % 256;
    WriteBytes[5] = Val / 256;
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF; ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;
    }
    // 停电前为停止状态则继续停止,否则在仪表通电后继续在原终止处执行。
    // StoP,通电后无论出现何种情况,仪表都进入停止状态。
    // run1,停电前为停止状态则继续停止,否则来电后都自动从头开始运行程序。
    // dASt,在通电后如果没有偏差报警则程序继续执行,若有偏差报警则停止运行。
    // HoLd(仅AI-719P),仪表在运行中停电,来电后无论出现何种情况,仪表都进入暂停状态。但如果仪表停电前为停止状态,则来电后仍保持停止状态
    void TempControl::getPafCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = (0x52);
    WriteBytes[3] = (0x2D);
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff;
    ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;
    }
    float TempControl::getPafValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;

    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal;
    return Val;
    }
    else
    {
    return -1;

    }


    }
    //PAF参数用于选择程序控制功能,其计算方法如下:
    //PAF=A×1+B×2 +C×4 +D×8+E×16+F×32
    //A=0,准备功能(rdy)无效;A=1,准备功能有效。
    //B=0,斜率模式,程序运行时存在温度差别时,按折线过渡,可以定义不同的升温模式,也可以降温运行;B=1,平台模式(恒温模式),每段程序定义给定值及保温时间,段间升温速率可受SPr限制,到达下段条件可受rdy参数限制;另外,即使设置B=0,如果程序最后一段不是结束命令,则也执行恒温模式,时间到后自动结束。
    //C=0,程序时间以分为单位;C=1,时间以小时为单位。
    //D=0,无测量值启动功能;D=1,有测量值启动功能。
    //E=0,作为程序给定发生器时上显示窗显示测量值;E=1,作为程序给定发生器时上显示窗显示程序段号。
    //F=0,标准运行模式;F=1,程序运行时执行RUN操作将进入暂停(HoLd)状态。
    //斜率模式
    // 参数PAF.B=0时,程序编排统一采用温度~时间~温度格式,其定义是:从当前段设置温度,经过该段设置的时间到达下一温度。温度设置值的单位同测量值PV,而时间值的单位可选择分钟或小时。在斜率模式下,若运行到Pno定义的最后一段程序不为停止命令或跳转命令(后文时间设置可编辑),则表示在该温度下保温该段时间后自动结束。下例为一个包含线性升温、恒温、线性降温、跳转循环、准备、暂停的5段程序例子。
    //第1段 SP 1=100.0 t 1=30.0 ;100℃起开始线性升温到SP 2,升温时间为30分钟,升温斜率为10℃/分
    //第2段 SP 2=400.0 t 2=60.0 ;在400℃保温运行,时间为60分
    //第3段 SP 3=400.0 t 3=120.0 ;降温到SP 4,降温时间为120分,降温斜率为2℃/分
    //第4段 SP 4=160.0 t 4=0.0 ;降温至160℃后进入暂停状态,需执行运行(run)才能继续运行下一段
    //第5段 SP 5=160.0 t 5=-1.0 ;跳往第1段执行,从头循环开始运行。
    //采用温度~时间编程方法的优点是升温、降温的斜率设置的范围非常宽。升温及恒温段具有统一的设置格式,方便学习。
    //设置曲线更灵活,可以设置连续设置升温段(如用不同斜率的升温段近似实现函数升温),或连续的恒温
    //平台模式 设置参数PAF.B=1可选择平台模式,适合不需要独立设置升温斜率且不需要设置降温斜率的应用,可以简化编程且更有效利用段数,每段程序含义为温度~该温度恒温时间,段与段之间也可以用SPr参数定义一个升温速率限制,
    //若SPr设置为0则表示全速升温,由于升温时间无法确定并会占据保温时间,可设置rdy有效,以保证正确的恒温时间
    // A=1 B=0/1 C=0:分钟 D=0 E=0 F =0 PAF=A+2B+4C+8D+16E+32F 推荐值 PAF=1 / 3

    void TempControl::setStepStateCmd(QByteArray &WriteBytes, int Val, float CrtVal, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = 0x43;
    WriteBytes[3] = 0x1B;
    WriteBytes[4] = Val % 256;
    WriteBytes[5] = Val / 256;
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF;
    ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;


    }
    void TempControl::getStepStateCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = (0x80 + AddressIde);
    WriteBytes[1] = (0x80 + AddressIde);
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0x1B;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;
    }
    float TempControl::getStepStateValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal;
    return Val;

    }
    else
    {
    return -1;
    }

    }

    //已经运行时间
    void TempControl::getPonTimeCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde)
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0x2F;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;
    }
    float TempControl::getPonTimeValue(QByteArray ReadBytes, int Proid, int AddressIde)
    {
    float Val;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    Val = LongVal;
    return Val;

    }
    else
    {
    return -1;

    }

    }


    void TempControl::SetAtCmd(QByteArray &WriteBytes, int AtVal, int Proid, int AddressIde) //自整定
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x43;
    WriteBytes[3] = 0x1d;
    WriteBytes[4] = AtVal % 256;
    WriteBytes[5] = AtVal / 256;
    cRc = WriteBytes[3] * 256;
    cRc += WriteBytes[2];
    cRc += WriteBytes[4];
    cRc += WriteBytes[5] * 256;
    cRc += AddressIde; cRc &= 0xFFFF; ucRc = cRc;
    WriteBytes[6] = ucRc % 256;
    WriteBytes[7] = ucRc / 256;
    }

    void TempControl::getAtCmd(QByteArray &WriteBytes, float Val, int Proid, int AddressIde) //自整定
    {

    int cRc = 0, ret = 0;
    ushort ucRc = 0;
    long LongVal = 0;
    WriteBytes[0] = 0x80 + AddressIde;
    WriteBytes[1] = 0x80 + AddressIde;
    WriteBytes[2] = 0x52;
    WriteBytes[3] = 0x1d;
    WriteBytes[4] = 0;
    WriteBytes[5] = 0;
    cRc = WriteBytes[3] * 256 + 82 + AddressIde;
    cRc = cRc & 0xffff; ucRc = cRc;
    WriteBytes[6] = ucRc & 0xFF;
    WriteBytes[7] = ucRc >> 8;

    }
    float TempControl::getAtValue(QByteArray ReadBytes, int Proid, int AddressIde) //自整定
    {
    float AtVal;
    long LongVal = 0;
    if (Udian_CheckRc(ReadBytes, AddressIde) == 1)
    {

    LongVal = (unsigned char)ReadBytes[6] + (unsigned char)(ReadBytes[7]) * 256;
    AtVal = LongVal;
    return AtVal;

    }
    else
    {
    return -1;

    }

    }

    /*测试用例:获取当前温度值*/

    #include <QtCore/QCoreApplication>
    #include "TempControl.h"
    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    TempControl *Yu_Dian;
    Yu_Dian = new TempControl("com5",
    QIODevice::ReadWrite,
    9600,
    QSerialPort::Data8,
    QSerialPort::NoParity,
    QSerialPort::NoFlowControl,
    QSerialPort::OneStop);
    Yu_Dian->Init();
    while (1)
    {
    float fPV = Yu_Dian->getTemp();
    qDebug() << "PV:" << fPV<< endl;;

    }


    return a.exec();
    }

    后知后觉、越学越菜
  • 相关阅读:
    【转载】stm32的GPIO八种工作模式
    常用数字滤波算法总结
    ST-LINK使用注意
    【转载】深入理解嵌入式开发
    【stm32中断优先级--珍藏版】
    对飞控的理解(一)
    【转载】c语言数据的左移右移
    四轴之第一炸
    linux下查看隐藏文件
    Jetson TK1 五:移植工控机程序到板上
  • 原文地址:https://www.cnblogs.com/chenhuanting/p/10824935.html
Copyright © 2020-2023  润新知