技术论坛

FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?

作者 主题
侠客

经验值: 617
发帖数: 291
精华帖: 1
主题:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 2009-10-02 09:13:13
标签:
下面是我编写的一个简单的功能(FC1),然后在OB1里两次调用,其作用就是利用两个不同的外部输入端I0.0和I1.0分别置位DB1.DBX0.0和DB1.DBX0.1,但用模拟器模拟的结果是只要I0.0和I1.0有一个为1,那么DB1.DBX0.0和DB1.DBX0.1都会被置1。我在单个周期扫描中观察到如果I0.0为0,I1.0为1那么在第一个扫描周期里只有DB1.DBX0.1为1,在下一个扫描周期DB1.DBX0.0才为1,这看似好像是因为使用了相同的L20.0本地地址的原因,但是我把DB1.DBX0.0和DB1.DBX0.1换成Q4.0和Q4.1,这回模拟结果且是正常的了,也就是能分别置位互不影响。

以下是FC1里的代码:
A #chufa //#chufa是FC1里定义的一个输入型形参。
S #baojing //#baojing是FC1里定义的一个输出型形参
A I 0.7 //FC1里直接使用的实参
R #baojing
NOP 0

以下是OB1里的调用两次FC1的代码:
程序段1:
A I 0.0
= L 20.0
BLD 103
CALL FC 1
chufa :=L20.0
baojing:=DB1.DBX0.0
NOP 0

程序段2:
A I 1.0
= L 20.0
BLD 103
CALL FC 1
chufa :=L20.0
baojing:=DB1.DBX0.1
NOP 0

为了简单明了的说明问题特意编写这段简单的程序,排除干扰的可能。
为什么会出现DB1.DBX0.0和DB1.DBX0.1同时被改写的情况呢?有网友告诉我说在FC、FB里最好不要使用置位、复位指令,这我也试验过了是可行的,即把--S--指令换成--()--指令,可是我想知道这是为什么?不能知其然而不知其所以然!
活到老学到老!
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=605538&s_id=0&num=0

至圣

经验值: 26286
发帖数: 5838
精华帖: 5
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 1楼 2009-10-02 09:44:22
程序有问题,DB1.DBX0.0和DB1.DBX0.1用法不对,详见
天天学习,天天进步.
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 2楼 2009-10-02 09:54:14
是吗?我该参考守则里那一章节?能不能细说一下啊
活到老学到老!
以下网友喜欢您的帖子:

  
至圣

经验值: 26286
发帖数: 5838
精华帖: 5
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 3楼 2009-10-02 16:41:17
寻址章节
天天学习,天天进步.
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 4楼 2009-10-02 17:11:32
这么简单的直接寻址怎么还用到了指针?侠客!您家就行行好吧,直接点破不就行了吗?不要再折磨我了好吧!!!
活到老学到老!
以下网友喜欢您的帖子:

  
奇侠

经验值: 8559
发帖数: 3432
精华帖: 56
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 5楼 2009-10-02 23:03:21
用DB地址确实有时候会出现莫名其妙的问题
我之前曾经也出现FC赋值输出了,但是外面的DB存储地址就是没有收到任何值,换成M存储区就没问题。
If anything can go wrong, it will.
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 6楼 2009-10-02 23:30:17
像我那样是一定会出错而不是可能会出错,即便是把两个位放在不同的数据块也同样会被同时置位。
怎么没人出来说说为什么?小儿科吗?不值得一提?
活到老学到老!
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 7楼 2009-10-04 08:45:07
唉!守了好几天了也得不到个满意的答复,自己顶起……
活到老学到老!
以下网友喜欢您的帖子:

  
游士

经验值: 218
发帖数: 152
精华帖: 0
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 8楼 2009-10-07 23:32:13
是临时变量的问题
临时变量的初值可能是任意值
在你的FC里当#chufa为"1"的时候对#baojing置位
但在当#chufa为"0"的时候什么都没有做
解决办法: 在FC一开始的时候给#baojing置零
希望多交些同行的朋友。我的200/300技术交流群10671799
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 9楼 2009-10-08 09:44:33
(⊙v⊙)嗯!看似很有道理,我试过了再来谢谢你……
活到老学到老!
以下网友喜欢您的帖子:

  
游士

经验值: 282
发帖数: 95
精华帖: 0
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 10楼 2009-10-08 09:47:54
在DB1中设DB1.DBX0.1和DB1.DBX0.0初始值FLASE
 
以下网友喜欢您的帖子:

  
至圣

经验值: 13053
发帖数: 4961
精华帖: 81
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?
推荐帖


只看楼主 11楼 2009-10-08 15:34:36
参考《西门子STEP7编程语言与使用技巧》第55页
对于FC的使用,一个常见的错误是对输出的错误处理,相比较于FB,FC是一个没有存储空间的逻辑块,如果没有数据被写至FC的OUT参数,FC将会输出一个随机值,对于FB,因为其可以使用背景数据块来存储OUT参数的数值,即使某次调用没有对OUT参数进行写操作,OUT参数依然可以输出上一次的旧值。
建议 :
1.用IN/OUT变量代替OUT变量
2.不论何时调用块,FC中的OUT参数都必须被赋值

具体Q输出没有影响和内部运行机制不清楚
 
推荐帖推荐理由: fc中的out是要在程序的里的每一个循环要输出一个值,这就可以很大的区别out和in/out的区别in/out有一个回读的过程。 (推荐人:菜腿骑菜车买菜)
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 12楼 2009-10-09 09:03:57
不知道在哪里可以找到楼上朋友说的那本书,很想看看。
不过你说的IN/OUT代替OUT那是不行的,实际上IN/OUT是输入接口,性质都不一样哦,再者如果真如你说的FC会产生随机值,可我就是给他指定了存储空间才出问题的,既然是随机那不可能每次都是错误的?
关于初始值的问题,我也试验过了,还是不能正常。
不知道哪位看得懂语句表状态在线监视,那旁边显示的状态字的意义我看不懂。
活到老学到老!
以下网友喜欢您的帖子:

  
游士

经验值: 282
发帖数: 95
精华帖: 0
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 13楼 2009-10-09 09:26:46
西门子是会出现这种状况的,我建议还是不要使用0.0,留一个初始占位符,其余的还是赋初值比较好~
 
以下网友喜欢您的帖子:

  
至圣

经验值: 13053
发帖数: 4961
精华帖: 81
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 14楼 2009-10-09 09:32:34
这本书在兑换奖品里有,你也可以去其他地方购买

用IN/OUT为什么不行,我是经过测试了的

对于这个随机值我认为OUT也是用临时变量来存储的,这个随机并不是真正的随机而是根据程序的变化而变化,你的程序没变化,所以每次都是一样的结果

至于Q输出无问题无法依此解释
 
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 15楼 2009-10-09 09:40:30
回楼上的:我说过了IN/OUT他是输入端口不是输出端口。
FC我给他指定了一个共享的数据块,默认的初始值就是FLASE。0位为什么不能使用?我即便是把两个数据写到不同的数据块也会出错(同时被改写)
活到老学到老!
以下网友喜欢您的帖子:

  
至圣

经验值: 13053
发帖数: 4961
精华帖: 81
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 16楼 2009-10-09 10:01:54
楼上的谁说的IN/OUT不能输出
 
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 17楼 2009-10-09 10:49:20
楼上的朋友你这么坚持的话我也不敢肯定了,我没有试验过,也许你是对的。谢谢你的不懈更正,呵呵!
活到老学到老!
以下网友喜欢您的帖子:

  
侠圣

经验值: 3650
发帖数: 780
精华帖: 58
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 18楼 2009-10-09 11:06:21
我遇到过这样的问题,问过SIEMENS技术支持,就说FC不能这么用。我觉得应该和“S”,“R”指令本身及FC参数是传递地址的方式也有很大的关系。如果一定要使用S,R指令请使用RS触发器,然后用线圈输出,这应该是推荐的作法。
 
以下网友喜欢您的帖子:

  
侠客

经验值: 617
发帖数: 291
精华帖: 1
回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?


只看楼主 楼主 19楼 2009-10-09 14:06:59
哦!原来如此,今天打开电脑也看到了来自西门子技术支持的答复,以下西门子技术支持的答复引用:
这是因为局部数据或称为临时栈引起的。
可以参考:
http://support.automation.siemens.com/CN/view/zh/291495
该局部数据的值在被释放后并不是确定的。因此应当先赋值在引用。如在FC1中先要将其清零,接着在引用。
置评专家:西门子自动化技术支持 2009-10-9 15:39

你们说的和他是一个道理,就是随机值的问题,可是我还有一个疑问,如果是-S-和-R-指令引起的随机值错误的话那么换成-()-指令就正确还可以说得通,可是我仍然使用置位复位指令,而修改输出DBX位为Q位,为什么也能正常呢?FC为什么没有给他们两赋予随机值呢?
还是不太明白……
活到老学到老!
以下网友喜欢您的帖子:

  
收起
FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。