| 作者 | 主题 |
|---|---|
|
半截蜡烛 游侠 经验值:599 发帖数:273 精华帖:1 |
楼主
主题: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楼
主题:回复:FC和FB里为什么使用--(S)--指令置位数据块里的位会出错?
经过多次试验发现:
FC的输入输出参数是DB块时,形参是保存在一个临时的区域,而输入输出参数是M、I、Q这类时就不使用临时区域。如果在FC里没对OUT执行输出则把临时区域的旧值输出,如果使用IN/OUT代替OUT则这个临时变量会被旧值初始化。 |
|
youhm 至圣 经验值:13571 发帖数:4924 精华帖:81 |
24楼
主题:回复: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块时,你会发现就不一样了 |