Qt使用S7协议进行数据类型转换

介绍

1.使用Qt调用S7协议与西门子PLC读写数据,使用到数据类型有int,bool,string,float,如何使用S7协议请看如何调用S7
2.本文只介绍如何使用这几种数据类型。

上代码

1.writeData介绍:

①.type数据类型,offset偏移量,value数据,int和bool用的都是同一种数据转换,高位在前地位在后,由于设备不同,可能存在plc收到数据不对,例如发1收到256等,那就是端序反了,可能人家是低字节在前改一下位置就行。
②.字符串数据类型string,首先在西门子plc中字符串类型的前两个字节非数据,0是最大长度,1是数据长度,后面才是数据,所以需要特殊处理。
③.字符串类型操作建议使用char数组,如果用string类型博图软件可能对于这个类型修改数据的时候只是做了覆盖处理而并未删除其他地址的数据例如写入123后在改为a,那么用qtc++去读取这个偏移量地址的数据就读到a23.

2.readData介绍:

①.读取bool类型例如写入true读到的是256,做一下处理就行,或者改变端序。

void Snap7Client::writeData(int type, int offset, const QString &value) {
    // Write data according to type
    // 0int 1bool 2string 3float
    switch (type) {
    case SnapInt:
    case SnapBool:
    {
        qint16 buff = value.toShort();
        QVector<char> buffToWrite(2);
        buffToWrite[0] = (buff >> 8) & 0xFF;  // 高位字节
        buffToWrite[1] = buff & 0xFF;  // 低位字节
        m_client->DBWrite(8000, offset, 2, buffToWrite.data());
        break;
    }
    case SnapString:
    {
   		QByteArray strBytes = value.toUtf8();  // 转换为UTF-8编码的字节序列
        QByteArray byte;  // 用来发送到PLC的数据
        byte.append(strBytes);  // 字符串的内容
        if (byte.size() <= 0) {
            QByteArray byte(64, ' ');  // 创建一个包含64个空格字节的字节数组
            m_client->DBWrite(8000, offset, byte.size(), byte.data());  // 写入PLC
        }
        else {
            m_client->DBWrite(8000, offset, byte.size(), byte.data());  // 写入PLC
        }
        break;
    }
    case SnapFloat:
    {
        float floatValue = value.toFloat();
        quint32 iniValue;
        union {
            float floatVal;
            quint32 iniValue;
        } u;
        u.floatVal = floatValue;
        iniValue = u.iniValue;
        QVector<char> buffToWrite(4);
        buffToWrite[0] = (iniValue >> 24) & 0xFF;
        buffToWrite[1] = (iniValue >> 16) & 0xFF;
        buffToWrite[2] = (iniValue >> 8) & 0xFF;
        buffToWrite[3] = iniValue & 0xFF;
        m_client->DBWrite(8000, offset, 4, buffToWrite.data());
        break;
    }
    default:
        qDebug() << "Invalid data type.";
    }
}

QString Snap7Client::readData(int type, int offset) {
    // Read data according to type
    QString result;
    switch (type) {
    case SnapInt:
    case SnapBool:
    {
        QVector<char> buff(2);
        m_client->DBRead(8000, offset, 2, buff.data());
        qint16 resultValue = ((unsigned char)buff[0] << 8) |(unsigned char)buff[1];
        //qint16 resultValue = ((unsigned char)buff[0]) |(unsigned char)buff[1] << 8;
        result = QString::number(resultValue);
        break;
    }
    case SnapString:
    {
        QVector<char> buff(64);
        m_client->DBRead(8000, offset, 64, buff.data());
        for (int i = 0; i < buff.size(); ++i) {
            if (buff[i] == ' ') break;
            result += buff[i];
        }
        break;
    }
    case SnapFloat:
    {
        QVector<char> buff(4);
        m_client->DBRead(8000, offset, 4, buff.data());
        qint32 iniValue = ((unsigned char)buff[0] << 24) | ((unsigned char)buff[1] << 16) | ((unsigned char)buff[2] << 8) | (unsigned char)buff[3];
        union {
            quint32 intValue;
            float floatValue;
        } u;
        u.intValue = iniValue;
        float floatValue = u.floatValue;
        result = QString::number(floatValue);
        break;
    }
    default:
        qDebug() << "Invalid data type.";
    }
    return result;
}


你可能感兴趣的:(qt,开发语言)