项目中我使用PCS7,自己做的FB块调用SFC51,但却始终无法看到效果。
1:我先做实验来验证是否可行,在CFC中调用自己用梯形图编写的块,在梯形图中调用SFC51,把SFC的结果写到P#db20.0 word 20,运行后监视DB20中的数据,非常好,可行。
2:我把以上思路应用到SCL中:我是用SCL编写FB块,在程序中调用SFC51,定义数组DR ARRAY【0..40】:char,在静态变量类型VAR中定义的。SFC51的输出写到这个数组变量中(试了很久才找到这样的方法,因为最开始写P#db20.0 word 20,就编译不过去)。这时候程序也编译过去了,终于不提示错误了。
运行:监视这个数组变量没有任何变化,都为0!
请大侠帮助指点,为什么会这样?
我目前想有两种可能性:
1:是否 SFC51的输出写不到这个数组变量中?(虽然是能编译过去了)
2:我发现SFC51的BUSY位始终为0,是否还有可能SFC51就没有执行或没法执行? SFC51的命令返回值为负数,在SFC51的帮助中没有那个返回值的说明。(可是程序中其他在一起的程序段都执行了)
最佳答案
1、SFC51系统功能块的作用是读取PLC系统状态列表代码(Reading a System Status List or Partial List);
2、在 SFC51系统功能块中,有一OUT参数“DR”,用于存放IN参数中“SSL_ID”指定的系统状态编码值(SSL-ID of the system status list or partial list to be read.)
3、“DR”参数是ANY数据类型。在使用SCL工具中初始化ANY数据类型确实比较复杂,需要使用AT函数(方法参见dcount107提供的地址链接)。
4、对于SFC51系统功能块,除了要正确初始化“DR”参数的ANY据类型外,还要注意正确填写好“REQ”、“SSL_ID”、“INDEX”这3个IN参数。其中“REQ”是通讯时的心跳(脉冲Pulse)参数,通常上升沿↑触发SFC51系统功能块读取一次“SSL_ID”参数中的数据,存放至OUT参数“DR”中。
5、因此,你还要检查一下“REQ”参数设置,是否是时钟脉冲Pulse变量!
6、另外,对于SFC51系统功能块的使用时,数据通讯状态可观察OUT参数“BUSY”变化;数据接收状态可观察OUT参数“RET_VAL”的返回值代码是否正确!
7、SFC51系统功能块使用复杂,即便是获取的“DR”存储中存放的系统状态列表(System Status List)也是编码形式。通常在PCS 7中,是系统编译后自动调用它,很少由用户手动使用。
提问者对于答案的评价:
谢谢剑忠 和dcount107
最终没能在SCL写成,还是编到FC中再放到CFC中了
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc191329.html