慢慢去习惯使用块的优化访问方式 离S7-1500 在中国正式发布,已经快3年时间 了,这款新控制器除了包含多种创新技术之外,还设定了新标准,最大程度提高生产效率。 块的“优化访问方式”是这款控制器的 一个创新之处
当我们新建一个OB,DB,FB,FC时有个块的属性叫“优化访问”这个属性默认是使用的;S7-1200/1500 具有优化的存储空间,在优化的块里面,变量的地址由CPU自己管理,这样使变量之间的地址间隙最小化。但是使用优化块的访问方式,比如DB,大家会发现变量的偏移地址消失了,没有偏移地址也就意味着,间接寻址不在适用了。 为什么西门子,要如此颠覆大家的使用习惯了?下面,就引用官方说法吧。优化块具有以下优点 1:最快的存取速度,个人理解就是标准块,就像用了很久的电脑硬盘一样,碎片化了;而优化块就像是经过磁盘整理程序整理过的电脑磁盘。 2:变量可以单独设置 是否是“保持Retain” 3:数据块预留一定的空间,这样重新下载数据块时,数据实际值,不会丢失。 4:变量声明的改变不会导致访问出错,比如,HMI访问PLC变量时全是符号访问,不涉及到地址。 5:背景数据块无需任何设定,所有的设定都是在相关的FB里设定(比如 数据是否保持) 那么,标准访问方式和优化访问方式下,数据块的存储空间有什么不同了,请看下图。
慢慢去习惯使用块的优化访问方式
优化块的访问方式下,数据块里的地址分配是什么样子的了?
慢慢去习惯使用块的优化访问方式
1:通过将占用地址空间多的变量放在前面,占用存储空间少的变量放在后面这样的存储方式来尽可能减少数据间隙; 2:具有保持属性的变量单独存放在一个区域; 3:布尔类型数据单独占用一个字节的空间,从而加快的访问速度; 由于S7-1500处理器架构的改变,S7-1500采用little-endian方法来存取数据。S7-300/400采用big-endian方法来存取数据,所以为了兼容S7-300/400,在标准访问方式下数据处理采用big-endian方法。
1:标准块中,CPU需要2*16 位的方式来去读一个4字节的数据,所以需要调换字节顺序。优化块中是以32位的方式来存取一个4字节的数据。 2:优化块,每个位单独占据一个字节的内存,这样来加快存取速度。 3:优化块可以到达16M的大小 所以,西门子给出了以下建议 如果不需要使用间接寻址的情况下,仅使用优化块的访问方式;而且在S7-1500平台下,可以使用符号变量来实现间接寻址,比如(array [“index”]),以前在S7-300+STEP7 V5.x平台下只有SCL语言才能使用的语句,在STEP7 PORTAL 中LAD,STL等都可以这样来使用了。 避免,在标准块和优化块中拷贝和传递数据,因为存储数据方法的不同,系统会自动调整访问方式,但是需要占用更多的CPU资源。 在 标准块中,变量的“保持”属性不可单独设定,只能应用于整个数据块,而优化块可以单独设定变量的“保持”属性。 标准块和优化块的访问类型
让不少同行不习惯使用 优化块访问方式的是优化块不能使用“间接寻址”,在STEP7时代,使用STL的间接寻址功能,大家可以很方便灵活地编写出各种程序。 但是,不使用间接寻址就不能写出好程序了吗?当然不是,我最早接触指针的是在大学里的C语言中,但是目前的,随.NET 平台一起出现的C#语言不是一样不推荐使用指针了嘛(只能在非安全代码里使用指针,就像S7-1500可以在标准块里使用指针一样),但是C#依然可以做出好的程序。而VB.NET干脆没有指针的概念。 在CPU/CM接口间通信也可以使用优化数据块的数据,这一点,我当初也是怀疑,但是在一遍文档中找到了证据(其实还是有些怀疑在S7-1500和S7-300之间通信,在S7-1500测使用优化块的访问,会不会有些问题,有时间为会实践一下)
除了DB,FB,FC,OB也可以使用优化块的访问方式。 在优化OB中,临时变量将被缩减,比如OB1,以前有很我们经常用到的三个临时变量 OB1_PREV_CYCLE 上一次扫描时间
OB1_MIN_CYCLE 最小扫描时间
OB1_MAX_CYCLE 最大扫描时间 在优化访问方式下,被缩减了,但是仍然有其它方法读取CPU扫描时间。 1:采用调用RUNTIME ,在OB1开始和结束处调用该指令,2者的结果相减即可,该指令还可以用于 测量任何 语句和程序块执行所用的时间。 2:调用RT_INFO函数通过模式1、2、3可以读出CPU的上次扫描、最小、最大扫描时间 使用块的优化访问方式,体现了标签化,符号化的编程风格(就像一些语言,我们不关心变量存放在计算机内存的什么地方)。在TIA PORTAL中,FB,OB,FC的编号也支持CPU由自己管理了。在新建FC,FB等程序块时,会出现一个关于程序块编号的选项,自动还是手动,自动时,程序只需要新建程序块,定义程序块名称即可,至于是FB109还是FB1099程序员不要关心,当然程序员还可以按照以前的习惯手动个程序块一个编号。
在TIA PORTAL中程序块下面可以自己新建文件夹,这样把相关的程序块和数据块进行分类分组,而不像STEP7 V5.x下所有程序块数据块全在Blocks一个文件夹下,这样程序结构看的更清晰。
块的优化访问,程序块编号由CPU自己管理,UDT的编号也由CPU来管理,体现了标签化的编程方式(个人理解),以前一些由程序员来做的工作,现在全部托管给CPU也在一定程度上让编程变的更简单,适应了当今潮流。
本人由于工作需要学习了一段时间的GE PACSystem的PLC编程,相对以前GE-Fanuc的90-30,90-70系列PLC,PAC平台下,它们的编程风格也是完全标签化(除了一些过程映像区和R区等),程序块也是仅靠名称,干脆没有所谓的编号。标签变量也是没有偏移地址的,一些间接寻址也仅靠array [“index”]的方式来处理,但是同样可以编写出和西门子一样的程序(实际上自己就是按照西门子程序进行转换的)。 所以,对于S7-1500和TIA PORTAL一些创新的地方,我们应该勇于接受,抛弃旧思维,来对待新事物!
--------好文!
不过,这的确还需要个转变的过程,原因是多方面的: - 程序员的习惯性问题,如楼主所说
- 新老系统的兼容问题,尤其是相当长时间内会有新老系统共存的问题,之间也会有数据的交互
- 技术还会再发展
我们生在这一个新老交替的时代,注定会有适应和不适应的过程,我觉得不用着急,时间会带来转变,可能10年后的新生代程序员就根本不需要了解这些了。 -----软件这样的转变,很大程度上是CPU换成ARM处理器的原因吧。 这种处理器多了几级缓存,支持更多内存,更快的处理速度,支持标准的C++编译库,所以编程软件直接转向C++类的编程方式。
这种方式的编程有好处也有坏处。好处是写程序门槛低了很多,然后更多的程序员推荐用西门子的PLC。坏处是写程序再也不能随意发挥了,程序再也不像那样单线程方式了要考虑多线程(自由通讯、中断、主程序)同步的问题了、各模块之间交换数据不好搞了、程序容量越来越大了、看不见的内存消耗越来越多了………
反正我的感觉就是“降低门槛限制自由发挥”。
还有楼主说的C#很好?其实不然!很多人说C#好,是因为微软的推广以及符合那些软件大公司经理的思维方式做纯粹的应用层软件,他们不在乎用户内存、硬盘、CPU是否撑得起、也不在乎程序猿的不能理解(程序框架门槛低了到限制了自由发挥),所以不是有程序猿打死项目经理的事件么?还有就是C#都的.net框架以及加入了VB的窗口程序框架以及更多的第三方平台支持……但是作为一个程序猿或者用户,你会发现这种框架下的程序太吃内存了内存老是不够用(看看安卓、看看友邦图就知道C++其实是在拉动硬件消费的啊)!
再来说说VB.NET,这个语言很多人都当做是程序猿的入门以及那些不负责任的学校考试用而已么?如果是真的好会被大公司唾弃?难道人家大公司的想法会比我们还不如?
最后来说个不好听的,如果你选全套的西门子产品,那么代价不低,用户还会骂WinCC界面怎么那么难看操作反映怎么这么慢!!!此时我们只能搬出西门子忽悠的那一套控制器多变量多操作反应慢,为了稳定界面不能漂亮,为了系统稳定运行不能装第三方软件……随之用户直接搬隔壁国内自主的一套差不多的项目来跟WinCC对此操作起来如此的丝质顺滑界面如此的HTML5,我的老脸都红透脸皮都当棉被盖了!!
-------存在即合理!还有现在内存,不是很值钱了,C#,VB.NET 占点内存也无所谓,因为我们是做应用程序的。至于你说的VB被大公司抛弃了?据我了解RA,SIEMENS至今他们的一些软件仍然支持VBS,VBA。C++是好,但是入门起点高,不是每个人都能用的好的:) 还有,楼上所说的,WINCC界面难看问题,纯粹是你个人问题,你可以不用WINCC自带的图形库,自己做啊,做一个你自己的项目库出来,或者,你可以用一些矢量画图软件Inkscape,来做过程画面,画面的动画等用高级语言来控制啊,这样WINCC 的钱都省下了:)如果说性能那还可能和WinCC或者项目太大有关系。
---------看到很多1500使用间址寻址的问题,用300/400的概念来写1500的程序,该转换思路了。
符号化的访问、数据类型及数组的运行时寻址,是非常好的变化。 显然1500给程序员的发挥空间小了。如zaxife所述,“降低门槛限制自由发挥“深有体会,感觉自己对CPU及其资源的掌控力大幅度下降。想想看:STL语言都是”仿真“出来的,也不会大量使用了,那纯粹吃力不讨好。 现在系统的核心资源,实质上未对程序员开放。
--------现在一直用SIMOTION,一直还没有用过1500,没想到发生了这么大的改变,感觉之前做300400PLC项目时用STL时自由性很大,性能也很好,后来用SCL发现编译后的STL有时太啰嗦,明显降低了效率。不过还是愿意用SCL,因为更安全些,现在各个编译器都开始进行功能封装了,不让你访问低层内存地址,就像C#只有引用没有指针,这样让语言更加简单,安全!也许以后除了C/C++其它语言都会像这个方向发展了。
很好的文章,
------编程的方便固然是好事,但是在我们工控行业,首先要满足的是稳定性,如果先开发一个功能块,然后我们在这个功能块再开发一个功能,在此功能块再开发功能块,这样就会容易导致系统的不稳定或强制打越来越多的补丁。我听别人说过,win7的10几G的大小,实际上有效使用的能有10%就算不错了,其他都是资源的浪费。
------真的惭愧一直用被你唾弃,以前用VB现在用VB.NET。我觉得VB用的蛮顺手啊,特别是开发一些小程序效率高速度快。找一些好的工控控件,画面也蛮赞!我觉得不管什么语言都是一直工具,如果真的是没用的工具。自然被淘汰了,市场是会考验这些产品的。
另外现在硬件发展这么快,我觉得加入一些方便的高级编程方法也是对的前提是保证同样的稳定性。
------软硬plc都用过一点,一知半解。
感觉软plc编程效率高,可以专注于算法而不必纠结于指针和各种特殊寄存器什么的。符号编程使软硬件资源脱离得更开一些。当然有时候还是要访问到绝对地址,可以用adr sizeof之类的获取,反正编程者不用关心这个
|