L 256
T LW22
UC FC30
p#m0.0
P#L22.0
P#Q32.5
FC30块里程序 in1为s5time类型in0,out1为布尔类型
a #in0
L#in1
SD T120
a T120
= #out1
我想要知道fc30块里的#in1这个s5time类型的时间是多少秒,及它是由谁给定的时间值,如果是由L22.0给定的,怎么不是s5t#这种类型的数,而是个位呢?请老师越详细说越好,我给高分,谢谢老师啦
最佳答案
1:首先你这个FC是在什么里面调用的了?在FC中?
2:你这个程序,是由SCL语言生产的,当SCL源代码被删除后,就会自动转为STL。
3:这种代码可以使你学到很多,它让你明白了,SIEMENS实参到形参的传送机制,传送的是地址,而不是数值。
说了 这么多废话,下面开始分析你的程序吧,你贴上来的代码是CPU里面操作系统底层,做的事情,实参到形参传递的过程,按地址传递。也就是,你看到P#L22.0是时间参数的指针地址。也就是时间参数,放在P#L22.0 所指向的地址变量的值,也就是LW22,由于LW是256,所以时间是256吗?
答案是正确的,就是放在LW22中,至于为什么不是 S5T#这种格式了?因为S5时间常数也是16位所以在程序调用时,SCL转化到STL时,它直接以WORD 类型来代替S5T时间常数了,这个是没问题的。
至于256 化为S5时间常数是多少了(是1000MS),参见我给你发的图片,可知
256 在内存中是:1,0000,0000,按照S5T时间格式来说,256 就是时基为0.01秒,时间是(1*100+0*10+0*1=100),所以你的定时时间是100*0.01秒=1秒
L 256
T LW22
UC FC30
p#m0.0
P#L22.0
P#Q32.5
其实你的程序如果用STL 直接来编写应该是这样调用的
CALL FC30
IN0:M0.0
IN1:S5t#1000MS // S5时间格式是16位,
OUT1:Q32.5
在SCL源代码中应该是这样调用的
FC30(
IN0:=M0.0;
IN1:=S5t#100MS,
OUT1:=Q32.5);
转化成STL 就变成你所发的代码了。
最后再次强调一遍!!!!!!!!!!!!!!
我想要知道fc30块里的#in1这个s5time类型的时间是多少秒,及它是由谁给定的时间值,如果是由L22.0给定的,怎么不是s5t#这种类型的数,而是个位呢?
(传的是地址P#L22.0,指像的起始地址是L22.0开始的16位的内存空间,就是LW22,L22.0仅仅是这个存储空间的起始地址)
图片说明:
提问者对于答案的评价:
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc198961.html