赞
踩
公司近期需要开发一款测试系统,其中有一个设备就是变频器AC310,因为CSDN相关资料少,于是记录一下。 之前看到一篇文章,伟创变频器AC310与上位机通信调试记录-CSDN博客,但是这个文章写的并不详细,于是自己额外写一篇。
变频器AC310详细版说明书(V1.1)20190729.pdf官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘
说明书页可以问官方的去要,也可以去京东客服要。
变频器使用的是modbus通讯格式,有主从机的区别,一般主机是PLC或者是其他串口设备,比如我们公司使用的是串口集线器,如果是PLC的话,就不需要这么麻烦,因为做了一些封装。
变频器控制的是电机,如果要控制的话,最基本的就是设置频率、启动、减速停机等关键几个。以下是通信格式,在说明书53页:
最开始我打电话问,结果说要搞明白什么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是说明书的指令。最后的是校验位,需要自己写代码计算。
16进制(CRC16)(MODBUS RTU通讯)校验码在线计算器 (23bei.com)
比如命令代码:其实利用在线校验工具,后面的可以自己计算出来的。
- // 变频器:******************************************************************************************
- // 【从机-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
- }
设置频率 = 50 * 转速 / 980 即可。其实看似很懵是吧,但是根据计算,发现其实极对数算出来大概就是3,所以其实是对的。因为变频器输出的是频率,最终的转速,要根据控制的电机来。
最后,因为这个只是项目中很小的一部分,就不放源码了哈。
从机地址提示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。