工业现场最不缺的就是扫码需求。最近用Qt5重构了车间里的数据追溯系统,无线扫码枪配合PLC自动触发,数据直存Sqlserver,顺手把核心代码扒出来聊聊
qt5_c工业上位机自动扫码数据追溯 Qt5之工业应用 一套完整工程链接PLC工业无人值守自动扫码使用无线扫码枪SR1000的使用使用qt5.14用qtcreator加载工程后编译运行可调试可扩展目的是学习qt开发方式。 Sqlserver存储方式查询自由。 excel方便导出c效率无需赘言。先说扫码枪这头SR1000无线枪走的是串口透传。Qt里玩串口就跟喝水似的简单QSerialPort *scanner new QSerialPort(this); scanner-setPortName(COM3); scanner-setBaudRate(QSerialPort::Baud115200); if(scanner-open(QIODevice::ReadOnly)){ connect(scanner, QSerialPort::readyRead, [](){ QByteArray data scanner-readAll(); QString barcode QString(data).trimmed(); qDebug() 捕获到条码: barcode; emit newBarcode(barcode); // 这信号能穿透整个系统 }); }注意这个lambda里直接捕获this指针扫码枪数据过来直接触发业务逻辑。遇到过现场电磁干扰导致乱码的情况加个校验算法就稳了。数据库操作这块QtSql模块直接硬刚SqlserverQSqlDatabase db QSqlDatabase::addDatabase(QODBC); db.setDatabaseName(DRIVER{SQL Server};SERVER192.168.1.100;DATABASETraceDB;); if(db.open()){ QSqlQuery query; query.prepare(EXEC InsertTraceData barcode?, station?, time?); query.addBindValue(currentBarcode); query.addBindValue(Config::stationId()); query.addBindValue(QDateTime::currentDateTime()); if(!query.exec()){ qWarning() 入库失败: query.lastError().text(); } }存储过程防SQL注入比直接拼字符串靠谱多了。遇到并发写入时改用事务批量提交效率直接起飞。qt5_c工业上位机自动扫码数据追溯 Qt5之工业应用 一套完整工程链接PLC工业无人值守自动扫码使用无线扫码枪SR1000的使用使用qt5.14用qtcreator加载工程后编译运行可调试可扩展目的是学习qt开发方式。 Sqlserver存储方式查询自由。 excel方便导出c效率无需赘言。数据导出到Excel才是真香现场QAxObject *excel new QAxObject(Excel.Application); QAxObject *workbooks excel-querySubObject(Workbooks); QAxObject *workbook workbooks-querySubObject(Add); QAxObject *sheets workbook-querySubObject(Worksheets); QAxObject *sheet sheets-querySubObject(Item(int), 1); // 直接从数据库怼数据到Excel QSqlQueryModel model; model.setQuery(SELECT * FROM TraceData WHERE lineA2); for(int row0; rowmodel.rowCount(); row){ for(int col0; colmodel.columnCount(); col){ QAxObject *cell sheet-querySubObject(Cells(int,int), row1, col1); cell-setProperty(Value, model.record(row).value(col)); } } excel-setProperty(Visible, true); // 调试完记得关自动显示QAxObject这货虽然有点老但胜在不用装第三方库。注意用完一定要释放COM对象不然进程关不干净。实际部署时踩过几个坑扫码枪休眠策略导致漏扫 - 加个心跳包维持连接数据库连接池爆满 - 改用单例连接配合队列Excel导出卡界面 - 扔到线程池里异步处理这整套东西跑在工控机上两年没掉过链子Qt的跨平台特性让后期迁移到Linux也省了不少事。核心就三板斧信号槽驱动业务流程、SQL模板化操作、合理调度硬件资源。工业级开发最忌炫技代码糙点没事稳定压倒一切。