单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章,S7-1200,的用户程序结构,4.1,函数与函数块,4.1.1,生成与调用函数,1函数的特点,函数,FC,和函数块,FB,是用户编写的子程序,它们包含完成特定任务的程序,,FC,和,FB,有与调用它的块共享的输入、输出参数。,设压力变送器量程的下限为,0MPa,,上限为,High,MPa,,经,A/D,转换后得到,0,27648,的整数。转换后的数字,N,和压力,P,之间的计算公式为,P,=,(,High,N,),/27648,(,MPa,),用函数,FC1,实现上述运算。,2生成函数,双击指令树的“添加新块”,单击“添加新块”对话框中的“函数”按钮,,FC,默认的编号为,1,,默认的语言为,LAD,。设置函数的名称为“计算压力”。单击“确定”按钮,生成,FC1,。,3,定义函数的局部数据,往下拉动程序区最上面的分隔条,分隔条上面是函数的接口区,下面是程序区。,第4章 S7-1200的用户程序结构4.1 函数与函数块,在接口区中生成局部变量,后者只能在它所在的块中使用。,右键单击项目树中的,FC1,,单击快捷菜单中的“属性”,选中打开的对话框左边的“属性”,用复选框取消默认的属性“块的优化访问”。成功编译后接口区出现“偏移量”列,只有临时数据才有偏移量。,函数各种类型的局部变量的作用如下:,1,)输入参数,Input,用于接收调用它的块提供的输入数据。,2,)输出参数,Output,用于将块的程序执行结果返回给调用它的块。,3,)输入,_,输出参数,InOut,的初值由调用它的块提供,块执行完后用同一个参数将它的值返回给调用它的块。,4,)文件夹,Return,中自动生成的返回值“计算压力”与函数的名称相同,属于输出参数。数据类型为,Void,,表示函数没有返回值。,函数还有两种局部数据:,5,)临时数据,Temp,是暂时保存在局部数据堆栈中的数据。每次调用块之后,临时数据可能被同一优先级中后面调用的块的临时数据覆盖。,在接口区中生成局部变量,后者只能在它所在的块中使用。,6,)常量,Constant,是块中使用并且带有符号名的常量。,4FC1的程序设计,程序见下图,运算的中间结果用临时局部变量“中间变量”保存。,STEP 7,自动地在局部变量的前面添加,#,号。,5在OB1中调用FC1,在变量表中生成调用,FC1,时需要的,3,个变量,将项目树中的,FC1,拖放到右边的程序区的水平“导线”上。,FC1,的方框中左边的“输入数据”等是在,FC1,的接口区中定义的输入参数和输入,/,输出参数,右边的“压力值”是输出参数。它们被称为块的形式参数,简称为形参,形参在,FC,内部的程序中使用。方框外是调用时为形参指定的实际参数,简称为实参。实参与它对应的形参应具有相同的数据类型。,STEP 7,自动地在全局变量的符号地址两边添加双引号。,PLC,变量表,OB1,调用,FC1,的程序,6)常量Constant是块中使用并且带有符号名的常,6函数,应用的实验,将程序下载到仿真,CPU,后,,CPU,切换到,RUN,模式。单击精简视图右上角的,按钮,切换到项目视图。生成一个新的项目,双击打开“,SIM,表格,_1,”。在表中生成下图中的条目。令,I0.6,为,1,状态,调用,FC1,,令,IW64,为,13824,(,27648,的一半),执行,FC1,中的程序后,输出参数“压力值”的值,5.0 MPa,被传送给它的实参“压力计算值”,MD18,。,4.1.2,生成与调用函数块,1函数块,函数块(,FB,)是用户编写的有自己的存储区(背景数据块)的代码块,,FB,的典型应用是执行不能在一个扫描周期结束的操作。每次调用函数块时,都需要指定一个背景数据块。,2生成函数块,在项目“函数与函数块”中添加名为“电动机控制”的,FB1,。取消,FB1,默认的属性“块的优化访问”。,6函数应用的实验4.1.2 生成与调用函数块,3,定义函数块的局部变量,函数块的输入、输出参数和静态数据用指定的背景数据块保存。在,FB,中,定时器如果使用一个固定的背景数据块,在同时多次调用该,FB,时,该数据块将会被同时用于两处或多处。为此在块接口中生成数据类型为,IEC_TIMER,的静态变量“定时器,DB,”,用它提供定时器,TOF,的背景数据。,3定义函数块的局部变量,4FB1的控制要求与程序,用输入参数“起动按钮”和“停止按钮”控制,InOut,参数“电动机”。按下停止按钮,断开延时定时器(,TOF,)开始定时,输出参数“制动器”为,1,状态,经过输入参数“定时时间”设置的时间预置值后,停止制动。,在,TOF,定时期间,每个扫描周期执行完,FB1,之后,用静态变量“定时器,DB,”,来保存,TOF,的背景数据。可以修改函数块的输入、输出参数和静态变量的默认值。该默认值作为,FB,的背景数据块同一个变量的起始值。调用,FB,时没有指定实参的形参使用背景数据块中的起始值。,4FB1的控制要求与程序,5用于定时器计数器的,多重背景,IEC,定时器指令实际上是函数块,每次调用它们时,都需要指定一个背景数据块。为了解决前述的,FB,中定时器、计数器固定的背景数据块带来的问题,在函数块的接口区定义数据类型为,IEC_Timer,的静态变量(见图,4-6,),用它们来提供定时器和计数器的背景数据。这种程序结构被称为多重背景。,将定时器,TON,方框拖放到,FB1,的程序区,出现“调用选项”对话框。单击选中“多重实例”,选中列表中的“定时器,DB,”,用,FB1,的静态变量“定时器,DB,”提供,TON,的背景数据。,5用于定时器计数器的多重背景,这样处理后,多个定时器、计数器的背景数据被包含在它们所在的函数块的背景数据块中,不需要为每个定时器或计数器设置一个单独的背景数据块。,6在,OB1中调用FB1,在,PLC,默认变量表中生成两次调用,FB1,使用的符号地址。在,OB1,中两次调用,FB1,,自动生成背景数据块。为各形参指定实参。,7调用函数块的,仿真实验,将程序下载到仿真,PLC,,后者进入,RUN,模式。在,S7-PLCSIM,的项目视图,生成一个新的项目,打开“,SIM,表格,_1,”,生成,IB0,和,QB0,的,SIM,表条目。,两次单击起动按钮,I0.0,,,1,号设备,Q0.0,变为,1,状态。两次单击停止按钮,I0.1,,,Q0.0,变为,0,状态,制动,Q0.1,变为,1,状态。经过参数“定时时间”设置的时间后,Q0.1,变为,0,状态。可以令两台设备几乎同时起动、同时停车和制动延时。,这样处理后,多个定时器、计数器的背景数据被包含在它们,8处理调用错误,调用符号名为“电动机控制”的,FB1,之后,在,FB1,的接口区增加了输入参数“定时时间”,被调用的,FB1,的字符变为红色。右键单击出错的,FB1,,执行快捷菜单中的“更新块调用”命令,出现“接口同步”对话框,显示出原有的块接口和增加了输入参数后的块接口。单击“确定”按钮,“接口同步”对话框消失。被调用的,FB1,被修改为新的接口,程序中,FB1,的红色字符变为黑色。,8处理调用错误,9函数与函数块的区别,FB,和,FC,均为用户编写的子程序,接口区中均有,Input,、,Output,、,InOut,参数和,Temp,数据。,FC,的返回值实际上属于输出参数。下面是,FC,和,FB,的区别:,1,)函数块有背景数据块,函数没有。,2,)只能在函数内部访问它的局部变量。其他代码块或,HMI,可以访问函数块的背景数据块中的变量。,3,)函数没有静态变量,函数块有保存在背景数据块中的静态变量。如果函数或函数块的内部不使用全局变量,只使用局部变量,不需要做任何修改,就可以将块移植到其他项目。如果代码块有执行完后需要保存的数据,应使用函数块。,4,)在调用函数块时可以不设置某些输入、输出参数的实参,而是使用它们的默认值。函数的局部变量没有默认值,调用时应给所有的形参指定实参。,5,)函数块的输出、输入参数和用静态数据保存的内部状态数据有关。,10组织块与,FB和FC的区别,出现事件或故障时,由操作系统调用对应的组织块,,FB,和,FC,是用户程序在代码块中调用的。组织块没有输出参数、,InOut,参数和静态数据,它的输入参数是操作系统提供的启动信息。用户可以在组织块的接口区生成临时变量和常量。组织块中的程序是用户编写的。,9函数与函数块的区别,4.1.3,多重背景,在项目“多重背景”中生成与,4.1.2,节相同的名为“电动机控制”的函数块,FB1,,去掉,FB1,“优化的块访问”属性。生成一个名为“多台电动机控制”的函数块,FB3,,去掉,FB3,“优化的块访问”属性。在它的接口区生成两个数据类型为“电动机控制”的静态变量“,1,号电动机”和“,2,号电动机”。每个静态变量内部的参数是自动生成的,与,FB1,“电动机控制”的相同。,在,FB3,中调用,FB1,,在“调用选项”对话框中选中“多重实例,DB,”,选中列表中的“,1,号电动机”,用,FB3,的静态变量“,1,号电动机”提供,FB1,“电动机控制”的背景数据。用同样的方法调用,FB1,来控制,2,号电动机。,4.1.3 多重背景,在,OB1,中调用,FB3,“多台电机控制”,,FB3,的背景数据块只有静态变量“,1,号电动机”和“,2,号电动机”。,在这个例子中实际上有,3,重背景数据。,FB3,的背景数据块,DB3,包含了两次调用,FB1,的背景数据,后者又包含了定时器,TOF,的背景数据。,将用户程序下载到仿真,PLC,,,CPU,切换到,RUN,模式。生成一个新的项目,在,SIM,表格,_1,中生成地址,IB0,和,QB0,,用,I0.0,和,I0.2,分别启动,1,号、,2,号电动机,用,I0.1,和,I0.3,分别停止,1,号、,2,号电动机,观察电动机和制动器的状态变化是否正常。,FB3,OB1,在OB1中调用FB3“多台电机控制”,FB3的背景数,4.2,数据类型与间接寻址,4.2.1,数据类型,1数据类型的分类,数据类型分为基本数据类型、复杂数据类型、参数类型、系统数据类型和硬件数据类型。,(,1,)参数类型,参数类型是传递给被调用块的形参的数据类型。参数类型,Void,不保存数值,它用于函数不需要返回值的情况。,(,2,)系统数据类型,系统数据类型(,SDT,)由系统提供,可供用户使用,具有不能更改的预定义的结构。例如定时器结构,IEC_TIMER,,,6,种整数数据类型的计数器结构等。,(,3,)硬件数据类型,硬件数据类型与硬件组态时模块的设置有关。它用于识别硬件元件、事件和中断,OB,等与硬件有关的对象。,PLC,变量表的“系统常量”选项卡列出了项目中的硬件数据类型变量的值,即硬件组件和中断事件的标识符。,4.2 数据类型与间接寻址,2数据类型的转换方式,调用指令或块时,,如果操作数具有不同的数据类型,应对它们进行转换。,(,1,)隐式转换,如果操作数的数据类型兼容,将自动执行隐式转换。兼容性测试使用两种标准:,1,)默认的是,IEC,检查,采用严格的兼容性规则,允许转换的数据类型较少。,2,)不进行,IEC,检查,兼容性测试采用不太严格的标准,允许转换的数据类型较多。,(,2,)显式转换,操作数不兼容时,只能使用显式转换指令。可使用指令列表的“数学函数”“转换操作”和“字符串,+,字符”文件夹中的指令进行转换。,3设置,IEC检查功能,(,1,)设置对项目中所有新的块进行,IEC,检查,执行“选项”菜单中的“设置”命令,选中出现的“设置”编辑器左边窗口的“,PLC,编程”中的“常规”组,用复选框选中右边窗口“新块的默认设置”区中的“,IEC,检查”。,(,2,)设置单独的块进行,IEC,检查,如果没有作上述的设置,右键单击项目树中的某个代码块,执行快捷菜单中的“属性”命令,选中打开的对话框左边窗口的“属性”组,