-68-第5章CoDeSys程序平台完成PLC的硬件及网络配置即可进入CoDeSys编程平台,进行变量声明、程序编写、下载及调试等工作。本章将对CoDeSys的编程环境进行概述,并主要介绍程序组织单元(POU)。程序组织单元是一个非常重要的概念,是组成工程的基本结构。任何复杂的工程都是由若干POU组成的。POU包括程序、功能块和功能。5.1CoDeSys简介CoDeSys是AC500PLC基于Windows平台的编程工具,具有以下主要功能及特点:符合IEC61131-3标准,采用积木式结构单元POU进行编程;支持LD、IL、ST、FBD、SFC、CFC等六种编程语言;指令丰富,支持多种数据类型;支持用户自定义库;具有软件仿真、断点调试及程序检查等功能;具有可视化界面、变量跟踪功能,从而可以实现控制过程的可视化;5.1.1编程界面激活CoDeSys后,进入以下编程主界面。编程界面由如下部分组成:菜单栏工具栏变量区程序区消息区对象组织器状态栏-69-菜单栏:包括文件、编辑、工程、附加、高级、联机、窗口、帮助等菜单。工具栏:提供快捷图标(或快捷按钮)。状态栏:用于显示工程目前的状态及诊断信息。变量区:声明及显示程序中声明的变量。程序区:程序编辑和修改区域。对象组织器:包含“POUs”、“数据类型”、“可视化界面”和“资源”四部分。消息区:显示工程和当前命令的相关信息。5.1.2对象组织器主界面左侧的竖条窗口称为对象组织器,由“POUs”、“数据类型”、“可视化界面”和“资源”四部分组成,包含了一个工程所必需的基本对象。1.POUs“POUs”部分采用树状结构方式显示文件夹和POU。2.数据类型在对象组织器中,选中“数据类型”,弹出“数据类型”定义界面。在此用户可自定义数据类型,如结构体(STRUCT)等,详见6.5章节。-70-3.可视化界面在对象组织器中,选中“可视化界面”,弹出“可视化界面”组态画面。界面左侧为可视化界面列表,右侧为可视化编辑区。详细内容见本手册第9章。4.资源在对象组织器中,选中“资源”,弹出“资源”管理器。“资源”部分的主要组成部分如下:库:显示当前工程所调用的库,详见5.10.2章节。全局变量:声明、显示整个工程中都能使用的全局变量,详见6.3.2章节。PLC浏览器:通过输入命令获得诊断结果,详见8.8.4章节。采样跟踪:跟踪变量值的变化,详见8.7章节。监视和配方管理器:用于“联机模式”下,集中监控同一工程不同程序的变量值,详见8.5章节。库文件管理器:为当前工程添加或删除所需的库,显示当前工程所调用的库,详见,详见5.10.3章节。其功能与“窗口(W)”菜单下“库管理器(L)”的内容一致。目标系统设置:进行CPU设置,设定目标平台、存储配置、一般配置、网络功能和可视化。任务配置:用于创建任务调用程序,详见5.9章节。-71-5.1.3界面语言CoDeSys的界面语言通过执行“工程(Project)/选项(Options)/桌面(Desktop)/语言(Language)”完成设置,其中“Chinese”为中文。如下图所示。(界面语言和联机帮助显示语言统一设置)5.2程序组织单元(POU)POU是程序组织单元(ProgramOrganizationUnit)的简称,是CoDeSys平台的基本构成元素。POU彼此间能够带有或不带有参数地相互调用。POU按其功能性的递增顺序,可分为功能(Function),功能块(FunctionBlock)和程序(Program)三种类型。它们在某些特性方面有所不同。功能(Function)可以赋予参数但没有记忆的POU。功能本身不能单独执行,只能由程序或功能块调用执行。当以相同的输入参数调用时,它只是生产相同的结果作为输出且只有一个输出。功能的编程语言是LD、FBD、IL、ST及CFC,不能选用SFC语言。功能块(FunctionBlock)可以赋予参数并具有记忆的POU。当以相同的输入参数调用时,功能块(例如定时器或计数器)的输出取决于其内部变量(VAR)和外部接口变量的状态,这些状态存储在功能块的实例中。功能块的输入量可以是一个或多个,输出量也可以是一个或多个。功能块的编程语言是LD、FBD、IL、ST、SFC及CFC。程序(Program)程序是唯一可执行的用户程序的主体,程序可以调用功能块、功能和其他程序。“主程序”是该类型POU的代表。程序是最高层的POU,能存取赋予PLC直接地址的变量,并使它们能为其它POU所存取。程序可以通过任务组态来激活,也可以通过其他程序来调用。程序的编程语言是LD、FBD、IL、ST、SFC及CFC。POU类型关键字含义ProgramPROGRAM例如主程序,可支配全局变量FunctionblockFUNCTION_BLOCK带输入和输出变量的块,最常用的POU类型FunctionFUNCTION具有功能值的块,用于扩展PLC的基本运算符-72-5.3POU的组成一个POU包含类型及名称部分、变量声明部分和代码部分,如下图。用户创建POU时,必须编辑这三部分。以下为一功能块的实例:类型及名称部分:变量区的首行。创建POU时系统自动完成生成。声明部分:在变量区创建、显示POU变量。用户可在引用变量之前进行声明,也可以在引用时利用变量声明对话框随时声明。具体的说明请参见第6章。代码部分:在程序区创建,是POU的主体,用户可以选用LD、FBD、IL、ST、SFC及CFC编程语言进行编写。具体的编程方法请参见第7章。-73-5.4POU的变量变量用于初始化、处理和存储用户数据。在每个POU的声明部分声明变量。对于变量的特性,请参见第6章的详细介绍。5.4.1POU变量的类别不同POU允许使用的变量的类别是不同的。如下表所示。变量类别ProgramFunctionblockFunctionVAR(局部变量)可以可以可以VAR_INPUT(输入变量)可以可以可以VAR_OUTPUT(输出变量)可以可以不可以VAR_IN_OUT(输入/输出变量)可以可以不可以VAR_GLOBAL(全局变量)可以不可以不可以从表中可以看出,程序可以使用所有的变量类别,功能块不能提供全局变量给其他POU,而功能只允许使用局部和输入变量,它使用功能返回值返回其计算结果。5.4.2POU接口变量的特性POU的变量中,除局部变量外,其它类别变量都可用于将数据输入到一个POU或从一个POU输出数据,这使得POU之间可进行数据交换,即POU接口。POU接口可分为以下三部分:调用接口:形式参数(输入和输入/输出变量)。输出接口:输出变量或功能返回值。全局接口:全局变量。5.5POU的调用POU的调用有以下两种方法:被其他已经调用的POU来调用。通过任务配置来调用,这种方法仅限于程序调用。当程序中没有进行任务配置时,系统会自动调用主程序“PLC_PRG”。此时,程序中必须有PLC_PRG,且其不能改名。POU的调用遵循以下原则,如下图所示。程序可以调用功能、功能块和其他程序。功能块可以调用功能和其他功能块。功能可以调用功能。功能(Function)程序(Program)功能块(FunctionBlock)程序(Program)功能(Function)功能(Function)功能块(FunctionBlock)-74-5.6功能功能通过代码部分作用于输入变量产生唯一的功能值。功能通常可用作PLC运算指令的扩展。5.6.1功能的返回值功能具有一个或任意数量的输入参数,但没有输出参数,只是返回一个功能返回值,即“功能名”。功能返回值可以为任意的数据类型,包括用户自定义的数据类型。相同的输入只是产生相同的功能返回值。这与调用的频繁程度及何时调用无关。这是因为功能不存储状态信息或内部数据,也就是说它们进行“无记忆”的操作。5.6.2创建功能创建功能可选择LD、FBD、IL、ST或CFC编程语言,创建步骤如下:1.在对象组织器中选中“POUs”,在程序列表中点击鼠标右键,弹出POU管理菜单,选择“添加对象(A)”,弹出“新建POU”对话框,如下图所示。2.在弹出的“新建POU”对话框中,“POU类型(Y)”选择“功能(U)”并定义返回类型,“POU语言(G)”可以选择IL、LD、FBD、ST和CFC之一,“新POU的名称(N)”为功能名,名字尽量采用能反映其实际功能的字符,便于识别。点击“确认”,完成定义关闭“新建POU”对话框。3.编写功能的具体算法。本例中创建功能“FUN_TEMP_LD”,返回类型为“REAL”类型,语言选择“LD”。其功能主要是完成比例系数的计算。-75-变量区的首行“FUNCTIONFUN_TEMP_LD:REAL”是系统自动生成的,其中关键字FUNCTION为功能标识,FUN_TEMP_LD为功能名称,REAL为返回值类型;在“VAR_INPUT”和“END_VAR”之间定义输入变量及其类型;在“VAR”和“END_VAR”之间定义局部变量及其类型编写完毕保存。编译通过后,可以在其它POU中直接调用。调用方法在不同的编程语言中有所不同,请参见第7章的详细介绍。-76-5.7功能块功能块是构成PLC用户程序的主要积木式部件。功能块可被程序和功能块调用,自身也可调用功能和其它功能块。5.7.1创建功能块功能块本身没有返回值,必须具有输入变量和输出变量。功能块的编程语言LD、FBD、IL、ST、SFC及CFC可选,功能块的创建和功能类似。1.在对象组织器中选中“POUs”,在程序列表中点击右键,弹出POU管理菜单,选择“添加对象(A)”,弹出“新建POU”对话框,如下图所示。2.在弹出的“新建POU”对话框中,“POU类型(Y)”选择“功能块(B)”,然后进行编程语言的选择和命名。点击“确认”,完成定义关闭“新建POU”对话框。3.编写功能块的具体算法。本例中创建功能块“FBD_TEMP_LD”,其功能主要是产生OFF/ON脉冲,OFF时间由输入变量T1_OFF设置,ON时间由输入变量T2_ON设置。-77-变量区的首行“FUNCTION_BLOCKFBD_TEMP_LD”是系统自动生成的,其中关键字FUNCTION_BLOCK是功能块标识。在“VAR_INPUT”和“END_VAR”之间定义输入类别变量及其类型在“VAR_OUTPUT”和“END_VAR”之间定义输出类别变量及其类型在“VAR”和“END_VAR”之间定义局部类别变量及其类型5.7.2功能块的实例调用功能块,必须对功能块进行实例声明,称为实例化。功能块的实例化与变量的声明是相同的。例如下图显示在POU的说明部分,FB实例“LED1”被声明为用户定义的功能块(FB类型)“FBD_TEMP_LD”的一个实例。进行实例化后,在声明该实例的POU中,便可以使用和调用该FB(作为一个实例)。功能块的调用,只改变功能块实例中的值。并且可通过输入“实例名.变量名”,来调用功能块中的变量。调用方法在不同的编程语言中有所不同,请参见第7章的详细介绍。5.7.3功能块实例的作用我们可以为某功能块声明多个实例,这些实例是独立的。这是因为,在PLC存储器内部,为每一个实例建立一个存储器。这些存储器包含局部变量值(VAR)和输入或输出变量值(VAR_INPUT,VAR_OUTPUT),但不包括输入输出变量值(VAR_IN_OUT)(这些只是指向变量的指针,不是变量值自身)。对于功能块来说,存储器很主要,因为对于功能块诸如定时器或计数器而言,它们的的特性取决于其内部变量和外部接口变量的状态,而且它们可能会被频繁调用。例如为上节范例“FBD_TEMP_LD”声明两个实例,并同时调用,其结果是独立的。见下图,程序中对-78-功能块输出的上升沿进行加一计数。此外,大量的输入和输出参数会导致功能块实例过多的存储器开销,使用VAR_IN_OUT代替VAR_INPUT和VAR_OUTPUT有助于减少对存储器的需要。5.8程序功能和功能块构成“