伟创变频器AC310上位机QT开发记录1

创作原因

        公司近期需要开发一款测试系统,其中有一个设备就是变频器AC310,因为CSDN相关资料少,于是记录一下。 之前看到一篇文章,伟创变频器AC310与上位机通信调试记录-CSDN博客,但是这个文章写的并不详细,于是自己额外写一篇。

说明书下载

变频器AC310详细版说明书(V1.1)20190729.pdf官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘

说明书页可以问官方的去要,也可以去京东客服要。

细节说明

1. 通信相关:

        变频器使用的是modbus通讯格式,有主从机的区别,一般主机是PLC或者是其他串口设备,比如我们公司使用的是串口集线器,如果是PLC的话,就不需要这么麻烦,因为做了一些封装。

        变频器控制的是电机,如果要控制的话,最基本的就是设置频率、启动、减速停机等关键几个。以下是通信格式,在说明书53页:

2. 开发的基本知识

        最开始我打电话问,结果说要搞明白什么modbus协议,后面简单了解了一下,就开始着手了,大概意思就是写入和读取相关寄存器地址的数据,就这么简单。首先是modbus报文,一般是8个字节,如下列排布的8个字节,举例说明:

"01 03 30 01 00 01 DA CA”
1【从机-01】   从机一般都是0x01
2【命令代码-03读 06写】
3【起始地址高】
4【起始地址低】
5【数据高】
6【数据低】
7【校验1】
8【校验2】

        刚刚的举例里面,01是从机。03是读的意思。3001是读取的地址,这个可以在说明书59页查到,也可以搜索3001看到,我顺便贴个图在下面。0001是说明书的指令。最后的是校验位,需要自己写代码计算。

3. RTU校验的在线工具

16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器 (23bei.com)

4. 相关参考代码:

比如命令代码:其实利用在线校验工具,后面的可以自己计算出来的。

// 变频器:****************************************************************************************** 
    // 【从机-01】【命令代码-03读 06写】【起始地址高】【起始地址低】【数据高】【数据低】【校验1】【校验2】
    QString order_transduce_read     = QString("01 03 01 0D 00 02 54 34");  // 参数读取

    QString order_transduce_InitSpeed= QString("01 06 30 00 13 88 8b 9C");  // 设置默认频率 50hz --- 5000 --- 0x1388
    QString order_transduce_setSpeed = QString("01 06 30 00");           // 设置频率 ++

    QString order_transduce_forward  = QString("01 06 30 01 00 01 16 CA");  // 电机正转
    QString order_transduce_reversal = QString("01 06 30 01 00 02 56 CB");  // 电机反转
    QString order_transduce_slowStop = QString("01 06 30 01 00 05 17 09");  // 减速停机
    QString order_transduce_freeStop = QString("01 06 30 01 00 06 57 08");  // 自由停机
    QString order_transduce_reset    = QString("01 06 30 01 00 07 96 C8");  // 复位停机

    QString order_transduce_initSpeedUpTime = QString("01 06 30 0E 03 E8 E7 B7");    // 默认加速时间:10s
    QString order_transduce_setSpeedUpTime  = QString("01 06 30 0E");                // 设置加速时间:时间*100
    QString order_transduce_initSpeedDownTime = QString("01 06 30 0F 03 E8 B6 77");  // 默认加速时间:10s
    QString order_transduce_setSpeedDownTime  = QString("01 06 30 0F");              // 设置加速时间:时间*100

比如一些可以用的通用函数:

    // 公共函数:
    QByteArray qstring_to_hex(QString msg);         // 类似"FE 02 00 00 00 06 EC 07"转为 byteArray
    QString hex_to_str(QByteArray in);              // byteArray转为类似"FE 02 00 00 00 06 EC 07"
    QString calculateModbusRTUChecksum(QString);    // 计算最后2为的RTU校验转为 类似“0A 0F”
    QString convertIntToHexString(int value);       // 0-65535 的数字,转为2位的十六进制 比如100  ->  00 64


QByteArray qstring_to_hex(QString msg)
{
    QString hexString = "FE 02 00 00 00 06 EC 07";

    // 转换为十六进制格式的字节数组
    QStringList hexValues = msg.split(" ");
    QByteArray hexData;
    foreach (QString hexValue, hexValues) {
        hexData.append(static_cast<char>(hexValue.toInt(nullptr, 16)));
    }
    return hexData;
}

QString hex_to_str(QByteArray in)
{
    QString s;
    for(int i=0;i<in.length();i++)
    {
        s+=QString("%1").arg(in[i]&0xFF,2,16,QLatin1Char('0')).toUpper();
        s.append(" ");
    }
    return s;
}

QString calculateModbusRTUChecksum(QString data)
{
    QByteArray byteArray = QByteArray::fromHex(data.toLatin1()); // 将输入的16进制字符串转换为字节数组
    quint16 crc = 0xFFFF; // 初始CRC值为0xFFFF

    for (int i = 0; i < byteArray.size(); ++i)
    {
        crc ^= static_cast<quint16>(byteArray.at(i)); // 异或操作

        for (int j = 0; j < 8; ++j)
        {
            if (crc & 0x0001) // 最低位为1
            {
                crc >>= 1;
                crc ^= 0xA001; // 异或操作
            }
            else
            {
                crc >>= 1;
            }
        }
    }

    QByteArray checksumBytes;
    checksumBytes.append(static_cast<char>(crc & 0xFF)); // 低位字节
    checksumBytes.append(static_cast<char>((crc >> 8) & 0xFF)); // 高位字节

    return QString(checksumBytes.toHex(' ').toUpper()); // 转换为16进制的QString,字节之间用空格分隔,大写字母
}

QString convertIntToHexString(int value)
{
    QString hexString = QString("%1").arg(value, 4, 16, QLatin1Char('0')).toUpper();
    hexString.insert(2, ' '); // 在第二个字符后插入一个空格
    return hexString;
    // "00 64"   100
}

5. 其他细节

  1. 先发送设置频率的指令,再发送启动指令。并且频率、加速时间和上升时间需要先乘100,再转为十六进制,比如可以使用我写的公共函数 converIntToHexString即可。
  2. 频率和电机转速的换算关系:N=60f/p, N是转速,f是频率,p是极对数。但其实也不需要这么计算,比如我们已经知道变频器控制的是三相异步电动机,那么极对数就是3,查看电机铭牌,发送额定转速是980r/min,额定频率是50hz,那么直接这么计算即可:

        设置频率 = 50 * 转速 / 980 即可。其实看似很懵是吧,但是根据计算,发现其实极对数算出来大概就是3,所以其实是对的。因为变频器输出的是频率,最终的转速,要根据控制的电机来。

最后,因为这个只是项目中很小的一部分,就不放源码了哈。

补充

 从机地址提示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿龍1787

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值