上位机工作感想-从C#到Qt的转变-1

2024-04-22 10:12

本文主要是介绍上位机工作感想-从C#到Qt的转变-1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0.前言

接触Qt开发也有一年多的时间了,还记得去年初从杭州回合肥时,刚来公司面临的几个问题:

  • 1.C#转上位机的迷茫
  • 2.新公司管理模式的差异
  • 3.试用期的各种紧急任务。

当时也是加班加点学习C++和Qt的基础知识,做了两个考核项目后,顺利渡过了试用期。
关于转语言,公司大概率是不会给一个社招人员过渡期的,我们所要做的就是放平心态,努力做好公司交待的项目就行了。基础扎实非常重要,一般来说熟练掌握一门语言后,学习其它语言时类比一下,再在项目中锻炼一下,熟悉起来还是很快的。后面的精通不仅需要学习相关编程书籍,还需要在项目中不断实践相关语言特性,写了一定数量并且解决了这些bug后,才会对语言有个深刻的认识。

1.项目积累

来这边大大小小也是做了7、8款软件了,其中拿3个比较有意义的来记录一下

1.1 样品前处理设备软件

这是在试用期开发的一款软件,原定用C#开发,最后在老员工的强力反对下改成了Qt。这让我想起了钱学森先生的一句话:”手里没剑和有剑不用是两码事“,你不会Qt人家就偏要让你用Qt开发。这款软件的主要功能就是使用modbus协议对下游IO设备进行一定时序的开闭控制,从而对皮带上移动的粉末物料作压块处理,提高设备的检测精度。
原本的测量软件架构就已经很乱了,再往里面塞新的业务代码不就是在屎山上再拉一泡屎,想想就恶心。后来也验证了我的想法,大部分时间都在在调试老软件。所以我前处理软件也是和老软件独立开发,二者通过modbus进行交互。控制软件分为通讯层、设备层、业务层三层,上层调用下层,达到代码的最大重用。同时业务层使用Command(指令模式),将不同业务封装进不同的指令,所有指令都继承BaseCommand,实现里面的Execute()方法,跑业务流程时把这些子Command串在一起for循环一下就行了。这样可以很大程度上解耦业务代码,调试修改也是简单。
现场运行时遇到了两个问题:tcp通讯在一段时间内无数据交互就会断线,调用保活方法也是不行,最后通过定时器定时获取设备状态在业务层进行保活。另外就是公司选购的串口服务器稳定性太差,经常会出现设备重置的状态,必须在软件层面加上断线重连机制,好在libmodbus就自带该功能。
总体来说第一次使用Qt编写项目还算顺利,对C++的基本语法也更加熟悉。设计模式、重构、配套测试、通讯等上位机编程的基础技能扎实也能比较快的适应新语言。
关于Modbus通讯库: 在Qt平台上用的比较多的一个是libmodbus、一个是Qt自带的Modbus通讯库。libmodbus接口都是同步读取,QModbus提供的多为异步接口。libmodbus还带有断线重连和通讯错误恢复功能,比较适合交互性较强的通讯场合,官方文档也是很详细,认真阅读一遍还是有很多收获的。经过了多次测试,还是决定使用libmodbus作为modbus通讯库。

1.2 公司产品软件重构

公司现有产品有多种型号,每种型号的大致功能都是类似,无非就是移动导轨、激光器打激光、光谱仪采数据、算法模型计算结果,但是每种型号都要维护一套特有的代码,这就导致设备功能迭代困难。领导就叫我对所有设备进行统一,通过配置文件实现不同设备的作业流程。
这是一件光荣而艰巨(吃力不讨好)的任务,本着对技术的追求和公司产品的负责,我最终还是接下了该任务(基本上也就我一个人在干)。我也是延续了之前的分层架构,将整个软件分为通讯、设备、指令、控制、算法几个模块。每个模块通过单例模式进行管理,通过json配置文件创建模块中的实体并且配置该实体,通过Manager单例向外提供获取不同实体指针的方法,类似于C#中的依赖注入。这五六个月的期间,我对原有业务进行分析、抽象、编码等工作,终于在上个月完成的所有编码工作。不是我效率低,是这个项目压根就没立项,仅仅算一个附加工作,还身负很多其它的开发项目。后面也是自己主导软件的功能测试(其实就我一个人在测试)。测试过程中发现软件有内存泄漏问题,这个也是困扰了我很久,半个月的测试运行,排查到了几个内存泄漏的点:

  • 模型计算部分传入的数组指针没有释放
  • 基于Qt的modbus通讯部分reply指针没有释放

依次解决了这两个bug后,软件的内存占用就非常稳定了,我也是成就感满满,也许这就是C++这类语言的魅力吧。
这个产品软件重构也让我认识到职场的复杂性,领导怎么做比怎么说更重要,行动上的支持、物质上的鼓励才是最实在的。这个项目也是兴趣和责任推动着我做下去,a loney solider!

1.3 基于Blazor开发的数据看板

这个项目源于客户想远程查看我们在线设备的实时数据。给他装个客户端吧?显得有点麻烦,做一整套的前后端?我也不太会。
刚好看到微软新出的blazor框架,说是可以用C#写前端代码(后来发现前端那些东西还是要了解),感觉甚是好玩。就学着使用blazor写了一套后台监控数据库文件,前台实时推送数据的web程序。自己也是学了html、css、bootstrap等前端相关的基础知识,开发出来的效果还怪不错的。通过这个也是学习了前后端、iis部署、jwt权限认证等知识,另外用自己的老搭档C#写代码也是非常开心的一件事。
数据看板实图

这篇关于上位机工作感想-从C#到Qt的转变-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925499

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图