技术论坛

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

返回主题列表
作者 主题
半截蜡烛
游侠

经验值:599
发帖数:273
精华帖:1
楼主    2009-10-02 09:13:13
主题:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?
下面是我编写的一个简单的功能(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--指令换成--()--指令,可是我想知道这是为什么?不能知其然而不知其所以然!
活到老学到老!
youhm
至圣

经验值:13571
发帖数:4924
精华帖:81
22楼    2009-10-11 11:30:55
精华帖  主题:回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?
经过多次试验发现:
FC的输入输出参数是DB块时,形参是保存在一个临时的区域,而输入输出参数是M、I、Q这类时就不使用临时区域。如果在FC里没对OUT执行输出则把临时区域的旧值输出,如果使用IN/OUT代替OUT则这个临时变量会被旧值初始化。
youhm
至圣

经验值:13571
发帖数:4924
精华帖:81
24楼    2009-10-11 16:00:39
精华帖  主题:回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?
针对楼上的观点又做了个试验

新建一FC功能,定义一个Byte型IN变量IN1,一个Byte型OUT变量OUT1
写代码
L OUT1
T IN1
调用这个FC块,输入参数IN1:=MB100,OUT:=MB200
在变量表里修改MB200的值你会发现作为输入值的MB100随之改变
这意味着什么呢?
MB100作为实参输入,如果FC里是赋值给一个临时变量,在FC里修改这个临时变量的值怎么又会改变作为实参的MB100呢
当实参是DB块时,你会发现就不一样了


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