900 likes | 1.22k Views
软 PLC 编 程 实 操班(一). 主讲人:黄伟权. huangweiquan@ictsd.com.cn. 复习. 逻辑控制. 运动控制. 可视化. 1. 2. 3. 4. 软 PLC 实操班 1. 复习. PLC 控制原理:. 输入采样. 扫描周期. 运算操作. IO 刷新时间. 刷新输出. 复习. 软 PLC. 硬 PLC 由硬件或者一块专用的 ASIC 芯片来实现 PLC 指令的执行。.
E N D
软 PLC 编 程 实 操班(一) 主讲人:黄伟权 huangweiquan@ictsd.com.cn
复习 逻辑控制 运动控制 可视化 1 2 3 4 软PLC实操班1
复习 PLC控制原理: 输入采样 扫描周期 运算操作 IO刷新时间 刷新输出
复习 软PLC • 硬PLC由硬件或者一块专用的ASIC芯片来实现PLC指令的执行。 • 软PLC由一些通用的CPU或者MCU来实现PLC指令的解释或者编译执行。即以通用操作系统和 PC为软硬件平台,用软件实现传统硬件PLC 的控制功能。或者说,将PLC 的控制功能封装在软件内,运行于PC环境中。这样的控制系统提供了PLC 的相同功能,却具备了PC机的各种优点。它是计算机技术与控制技术的结合。 • 处理器: ARM、MIPS、PowerPC、X86等。 • 操作系统:Linux、WinCE、XP、XPE、Win7、QNX、VxWorks等。
复习 软PLC优势 • 硬PLC的不足:难以构建开放的硬件体系结构;工作人员必须经过较长时间的专业培训才能掌握某一种产品的编程方法。 • 软PLC的优势: • 1、具有开放的体系结构 • 2、遵循IEC 61131-3编程标准 • 3、充分利用 PC的资源 • 4、更强的数据处理能力 • 5、更加友好的人机界面,便于操作。 • 6、具有强大的网络通信功能 • 7、能执行比较复杂的控制算法 • 8、性价比高
复习 软PLC需要解决的问题 • 以PC为基础的控制引擎实时性问题。传统PLC具有硬实时性,正因为如此它才能提供快速、确定而且可重复的响应。要让通用的操作系统具有硬实时性,必须对它进行扩展,使得PC的控制任务具有最高的优先级,不因其它系统功能和用户程序的调用而被抢占。 • 以PC为基础的硬件可靠性问题。工业环境存在电磁干扰,粉尘,腐蚀性气体、液体,震动等一系列的干扰因素,对PLC硬件(处理器)可靠性提出很高的要求。
IEC 61131-3编程语言标准是第一个为工业控制系统提供标准化编程语言的国际标准。 复习 IEC 61131-3标准 • IEC 61131-3标准分为公用元素和编程语言两大部分,如下图所示。 配置 资源 任务 软件模型 存取路径 编程模型 全局变量 数据外部表示 公用元素 变量 程序组织单元 IEC 61131-3 顺序功能图表 指令表编程语言 文本化编程语言 结构化文本编程语言 编程语言 梯形图编程语言 图形化编程语言 功能块图编程语言
任务 复习 • 一个工程最多支持32个任务。 • 任务被配置后,可以控制一系列程序周期性地执行或者由一个的特定的事件触发启动。任务的类型有:循环、事件、自由运行、状态。 • 任务存在优先级,优先级数值越低,优先级越高;优先级高的任务优先执行。 • 任务的优先级与启动条件决定了任务的执行时序。 • IEC程序或功能块通常保持完全的待用状态,只有当 • 配置它的任务触发时, IEC程序或功能块才执行。
字符集 复习 • 字母不分大小写,字母的大小写具有相同的含义。 如abc 、Abc 与ABC是相同的变量名或者标识符。 标识符 • 标识符用于表示IEC语言中的不同元素,包括变量、标号、程序组织单元名等。 • 标识符使用字母、数字和下划线(_)组成,且首字符不能是数字。标识符不能连续使用多于一个的下划线,且总长度不能多于32个字符。 • 正确的 : ab_c, AB_de, _AbC • 错误的 : 1abc, __abc, a__bc
注释 复习 • 注释的内容用“(* *)”框住。 • 可将注释语放在语句以外的任何地方,指令表IL的注释必须放在语句之后。 • 注释语允许多行表示。 • 注释语不允许嵌套。 • 也可用“//”表示当前行“//”以后的内容为注释。只能用于单行注释,且可嵌套。
数值文字 复习 可编程控制器的编程语言中,数据外部表示由数值文字、字符串文字和时间文字组成。 • 数值文字用于定义一个数值,它可以是十进制或者其它进制的数。数值文字分为整数文字和实数文字两类。 • 整数文字可使用十进制、 十六进制(16#)、八进制(8#)和二进制(2#)表示。如: • 十进制表示: -123, +234, 0, 1_000 • 十六进制表示: 16#F1, 16#0A_1B • 二进制表示: 2#0001_0011_0111_1111 • 实数文字用十进制小数或者指数表示,如: • 1000.23 ; 1.23e3 ; 1.23E3
字符串文字 复习 • 字符串文字由单引号“ ‘’ ”括住相应字符来表示,如'ABC'、'2013-4-26'、‘1234abcd’ • 字符串文字用于字符串变量的赋值。
时间文字 复习 时间文字用于表示时间,有4种与时间有关的数据类型提供外部表示,分别为: • 持续时间(Duration) • 一天中的时间(Time of Day) • 日期(Date) • 日期和时刻(Date and Time)
持续时间 复习 持续时间的标识符是T或者TIME。数据格式为:T# xx d xx h xx m xx s xx ms。其中:T为持续时间标识符,#表示其后为立即数,d表示天,h表示小时,m表示分,s表示秒,ms表示毫秒。如: T#130S12ms 一天中的时间 一天中的时间标识符为TOD或者Time of Day。数据格式为:TOD#小时:分:秒。小时和分必须为整数,秒可以用小数表示,如:TOD#1:1:1.1。
日期 复习 日期标识符为D或者DATE。数据格式为:D#年-月-日。其中:D为日期标识符,#表示其后为立即数,年、月、日之间用“-”连接,如:D#2012-06-14。 日期和时刻 日期和时刻标识符为DT或者DATE_AND_TIME,数据格式为:DT#年-月-日-小时:分:秒。年月日的分界符与日期的分界符相同,用“-”分界;时分秒的分界符与时刻分界符相同,用“:”分界;日期与时刻之间用“-”分界。如: DT#2012-06-14-10:36:31。
基本数据类型是IEC61131-3中预先定义的标准化数据类型。基本数据类型是IEC61131-3中预先定义的标准化数据类型。 复习
衍生数据类型 复习 • 衍生数据类型是用户在基本数据类型的基础上,建立的由用户自定义的数据类型,也称为导出数据类型。衍生数据类型与基本数据类型的用法相同。 • 衍生数据类型有5种,分别是直接衍生的数据类型、枚举数据类型、子范围数据类型、数组数据类型、结构体数据类型。
数组数据类型 复习 • 数组是由多个相同的数据类型元素组成的集合。 • 数组数据类型声明的格式为: • <数组名> : ARRAY [<ll1>..<ul1] OF <elem. Type> 或者 • <数组名> : ARRAY [<ll1>..<ul1>,<ll2>..<ul2>] OF <elem. Type> • 其中ll1和ll2为数组维数的下限标识,ul1和ul2为数组维数的上限标识,数值范围必须为整数。如:intArray1 : ARRAY [1..5] OF INT := [1,2,3,4,5]; intArray2 : ARRAY[1..2,1..2] of INT := [4(1)]; • 一维数组元素存取:<数组名>[Index],如:intArray1 [1]。 • 二维数组元素的存取:<数组名>[Index1, Index2],如:intArray2 [1,2]。 • 使用数组时,引用的数组元素的下标不能超过其上下限。
结构体数据类型 复习 • 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 • 结构类型声明的格式:TYPE <结构名>: • STRUCT • <声明变量1> • … • <声明变量n> • END_STRUCT • END_TYPE • 结构类型声明的例子:TYPE CIRCLE: • STRUCT • X : real; • Y : real; • Radius : REAL; • END_STRUCT • END_TYPE • 程序中访问的结构体成员的方法:<结构名>.<成员名>,如在程序中定义了CIRCLE类型变量cCircle后,可用cCircle.X、cCircle.Y、cCircle. Radius访问cCircle变量里的相应成员。
枚举数据类型 复习 • 枚举类型声明的格式:TYPE <标识符>: • ( • <Enum_0> , • ... • <Enum_n> • ); • END_TYPE • 枚举数据类型声明例子: • TYPE MainState : • ( • InitState, • RunState, • FaultState • ); • END_TYPE • 缺省情况下,第一个枚举值为零,其后依次递增。 • 枚举变量可以取枚举值中的任何一个值。
直接衍生的数据类型 复习 直接衍生的数据类型格式为: TYPE <标识符> : <基本数据类型>; END_TYPE 直接衍生的数据类型例子: TYPE SWITCH : BOOL; END_TYPE( *给BOOL类型定义了一个别名SWITCH *) TYPE PI : REAL := 3.1415926; END_TYPE (*定义PI为初值是3.1415926的REAL数据类型。*) TYPE ARR : ARRAY [1..2,1..2] OF BOOL; END_TYPE (*定义ARR为2*2的二维数组数据类型*) TYPE SubByte : BYTE(0..10); END_TYPE(*定义SubByte是取值范围界定在0到10之间的BYTE数据类型*)
变量 复习 变量有直接变量和符号变量两种。直接变量类似传统可编程控制器的操作数,它对应某一可寻址的存储单元。符号变量用符号表示变量,某存储地址由编译器在编译时指定。
直接变量 复习 直接变量用百分数符号“%”开始,随后是位置前缀符号和大小前缀符号。如果有分级,则用无符号整数表示分级,并用小数点符号“.”分隔。如:%IX0.0
符号变量 复习 • 符号变量是指用标识符表示的变量,变量的存储地址可以不需要在定义时指定,而是在编译时由编译器分配。 • 可以用AT关键字给符号变量指定存储地址。如: • bBool AT %IX1 (*bBool存储在输入位1*) • bBool2 AT %QX1 (*bBoo2存储在输出位1*) • bBool3 AT %I* (*bBoo3存储在输出位置*) • bBool4 AT %M* (*bBoo4存储在某个寄存器*)
变量属性 复习 可通过设置变量的属性值将有关性能赋予变量。 除了以上的属性,IEC 61131-3标准还为变量提供了附加属性。
变量声明 复习 • 变量声明用于建立与数据类型的关系,即告诉编译器变量属于什么数据类型。可以在变量声明时指定变量初始值,如果不作指定,则变量被初始化为数据类型的默认值。 • 变量声明的格式 : • <直接变量/符号变量> : <数据类型> ; 或者 • <直接变量/符号变量> : <数据类型> := <初始值>; • 变量声明的例子: • bBool : BOOL; • str : STRING(32) := ‘1234567’; • arr : ARRAY[1..2] of INT := [1,2]; • tTime : TIME := t#2s;
功能 复习 • 功能是一种可以赋予参数,但自身没有静态变量(没有记忆)的程序组织单元。当使用相同的输入参数调用功能时,该功能的输出也相同。功能是可重复使用的软件元素,可用于标准规定的各种编程语言中。功能分为标准功能和用户自定义功能两类。 • 标准功能和用户自定义功能可在其它功能、功能块和程序中使用。 • 功能由关键字FUNCTION、功能名、冒号、返回值数据类型、变量声明和功能本体组成。可用文字或图形类编程语言编写功能本体。
复习 • 功能可以有多于一个的输入参数,但有且仅有一个返回值。 • 功能声明的例子: • 功能调用格式为:功能名(调用参数),如:
复习 IEC 61131-3标准定义了7类标准功能,它们的作为类似于数学的函数。 • 类型转换功能 • 数值类功能 • 算术类功能 • 位串类功能 • 选择类功能 • 比较类功能 • 字符串类功能 • 枚举数据类型功能
功能块 复习 • 功能块是在执行时能产生一个或者多个值的程序组织单元。功能块是面向对象特性的基本算法单元。既保留了自身特殊的内部变量(私有数据),也允许接受外部的数据输入及数量读出的对象行为特征。 • 功能块实例化后才能调用,同一功能块可同时建立多个实例。 • 功能块每次执行,会刷新内部变量和输出变量(如果程序有这样的操作),并且保存到下一次执行。因此,对于相同的输入,功能块每次执行输出的结果可能存在不同。
复习 • 功能块分为标准功能块和用户自定义功能块两类。标准功能块和用户自定义功能块可在其它功能块和程序中使用。 • 功能块由关键字FUNCTION_BLOCK、功能块名、变量声明和功能块本体组成。可用文字或图形类编程语言编写功能本体。
复习 • 功能块实例化的格式为:<功能块实例化名>:<功能块名>,如: fbCalculate : CALCULATE; • 功能块调用的格式为:<功能块名>(in1:=iVar1,…, inn:=iVarn,out1=>oVar1,…,outn=>oVarn),如: fbCalculate(cCircle := c1,area => a3,length => l1);
复习 IEC 61131-3标准定义了4类标准功能块。 • 双稳元素功能块 • 边缘检测功能块 • 计数器功能块 • 定时器功能块
程序 复习 • 程序是IEC 的逻辑执行主体,概念上与功能块类似,为用户程序提供可重复使用的软件组件。功能和功能块用于构成用户子程序,而程序则用于构成用户主程序。程序内部可定义输入变量、输出变量、输入输出变量以及内部变量。 • 典型的IEC程序由许多程序调用及互连的功能块组成,程序可调用其它程序、功能和功能块。 • 程序的执行通过任务来控制。 • 程序可以用不同的IEC编程语言来编写。
复习 • 程序由关键字PROGRAM、程序名、变量声明和程序本体组成。可用文字或图形类编程语言编写程序本体。 • 程序调用的格式:<程序名>(),如:PLC_PRG();
复习 • 文本语言 结构文本(ST - Structured Text) 指令表(IL - Instruction List) • 图形语言 功能块图(FBD- Function Block Diagram) 梯形图(LD - Ladder Diagram) 顺序功能表图(SFC - Sequential Function Chart)
复习 • 结构化文本是是高级编程语言,类似于高级计算机编程语言PASCAL。 • 由一系列语句,如选择语句、循环语句、顺序语句、赋值语句等组成程序组织单元的本体部分,用于实现一定功能。 • 不采用面向机器的操作符,而采用能够描述复杂控制要求的功能性抽象语句。因此具有清晰的程序结构,利于程序的分析。 • 具有强有力的控制命令语句结构,使复杂控制问题变得容易解决,但它的编译时间较长,执行速度慢。 • 在大中型的可编程控制器系统中,尤其涉及到大量的模拟量运算和处理时,常采用ST语言来描述控制系统中各个变量之间比较复杂的控制运算关系。
程序结构 复习 由结构化文本编写的程序是结构化的,它具有以下的特点: • 不存在跳转语句,通过条件语句实现程序分支。 • 语句与语句之间用分号“;”分隔,即分号表示一个语句的结束。 • 可以在语句的任何地方插入注释,注释的内容包含在“(*”和“*)”之间。但注释不能嵌套使用。 • 表达式是结构化文本编程语言的基本元素。表达式由操作符和操作数组成。
表达式 复习 • 结构化文本编程语言的表达式由操作符和操作数组成。其中操作数可以是常量、变量、功能调用或者其它表达式。如:1 + 1,a OR b等。 • 表达式用于生成处理语句所需的数值。表达式通常产生特定数据类型的数值,它既可以是基本数据类型,也可以是衍生数据类型。 • 表达式值的计算要依照一定的运算规则,优先级高的运算符优先参加运算,直到所有运算符被处理为止。 • 一个表达式能调用一个或多个操作符、变量和功能。
操作符 复习 结构化文本ST中运算符的优先级排列如下表所示,优先级从上到下递减。
操作数 复习 操作数可以是数据外部表达的数据文字、字符串文字、时间文字、单元素变量和多元素变量、功能调用和其它表达式。例如,操作数可以为:23、3.14、 ‘abcd’ 、T#300ms、cCircle.Radius、SIN(A)、(A>B)OR(C<=D)、fbRtrig.Q等。 语句 结构化文本编程语言中的语句有4种类型,即:赋值语句、功能和功能块控制语句、选择语句和循环语句,它们都以分号作为语句的结束标志。
赋值语句 复习 • 赋值语句是将赋值操作符号右侧表达式的值赋予在赋值操作符左侧的变量。赋值语句的格式为:变量:=表达式;其中“:=”是赋值操作符。 • 赋值操作符两端的数据类型必须相同,即赋值操作符左边的变量与赋值操作符右边的表达式值的数据类型必须相同。若不相同,则需要使用类型转换函数。
功能和功能块控制语句 复习 功能和功能块控制语句用于调用功能和功能块,它包括对功能和功能块的调用以及调用功能和功能块后返回控制两部分。 • 功能控制语句。功能调用后将返回值作为表达式的值赋值给变量,语句格式为:变量 := 功能名(参数列表);如:A := SIN(0.5); • 功能块调用语句。功能块只有经过实例化后才能调用,功能块调用语句格式为:功能块实例名(参数列表);。例如fbTon是定时器TON功能块的实例名,则调用fbTon的格式为:fbTon(IN := IN1,PT := T#100ms);
复习 • 功能块返回控制语句。功能块返回控制语句是功能块的输出语句,语句格式为:变量 := 功能块实例名.参数名;。例如fbTon是定时器TON功能块的实例名,则可用以下语句bBool := fbTon.Q读取TON功能块输出Q的值。此外,可以用“=>”操作符将功能块的输出直接赋值给某一变量,它使功能块的调用和返回控制语句合并,如: fbTon(IN := IN1,PT := T#100ms,Q => bBool);
选择语句 复习 选择语句是根据规定的条件选择表达式的值来确定语句的执行。选择语句有IF语句和CASE语句两种。结构化文本语言没有跳转指令,它是通过选择语句来实现程序的跳转执行(有条件执行)。
IF语句 复习 在IF语句中,只有当布尔表达式值为TRUE时,IF下的语句才被执行,否则执行ELSE下的语句。IF语句的格式为: IF 布尔表达式THEN 语句 END_IF IF 布尔表达式THEN 语句 ELSE 语句 END_IF IF 布尔表达式THEN 语句 ELSIF布尔表达式THEN 语句 ELSE 语句 END_IF IF语句至少由一个IF、THEN和END_IF构成。“ELSIF 布尔表达式 THEN”语句可以重复重复出现多次,且IF语句可以嵌套使用,即在IF语句下,又存在IF语句。
复习 IF a > b THEN nMax := a; END_IF IF a > b THEN nMax := a; ELSE nMax := b; END_IF IF c < a THEN d := a; ELSIF c > b THEN d := b; ELSE d := c; END_IF
CASE语句 复习 CASE语句由整型或者枚举数据类型表达式和若干组语句组成。 CASE <VAR1> OF <Value1> : 语句1 <Value2 > : 语句2 <Value n> : 语句n ELSE 语句n+1 END_CASE 计算VAR1表达式的值 =Value1? =Value2? =Value n? 否 否 否 是 是 是 语句组1 语句组2 语句组n 语句组n+1