以下是引用82252031在2018/3/18 12:44:59的发言:
我的思路(不知道是否合理):
1、通过模拟量或脉冲量的方式算出实时有功功率
2、每1分钟读取实时有功功率,并按先入先出移位的方式存入15个固定的数据区
3、求这15个固定数据区的平均值,即为当前这一分钟的有功需量,并另存
4、最新每分钟的有功需量与上次的数值比较,不大于上次值则保留上次值,作为最大需量
5、如大于上次值,则取而代之成为当前新的最大需量值
6、每月底,把当月最大需量值另存并固化,用于虚拟电费结算。
现在用西门子S7-200编程卡在第2步,未找到合适的指令,请问有没有其他思路或编程方法实现此目的?
这个用200实现起来有些难度,关键是200所提供的指令比较低端。
不过也不是不能实现。
开辟一块V区作为数据队列使用,可以设置开头几个单元的功能如下:
数据总量(运行一段时间后固定自然固定为15)、当前指针或队列数组索引值。
单元大小根据自己的需求来设计,比如实数4byte。
接下来的单元存放实时数据,可以设计为0号...14号,0号为队列头部,14号为尾部。
数据进入队列时存放在当前索引指定的单元(可能需要用到指针),当前索引初始化为0,还需要一个队列头指针和当前指针,分别存放0号单元指针和(头指针+当前索引)所指向的当前数据地址。
这样FIFO问题转换为指针操作:入队->修改索引->求数据平均值->比较。
出对入队操作:
0到当前索引之内的单元数据集体向0头部移动一个单元实现把0号单元出对(需要从头部开始移动覆盖),然后实时数据写入当前单元。当前索引+1,如果当前索引大于等于14则不再进行+1.
一段时间后当前单元索引固定为14,就是最后一个单元了。
这种操作如果使用1200或300就简单得多直接使用SCL实现。
不知道对你有没有帮助。