从零写一个工控多协议通讯库(五):画面组态——从写死一个监视器,到用组态把它拼出来
本文首发于我的博客talkplc.com系《从零写一个工控多协议通讯库》系列第五篇。转载请注明出处。第四篇接第二种协议时立过一个标准新协议进来框架和界面一行不改。S7 通过了考试。但界面本身一直是块心病——协议树、点表、收发帧监视全是写死在MainWindow里的。这篇把界面也变成数据原来是我写一个监控软件现在监控软件的页面由组态软件拼出来。项目代号 talkplc个人时间与设备自研实现不碰任何厂商代码。起点一份代码即界面的监视器talkplc 的监视窗口长这样左边协议树右边串口参数、八列点表、收发帧监视顶上一颗连接状态灯。功能没毛病但每加一个显示需求都要改 C 重新编译。界面是代码不是数据。组态软件WinCC、组态王、Ignition 这类的路子正好相反界面是一份配置文件运行器加载它、按配置采集和显示。好处人人都知道。但真下手做的时候问题一个一个冒出来。设计器画的东西运行器怎么认这需要一个双方都认的东西也就是契约。构件数值、仪表、按钮这些怎么加才不用改一堆地方这个问题协议层已经答过一次注册表。还有表格、设备列表这种长得像表的东西是一个一个写还是有别的办法第一步契约先行别管界面设计器和运行器是两个角色工控惯例是组态环境和运行环境分开。但它们之间只需要一个东西工程文件。所以第一刀切在数据上。工程 project connections[] screens[] connections[i] 一个 tp_conn_config 一个 id协议/链路/点表全是已有的 screens[i] 画布尺寸 widgets[]构件数组 widgets[j] type rect 绑定(conn id 点名) 各自属性构件绑定用名字连接 id 加点名而不是索引稳定、可读手改 JSON 也不容易错运行时再解析成索引。旧的单连接配置文件自动视作一个iddefault的连接向前兼容白送。有了契约程序形态反而是小事。一个 exe 两个模式--design进设计器产出工程--screen进运行器消费工程。设计器只产不跑设计态不连设备构件画占位运行器只跑不编辑。将来要拆成两个程序或者把运行器下沉到嵌入式LVGL契约一个字不用改。内核照旧零改。运行器核心tp_runtime是个纯 C 引擎吃一份工程每连接自动开一个会话每拍把值递给渲染层。Qt 只是它的一个前端。构件自己报属性属性面板谁也不认识设计器里最容易被低估的是属性面板。我的做法是让每个构件自己声明有哪些属性绑定、量程、颜色、动作面板只负责把声明渲染成编辑行、把编辑写回去QListWidgetPropGaugeItem::typeProps()const{QListWidgetPropL;LwpMake(unit,单位,WP_Text)wpMake(min,最小,WP_Real)wpMake(max,最大,WP_Real);returnL;}面板是通用的加构件不用改面板。这句话后来被我自己打脸了一次。画面跳转按钮有个 bug属性面板显示目标画面画面1存盘后却是空的跳转永远没反应。查下来是两个不起眼的事凑在一起——下拉框显示着第一项但这个值从没被写进构件。你看到的和你存下来的不是一回事。修法是把所见即所存定成面板的硬规则值为空时把显示着的默认项真正提交进去。这个 bug 比功能本身值钱。通用 UI 的坑往往就藏在显示和数据的缝隙里。加构件和加协议一个待遇前四篇最得意的设计是协议注册表tp_registry名字到工厂加协议等于加一行框架核心零改。那构件凭什么例外// gui/screen/items/TableItem.cpp 文件尾staticScreenItem*makeTable(ints,intw,consttp_screen_widget_td){returnnewTableItem(s,w,d);}namespace{structTableRegistrar{TableRegistrar(){ItemInfo ii{table,表格,70,360,260,paintTableIcon,makeTable};itemRegistryAdd(ii);}}tableReg_;}每个构件一个自包含文件文件尾一个静态注册器把自己登记进ItemRegistry登记的内容是类型名、调色板标签、默认尺寸、图标、工厂。设计器的调色板和工厂只读注册表。工厂 switch、调色板数组、图标 if/else这些我在第一版里亲手写过的东西全都不存在了。加一个构件 加一个文件 CMake 一行。和加协议一个待遇。一段弯路专门构件的坑接下来我犯了这篇里最大的错值得原样记下来。做设备管理页左边设备列表右边选中设备的点表和参数的时候我按老习惯写了三个专门构件类TableItem点表四列写死、DeviceListItem设备列表、DevParamsItem参数卡带编辑按钮。每个都要新类、工厂分支、调色板注册、图标、默认尺寸。注册表明明已经把成本降到加一个文件了我还在往一个文件里堆类。手上有了新工具脑袋还在旧习惯里。想通之后全部推倒。点表、设备列表、参数卡本质是同一种东西一张表只是数据源不同。于是通用表格有了source属性conn是整连接点表可以子集选点devices是设备清单行点击可以选中设备devattr是选中设备的属性卡。列用columns配行点击动作用row_action配。参数卡上那个编辑参数按钮就是普通按钮构件的一个动作actionparams。{type:table,source:devices,columns:dot,id,proto,row_action:select,rect:[40,96,300,660]}上面这七行就是原来 DeviceListItem 那 150 行类的全部。后来我给自己定了个规矩再遇到表状的东西先想能不能用通用表格配出来能配就不写类。让右侧跟着左侧走master-detail 还差一口气左边点了一台设备右边的点表、仪表怎么跟着换给构件绑定加一个特殊值conn意思是跟随运行器当前选中的设备。选中状态放在tp_runtime里绑定解析每次即时求值解析成选中的连接 id。任何构件绑上就自动联动跨设备同名点位比如都叫 temp无缝跟随不同名的显示无效。参数编辑也顺下来了。画面上一个编辑参数按钮绑点了弹出该设备当前值预填的表单。表单字段来自协议清单protocols.json每种协议声明自己有哪些可编辑参数又是一层配置。确定之后改配置、断开重连、自动存回工程 JSON。运行中的监视页面可以改波特率、换 IP改完状态灯闪一下连接中就回来了。验收把监视器拼回来说再多验收标准就一条原来写死的那个监视页面现在能用设计器拼出来。标题是文本构件点表是通用表格绑连接写入行是输入框绑点位仪表盘是三个 gauge。原来几百行 C 的界面现在是四十来行 JSON。点表里每一行的值和状态是活的仪表的指针在动。再往上叠一层就是完整的设备管理页三台设备三种协议S7、Modbus RTU、Omron NJ全部跑内置仿真从站点左边的行右边整块跟着换参数卡上改个采集周期重连生效存盘留痕。而它本身也是设计器里拖出来的没有硬件怎么验证老规矩sim链路三台仿真从站一起跑画面上的值就是活的。纯 C 的契约层工程读写、绑定解析、选中、重连在 ctest 里跑一遍全绿GUI 层人工过——画面来回切几轮看跳转设备列表点几行看右侧跟不跟参数改个采集周期看状态灯闪一下连接中再回来。没有 PLC 也能把整条画面逻辑过一遍这套方法从第一篇用到现在。接下来四篇立住了数据面协议是外挂的这一篇立住了表达面。工程 JSON 是设计器和运行器之间唯一的东西构件自描述加注册表加构件和加协议一样便宜表状界面是配置不是类型这条弯路比任何功能都值钱一个字符master-detail 免费送。后面排得上号的趋势曲线window_s字段从第一版起就躺在契约里等着被用、设计器里一键生成设备页、把纯 C 运行器搬到 LVGL 上。契约不变换个前端而已。每加一层都回来对照一次改动越小说明当初的抽象越对。系列前四篇① 架构与传输抽象 · ② Modbus TCP 与重构 · ③ 数据构件仪表盘 · ④ 西门子 S7

相关新闻

Python趣味游戏开发:少儿编程启蒙实践

Python趣味游戏开发:少儿编程启蒙实践

1. 项目概述:用Python打造趣味小游戏的启蒙实践这个项目源于我在少儿编程教学中的一次课堂实践——通过编写简单小游戏来巩固Python基础知识。不同于传统枯燥的语法练习,游戏开发能让孩子在创造中获得即时反馈,当看到自己编写的代码变成可交互…

2026/10/24 8:00:01 阅读更多 →
CarSim 2021.0 完整安装、破解与Simulink联合仿真环境搭建指南

CarSim 2021.0 完整安装、破解与Simulink联合仿真环境搭建指南

1. 项目概述与核心价值如果你正在做车辆动力学仿真、自动驾驶算法开发或者相关的科研项目,那么CarSim这个名字对你来说一定不陌生。它几乎是这个领域绕不开的工业标准软件,尤其是在和MATLAB/Simulink做联合仿真的时候,CarSim提供的车辆模型精…

2026/10/23 23:23:21 阅读更多 →
Python实战:从零构建钢筋混凝土柱PMM相互作用图计算与可视化工具

Python实战:从零构建钢筋混凝土柱PMM相互作用图计算与可视化工具

1. 从需求到图纸:为什么我们需要PMM图?在结构工程、机械设计或者任何涉及复杂构件分析的领域,我们常常会遇到一个核心问题:如何直观、定量地评估一个构件在承受弯矩(M)和轴力(P)共同…

2026/10/23 18:04:57 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/23 10:29:42 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/23 15:39:08 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/23 10:53:32 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/24 3:09:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/23 19:30:19 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/23 13:55:34 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/24 1:12:31 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/23 9:25:46 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 22:56:44 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 22:56:12 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 5:28:28 阅读更多 →