博途hmi历史趋势值怎么改
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了博途hmi历史趋势值怎么改相关的知识,希望对你有一定的参考价值。
参考技术A 博途上载hmi程序_关于博途精智屏的变量记录的设置和趋势图的使用 原创2021-01-15 18:16:09
布洛分制造局
码龄4年
关注
第三讲 精智屏的变量记录相关内容
在运行系统中,将变量值存储在日志中。 可在以后分析记录的数据。 可为记录变量定义下列条件:
(1)用于记录所连接变量的值的日志变量。
(2)存储变量的数据日志。
(3)存储变量的周期或事件。
(4)存储变量的值范围。
一、数据记录包括下列几个步骤:
1、创建和组态数据日志
创建数据日志时,定义下列设置:
(1)常规设置,如名称、大小和存储位置
(2)运行系统启动特性
(3)日志已满时的行为
2、组态变量记录
对于每个日志变量,指定用于记录所连接变量的值和其它信息(如记录时间)的数据日志。
还将定义记录日志变量值的时间和频率。 有下列选项:
(1)“要求时”:
通过调用“LogTag”系统函数记录变量值。
(2)“改变时”:
HMI 设备检测到变量值变化时,即对变量值进行记录。
(3)“周期性”:
定期记录变量值。 在默认周期的基础上,可以 在 WinCC 中 使用自己的周期对其补充。最小值可设为 1 秒。所有其它值是此值的整数倍。
还可以将记录值限制在公差范围内或公差范围外。 这样,便限制了记录相应值范围内的值。
如果要根据请求记录变量,请注意以下几点:
(1)不要将此类型变量记录在分段的循环日志中,此日志会在连续循环或响应变化时记录变量。
(2)背景:
例如,如果根据请求进行的记录很少,循环日志值则会填充日志段,并创建下一个日志段。 如果那时尝试访问根据请求记录的变量,则不可能显示该变量,因为它是运行系统中可进行访问的当前日志段。 为消除此问题,应为极少记录的变量创建单独的数据日志。
进一步处理记录的变量值
可以直接在项目中(如在趋势视图中)或在其它用户程序中(如 Excel)分析记录的变量值。
二、通过演示操作来看看如何进行变量记录
前面文章中跟大家讲了如何组态一个项目,如何连接外部变量,如何仿真,这里不再过多啰嗦了,有兴趣的可以参看链接中的文章。
链接:手把手跟你分享博途HMI精智屏组态,适合初学者
链接:博途精智屏如何通过设备向导完成画面基本设置
1、周期性记录
在画面中插入输入输出域,并设置变量(这里我也是用上一个例子中的变量)
7faaeec8da6e478ce6ec66e06249d533.png
2、打开历史数据并创建变量记录
c2aed849ddd58b409ef58f283cec2794.png
3、打开仿真,查看执行情况
这里在PLC侧为了方便演示,我做了一个小程序,将变量HMI_word的每隔1s加1。
程序如下:
64fabedbea88a3ed7cd2787d5e3d8aca.png
打开画面仿真器的结果如下:
af2e860e5e020242f3ee9664a8ddb6bf.png
然后可以在EXCEL中查看记录,在上面的变量记录中的存储位置
Storage Card SDLogs
所以到C盘的Storage Card SDLogs中查看。
b42ee573d312edb55ecf332831daa233.png
记录如下:
1f53ce546ed2cd22946ee326673fb854.png
2、变化时记录
需要在历史数据中变量记录中将采集模式由循环修改为变化时。
707afac832dc7cf19b0f5892ad079e87.png
仿真结果:
7bba1f2da7497edf61c92464434945bb.png
3、必要时记录
在我们编辑的画面上通过变量HMI_bit改变是来记录变量HMI_word的值
首先也是在记录变量中将变化时修改为必要时。
344a853b09c84c98e18e74b106677084.png
在变量表中选择HMI_bit变量选择属性
4b6fc379046b27d27a6ec8ac09c0fc29.png
在事件页签中添加函数中选择历史数据中的日志变量。
363f1e211ee23f58debf81e9a6948dea.png
这样就设置完成,开始仿真
6d5667916831a6b57f4c32c51dd885db.png
5444ffd90a39eec056cf8c289e0ef385.png
4、趋势视图显示变量记录
在画面中将趋势 视图拖拽到画面中
4f96744642e553155f9fd423b2c282da.png
在属性中选择趋势,新建一个趋势,将趋势类型选择为数据记录
757735331e9908fe6cd4d19c8fefe962.png
在源设置中将数据记录选择为我们命名的“演示word记录”,过程值选择HMI_word变量。
4bb635144f9e86aac70c8d1b2fcefe8c.png
保存项目,编译并开始仿真
bzoj4241 历史研究
http://www.lydsy.com/JudgeOnline/problem.php?id=4241 (题目链接)
看到题目就联想到了【bzoj2809】 Apio2012—dispatching。想了想权值分块+莫队,发现不好维护块内最值,又看了看80s的时间,于是怒水一发线段树+莫队,结果先WA后TLE,不断TLE,无论怎么改常数都不行,难道nlogn*sqrt(n)就是过不了吗!!不爽,蒯个题解,再见!
题意:求区间加权众数。
solution
貌似是分块,离散化之后,用mx[i][j]表示第i块到第j块的答案,cnt[i][j]表示前i块数字j的个数。
代码:
// bzoj4241 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #define LL long long #define inf 2147483640 #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std; inline LL getint() { int f,x=0;char ch=getchar(); while (ch<=‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1;else f=1;ch=getchar();} while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘;ch=getchar();} return x*f; } const int maxn=100010; struct data {int w,id;}a[maxn]; int b[maxn],pos[maxn],L[400],R[400],cnt[400][maxn],num[maxn],st[maxn]; LL mx[400][400],ans; int n,m,block,tot,top; bool cmp(data a,data b) { return a.w<b.w; } LL cal(int l,int r) { LL ans=0; top=0; for (int i=l;i<=r;i++) { if (!num[b[i]]) st[++top]=b[i]; num[b[i]]++; ans=max(ans,(LL)num[b[i]]*a[b[i]].w); } while (top) num[st[top--]]=0; return ans; } void build() { block=sqrt(n);tot=(n-1)/block+1; for (int i=1;i<=n;i++) { pos[i]=(i-1)/block+1; if (!L[pos[i]]) L[pos[i]]=i; R[pos[i]]=i; } for (int i=1;i<=n;i++) cnt[pos[i]][b[i]]++; for (int i=2;i<=tot;i++) for (int j=1;j<=n;j++) cnt[i][j]+=cnt[i-1][j]; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i].w),a[i].id=i; sort(a+1,a+1+n,cmp); b[a[1].id]=1; for (int i=2;i<=n;i++) { if (a[i].w==a[i-1].w) b[a[i].id]=b[a[i-1].id]; else b[a[i].id]=i; } build(); for (int i=1;i<=tot;i++) { LL ans=0; memset(num,0,sizeof(num)); for (int j=L[i];j<=n;j++) { num[b[j]]++; ans=max(ans,(LL)num[b[j]]*a[b[j]].w); if (j==R[pos[j]]) mx[i][pos[j]]=ans; } } memset(num,0,sizeof(num)); for (int i=1;i<=m;i++) { int l,r; scanf("%d%d",&l,&r); ans=0; if (pos[l]==pos[r]) printf("%lld\n",cal(l,r)); else { ans=mx[pos[l]+1][pos[r]-1]; top=0; for (int i=l;i<=R[pos[l]];i++) if (!num[b[i]]) st[++top]=b[i],num[b[i]]=cnt[pos[r]-1][b[i]]-cnt[pos[l]][b[i]]; for (int i=L[pos[r]];i<=r;i++) if (!num[b[i]]) st[++top]=b[i],num[b[i]]=cnt[pos[r]-1][b[i]]-cnt[pos[l]][b[i]]; for (int i=l;i<=R[pos[l]];i++) num[b[i]]++; for (int i=L[pos[r]];i<=r;i++) num[b[i]]++; while (top) { ans=max(ans,(LL)a[st[top]].w*num[st[top]]); num[st[top--]]=0; } printf("%lld\n",ans); } } return 0; }
以上是关于博途hmi历史趋势值怎么改的主要内容,如果未能解决你的问题,请参考以下文章