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#写代码也是非常开心的一件事。