CFC编程常见问题
问题1. CFC里能不能调用LAD/STL编写的FC/FB
在CFC中可以调用其他编程语言编写的FC/FB,例如使用LAD编写的设备逻辑处理代码等。
使用LAD/STL等编写FC/DB时需要注意功能块号的选择,具体信息请参考 问题2;
在CFC的编程窗口中,依次打开菜单项“Options”à“ Customize”à“Compile/Download”:
在弹出的窗口中,“Areas Reserved for Other Applications”中可以设置和查看给用户预留的FC和DB范围:
问题3. 修改FC/DB块范围时报错
CFC编译过程中会根据Chart中插入的功能块和运行组的设置,自动创建FC和DB块。如果程序中还有通过LAD/STL/FBD创建的FC和DB,在CFC编译过程中为了保护这些用户代码,可以指定哪些范围中的FC和DB块被保留。
根据实际需要可以调整预留的FC和DB块的范围,但在调整过程中,可能会弹出如下错误提示:
导致这个问题的原因是设置的新范围并不能涵盖所有用户自定义的FC/DB。可以将涉及到的FC/DB修改块号来适应新的范围。
在FC/DB的范围设置窗口中还可以通过“Compress”选项来调整CFC相关的FC/DB以实现块号的连贯性。但使用这个功能需要注意:
1、 使用Compress之前使用Read Back功能回读参数;
2、 Compress之后需要对CPU进行全部下载;
3、 对OS重新编译和下载。
问题4. CFC中如何监控功能块和变量
完成CFC的编译和下载之后,点击工具栏上的按钮,即可开启测试模式(“Test Mode”)。在测试模式下选中需要监控的功能块,点击右键选择“Watch On”,或者在菜单“Debug”下选择“Watch On”。此时该功能块的监控列表(“Watch List”)中包含的管脚都会开始监控。如果需要监视该功能块的其他管脚,则可以选择该管脚,点击右键选择“Add I/O”,或者点击功能工具栏上的即可将其添加到功能块的Watch List中:
每次开启测试模式,所有的功能块管脚不会自动被监控,这是因为默认情况下,CFC为了降低监控通讯负荷对AS的影响,都是在运行模式(“Process Mode”)工作。但是,也可以在CFC编程窗口的菜单项“Debug”中选择“Laboratory Mode”来激活实验室模式。工作在这种模式下,只要测试模式开启,CFC中所有功能块的Watch List中包含的管脚都会自动被监控。
默认情况下,CFC中插入的功能块都是隶属于某个OB3x下、以CFC名称命名的运行组。双击功能块上的高亮区即可打开运行组窗口:
在运行组编辑器中也可以自己创建新的运行组,将需要禁用的功能块拖放到其中。
在程序中可以通过一个BOOL类型的输出来激活/禁止一个运行组,具体过程是:
选择一个功能块的BOOL类型输出管脚,点击菜单项“Insert”à“Interconnection to Runtime Group…”:
编译下载程序。只要上图中“StruDiIn”的管脚“Value”为0,名为“TIC1003”的运行组就会被禁止执行。
在CFC中使用DB块中的单元可以参考如下文档:
https://support.industry.siemens.com/cs/cn/zh/view/81211742
问题7. CFC编译时为何将创建的OB块删除了
CFC中包含驱动块,且选择了“Generate module drivers”,那编译过程中会尝试重新生成诊断OB(例如OB85/86/101/102等)。如果用户已经创建了诊断OB,且内容为空,在编译时则会删除空的诊断OB并生成新的,如下警告信息:
如果用户创建的诊断OB中已经有内容,则编译时就会报错:
问题8. 没有驱动块的CFC程序编译时如何自动生成诊断OB
如果CFC程序中不包含驱动块,为了生成相应的诊断OB,请参考如下应用文档:
https://support.industry.siemens.com/cs/cn/zh/view/79575755
问题9. 如何将CFC的Chart编译成一个功能块
CFC的Chart在默认情况下都是作为一个项目程序(Program)来编译的,但也可以编译成一个和FB一样的功能块。
选择菜单项“View”中的“Chart Inputs/Outputs”,或者点击工具栏上的,可以打开Chart的I/O窗口,和FB下类似:
在Chart中设置输入IN、输出OUT或者输入_输出IN_OUT,通过拖放和Chart中的功能库的相同数据类型管脚连接。
完成程序编写之后,依次点击菜单项“Chart”à“ Compile”à“ Chart as Block Type…”:
在弹出的窗口中设置功能块号、符号名、参数等即可。
问题10. 如何一次打印所有的CFC
在CFC编程窗口中的“Chart”菜单项下点击“Print…”可以打印当前的Chart中的内容,但不能实现所有CFC内容的打印。
要实现一次性打印所有CFC内容,需要使用DOCPOR。在工厂视图(或者组件视图)下,在单项目的右键菜单插入“Project Documentation”:
双击生成的“Documentation”,打开DOCPRO配置窗口。首次打开会有一个初始化的过程。在DOCPRO中“Documentation”的右键菜单中选择“Insert Wiring Manual”:
点击之后,就可以选择需要包含的内容:
如上图所示,将工程视图中CFC选择,其会自动添加在一个打印任务中:
和CFC编程界面下的打印一样,需要设置CFC打印的内容,在添加进来的CFC(或全选所有CFC)上点击右键,选择“Object Properties”:
在属性窗口中,修改View标签页中的内容,选择“Sheet”:
完成以上设置后,直接在打印任务“Job List”的右键快捷菜单上触发“Print”即可将其中添加进来的所有CFC全部打印出来:
关于DOCPRO的更多内容可以参考如下手册:
https://support.automation.siemens.com/WW/view/en/1137193
问题11. 如何将IO管脚的数据类型显示出来
CFC中是可以将功能块管脚的数据类型显示出来的,在编程窗口中,点击菜单“Option”à“ Customize”à“ Layout”:
在弹出的设置窗口中,检查“I/Os”中是否已选择为“Name(and type)”,默认情况下这个选项是被选择的:
之后,设置功能块的显示宽度:
在其中修改Block width为“Wide”即可:
完成设置之后,Chart中的所有功能块都变宽了,且管脚数据类型也显示出来了:
问题12. CFC中使用IN_OUT管脚,为何只能接输入
在将CFC的“Chart I/O”中定义的“IN_OUT”接口,只能和Chart中功能块的“IN”或者“IN_OUT”类型相连接,不可以和“OUT”类型连接。
问题13. CFC中的功能块的EN管脚能否通过逻辑来控制
默认情况下CFC功能块的EN管脚是隐藏的,可以在功能块的“I/Os”中取消EN管脚的“Invisible”属性选择。
Chart中可以通过其他功能块的BOOL类型输出来连接EN管脚:
连接EN端之后,功能块的高亮区加了一个黄底的问号,这表示功能块的执行与否不确定。在运行过程中EN端变成0,或者直接在编程过程中赋值为0:
其中的红底感叹号表示该功能块不会被执行。
所以,CFC中功能块可以通过EN来控制控制块执行与否,但需要注意其使能条件,以免出现功能始终无法执行的问题。
问题14. CFC编译时为何报超过64K的上限
进行CFC编译的时候会报如下错误:
这个问题是指编译过程中生成功能块时,其大小超过64K的上限。如下是出现该问题之前的最近一次正常编译之后最大的功能块:
此时CFC编译生成的FC的大小接近64K了,在增加了少量程序之后再编译就出错。
对于CPU而言,其能支持的单个FC/FB最大规模为64K,所以在CFC编译生成FC超过这个限制后就会报错停止:
导致这个问题的原因是CFC的运行组设置不合理,如下图所示,所有的功能块都集中在一个运行组或者直接在OB3x中,这样就容易让编译生成的FC规模过大。
解决这个问题就可以根据功能块之间的联系、或者工艺关系来多划分运行组,让每个运行组中的功能块个数不要过多。