fc块的#temp变量问题 点击:3062 | 回复:16



木云

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:26帖 | 25回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2005年5月31日
发表于:2011-06-23 09:42:07
楼主
比如我在fc1中temp中定义二个#temp1,#temp2变量,单程序执行到fc2时,fc1中的#temp1,#temp2变量是不是为0?当又执行到fc1时如果不给#temp1,#temp2变量赋值,#temp1,#temp2变量是不是也为0?



simonvic

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 19回
  • 年度积分:0
  • 历史总积分:119
  • 注册:2007年3月14日
发表于:2011-06-23 13:28:40
1楼
不是,如果是你自己定义的,并且未在程序中赋值,那么它的值是不确定的。是随机分配的一个地址,原来是什么就是什么了,有可能是0,更有可能不是。

yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2011-06-23 14:11:41
2楼
不一定,因为临时变量占用临时存储区L区域,因此,系统仅分配存储区,而不负责对于存储区内数据进行清零的操作。因此,临时变量需要遵循先赋值,再使用的准则。

彩云之滇东北

  • 精华:20帖
  • 求助:5帖
  • 帖子:107帖 | 2725回
  • 年度积分:0
  • 历史总积分:21121
  • 注册:2005年6月14日
发表于:2011-06-23 15:54:34
3楼

随系统调用的情况不同而值不同

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-23 21:48:45
4楼

引用simonvic 的回复内容:不是,如果是你自己定义的,并且未在程序中赋值,那么它的值是不确定的。是随机分配的一个地址,原来是什么就是什么了,有可能是0,更有可能不是。



要是同一个 FC 块 ,调用两个实例,那么如果内部给 #temp1,#temp2 赋值,他的值可能是 最有一次调用哪个值!

我就吃过这个亏!  其实 FB 同样存在这样的 临时变量问题, 西门子的FB 好像背景 DB 只是 FB 的输入输出形参的地址;

也就是 临时变量和 FC 分配机制一样,我猜测可能是这样! 但是 Omron 的 是FB 块,是给每个实例 的 所有的变量都给分配实际的固定的地址!所以,西门子的这点 内存管理 不够好!而且封装的也太多,没有给用户提供一种 手动分配地址的机制!

simonvic

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 19回
  • 年度积分:0
  • 历史总积分:119
  • 注册:2007年3月14日
发表于:2011-06-23 21:57:36
5楼
你要想分配固定地址,那就不用临时变量,直接用固定地址啊

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-25 23:25:01
6楼
引用simonvic 的回复内容:你要想分配固定地址,那就不用临时变量,直接用固定地址啊


我说的是系统自动分配 固定地址,在编译时 静态分配!

yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2011-06-26 06:01:11
7楼
西门子这一点比其他的PLC都灵活,FB的DB作为FB的变量的固定存放地址,而Temp则是有系统分配临时区L地址。 比如:存在FC1,FC2两个功能,它们都有两个Temp,那么当调用FC1时,系统分配L区域地址给FC1的Temp,如分配了LB0,LB1,那么当FC1调用完成后,系统认为LB0,LB1已经不需要,但是西门子的系统不会对临时区进行清零,只是继续分配,当调用FC2时,系统将LB0,LB1重新分配给FC2的Temp,此时如果不遵循先赋值后使用的准则,那么FC2的Temp使用的值将是FC1的Temp的值。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-26 23:12:17
8楼

楼上这位前辈,我感觉 300 PLC  的 DB 块数据 先定义后使用 ,不方便,而且300的指令 对数据类型做严格的 类型检查,l例如: 同是 16位 WORD 变量,300 严格 分 INT 和WORD 类型, 更让我苦恼的是 300 PLC 类型太多, BYTE, WORD ,DWORD,INT ,UINT ,DINT,REAL., TIMER,STRING,STRUCT,UDT,等等!这么多的类型 ,难道使用到的变量 需要这些类型时, 要定义这么多 DB 块么? 而且300 的好像支持 20个DB块。 更致命的是 你使用DB 块变量时,用一段时间,不知道DB块 地址用了多少,哪个地址,等到一会要用 不同的类型 DB 数据时, 我就想不起来用到哪个地址了,这样很容易造成地址重复使用? 对编程带来不便, 西门子的 300 的地址管理 我个人觉得 不是很完美。它自己把数据分配机制封装的太深,导致用户很难理解 地址用了多少?用在哪了?等等!应该留给用户手动分配地址的机会!

 

可能我还不太熟悉300 ,你平时是怎么用DB 块的,如何 提高编程效率?

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-26 23:14:02
9楼

还有 西门子 300 , 累计器 有没有, 怎么方法,操作?

 

g306434364

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7回
  • 年度积分:0
  • 历史总积分:45
  • 注册:2008年11月08日
发表于:2011-06-27 09:12:47
10楼
楼上的粪青,不要抱怨什么,其实你说的功能300都有,可能是你没有留下而已,任何一款软件要想弄透彻,搞明白都是需要花费时间的。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-27 11:18:15
11楼

引用g306434364 的回复内容:楼上的粪青,不要抱怨什么,其实你说的功能300都有,可能是你没有留下而已,任何一款软件要想弄透彻,搞明白都是需要花费时间的。



不好意思,我不是仕么愤青, 那你能帮我解释一下我上面的问题么?


yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2011-06-27 11:41:51
12楼
您涉及到的问题在所有的支持IEC61131-3 标准的PLC中都存在,同样,富士的SPH存在,施耐德存在,AB的也一样存在。变量使用之前需要定义数据类型,先定义再使用,是符合标准的,但是西门子做的不太好,因为其使用IL语句时,西门子称作为STL,其实一样的,在这种情况下,是不需要进行数据类似定义的。

交叉索引就是提供给用户知道自己用了多少资源的工具。

手动分配地址,你觉得不使用连续地址,而进行跳跃式的地址定义更好吗?就个人使用来看,西门子应该禁止DB使用,改由系统自行分配,而不是由用户进行分配。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-27 19:59:01
13楼

楼上说的 西门子的地址自动分配,你可以看一下Omron 的 新款的 小型PLC 地址分配机制,在看一下 和利时的 ,它们都是 系统分配 和 用户指定地址 两种相结合 的方法。这样 用户可以做中间结果 存储变量,随时用,不用定义的,也即是说刘一部分地址区是 可以用户指定绝对地址的, 像 和利时 的 就可以用 AT 命令指定绝对地址,而不影响系统自动分配地址!

第二个问题: 我当然像用连续的地址啊,可能你没理解我的意思,我就怕地址不连续 ,太麻烦!

 

yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2011-06-28 08:42:53
14楼
西门子不是同样可以使用STL语言来直接使用数据块的绝对地址么。和立时的AT指令是在其ST语言中实现的,和立时使用的架构是Codesys的。因此,同样Codesys比西门子更符合IEC61131.。

连续地址你定义数组不是可以实现变量的数据类型的快速定义了么

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2011-06-29 20:42:58
15楼
引用yuanle 的回复内容:西门子不是同样可以使用STL语言来直接使用数据块的绝对地址么。和立时的AT指令是在其ST语言中实现的,和立时使用的架构是Codesys的。因此,同样Codesys比西门子更符合IEC61131.。

连续地址你定义数组不是可以实现变量的数据类型的快速定义了么


那 STL 的绝对地址是怎么写的? 我编程手册中没看到?

阿水

  • 精华:23帖
  • 求助:347帖
  • 帖子:1611帖 | 22281回
  • 年度积分:37
  • 历史总积分:98482
  • 注册:2007年3月22日
发表于:2011-06-29 21:47:51
16楼

        不一定的。

STL 的绝地地址就是 I *.*或是如 I 1.1


热门招聘
相关主题

官方公众号

智造工程师