技术论坛

 【万泉河】FB内的static静态变量是全局变量吗?

返回主题列表
作者 主题
万泉河
至圣

经验值:28579
发帖数:10817
精华帖:131
楼主    2018-10-19 20:46:19
主题:【万泉河】FB内的static静态变量是全局变量吗? 精华帖  精编帖 

昨天跟zane版主通了一个电话。

   

起因是我写了一篇文章【万泉河】PLC系统变量的作用域和生存期.pdf,想咨询下他对我文章的看法。 

   

一聊,还真有。 除却复杂章节的不算, 一个最底层的认知分歧是FB函数里面的static静态变量,算不算全局变量。

   

zane认为它是全局变量, 因为它和所有的全局数据块内的变量一样, 可以被外部访问,完全等同于全局变量。

   

而我认为不是。 因为在我看来,它只是能被跨周期记忆的内部变量,纵然能被外部访问, 也只是被允许而已。 西门子随时可以在未来发布的新版软件中, 宣布这些变量对外部访问隐藏, 不再运行被访问。

   

至少, 我倒是很希望未来的PORTAL软件增加一个功能, 就是我在设计FB块时,可以选择某个STATIC变量是否对外部访问可视。就像现在有功能可以设定是否被HMI访问一样。 那样, 我在调用某个FB的实例的参数的时候, 不必越过一大堆我根本不想访问的无用的内部变量。


   

类似这样的, 超长的, 鼠标总也拉不到底的选择框。


现在, 把问题抛给大家来选择:


这是十多年来,我和zane为数不多的观点不一致之处。 所以大家也不必担心哪一个完全对, 哪一个完全错。也不需要骑墙式两边都不得罪的既是又不是。 只需要仔细思考, 做出你倾向性的选择即可。 


思考比什么都重要。 



微信公众号:PLC标准化编程,ZHO6371995
yming
至圣

经验值:127286
发帖数:21992
精华帖:824
1楼    2018-10-19 21:26:02
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

Static是全局数据块。而且外部访问还挺有用。

比如,生产线的配方数组,只需要复制到那个FB中,In接口不变,就改变了生产线的参数、系数。如果调整了这些系数,也是复制回去即可。

如果相同的FB,不同的背景DB,还得修改程序才能增加一种配方。而这样只增加个DB而已。




学而时习之,不亦说乎?温故而知新,不亦乐乎?
HwLib(慧兰博)
侠士

经验值:1037
发帖数:61
精华帖:5
3楼    2018-10-19 21:49:16
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

从static的生命周期来看,把他理解为全局变量也无不可。


www.hwlib.com.cn 《TIA PORTAL顶级编程技术》
shine
至圣

经验值:19840
发帖数:8834
精华帖:39
5楼    2018-10-19 23:31:58
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?
配方不适合放在背景数据块中,而是放在全局数据块中,由程序块去调用其数据。
背景数据块是全局的,因为它允许全局访问。
目前,不能定义为私有变量。
如果哪一天,可以定义变量是否能全局访问了,那么,我会认为public的是全局的,private的不是。
但是,直接访问并不是一个好主意,而是应该通过块接口去访问。
'Razor
至圣

经验值:20115
发帖数:2773
精华帖:23
8楼    2018-10-20 10:52:56
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

看看官方口径是怎么说的吧,注意Function Blocks




Less is more……
lf184452
侠圣

经验值:2440
发帖数:467
精华帖:6
10楼    2018-10-20 11:24:44
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

当然是全局的了,静态变量是存在背景DB里的,变量只要是存在DB里,不管是背景DB还是共享DB都可以全局访问的。

yming
至圣

经验值:127286
发帖数:21992
精华帖:824
11楼    2018-10-20 13:23:03
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

嘿嘿。你说的没错,配方、参数是需要其他的单独DB保存;只是传输到背景DB中作为当前运行参数。

对于通过接口传输 和 直接访问背景DB,其实这两者是有差异的。

通过接口传输,好处是它是显性的,一看便知。但每次循环扫描都会执行。DB数据总是最新的。

而直接访问(包括 HMI )则缺点是隐性的。但程序可以在指定的状态下,背景DB与配方参数DB交换数据。

它所带来好处是:给用户带来了一个确认与Cancel的机会(保留维持原配方参数)。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
=^_^=
侠圣

经验值:4323
发帖数:127
精华帖:6
12楼    2018-10-20 19:41:15
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

 目前来看,共享DB和实例DB就读写来说,差别不是太大,基本一样。

但是,我们应该只把共享DB当作全局变量来使用,实例DB最好还是像C语言里面的静态变量一样,只在相应的FB中使用,这也是实例DB应该扮演的角色。

说不定以后实例DB也想c语言一样,不允许在外部读写了呢。

不提无意义的问题; 不做无意义的回答。
Zane
版主

经验值:76111
发帖数:19121
精华帖:378
14楼    2018-10-21 01:00:03
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

和万泉河通了电话后,我查了一下手册,STEP7和博图的,


S7的数据是这么定义的: 


1.全局数据 与 局部数据  两大类


2.全局数据为 M,全局DB,T,C


3.局部数据分为  局部静态数据   临时数据


(在定义方面,我认为两者没有太大的区别,博图的定义更加明确一些)


4.在STEP 7里直接了当地就告诉说局部静态数据可以被外部程序同全局DB一样访问,但风险自担


5.但在博图对静态数据的访问的描述就相当的暧昧了

    首先是鼓励用数据块及静态数据而不是用M/T,这和万侠的主张一致

    其次告知局部静态数据可以被外部程序同全局DB一样访问,但又不建议这么做,说有风险

    第三主张通过数据接口及多重背景实现数据的交换,但又怕造成多次数据交互造成的重复与浪费,不这么做那就是外部直接访问静态数据效率最高了


我还是比较同意shine的说法,简单点,就当全局变量用就是了。

    

   

Zane 注册自动化系统工程师 Always save before download
Willow_leaves_follow_the_wind
奇侠

经验值:6006
发帖数:959
精华帖:6
15楼    2018-10-21 07:46:02
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

我理解就是:M,全局DB,T,C。之外的都不是全局变量。satatic虽然全局能用也是中转的变量类型不固定,感觉还是与全局变量有区别。

李岩
至圣

经验值:13626
发帖数:2834
精华帖:32
16楼    2018-10-21 08:38:33
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

我的观点就是static类型和全局DB在使用上可能基本上一样,但人为的被分了类。这就是说,从概念上说,他们是不同的。所以,我支持老万,老万现在着魔一样的在追求标准化,我也很支持,虽然我人为要用标准化来一统天下可能性不大,但这种追求还是很好的,我也希望有一天能成功。如果按照标准化的思路,那么这个static类型,就必须不是全局变量了,因为它是在FB里面声明的。

其实,wincc直接访问static数据,有时感觉很方便,比如:PID那个FB41,直接访问可以不用在管脚上另外加变量了,还能省内存。完全可以当成全局变量来用。但我一般情况下,在程序里面(step7)里面,尽量避免直接使用static中的数据,会另外给管脚加变量,使用这个变量。起码,这样的程序好好读。

国人当自强 共同努力 抵制日货
宁超
至圣

经验值:11495
发帖数:1028
精华帖:39
17楼    2018-10-21 09:21:25
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

就是这么定义的标准规范,这话题跟问井盖要做成yuan的还是方的好一样。实质就是绝对地址,FB获得封装后甚至加密,static变量可能会被fb内部逻辑改写值变的好象不可控,用户主动去改写staic的值甚至会破坏fb原有的正常逻辑。

liucs_2009
奇侠

经验值:8355
发帖数:580
精华帖:5
18楼    2018-10-21 09:37:29
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

有道理!

我觉得如果只对static变量进行操作,而不进行操作,应该是没有风险的;

如果要进行写操作,还是单独拿出来做管脚比较好。

工控生活、精彩人生
yming
至圣

经验值:127286
发帖数:21992
精华帖:824
19楼    2018-10-21 11:32:02
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

不会吧。出问题还是程序写的有问题吧。

看看西门子自己提供的库程序,例如:MODBUS TCP,不也是封装、加密的?但把原来放在接口的参数,放到背景数据块里了么?还有许多设置,不也是要求去背景数据块里设置么?还有些西门子提供的FB功能库,参数不也是需要外部去背景数据块中读取么?

为什么从接口改到背景数据块中?就是每次调用不需要都传送。

所以,就像这些标准库一样,每次调用都有可能发生改变的,放在接口;仅在特定状态下才需要改变的,就放在背景数据块中。封装、加密后,不允许改变的的就是灰色的,允许外部设置、读取的就是白色。



学而时习之,不亦说乎?温故而知新,不亦乐乎?
宁超
至圣

经验值:11495
发帖数:1028
精华帖:39
20楼    2018-10-21 11:45:45
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

一个大的功能块,使用者,特别是首次使用的人很难辨别哪些参数是可以改的。我说的变的好象不可控是使用者的一个心理状态。接口是预留给用户使用的,static是开发者不希望被用户改动的东西,但是有的时候为功能块接口看上去什么的简洁,不得不把一些接口放到static

yming
至圣

经验值:127286
发帖数:21992
精华帖:824
21楼    2018-10-21 12:23:14
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

其实,我觉得问题不大。

对于所使用的Statics 写好注释就可以。使用者打开背景数据块,就能知道哪些不要动;哪些需要设置。

其他原设计HMI可访问性都是勾选好的。封装后,用户也改不了。


总觉得,每次调用个FB都要传送一堆不需要改变的参数,很麻烦、很没效率。

学而时习之,不亦说乎?温故而知新,不亦乐乎?
万泉河
至圣

经验值:28579
发帖数:10817
精华帖:131
22楼    2018-10-21 15:23:04
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?
微信公众号:PLC标准化编程,ZHO6371995
Zane
版主

经验值:76111
发帖数:19121
精华帖:378
23楼    2018-10-21 21:38:17
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

 @李岩 @宁超 @liucs_2009 @yming


与外部设备通讯的数据必须是全局数据,WINCC能访问静态变量,就说明静态S7的静态变量有全局属性,WINCC能访问临时变量吗?


你们觉得为了避免外部程序直接读写静态变量,应该把变量做在接口上,请问是输入还是输出?如果我的变量在FB内部有程序干预,同时也允许外部程序干预,风险自担嘛,那它应该是什么接口?输入_输出吗?如果是,那输入_输出接口上的变量就是全局变量,如果只在输入或输出接口,那根本就无法实现,你们可以试试。


有多少西门子提供的库程序的FB,除了需要填写FB的管脚(输入输出)之外,我们还要看手册,看一些内部变量的定义,我们需要在FB块之外去直接读写其中的内部变量,这些内部变量都是静态变量。如果一个FB功能块的变量都要体现在其输入输出管脚上,那是灾难性的。


西门子用计算机的术语定义了FB的局部静态变量,但是在实际编程的工程需求上我们对静态变量的读写存在着各种复杂的需求,又不得不赋予其全局变量的属性,我觉得这是明智的,这样才有我们目前灵活多变的编程方法。

Zane 注册自动化系统工程师 Always save before download
YiMoon
至圣

经验值:11064
发帖数:1222
精华帖:35
24楼    2018-10-22 00:14:04
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

 在SIEMENS培训课程A1482的资料中,有一面专门讲到了局部变量,FB中的静态变量应该是属于局部变量。如图所示:

 

Keep calm and carry on!!!
周杰伦
至圣

经验值:13748
发帖数:2032
精华帖:16
25楼    2018-10-22 08:01:33
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

全局变量,但是使用的时候要当作局部变量来使用。

不能在其他的程序里面对FB的静态变量进行写,但是可以读。

工控毁我青春!
我家牛
奇侠

经验值:9086
发帖数:2334
精华帖:30
26楼    2018-10-22 09:03:43
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

什么是黑?什么是白?人的定义一样,就如同时间,这个是人类发明定义的。

说他是全局变量,是因为他可以全局用,

说他是局部变量,是因为他是针对FB的背景DB。但是我们用FC+专有的DB(如同FM350-1高度计算块一样,指定一个DB)效果不是一样吗?。

学习ing!学习!
李岩
至圣

经验值:13626
发帖数:2834
精华帖:32
27楼    2018-10-22 09:23:14
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

这个问题,其实zane、老万说的都对。看了楼上诸位老师们的讨论,本胖突然想到发生在自己身上的一件事:

    有一条本胖开车,胖嫂坐在副驾驶位。前面的车流很拥堵,但右边一条车道前面没车,本胖一打方向,从右侧车道直接开到了前面的路口。胖嫂对本胖说:你走的是公交车道,等着扣分、罚款吧。我朝的摄像头真不是盖的,果然扣分罚款了。

    上面的小事说明了啥?说明这个“公交车道”也是道,就算不是公交车,也是能在上面走的。但本胖却被扣分罚款了,这说明这个公交车道在某些时间段还是不够安全的。

    引申一下,就算是没用扣分、罚款,那么就是安全的吗?为啥要设置公交车道呢?索引,本胖觉得FB背景数据块里面的static数据类型,跟公交车道一样,不是不能用,而是要尽量遵守规则。规则就是不能在本FB之外调用。但俺说的是尽量,wincc里面用一下,俺觉得可以算是擦边球。

国人当自强 共同努力 抵制日货
yming
至圣

经验值:127286
发帖数:21992
精华帖:824
28楼    2018-10-22 12:04:29
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

如果“静态变量 - 只能在FB中使用” 那就不能全局访问。反之,可以全局访问,那它就是全局变量。


1200/1500博图编程与 300/400 STEP7差异就是:它不用绝对地址。因此,在博图中,背景数据块中的静态变量,与其他全局DB没有性质上的差异。

学而时习之,不亦说乎?温故而知新,不亦乐乎?
yming
至圣

经验值:127286
发帖数:21992
精华帖:824
29楼    2018-10-22 12:45:00
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

曾经也试过用接口 inout 传送配方、参数。方法是 建立数组DB,固定其数组0 与 FB 交换数据。这时,每次调用,数组0的数据总是最新的。HMI 也与数组0打交道。需要的时候,保存到原来的数组 n 中。

尽管这样也行,但是要在外部做 确认与取消。数组的类型 有时还得做成UTD,反而觉得更麻烦。

后来发现,西门子提供的许多 FB功能块,只把常用的(每次调用都要使用的)做在接口上,不常用的、设置类型的,放在背景DB的静态变量中。再后来发现,西门子提供的封装功能块FB接口越来越简单,像原来放在接口上的IP地址呀,端口呀,PID的参数呀,都“收”到其背景DB的静态变量中了。


另外,像驱动的 Drive 功能块,常用的都是控制字、状态字,好多都是位操作。接口使用位Bool。当我使用8/8PZD时,这功能块接口成什么样了?对于那些简单应用来说(启动、停止、速度给定)使用它,还要带一波没用的参数,烦不烦呀。

(尽管可以使用默认参数)

所以这种功能块,还是仅将常用的做成位Bool,其他的也只是传送字。你还得外部将它们分解成位。

甚至有些功能块的诊断状态,还得从其背景数据块中取得。




学而时习之,不亦说乎?温故而知新,不亦乐乎?
莎利文
侠士

经验值:1779
发帖数:109
精华帖:4
32楼    2018-10-22 13:43:24
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

好热闹啊,我也来参加,活跃下气氛。有写错的地方请诸位指点一下,首先谢过。

 我认为应该属于全局变量,理由就一条,因为FB内的static静态变量的所有属性都符合全局变量的属性,

首先,变量可以在其他程序中读写。至少随时随地的被读取没有问题,(这也是静态变量的特点)。

其次,存储地址固定,正是固定的寻址方式,导致它与全局变量有相同的特质。

再次,本体程序运行结束后,存储地址依然没有被释放,导致外部读写有效。

然而,临时变量则不是这种存储布局,(它被编译器的分配空间是动态的)。比如运行完成后立刻释放所属权,使本体程序失效。

当然,西门子的工程师希望我们像使用局域变量一样使用它,是从它的使用方式上考虑的,并不是从它的属性与存储结构上定义的,所以,我认为大家产生了歧义也是情理之中。不知道我说的对吗?请您指点一下。

人情到时文章老,书读深处意气平。
liucs_2009
奇侠

经验值:8355
发帖数:580
精华帖:5
37楼    2018-10-22 17:06:00
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

Temp变量在执行完后,对应部分的内存是释放的,因此在下一个扫描周期的状态是不确定的;而Static的状态是确定的,可以在下个周期继续调用,因此Static不是局部临时变量,可不可以把背景DB理解成是专属于FB的全局DB,是全局DB的特殊应用情况?


工控生活、精彩人生
yming
至圣

经验值:127286
发帖数:21992
精华帖:824
38楼    2018-10-22 18:03:56
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

占用公交道的这个比喻不恰当。因为那是违法(违反规则);

这个外部访问背景数据块中的静态变量则不是。

只能说相当于是 机动车右转占用 非机动车道。虽然规则允许,但碰了人,责任在你。风险自担

学而时习之,不亦说乎?温故而知新,不亦乐乎?
yming
至圣

经验值:127286
发帖数:21992
精华帖:824
39楼    2018-10-22 18:36:17
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

关于这个“空”;其实也有些问题。

例如:当初西门子提供的驱动库。当出现掉站时,输出接口只显示故障,哪个站?没有输出引脚。

后来发现,信息就在背景DB中,真的需要时,访问它就是了。

假如做个输出引脚;你不连接变量,“空”在那里,照样看不见。


其实,对于这种小概率的访问需求,只要背景数据块中有注释(变量名称命名好了也行)。程序中不引用,在线查看一下,也能解决诊断问题。

如果完全私有,封装后完全看不见。那倒会造成麻烦。

我觉得背景块中的静态变量外部可访问,并不影响库程序的“标准化”。

学而时习之,不亦说乎?温故而知新,不亦乐乎?
YiMoon
至圣

经验值:11064
发帖数:1222
精华帖:35
40楼    2018-10-22 18:54:42
精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

在全部程序中有效:指的是下面的PII/PIQ。。。等


静态变量是归入局部变量中 的


左侧是全局变量,右侧是局部变量


所以,我的意思是:静态变量在定义上是归入局部变量的,但它可以全局使用。


还有,请忽略图片最上面的 ”局部变量“ 这个几个字,这是这一章要讲内容的标题



Keep calm and carry on!!!
YiMoon
至圣

经验值:11064
发帖数:1222
精华帖:35
41楼    2018-10-22 23:11:05
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

 如果是说在 ”全部程序中可以使用“ 的就是全局变量的话,那么,FB的 IN  /   IN_OUT  /   OUT  这些又算什么呢?这些接口定义后,也是可以在背景数据块中全局使用的


FB块接口定义

 

 


调用FB


 

 


FB 背景数据块


 

 


使用背景数据块地址


 

 

还是之前的理解,静态变量定义为局部变量,但可以全局使用。就像37楼说的,背景DB是全局DB的特殊应用

Keep calm and carry on!!!
李岩
至圣

经验值:13626
发帖数:2834
精华帖:32
42楼    2018-10-23 00:12:26
精华帖  精编帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

貌似你在外部调用static的数据也是要“风险自担”的吧。楼上的几位好像引用的西门子的官方文件,看着就是这个意思吧。

国人当自强 共同努力 抵制日货
wahaha543
游士

经验值:196
发帖数:2
精华帖:2
49楼    2018-12-28 12:36:20
精华帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

先引用C++的概念:

C++的类的成员(主要是变量,函数) 有三种访问修饰符(public、private、protected ), protected是跟继承相关的,在此不讨论

被public修饰的成员可以被类的内部或者是外部直接访问,而private成员只能被类的内部访问


我们可以将FB类比为C++中的类, DB为对象实例,因为它们的很多特性都非常相似

由以上信息类推: FB内的static变量默认访问修饰符是public, FB内的temp变量的访问修饰符是private, 


变量能在外部被访问并不能说明这个变量就是全局的, 能否被访问是由访问修饰符决定的

区分一个变量是全局变量还是局部变量要看这个变量是在哪里定义的.


有些人可能会说这是西门子的编程, 跟C++完全两码事, 那么,请无视我的观点


conquer3
奇侠

经验值:5057
发帖数:453
精华帖:3
50楼    2019-01-25 10:40:12
精华帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

西家将PLC变量和全局DB块里的变量定义为全局变量,将块的声明表中定义的变量称为局部变量。见下图



conquer3
奇侠

经验值:5057
发帖数:453
精华帖:3
51楼    2019-01-27 08:58:27
精华帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

我是在视频中心搜到的《1200:局部变量》,下面是网址。http://www.ad.siemens.com.cn/service/elearning/course/533.html



wahaha543
游士

经验值:196
发帖数:2
精华帖:2
52楼    2019-03-30 08:21:45
精华帖  主题:回复:【万泉河】FB内的static静态变量是全局变量吗?

本人刚刚在博途V15中发现的,其他版本未确认

在博途创建一个FB,在FB中中某个指令的变量中随便输入一串字符, 然后右键菜单, 选择【定义变量】




上图,Local Static

Local,Global是什么意思大家都懂的吧?






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