PCS7工业库实现S7-300趋势图在线/历史切换显示
2026/9/9 22:22:46 网站建设 项目流程

在过程控制项目里,“趋势图切换显示”可以说是出现频率最高的画面需求之一,但真要在S7-300 PLC加PCS7这套架构下做得顺手、稳定,很多刚接触的工程师还是会在组态思路上绕弯子。我之前在几个改造项目里反复调过这类功能,今天就把“在线实时数据”和“归档数据”在同一个趋势画面中切换显示的思路、步骤和坑,一次性讲清楚。

先明确一下使用场景:现场操作员既需要看到当前几秒钟内的实时曲线,判断调节阀动作是否正常,又需要回看过去几个小时甚至几天的历史趋势,分析工艺波动的原因。常规做法是在画面上放两个趋势控件,一个显示在线数据,一个显示归档数据,通过按钮切换可见性。这种方案能用,但画面上控件多、画面切换卡顿,而且两个控件各自维护一套时间轴和曲线配置,后期增加测点时要改两处,维护麻烦。

我采用的方案是只用一个趋势控件,通过PCS7工业库自带的按钮模板和可视化逻辑,动态切换控件的运行模式(在线/离线),实现“一个画面、两种模式、自由切换”。这样既减少了画面对象,也简化了测点挂接,操作员不需要理解底层原理,只需点击“实时/历史”按钮即可。


1. 需求解析与方案选型

1.1 为什么强调“PCS7工业库”而不是普通WinCC组态

标题里特意说了“PCS7工业库”,这里面的门道值得单独拿出来聊。PCS7里常用的库分为两类:一类是传统的PCS7库(Classic Library),另一类是V7.0之后主推的高级过程库(Advanced Process Library,简称APL,也就是业内常说的“工业库”)。如果只在WinCC里手动画几个按钮、放一个趋势控件,其实用普通WinCC也能做,但工业库的价值在于:所有模板、画面、块图标、操作面板都遵循统一规范,按钮、输入框、趋势控件的样式和行为已经预制好,工程师不需要从零搭建。

我之所以选用工业库来做这个功能,还有一层原因是项目后续往往要扩展——比如增加操作员权限、报警确认、面板弹窗等。如果一开始就基于工业库模板做,后续扩展时可以直接复用库自带的模板属性,不需要返工。工业库里的按钮模板本身就带有“按下去高亮”“操作记录”“权限使能”等功能,比自己在WinCC里画一个圆角矩形按钮再写一堆脚本要靠谱得多。

1.2 在线实时数据与归档数据的本质区别

在做趋势切换前,必须先把数据源的路劲搞清楚。在线实时数据是PLC通过PROFIBUS DP或PROFINET实时传上来的过程值,直接存在WinCC运行系统的变量管理器中,画面控件读取的是当前值,所以曲线会跟随现场数据变化实时刷新。归档数据则是WinCC变量归档服务按设定周期(比如1秒存一次、5秒存一次,或者变化时存储)写入SQL数据库的历史记录,趋势控件显示的是从数据库读出来的历史值,不再受PLC实时通信的影响。

这两类数据的差异决定了趋势控件必须工作在不同模式:在线模式需要持续订阅变量变化,按扫描周期刷新曲线;离线(归档)模式则要按时间范围查询数据库,把指定时间段内的归档记录加载到曲线坐标上。理解了这个区别,再看工业库趋势控件的属性设置就不会懵了——在线模式关注的是“刷新周期”,归档模式关注的是“查询时间段”。

1.3 趋势控件选型的几个细节

PCS7项目里最常用的趋势显示控件是WinCC的Online Trend Control和Trend Control。Online Trend Control用于在线实时数据,Trend Control用于显示归档数据。单从控件本身来看,这俩是独立的两个控件。我做的“切换显示”本质上是让同一个画面位置上的某个控件在两种模式下切换,而不是两个控件来回折腾。

不过实际组态时,我更推荐用工业库自带的“WinCC Online Trend Control”并配合脚本修改其“Online/Offline”属性来实现切换,因为工业库的趋势控件封装了更多针对过程控制的显示属性,比如时间轴缩放按钮、阈值线、曲线样式模板等,这些在石化、化工、电厂项目里几乎都是刚需。另外,还需要关注控件对时间轴的缓存处理——在线模式下,控件会缓存一段时间的实时数据,切换成离线模式时,如果缓存未清空,新旧数据会混在一起,曲线看起来会“花掉”,这个细节我在第4部分展开讲。


2. 核心细节解析与实操要点

2.1 工业库中趋势控件的数据接口

在PCS7工业库中,趋势画面通常直接绑定到过程标签(Process Tag)的输出参数上,最常见的是PV(过程值)和QA(质量代码)。这种绑定方式的优势是:一旦做好了标签模板,后续增减测点时只需要更新标签参数,趋势控件会自动关联,不需要在画面里逐个配置通道。

实操时要注意,工业库的趋势控件通常支持“多曲线批量绑定”,操作路径是控件属性 → Data Connection → 添加过程标签或变量。如果项目里只有几个测点,直接绑WinCC变量即可;但如果测点数量在几十个以上,强烈建议按照单元或者工段建立结构化的变量组,再整体拖入趋势控件。否则后期查找和维护都是一场灾难。

还有一点容易被忽略:质量代码QA必须一并绑定。现场出现过一种情况——PLC侧信号超量程或者传感器断线,WinCC变量值出现坏值(bad value),如果不把QA接入趋势控件,曲线会画出异常跳变的尖峰,极容易误导操作员。接入QA后,曲线可以按质量状态用不同颜色或虚线区分,这样诊断问题直观很多。

2.2 切换显示的核心逻辑:Online/Offline属性切换

在PCS7中,Online Trend Control控件有一个关键属性,叫“Online”,大概可以理解为在线刷新模式。当这个属性为True时,控件会按照设定的采集周期从PLC变量实时读取数据并绘制曲线;当它变成False时,控件不再订阅实时变量,而是等待接收归档数据查询指令。

我实现的切换机制,就是在两个按钮之间切换这个Online属性的值,同时触发一次归档数据加载。说白了,就是让同一个控件在“实时刷新”和“历史查询”两个工作模式间跳转。需要注意,仅仅切换Online属性还不够,必须配合一次时间轴的自动设定,否则控件虽然切到了离线模式,却可能因为时间范围不正确而不显示任何数据。

2.3 时间轴联动与归档数据的按段加载

为了让切换到历史模式时能第一时间看到数据,我通常会做一个脚本,在按钮触发时将控件的显示时间范围设置为“当前时间往前推一段时间”,比如8小时、24小时或者上周。这个时间范围可以直接写死,也可以用工业库的“Time Range”按钮模板实现,让操作员自由选择。

比较有用的做法是:把“实时/历史”切换按钮放在工业库标准按钮模板上,然后在按钮事件中同时做三件事:

  • 切换趋势控件的Online属性(True/False)
  • 设置趋势控件的时间轴起始时间和结束时间
  • 对归档数据执行一次重新加载(Reload),确保画面立即可见历史曲线

我见过很多工程师只切换Online属性,结果切到历史模式后画面一片空白,按钮也没报错,其实就是漏了“设置时间轴范围”和“触发加载”这两步。后来我把这两步也写进脚本,问题没有再出现过。

2.4 组态逻辑中的“涨知识”:别把实时数据和归档数据混在一条曲线上

有一次项目联调时,现场操作员反馈:“为什么我切到实时模式,曲线里却有几个测点显示的是昨天的数据?”排查下来发现,当初组态时工程师把部分变量同时勾选了“实时采集”和“归档存储”,而趋势控件中的同一根曲线在在线模式下读取的是实时值,切到离线模式后又读取归档值,切换的瞬间会出现新旧数据交接的毛刺。

针对这个问题,我的做法是码清数据路线:在线模式下,趋势控件只绑定过程标签的PV输出;离线模式下,查询的是变量归档数据。尽管两者在画面上使用同一个控件,但底层数据源必须分清楚。如果项目允许,更稳妥的办法是不同测点分开建趋势模板,避免一个模板里既有实时专属测点又有归档专属测点。


3. 实操过程与核心环节实现

3.1 整体步骤概览

这个功能从零开始组态,我一般按以下顺序来做,整个过程大概需要两到三个工作日(含测试),如果脚本熟练的话一天也能完成主体部分:

  1. 在PCS7项目中确认S7-300 PLC的通信连接状态良好,CPU在线且变量能够正常读取。
  2. 检查WinCC变量归档配置,确保需要做历史趋势的测点已启用归档,且归档周期满足工艺需求。
  3. 在WinCC画面编辑器中新建一个过程画面,将工业库“趋势控件”拖入画面,并根据显示区域调整尺寸。
  4. 在控件属性中配置数据源,绑定过程标签的PV和QA变量,设置曲线颜色、线宽、量程上下限。
  5. 在画面中添加“实时/历史”切换按钮,选择工业库标准按钮模板,配置按钮文本以及切换逻辑。
  6. 编写按钮的C脚本或VBS脚本,实现Online属性切换、时间轴设置和归档数据加载。
  7. 编译、运行项目,在仿真或现场环境下测试实时曲线刷新和归档曲线回看功能。
  8. 优化交互细节,比如按钮高亮状态、曲线图例、时间轴缩放等。

3.2 具体脚本与属性设置

在PCS7中,趋势控件的对象名一般默认叫“OnlineTrendControl1”(工业库中可能稍有差异,但属性接口基本一致)。切换按钮的C脚本可以这样写:

#include "apdefap.h" void OnClick(char* lpszScreenName, char* lpszObjectName, char* lpszPropertyName) { // 获取趋势控件对象 HWND hTrend = GetDlgItem(GetWndFromObject("画面名称", "PdlName"), IDC_TREND); // 切换在线/离线状态 SetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "Online", TRUE); // 设置时间轴范围:从当前时间往前推8小时 SetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "TimeRangeStart", GetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "ServerTime") - 8 * 3600); SetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "TimeRangeEnd", GetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "ServerTime")); // 触发归档数据加载 SetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "Reload", TRUE); }

写脚本时要注意:GetWndFromObject中的“画面名称”要替换成你实际建立的画面名称,不能照抄。如果直接用按钮属性和动态向导来做,也可以不用脚本,但灵活性差一些,比如时间范围就不能做成“最近8小时”而是只能固定一个绝对时间值。

如果项目里用的是VBS脚本(有些工程师更熟悉VBS),基本逻辑是一样的,只是语法换成VBS:

Sub OnClick(ByVal Item) ScreenItems("OnlineTrendControl1").Online = True ScreenItems("OnlineTrendControl1").TimeRangeStart = Now - 8/24 ScreenItems("OnlineTrendControl1").TimeRangeEnd = Now ScreenItems("OnlineTrendControl1").Reload = True End Sub

注意,在VBS里时间单位是天,所以“8小时”要写成“8/24”,这个换算特别容易出错。

3.3 参数设置:归档周期与数据量估算

归档周期的选择直接影响趋势查询体验。以S7-300 PLC为例,CPU的通信负载一般在20%以内比较稳妥。如果归档周期设为1秒,一个测点一天就会产生86400条记录,假设项目有100个测点,一天就是864万条记录。WinCC的SQL数据库撑得住,但查询速度会明显下降,特别是操作员点开历史趋势时,如果一次加载8小时的数据,控件要渲染的点的数量级会比较大,可能出现卡顿。

我的经验是:关键工艺参数(温度、压力、流量、液位)归档周期设为1秒到2秒;一般监测参数设为5秒;纯趋势分析参数可以设为10秒。如果现场对某个参数的历史曲线要求非常高,再单独缩短该测点的归档周期。趋势控件加载数据时,配合“抽稀显示”功能(即控件自动对数据进行降采样显示),可以兼顾清晰度和流畅度。

3.4 精确组态:将S7-300变量接入PCS7

在PCS7项目中,S7-300 PLC的变量通常通过符号表或CFC(连续功能图)统一管理。CFC里建立好的过程标签会自动生成对应的WinCC变量,这也是PCS7与普通WinCC项目最大的不同。在趋势画面里,我一般建议直接拖拽CFC中的模拟量输出块(比如APL库里的ANALOG_IN或MEAS_MON块)到趋势控件上,这样变量路径不会写错。

有一点要特别提醒:如果S7-300的通信中断,趋势控件会显示断线或保持旧值,不会自动恢复。调试过程中,PC机与PLC通信恢复后,需要在趋势控件上手动执行一次“重新连接”操作,否则曲线可能一直不刷新。这个问题在PCS7 V8.0之后有所改善,但老项目里还是经常遇到。

3.5 时间轴的精准控制与跨天显示

化工和电力项目里,“跨天显示”是很容易被忽视的需求。操作员在凌晨2点想看前一天晚上22点到凌晨1点的趋势,如果时间轴没处理好,画面就会空白。我的方案是在画面里再加一个“时间范围选择”组合框,支持“最近1小时”“最近8小时”“最近24小时”“自定义时段”四个选项,每个选项对应一组起止时间。

自定义时段最好做成两个输入框,操作员输入起始时间和结束时间,格式用“YYYY-MM-DD HH:MM:SS”,脚本里做字符串解析并设置控件的TimeRangeStart和TimeRangeEnd。这个功能看起来简单,但接口设计上要注意:如果输入的起始时间晚于结束时间,直接拒绝并弹提示,否则控件行为不可预知。


4. 常见问题与排查技巧实录

4.1 切换后曲线空白,可能不是数据问题

这是最高频的问题,基本占所有趋势图相关求助的一半以上。开关切到“历史”模式后画面空白,大多数人第一反应是“数据库里没存到数据”。但实际上更常见的原因有两个:时间轴范围设置错误,导致查询区间内没有数据;或者控件在线/离线属性切换写在了错误的事件里,属性没真正生效。

排查时我先做两件事:一是查看WinCC变量归档的原始记录,比如用WinCC的“变量记录”诊断工具,确认数据库里确实有数据;二是在趋势控件上手动右键“属性”,查看当前模式和时间轴范围。如果数据库有数据,但控件查询范围不对,只需要调整起止时间即可。如果模式没切换成功,检查按钮事件中Online属性赋值是否执行了。

4.2 在线切归档后曲线出现“毛刺”或“花屏”

这个问题和我前面提到的“新旧数据交接毛刺”类似,触发原因通常是:在线模式下控件已经缓存了近几年(或较长一段)的实时数据,切换归档时,这些缓存数据没有清空,和归档数据叠加显示。解决办法是在切换脚本中明确清理缓存,或者将趋势控件的“ClearOldValues”属性设为True。

另外,我还会在切换时强制重绘控件,代码如下:

SetProp(GetWndFromObject("画面名称", "OnlineTrendControl1"), "Refresh", TRUE);

这步操作能强制控件丢弃陈旧的时间轴数据,重新绘制整个坐标区域,能有效解决大部分花屏和毛刺。

4.3 时间轴显示不对,曲线偏在坐标边缘

这个问题经常出现在“最近24小时”这类相对时间模式下。原因很简单:操作员点击“历史”按钮的时刻,脚本里用的系统时间可能与WinCC服务器时间有偏差,或者PLC与PC时间不同步导致归档数据时间戳与不准确。

我的惯用做法是:在项目所有操作员站上启用时间同步(用PCS7的时间同步功能或Windows时间服务),确保PLC、WinCC服务器、操作员站三者时间一致。趋势切换脚本里的时间计算统一以WinCC服务器时间为基准,不要用本地客户端时间。否则夜班操作员在操作员站A上看历史趋势,数据可能比操作员站B滞后或超前。

4.4 多画面间切换后,趋势控件状态丢失

PCS7画面通常用画面窗口或页面切换来实现多画面浏览。有时候操作员从“总览”切到“反应釜”再切回来,发现之前选好的“最近8小时”变成了默认的“最近1小时”,曲线也回到了初始状态。

这个问题源于WinCC画面窗口的“页面生命周期”机制——退出页面时,页面内的控件对象被销毁,重新进入时重新创建,状态自然丢失。解决办法是将趋势控件的关键属性(Online模式、时间范围、曲线数量等)保存到全局变量或者SetProp的持久化属性中,页面打开时执行初始化函数做恢复。如果项目简单,不想做那么复杂,也可以把趋势功能独立放到一个专门画面里,不和其他画面混用切换,从源头避免状态丢失。

4.5 性能问题:趋势画面打开慢、拖动卡顿

打开趋势画面耗时3秒以上,时间轴拖动摇杆时曲线刷新出现严重掉帧,这类性能问题在测点数量很多的项目里尤其普遍。经验法则是:单个趋势控件中,曲线数量尽量控制在8条以内,超过10条建议拆分显示;历史查询的最大时间跨度建议限制在7天以内,避免一次性加载数十万级数据点。

如果真的需要展示很多曲线,可以考虑用多个趋势控件分页显示,或者对归档数据启动“最小/最大抽稀”模式,画出来的曲线虽然在某些时间点看起来“方”,但整体趋势不会失真。对于数据量实在很大的场景,还可以在WinCC归档设置中启用“归档压缩”,把长时间段的历史数据压缩为分钟级平均值,查询时加载的数据量会大幅下降。


5. 扩展思考与实用技巧

5.1 操作员交互细节:一键切换、图例与阈值线

“实时/历史切换”做成一个按钮最简单,但操作员实际使用时往往还有一些衍生需求。我在最近一个项目里给画面加了三个小功能,操作员反馈很好:

  • 切换按钮高亮提示:按钮处于“历史”模式时,按钮背景变成黄色,避免操作员误以为还在看实时数据。
  • 阈值线显示:在趋势控件中为关键测点设置高限和低限阈值线,超出阈值红色闪烁,这样历史回看时一眼就能看到事故发生的时间段。
  • 图例自动排序:多曲线显示时,图例按照数值大小自动排序,操作员不用费力去看曲线颜色对照表。

这些功能都可以通过工业库自带的控件属性实现,不需要额外写复杂脚本,但需要在组态时预留属性接口。

5.2 在KingsCada等其他SCADA里能参考吗

现在不少项目在做国产化改造,会用到KingSCADA等国产组态软件。很多工程师问我,这个趋势切换的实现在KingSCADA里怎么做。实际上思路完全一样:KingSCADA里也有类似的“实时趋势控件”和“历史趋势控件”,它们的核心属性也是在线刷新模式与历史查询模式,只是控件命名和脚本语法有差异。标题热词里提到的“kingscada趋势图控件名称”,一般指的是控件库中叫“趋势曲线控件”或“历史趋势分析控件”的那一类,具体名称会随版本变化,大家在组态环境里查看控件列表时,认准带“Trend”和“His”字样的选项基本没错。

核心逻辑不变:一个画面、实时/历史两种模式、切换时设置时间轴并加载归档数据。掌握了PCS7这套思路,迁移到其他SCADA只是换个控件名和脚本语法的问题。

5.3 我踩过的坑:归档存储周期改错导致的“数据黑洞”

最后分享一个压力挺大的排查案例。有次项目已经投运三个月,操作员突然说某个测点的历史趋势缺失了一大段,但实时显示正常。我查遍数据库,发现缺失时间段里确实没有这条变量的归档记录。后来定位到问题根源:当初组态时误将归档周期和采集周期设成了同一个值,后来为了降低通信负载,在CFC里修改了采集周期,结果无意中把归档周期也连带改了,导致一段时间内变量没有按预期存入数据库。

从那以后,我在每个项目里都有个习惯:归档配置做完后,多建一个“归档自检”画面,里面放几个关键测点的趋势控件,专门拉最近24小时的数据看曲线完整性。这个画面不投运,只是工程师自己用来验收数据质量,非常管用。


这个功能做到后面,其实不复杂,核心就是理解在线数据与归档数据的数据链路,以及趋势控件的Online/Offline切换机制。很多刚开始接触PCS7的工程师容易被SCADA软件里纷繁的属性吓住,但只要先理清数据从PLC到变量、从变量到归档、从归档到趋势控件这条主线,再顺着“切换模式、设置时间、重载数据”这三步去写脚本,基本就不会跑偏。如果能找一个现场的真实测点先练一遍,从实时看到历史、再从历史切回实时,整个过程跑顺了,后面再做类似功能就非常快了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询