技术论坛

 100个浮点数数据Real求和的SCL编程

返回主题列表
作者 主题
WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
楼主    2022-11-10 17:18:56
主题:100个浮点数数据Real求和的SCL编程

100个浮点数数据Real求和的SCL编程

  曾经在STEP7软件STL编程环境下,指针偏移运算已经着迷了的我,目前也慢慢开始着迷于运算能力更强大的SCL编程环境下写一些简单的运算程序。

以下是求100个浮点数的和基本过程,希望能够给初学一些提示。实际上浮点数、整数、字节之间的计算,也仅仅只是数据类型的差异,也就是我们热门的几位数数据,如,字节是8位,字word是16位。

100个浮点数求和步骤:

1)  创建一个新项目,名称100个浮点数求和。选择合适的机型,如s7-1214C,创建求和的子程序FC1,图示:

事先按基本思路定义好FC的接口,也可以边写程序边创建,这个我感觉没有什么好与坏。创建一个浮点数数组,Array[0..99];创建一个存放FOR循环需要的存储器,名称取“i”,数据类型INT,完全可以存放数据0 ~ 99这个数据了。,当然此处定义数据类型Byte丝毫没有问题的。

2)  在SCL编辑区,编辑求和程序,图示:

程序语句非常简单,首先是给浮点数和存储器清0,目的是想从新开始计算。利用FOR循环指令做自编号0开始到99的循环,这个主要目的是为了创建浮点数数字能够带一个类似的指针偏移,Static创建的变量“i”存放循环次数的记录。假设FOR循环刚刚开始的第0次,

那么,#sum := #sum + #arrayReal[#i]的结果是:#sum := 0 + array[0],假设array[0] =1.0,则,第一次循环结束后#sum := 1.0。当进入第二次循环时,假设array[1] =2.0,那么,循环结束后#sum := 1.0 + 2.0 := 3.0、、、、、、这样重复累加100次,把浮点数数组array[0..99]的数据全部累加一遍,完成求和的过程。

3)  当IF  #i = 100 THEN条件满足时,启动EXIT指令退出FOR循环,整个过程假设这么简单精炼,在OB1中调用FC1,将程序下载到cpu,看运算结果,图示:

下载cpu验证结果符号要求,此。


WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
1楼    2022-11-10 17:27:49
主题:回复:100个浮点数数据Real求和的SCL编程

实际上,100个数据和1000个数据,在此没有什么大的变化,仅仅只是一些定义而已,有10000个数据更好,程序架构还是同样的那个,只是需要考虑数据存储的溢出问题了。

反过来,深化这个程序,如求平均值,也只是再增加一步除100的过程而已,scl运算功能确实够强大。

RENHQ
至圣

经验值: 68887
发帖数: 12218
精华帖: 59
2楼    2022-11-10 18:13:20
主题:回复:100个浮点数数据Real求和的SCL编程

可以~适合初学者学习

不过循环里面的那个if判断没必要的~

Q群:https://jq.qq.com/?k=9BDuEgf6
0615317263
至圣

经验值: 19210
发帖数: 4208
精华帖: 2
3楼    2022-11-10 19:03:38
主题:回复:100个浮点数数据Real求和的SCL编程

有了scl语句,编程工作量降低了不少。

WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
4楼    2022-11-11 07:36:30
主题:回复:100个浮点数数据Real求和的SCL编程

我肤浅的认为,需要添加exit指令,用if作为判断条件。

如果不添加exit指令,这个循环是始终进行的。

WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
5楼    2022-11-11 07:37:57
主题:回复:100个浮点数数据Real求和的SCL编程

是的,特别是对数据的处理。

几句话可以搞定。

WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
6楼    2022-11-11 09:27:31
主题:回复:100个浮点数数据Real求和的SCL编程

实际上,上面的求和程序语法没有问题,而实际应用且存在一个数据溢出的问题。

一个real能够存放100个real的和?显然是不够的。需要Lreal(s7-1200、s7-1500)已经支持这个数据类型了。

当然,我不需要100个real的和,这样考虑是可以的,总之,数据累加应该考虑数据的溢出问题。

WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
7楼    2022-11-11 09:53:37
主题:回复:100个浮点数数据Real求和的SCL编程

知道原因了,哈哈。

  我之前测试scl程序一直是在仿真环境下进行的,今天特意下载了求和的程序,用if+exit和删除if+exit的结果在程序的扫描周期中没有明显的反应,如果在仿真环境中,是有非常明显的区别。

  但是,写与不写这步,是否有作用,我认为还是写为好,至少,我是想到循环不允许始终进行,会影响到整体程序的周期时间。



Ready_OK
至圣

经验值: 15530
发帖数: 1735
精华帖: 0
8楼    2022-11-11 10:53:49
主题:回复:100个浮点数数据Real求和的SCL编程


不错,感谢楼主尽心分享!

海纳百川,厚德务实!
莘莘学子
至圣

经验值: 18702
发帖数: 3807
精华帖: 1
9楼    2022-11-11 11:26:08
主题:回复:100个浮点数数据Real求和的SCL编程

我会写SCL,但是我还是喜欢用梯形图

弘扬中华传统美德,无私奉献为根本,助人为乐为根源。
WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
10楼    2022-11-11 11:33:43
主题:回复:100个浮点数数据Real求和的SCL编程

个人观点,逻辑控制我还是习惯于LAD方式,毕竟应用时间长,而且,还是那种图示化的逻辑直观,容易理解,上手也快。

数据处理,scl确实有独到的优势。

黑猫警长W
至圣

经验值: 18377
发帖数: 2409
精华帖: 1
11楼    2022-11-11 11:34:53
主题:回复:100个浮点数数据Real求和的SCL编程

是的,SCL特别适合复杂的数据计算

莘莘学子
至圣

经验值: 18702
发帖数: 3807
精华帖: 1
12楼    2022-11-11 11:38:28
主题:回复:100个浮点数数据Real求和的SCL编程

你这样很容易引起恐慌,我见到最多的就是一台设备一半用SCL,一半用LAD来写,我一看到这样的程序,我就想慰问他家人的。还没见到一台设备全部用SCL写的,多少带LAD模式,或许还没遇到真正的SCL高手。

弘扬中华传统美德,无私奉献为根本,助人为乐为根源。
WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
13楼    2022-11-11 11:41:45
主题:回复:100个浮点数数据Real求和的SCL编程

@莘莘学子:

   直接写exit;可以?

这个指令的含义的,当采集到exit后,循环直接结束了的,这个是病句!

我现在就挂着验证plc,也刚刚测试过,取消if那段指令,for循环无法循环的。

图示:



莘莘学子
至圣

经验值: 18702
发帖数: 3807
精华帖: 1
14楼    2022-11-11 11:46:07
主题:回复:100个浮点数数据Real求和的SCL编程

你验证是对的,我刚刚想了也是那么回事。

还是和单片机有点区别,哈哈。

弘扬中华传统美德,无私奉献为根本,助人为乐为根源。
WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
15楼    2022-11-11 11:47:33
主题:回复:100个浮点数数据Real求和的SCL编程

我再把if加上,for循环才可以正常,图示:


实际上,这样的应用场景,不需要调用exit指令的,也说明我在此功夫还没有深刻。

写这个是我之前一直是在仿真环境下,测试验证scl指令的。

上述测试是实体机上进行,与仿真确实是有一些区别。


莘莘学子
至圣

经验值: 18702
发帖数: 3807
精华帖: 1
16楼    2022-11-11 11:51:21
主题:回复:100个浮点数数据Real求和的SCL编程

有现成的硬件不用,还仿真啥呢?

弘扬中华传统美德,无私奉献为根本,助人为乐为根源。
WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
17楼    2022-11-11 11:54:13
主题:回复:100个浮点数数据Real求和的SCL编程

这个exit指令我在7楼已经做了解释。我测试的程序没有其它内容,就是一些测试程序,相对比较简单,加与不加,没有多大的区别。


xiatianyun
侠圣

经验值: 4856
发帖数: 735
精华帖: 10
19楼    2022-11-11 12:43:05
主题:回复:100个浮点数数据Real求和的SCL编程

没搞懂,我是不是被什么事情耽误了。

循环里面的i有机会得到100吗?

WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
20楼    2022-11-11 13:12:17
主题:回复:100个浮点数数据Real求和的SCL编程

,你的理解是对的,此处确实有问题。

我最初的本意是当全部循环100次结束后,调用exit,退出循环。

而实际上,循环指令本身就具备了这个功能。我在7楼已经有解释了,属于多此一举的程序段。

事不辩不明,通过与各位大侠的讨论,这些点点滴滴,都将提升大家对指令的认识,包含我开始说的求和数据溢出问题。

WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
21楼    2022-11-12 10:19:20
主题:回复:100个浮点数数据Real求和的SCL编程

100个real到底需要多少大的存储区?

以real最大值+3.402823e+38 计算,结果:+3.402823e+40.

而一个Lreal的最大数据长度是:+1.7976931348623158e+308,显然完全可以存放。

修改后的程序:




手机用户20180604694547
侠圣

经验值: 3788
发帖数: 729
精华帖: 3
24楼    2022-11-12 12:25:19
主题:回复:100个浮点数数据Real求和的SCL编程
注意一下,1200是不支持LREAL类型的,只有1500支持。
不过处理超过最大范围的方案也有很多,只要处理的好不会出什么问题的。
WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
25楼    2022-11-12 14:05:45
主题:回复:100个浮点数数据Real求和的SCL编程

@手机用户20180604694547:

感谢,自己尝试着写了,可以的。

1)s7-1200支持LReal数据;

2)我用array[*] of real数组组态可以的,图示:



WWCWWC
至圣

经验值: 71712
发帖数: 8024
精华帖: 145
27楼    2022-11-12 14:28:38
主题:回复:100个浮点数数据Real求和的SCL编程

我把我遇到的过程描述一下,程序编写没有问题,但是,下载后出现这个,图示:

很显然,我调用的数据超了范围,需要OB调用,找来找去,无法找到我想要的OB121/OB122这样的,汗、今天气温有一点高,我们这里居然到30摄氏度以上,中午和同事喝了一点酒,感觉想开空调了。

老手遇到新问题了,因为这个问题曾经在step7环境中出现,自己在portal环境一直注意着的,先定义,后调用的原则。

再仔细一看,哈哈哈,这个调用,不报警才怪呢,图示:

问题找到,修改后,再下载正常,图示:



Zane
至圣

经验值: 76200
发帖数: 19331
精华帖: 377
28楼    2022-11-13 18:41:37
主题:回复:100个浮点数数据Real求和的SCL编程

数组长度就是100个,但数组定义是0~99,但如果数组定义是1~100呢?为什么同一件事会有两个结果呢?


编程的细节与变量的命名还是要注意的。


如果就是整个数组求和,可以在块内通过指令得出数组的下限值与上限值,FOR循环即可,可以不输入数组长度

Zane 注册自动化系统工程师 Always save before download
手机用户20180604694547
侠圣

经验值: 3788
发帖数: 729
精华帖: 3
30楼    2022-11-14 09:34:57
主题:回复:100个浮点数数据Real求和的SCL编程


这样写即可,你首先要获取不定数组的上下限,然后再用上下限循环。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。