在linux编程中若一个用户程序希望将一组数据传递给kernel有几种方式

在linux编程中若一个用户程序希望将一组数据传递给kernel有几种方式,第1张

教科书里的Linux代码例子都已作古,所以看到的代码不能当真,领会意思就行了

比如以前的init进程的启动代码

execve(init_filename,argv_init,envp_init)

现在改为

static void run_init_process(char *init_filename)

{

argv_init[0] = init_filename

kernel_execve(init_filename, argv_init, envp_init)

}

好的,聪明人就发现,linux内核中调用用户空间的程序可以使用init这样的方式,调用 kernel_execve

不过内核还是提供了更好的辅助接口call_usermodehelper,自然最后也是调用kernel_execve

调用特定的内核函数(系统调用)是 GNU/Linux 中软件开发的原本就有的组成部分。但如果方向反过来呢,内核空间调用念桥用户空间?确实有一些有这种特性的应用程序需要每天使用。例如,当内核找到一个设备, 这时需要加载某个模块,进程如何处理?动态模块加载在内核通过 usermode-helper 进程进行。

让我们从探索 usermode-helper 应用程序编程接口(API)以及在内核中使用的例子开始。 然后,使用 API 构造一个示例应用程序,以便更好地理解其工作原理与局限。

usermode-helper API

usermode-helper API 是个很仔嫌猛简单的 API,其选项为用户熟知。例如,要创建一个用户空间进程,通常只要设置名称为 executable,选项都为 executable,以及一组环境变量(指向 execve 主页)。创建内核进程也是一样。但由于创建内核空间进程,还需要设置一些额外选项。

内核版本

本文探讨的是 2.6.27 版内核的 usermode-helper API。

表 1 展示的是 usermode-helper API 中一组关键的内核函数

表 1. usermode-helper API 中的核心函数

API 函数

描述

call_usermodehelper_setup准备 user-land 调用的处理函数

call_usermodehelper_setkeys设置 helper 的会话密钥

call_usermodehelper_setcleanup为 helper 设置一个清空函数

call_usermodehelper_stdinpipe为 helper 创建 stdin 管道

call_usermodehelper_exec调用 user-land

表 2 中还有一些简化函数,它们封装了的几个内核函数(用一个调用代替多个调用)。这些简化函数在很多情况下都很有用,因此尽可能使用他们。

表 2. usermode-helper API 的简化

API 函数

描述

call_usermodehelper调用 user-land

call_usermodehelper_pipe使用 stdin 管道调用 user-land

call_usermodehelper_keys使用会话密钥调用 user-land

让我们先浏览一遍这些核心函数,然后探索简化函数提供了哪些功能。核心 API 使用了一个称为subprocess_info 结构的处理函数引用进行 *** 作。该结构(可在 ./kernel/kmod.c 中找到)集合了给定的 usermode-helper 实例的所有必需元素。该结构引用从 call_usermodehelper_setup 调用返回。该结构(以及后续调用)将会在 call_usermodehelper_setkeys(用于存储凭证)、call_usermodehelper_setcleanup 以及 call_usermodehelper_stdinpipe 的调用中进一步配置。最后,一旦配置完成,就可通过调用 call_usermodehelper_exec 来调用配置者斗好的用户模式应用程序。

声明

该方法提供了一个从内核调用用户空间应用程序必需的函数。尽管这项功能有合理用途,还应仔细考虑是否需要其他实现。这是一个方法,但其他方法会更合适。

核心函数提供了最大程度的控制,其中 helper 函数在单个调用中完成了大部分工作。管道相关调用(call_usermodehelper_stdinpipe 和 helper 函数 call_usermodehelper_pipe)创建了一个相联管道供 helper 使用。具体地说,创建了管道(内核中的文件结构)。用户空间应用程序对管道可读,内核对管道可写。对于本文,核心转储只是使用 usermode-helper 管道的应用程序。在该应用程序(./fs/exec.c do_coredump())中,核心转储通过管道从内核空间写到用户空间。

这些函数与 sub_processinfo 以及 subprocess_info 结构的细节之间的关系如图 1 所示。

图 1. Usermode-helper API 关系

表 2 中的简化函数内部执行 call_usermodehelper_setup 函数和 call_usermodehelper_exec 函数。表 2 中最后两个调用分别调用的是 call_usermodehelper_setkeys 和 call_usermodehelper_stdinpipe。可以在 ./kernel/kmod.c 找到 call_usermodehelper_pipe 和 call_usermodehelper 的代码,在 ./include/linux/kmod.h 中找到 call_usermodhelper_keys 的代码。

为什么要从内核调用用户空间应用程序?

现在让我们看一看 usermode-helper API 所使用的内核空间。表 3 提供的并不是专门的应用程序列表,而是一些有趣应用的示例。

表 3. 内核中的 usermode-helper API 应用程序

应用程序

源文件位置

内核模块调用./kernel/kmod.c

电源管理./kernel/sys.c

控制组./kernel/cgroup.c

安全密匙生成./security/keys/request_key.c

内核事件交付./lib/kobject_uevent.c

最直接的 usermode-helper API 应用程序是从内核空间加载内核模块。request_module 函数封装了 usermode-helper API 的功能并提供了简单的接口。在一个常用的模块中,内核指定一个设备或所需服务并调用 request_module 来加载模块。通过使用 usermode-helper API,模块通过 modprobe 加载到内核(应用程序通过 request_module 在用户空间被调用)。

与模块加载类似的应用程序是设备热插拔(在运行时添加或删除设备)。该特性是通过使用 usermode-helper API,调用用户空间的 /sbin/hotplug 工具实现的。

关于 usermode-helper API 的一个有趣的应用程序(通过 request_module) 是文本搜索 API(./lib/textsearch.c)。该应用程序在内核中提供了一个可配置的文本搜索基础架构。该应用程序使用 usermode-helper API 将搜索算法当作可加载模块进行动态加载。在 2.6.30 内核版本中,支持三个算法,包括 Boyer-Moore(./lib/ts_bm.c),简单固定状态机方法(./lib/ts_fsm.c),以及 Knuth-Morris-Pratt 算法(./lib/ts_kmp.c)。

usermode-helper API 还支持 Linux 按照顺序关闭系统。当需要系统关闭电源时,内核调用用户空间的 /sbin/poweroff 命令来完成。其他应用程序如 表 3 所示,表中附有其源文件位置。

Usermode-helper API 内部

在 kernel/kmod.c 中可以找到 usermode-helper API 的源代码 和 API(展示了主要的用作内核空间的内核模块加载器)。这个实现使用 kernel_execve 完成脏工作(dirty work)。请注意 kernel_execve是在启动时开启 init 进程的函数,而且未使用 usermode-helper API。

usermode-helper API 的实现相当简单直观(见图 2)。usermode-helper 从调用call_usermodehelper_exec 开始执行(它用于从预先配置好的 subprocess_info 结构中清除用户空间应用程序)。该函数接受两个参数:subprocess_info 结构引用和一个枚举类型(不等待、等待进程中止及等待进程完全结束)。subprocess_info(或者是,该结构的 work_struct 元素)然后被压入工作队列(khelper_wq),然后队列异步执行调用。

图 2. usermode-helper API 内部实现

当一个元素放入 khelper_wq 时,工作队列的处理函数就被调用(本例中是__call_usermodehelper),它在 khelper 线程中运行。该函数从将 subprocess_info 结构出队开始,此结构包含所有用户空间调用所需信息。该路径下一步取决于 wait 枚举变量。如果请求者想要等整个进程结束,包含用户空间调用(UMH_WAIT_PROC)或者是根本不等待(UMH_NO_WAIT),那么会从 wait_for_helper 函数创建一个内核线程。否则,请求者只是等待用户空间应用程序被调用(UMH_WAIT_EXEC),但并不完全。这种情况下,会为____call_usermodehelper() 创建一个内核线程。

在 wait_for_helper 线程中,会安装一个 SIGCHLD 信号处理函数,并为 ____call_usermodehelper 创建另一个内核线程。但在 wait_for_helper 线程中,会调用 sys_wait4 来等待____call_usermodehelper 内核线程(由 SIGCHLD 信号指示)结束。然后线程执行必要的清除工作(为UMH_NO_WAIT 释放结构空间或简单地向 call_usermodehelper_exec() 回送一个完成报告)。

函数 ____call_usermodehelper 是实际让应用程序在用户空间启动的地方。该函数首先解锁所有信号并设置会话密钥环。它还安装了 stdin 管道(如果有请求)。进行了一些安装以后,用户空间应用程序通过 kernel_execve(来自 kernel/syscall.c)被调用,此文件包含此前定义的 path、argv 清单(包含用户空间应用程序名称)以及环境。当该进程完成后,此线程通过调用 do_exit() 而产生。

该进程还使用了 Linux 的 completion,它是像信号一样的 *** 作。当 call_usermodehelper_exec 函数被调用后,就会声明 completion。当 subprocess_info 结构放入 khelper_wq 后,会调用wait_for_completion(使用 completion 变量作为参数)。请注意此变量会存储到 subprocess_info 结构作为 complete 字段。当子线程想要唤醒 call_usermodehelper_exec 函数,会调用内核方法complete,并判断来自 subprocess_info 结构的 completion 变量。该调用会解锁此函数使其能继续。可以在 include/linux/completion.h 中找到 API 的实现。

应用程序示例

现在,让我们看看 usermode-helper API 的简单应用。首先看一下标准 API,然后学习如何使用 helper 函数使事情更简单。

在该例中,首先开发了一个简单的调用 API 的可加载内核模块。清单 1 展示了样板模块功能,定义了模块入口和出口函数。这两个函数根据模块的 modprobe(模块入口函数)或 insmod(模块入口函数),以及 rmmod(模块出口函数)被调用。

清单 1. 模块样板函数

#include

#include

#include

MODULE_LICENSE( "GPL" )

static int __init mod_entry_func( void )

{

return umh_test()

}

static void __exit mod_exit_func( void )

{

return

}

module_init( mod_entry_func )

module_exit( mod_exit_func )

usermode-helper API 的使用如 清单 2 所示,其中有详细描述。函数开始是声明所需变量和结构。以subprocess_info 结构开始,它包含所有的执行用户空间调用的信息。该调用在调用call_usermodehelper_setup 时初始化。下一步,定义参数列表,使 argv 被调用。该列表与普通 C 程序中的 argv 列表类似,定义了应用程序(数组第一个元素)和参数列表。需要 NULL 终止符来提示列表末尾。请注意这里的 argc 变量(参数数量)是隐式的,因为 argv 列表的长度已经知道。该例中,应用程序名是 /usr/bin/logger,参数是 help!,然后是 NULL 终止符。下一个所需变量是环境数组(envp)。该数组是一组定义用户空间应用程序执行环境的参数列表。本例中,定义一些常用的参数,这些参数用于定义 shell 并以 NULL 条目结束。

清单 2. 简单的 usermode_helper API 测试

static int umh_test( void )

{

struct subprocess_info *sub_info

char *argv[] = { "/usr/bin/logger", "help!", NULL }

static char *envp[] = {

"HOME=/",

"TERM=linux",

"PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL }

sub_info = call_usermodehelper_setup( argv[0], argv, envp, GFP_ATOMIC )

if (sub_info == NULL) return -ENOMEM

return call_usermodehelper_exec( sub_info, UMH_WAIT_PROC )

}

下一步,调用 call_usermodehelper_setup 来创建已初始化的 subprocess_info 结构。请注意使用了先前初始化的变量以及指示用于内存初始化的 GFP 屏蔽第四个参数。在安装函数内部,调用了kzalloc(分配内核内存并清零)。该函数需要 GFP_ATOMIC 或 GFP_KERNEL 标志(前者定义调用不可以休眠,后者定义可以休眠)。快速测试新结构(即,非 NULL)后,使用 call_usermodehelper_exec 函数继续调用。该函数使用 subprocess_info 结构以及定义是否等待的枚举变量(在 “Usermode-helper API 内部” 一节中有描述)。全部完成! 模块一旦加载,就可以在 /var/log/messages 文件中看到信息。

还可以通过 call_usermodehelper API 函数进一步简化进程,它同时执行 call_usermodehelper_setup和 call_usermodehelper_exec 函数。如清单 3 所示,它不仅删除函数,还消除了调用者管理subprocess_info 结构的必要性。

清单 3. 更简单的 usermode-helper API 测试

static int umh_test( void )

{

char *argv[] = { "/usr/bin/logger", "help!", NULL }

static char *envp[] = {

"HOME=/",

"TERM=linux",

"PATH=/sbin:/bin:/usr/sbin:/usr/bin", NULL }

return call_usermodehelper( argv[0], argv, envp, UMH_WAIT_PROC )

}

请注意在清单 3 中,有着同样的安装并调用(例如初始化 argv 和 envp 数组)的需求。此处惟一的区别是 helper 函数执行 setup 和 exec 函数。

PLC的发展史

PLC即可编程控制器(Programmable logic Controller,是指以计算机技术为基础的新型工业控制装置。在1987年国际电工委员会(International Electrical Committee)颁布的PLC标准草案中对PLC做了如下定义:

PLC英文全称Programmable Logic Controller ,中文全称为可编程逻辑控制器,定义是:一种数字运算 *** 作的电子系统,专为在工业环境应用而设计的。它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算,顺序控制,定时,计数与算术 *** 作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程.PLC是可编程逻辑电路,也是一种和硬件结合很紧密的语言,在半导体方面有很重要的应用,可以说有半导体的地方就有PLC

“PLC是一种专门为在工业环境下应用而设计的数字运算 *** 作的电子装置。它采用可以编制程序的存储器,用来在其内部存储执行逻辑运算、顺序运算、计时、计数和算术运算等 *** 作的指令,并能通过数字式或模拟式的输入和输出,控制各种类型的机械或生产过程。PLC及其有关的外围设备都应该按易于与工业控制系统形成一个整体,易于扩展其功能的原则而设计。”

一、PLC的产生

1.继-接控制回顾

由学生回答继电器(接触器)的结构、原理、画出三相异步电机启-停的主电路图、控制电路图

由学生归纳出继-接控制的不足,从而引出“PLC的产生”

2.PLC的产生

68年美国通用汽车公司(GM)招标要求:

(1)软连接代替硬接线 (2)维护方便 (3)可靠性高于继电器控制柜 (4)体积小于继电器控制柜 (5)成本低于继电器控制柜 (6)有数据通讯功能 (7)输入115V (8)可在恶劣环境下工作 (9)扩展时,原系统变更要少 (10)用户程序存储容量可扩展到4K

核心思想:

•用程序代替硬接线

•输入/输出电平可与外部装置直接相联

•结构易于扩展

这是PLC的雏形。

69年美国DEC公司研制出世界上第一台PLC(PDP-14),并在GM公司汽车生产线上应用成功

PLC的诞生:

•1969年,美国研制出世界第一台PDP-14

•1971年,日本研制出第一台DCS-8

•1973年,德国研制出第一台PLC

•1974年,中国研制出第一台PLC

二、PLC的特碰腔亩点、现状与发展

(一)特点

(1)体积小 (2)可靠性高 (3)柔性好,可在线更改程序 (4)对环境条件无要求 (笑森5)价格低廉……具备招标要求的所有功能

(二)现状

80%以上的行业,80%以上的设备均可使用PLC

(三)发展

发展史:

第一代:1969年~1972年,代表产品有

•美国DEC公司的PDP-14/L

•日本立石电机公司的SCY-022

•日本北辰电机公司的HOSC-20

第二代:1973年~1975年,代表产品有

•美国GE公司的LOGISTROT

•德国SIEMENS公司的SIMATIC S3、S4系列

•日本富士电机公司的SC系列

第三代:圆做1976~1983年,代表产品有

•美国GOULD公司的M84、484、584、684、884

•德国SIEMENS公司的SIMATIC S5系列

•日本三菱公司的MELPLAC-50、550

第四代:1983年~现在,代表产品有

•美国GOULD公司的A5900

•德国西门子公司的S7系列

发展方向:

•产品规模向两极分化

•处理模拟量

•追求高可靠性

•通讯接口和智能模块

•系统 *** 作站配高分辨率的监视器

•追求软、硬件标准化

三、PLC的分类

•按结构分:

•整体型

•组合型

•按I/O点数及内存容量分:

•超小型:小于64点,256Byet~1KB

•小 型:65~128点,1~3。6KB

•中 型:129~512点,3。6~13KB

•大 型:513~896点,大于13KB

•超大型:大于896点,大于13KB

四、网络型PLC与DCS的关系

DCS起源于模拟量

PLC起源于开关量

二者相互渗透、取长补短,功能上日趋接近,使数字世界、模拟世界更加模糊

决定DCS与PLC应用面大小的是其性能/价格比

1、PLC即可编程控制器(Programmable logic Controller,是指以计算机技术为基础的新型工业控制装置。在1987年国际电工委员会(International Electrical Committee)颁布的PLC标准草案中对PLC做了如下定义:

PLC英文全称Programmable Logic Controller ,中文全称为可编程逻辑控制器,定义是:一种数字运算 *** 作的电子系统,专为在工业环境应用而设计的。它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算,顺序控制,定时,计数与算术 *** 作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程.PLC是可编程逻辑电路,也是一种和硬件结合很紧密的语言,在半导体方面有很重要的应用,可以说有半导体的地方就有PLC

“PLC是一种专门为在工业环境下应用而设计的数字运算 *** 作的电子装置。它采用可以编制程序的存储器,用来在其内部存储执行逻辑运算、顺序运算、计时、计数和算术运算等 *** 作的指令,并能通过数字式或模拟式的输入和输出,控制各种类型的机械或生产过程。PLC及其有关的外围设备都应该按易于与工业控制系统形成一个整体,易于扩展其功能的原则而设计。”

PLC的特点

2.1可靠性高,抗干扰能力强

高可靠性是电气控制设备的关键性能。PLC由于采用现代大规模集成电路技术,采用严格的生产工艺制造,内部电路采取了先进的抗干扰技术,具有很高的可靠性。例如三菱公司生产的F系列PLC平均无故障时间高达30万小时。一些使用冗余CPU的PLC的平均无故障工作时间则更长。从PLC的机外电路来说,使用PLC构成控制系统,和同等规模的继电接触器系统相比,电气接线及开关接点已减少到数百甚至数千分之一,故障也就大大降低。此外,PLC带有硬件故障自我检测功能,出现故障时可及时发出警报信息。在应用软件中,应用者还可以编入外围器件的故障自诊断程序,使系统中除PLC以外的电路及设备也获得故障自诊断保护。这样,整个系统具有极高的可靠性也就不奇怪了。

2.2配套齐全,功能完善,适用性强

PLC发展到今天,已经形成了大、中、小各种规模的系列化产品。可以用于各种规模的工业控制场合。除了逻辑处理功能以外,现代PLC大多具有完善的数据运算能力,可用于各种数字控制领域。近年来PLC的功能单元大量涌现,使PLC渗透到了位置控制、温度控制、CNC等各种工业控制中。加上PLC通信能力的增强及人机界面技术的发展,使用PLC组成各种控制系统变得非常容易。

2.3易学易用,深受工程技术人员欢迎

PLC作为通用工业控制计算机,是面向工矿企业的工控设备。它接口容易,编程语言易于为工程技术人员接受。梯形图语言的图形符号与表达方式和继电器电路图相当接近,只用PLC的少量开关量逻辑控制指令就可以方便地实现继电器电路的功能。为不熟悉电子电路、不懂计算机原理和汇编语言的人使用计算机从事工业控制打开了方便之门。

2.4系统的设计、建造工作量小,维护方便,容易改造

PLC用存储逻辑代替接线逻辑,大大减少了控制设备外部的接线,使控制系统设计及建造的周期大为缩短,同时维护也变得容易起来。更重要的是使同一设备经过改变程序改变生产过程成为可能。这很适合多品种、小批量的生产场合。

2.5体积小,重量轻,能耗低

以超小型PLC为例,新近出产的品种底部尺寸小于100mm,重量小于150g,功耗仅数瓦。由于体积小很容易装入机械内部,是实现机电一体化的理想控制设备。

3。PLC基础知识

1.1 PLC的发展历程 在工业生产过程中,大量的开关量顺序控制,它按照逻辑条件进行顺序动作,并按照逻辑关系进行连锁保护动作的控制,及大量离散量的数据采集。传统上,这些功能是通过气动或电气控制系统来实现的。

4. PLC的应用领域

目前,PLC在国内外已广泛应用于钢铁、石油、化工、电力、建材、机械制造、汽车、轻纺、交通运输、环保及文化娱乐等各个行业,使用情况大致可归纳为如下几类。

4.1开关量的逻辑控制

这是PLC最基本、最广泛的应用领域,它取代传统的继电器电路,实现逻辑控制、顺序控制,既可用于单台设备的控制,也可用于多机群控及自动化流水线。如注塑机、印刷机、订书机械、组合机床、磨床、包装生产线、电镀流水线等。

4.2模拟量控制

在工业生产过程当中,有许多连续变化的量,如温度、压力、流量、液位和速度等都是模拟量。为了使可编程控制器处理模拟量,必须实现模拟量(Analog)和数字量(Digital)之间的A/D转换及D/A转换。PLC厂家都生产配套的A/D和D/A转换模块,使可编程控制器用于模拟量控制。

4.3运动控制

PLC可以用于圆周运动或直线运动的控制。从控制机构配置来说,早期直接用于开关量I/O模块连接位置传感器和执行机构,现在一般使用专用的运动控制模块。如可驱动步进电机或伺服电机的单轴或多轴位置控制模块。世界上各主要PLC厂家的产品几乎都有运动控制功能,广泛用于各种机械、机床、机器人、电梯等场合。

4.4过程控制

过程控制是指对温度、压力、流量等模拟量的闭环控制。作为工业控制计算机,PLC能编制各种各样的控制算法程序,完成闭环控制。PID调节是一般闭环控制系统中用得较多的调节方法。大中型PLC都有PID模块,目前许多小型PLC也具有此功能模块。PID处理一般是运行专用的PID子程序。过程控制在冶金、化工、热处理、锅炉控制等场合有非常广泛的应用。

4.5数据处理

现代PLC具有数学运算(含矩阵运算、函数运算、逻辑运算)、数据传送、数据转换、排序、查表、位 *** 作等功能,可以完成数据的采集、分析及处理。这些数据可以与存储在存储器中的参考值比较,完成一定的控制 *** 作,也可以利用通信功能传送到别的智能装置,或将它们打印制表。数据处理一般用于大型控制系统,如无人控制的柔性制造系统;也可用于过程控制系统,如造纸、冶金、食品工业中的一些大型控制系统。

4.6通信及联网

PLC通信含PLC间的通信及PLC与其它智能设备间的通信。随着计算机控制的发展,工厂自动化网络发展得很快,各PLC厂商都十分重视PLC的通信功能,纷纷推出各自的网络系统。新近生产的PLC都具有通信接口,通信非常方便。

5. PLC的国内外状况

在工业生产过程中,大量的开关量顺序控制,它按照逻辑条件进行顺序动作,并按照逻辑关系进行连锁保护动作的控制,及大量离散量的数据采集。传统上,这些功能是通过气动或电气控制系统来实现的。1968年美国GM(通用汽车)公司提出取代继电气控制装置的要求,第二年,美国数字设备公司(DEC)研制出了基于集成电路和电子技术的控制装置,首次采用程序化的手段应用于电气控制,这就是第一代可编程序控制器,称Programmable ,是世界上公认的第一台PLC.

限于当时的元器件条件及计算机发展水平,早期的PLC主要由分立元件和中小规模集成电路组成,可以完成简单的逻辑控制及定时、计数功能。20世纪70年代初出现了微处理器。人们很快将其引入可编程控制器,使PLC增加了运算、数据传送及处理等功能,完成了真正具有计算机特征的工业控制装置。为了方便熟悉继电器、接触器系统的工程技术人员使用,可编程控制器采用和继电器电路图类似的梯形图作为主要编程语言,并将参加运算及处理的计算机存储元件都以继电器命名。此时的PLC为微机技术和继电器常规控制概念相结合的产物。个人计算机(简称PC)发展起来后,为了方便,也为了反映可编程控制器的功能特点,可编程序控制器定名为Programmable Logic Controller(PLC)。

20世纪70年代中末期,可编程控制器进入实用化发展阶段,计算机技术已全面引入可编程控制器中,使其功能发生了飞跃。更高的运算速度、超小型体积、更可靠的工业抗干扰设计、模拟量运算、PID功能及极高的性价比奠定了它在现代工业中的地位。20世纪80年代初,可编程控制器在先进工业国家中已获得广泛应用。这个时期可编程控制器发展的特点是大规模、高速度、高性能、产品系列化。这个阶段的另一个特点是世界上生产可编程控制器的国家日益增多,产量日益上升。这标志着可编程控制器已步入成熟阶段。

上世纪80年代至90年代中期,是PLC发展最快的时期,年增长率一直保持为30~40%。在这时期,PLC在处理模拟量能力、数字运算能力、人机接口能力和网络能力得到大幅度提高,PLC逐渐进入过程控制领域,在某些应用上取代了在过程控制领域处于统治地位的DCS系统。

20世纪末期,可编程控制器的发展特点是更加适应于现代工业的需要。从控制规模上来说,这个时期发展了大型机和超小型机;从控制能力上来说,诞生了各种各样的特殊功能单元,用于压力、温度、转速、位移等各式各样的控制场合;从产品的配套能力来说,生产了各种人机界面单元、通信单元,使应用可编程控制器的工业控制设备的配套更加容易。目前,可编程控制器在机械制造、石油化工、冶金钢铁、汽车、轻工业等领域的应用都得到了长足的发展。

我国可编程控制器的引进、应用、研制、生产是伴随着改革开放开始的。最初是在引进设备中大量使用了可编程控制器。接下来在各种企业的生产设备及产品中不断扩大了PLC的应用。目前,我国自己已可以生产中小型可编程控制器。上海东屋电气有限公司生产的CF系列、杭州机床电器厂生产的DKK及D系列、大连组合机床研究所生产的S系列、苏州电子计算机厂生产的YZ系列等多种产品已具备了一定的规模并在工业产品中获得了应用。此外,无锡华光公司、上海乡岛公司等中外合资企业也是我国比较著名的PLC生产厂家。可以预期,随着我国现代化进程的深入,PLC在我国将有更广阔的应用天地。

6. PLC未来展望

21世纪,PLC会有更大的发展。从技术上看,计算机技术的新成果会更多地应用于可编程控制器的设计和制造上,会有运算速度更快、存储容量更大、智能更强的品种出现;从产品规模上看,会进一步向超小型及超大型方向发展;从产品的配套性上看,产品的品种会更丰富、规格更齐全,完美的人机界面、完备的通信设备会更好地适应各种工业控制场合的需求;从市场上看,各国各自生产多品种产品的情况会随着国际竞争的加剧而打破,会出现少数几个品牌垄断国际市场的局面,会出现国际通用的编程语言;从网络的发展情况来看,可编程控制器和其它工业控制计算机组网构成大型的控制系统是可编程控制器技术的发展方向。目前的计算机集散控制系统DCS(Distributed Control System)中已有大量的可编程控制器应用。伴随着计算机网络的发展,可编程控制器作为自动化控制网络和国际通用网络的重要组成部分,将在工业及工业以外的众多领域发挥越来越大的作用。

1.2 PLC的构成

从结构上分,PLC分为固定式和组合式(模块式)两种。固定式PLC包括CPU板、I/O板、显示面板、内存块、电源等,这些元素组合成一个不可拆卸的整体。模块式PLC包括CPU模块、I/O模块、内存、电源模块、底板或机架,这些模块可以按照一定规则组合配置。

1.3 CPU的构成

CPU是PLC的核心,起神经中枢的作用,每套PLC至少有一个CPU,它按PLC的系统程序赋予的功能接收并存贮用户程序和数据,用扫描的方式采集由现场输入装置送来的状态或数据,并存入规定的寄存器中,同时,诊断电源和PLC内部电路的工作状态和编程过程中的语法错误等。进入运行后,从用户程序存贮器中逐条读取指令,经分析后再按指令规定的任务产生相应的控制信号,去指挥有关的控制电路。

CPU主要由运算器、控制器、寄存器及实现它们之间联系的数据、控制及状态总线构成,CPU单元还包括外围芯片、总线接口及有关电路。内存主要用于存储程序及数据,是PLC不可缺少的组成单元。

在使用者看来,不必要详细分析CPU的内部电路,但对各部分的工作机制还是应有足够的理解。CPU的控制器控制CPU工作,由它读取指令、解释指令及执行指令。但工作节奏由震荡信号控制。运算器用于进行数字或逻辑运算,在控制器指挥下工作。寄存器参与运算,并存储运算的中间结果,它也是在控制器指挥下工作。

CPU速度和内存容量是PLC的重要参数,它们决定着PLC的工作速度,IO数量及软件容量等,因此限制着控制规模。

1.4 I/O模块

PLC与电气回路的接口,是通过输入输出部分(I/O)完成的。I/O模块集成了PLC的I/O电路,其输入暂存器反映输入信号状态,输出点反映输出锁存器状态。输入模块将电信号变换成数字信号进入PLC系统,输出模块相反。I/O分为开关量输入(DI),开关量输出(DO),模拟量输入(AI),模拟量输出(AO)等模块。

常用的I/O分类如下:

开关量:按电压水平分,有220VAC、110VAC、24VDC,按隔离方式分,有继电器隔离和晶体管隔离。

模拟量:按信号类型分,有电流型(4-20mA,0-20mA)、电压型(0-10V,0-5V,-10-10V)等,按精度分,有12bit,14bit,16bit等。

除了上述通用IO外,还有特殊IO模块,如热电阻、热电偶、脉冲等模块。

按I/O点数确定模块规格及数量,I/O模块可多可少,但其最大数受CPU所能管理的基本配置的能力,即受最大的底板或机架槽数限制。

1.5 电源模块

PLC电源用于为PLC各模块的集成电路提供工作电源。同时,有的还为输入电路提供24V的工作电源。电源输入类型有:交流电源(220VAC或110VAC),直流电源(常用的为24VDC)。

1.6 底板或机架

大多数模块式PLC使用底板或机架,其作用是:电气上,实现各模块间的联系,使CPU能访问底板上的所有模块,机械上,实现各模块间的连接,使各模块构成一个整体。

1.7 PLC系统的其它设备

1.7.1

编程设备:编程器是PLC开发应用、监测运行、检查维护不可缺少的器件,用于编程、对系统作一些设定、监控PLC及PLC所控制的系统的工作状况,但它不直接参与现场控制运行。小编程器PLC一般有手持型编程器,目前一般由计算机(运行编程软件)充当编程器。也就是我们系统的上位机。

1.7.2 人机界面:最简单的人机界面是指示灯和按钮,目前液晶屏(或触摸屏)式的一体式 *** 作员终端应用越来越广泛,由计算机(运行组态软件)充当人机界面非常普及。

1.8 PLC的通信联网

依靠先进的工业网络技术可以迅速有效地收集、传送生产和管理数据。因此,网络在自动化系统集成工程中的重要性越来越显著,甚至有人提出"网络就是控制器"的观点说法。

PLC具有通信联网的功能,它使PLC与PLC

之间、PLC与上位计算机以及其他智能设备之间能够交换信息,形成一个统一的整体,实现分散集中控制。多数PLC具有RS-232接口,还有一些内置有支持各自通信协议的接口。PLC的通信现在主要采用通过多点接口(MPI)的数据通讯、PROFIBUS

或工业以太网进行联网。

2 PLC控制系统的设计基本原则

2.1 最大限度的满足被控对象的控制要求。

2.2 在满足控制要求的前提下,力求使控制系统简单、经济、使用和维护方便。

2.3 保证控制系统安全可靠。

2.4 考虑到生产的发展和工艺的改进在选择PLC容量时应适当留有余量。

3 PLC软件系统及常用编程语言

3.1 PLC软件系统由系统程序和用户程序两部分组成。系统程序包括监控程序、编译程序、诊断程序等,主要用于管理全机、将程序语言翻译成机器语言,诊断机器故障。系统软件由PLC厂家提供并已固化在EPROM中,不能直接存取和干预。用户程序是用户根据现场控制要求,用PLC的程序语言编制的应用程序(也就是逻辑控制)用来实现各种控制。STEP7是用于SIMATIC可编程逻辑控制器组态和编程的标准软件包,也就是用户程序,我们就是使用STEP7来进行硬件组态和逻辑程序编制,以及逻辑程序执行结果的在线监视。

3.2 PLC提供的编程语言

3.2.1 标准语言梯形图语言也是我们最常用的一种语言,它有以下特点

3.2.1.1 它是一种图形语言,沿用传统控制图中的继电器触点、线圈、串联等术语和一些图形符号构成,左右的竖线称为左右母线。

3.2.1.2 梯形图中接点(触点)只有常开和常闭,接点可以是PLC输入点接的开关也可以是PLC内部继电器的接点或内部寄存器、计数器等的状态。

3.2.1.3 梯形图中的接点可以任意串、并联,但线圈只能并联不能串联。

3.2.1.4 内部继电器、计数器、寄存器等均不能直接控制外部负载,只能做中间结果供CPU内部使用。

3.2.1.5 PLC是按循环扫描事件,沿梯形图先后顺序执行,在同一扫描周期中的结果留在输出状态暂存器中所以输出点的值在用户程序中可以当做条件使用。

3.2.2 语句表语言,类似于汇编语言。

3.2.3 逻辑功能图语言,沿用半导体逻辑框图来表达,一般一个运算框表示一个功能左边画输入、右边画输出。

4 STEP7程序的使用

4.1 创建一个项目结构,项目就象一个文件夹,所有数据都以分层的结构存在于其中,任何时候你都可以使用。在创建一个项目之后,所有其他任务都在这个项目下执行。

4.2 组态一个站,组态一个站就是指定你要使用的可编程控制器,例如S7300、S7400等。

4.3 组态硬件,组态硬件就是在组态表中指定你的控制方案所要使用的模板以及在用户程序中以什么样的地址来访问这些模板,地址一般不用修改由程序自动生成。模板的特性也可以用参数进行赋值。

4.4 组态网络和通讯连接,通讯的基础是预先组态网络,也就是要创建一个满足你的控制方案的子网,设置网络特性、设置网络连接特性以及任何联网的站所需要的连接。网络地址也是程序自动生成如果没有更改经验一定不要修改。

4.5 定义符号,可以在符号表中定义局部或共享符号,在你的用户程序中用这些更具描述性的符号名替代绝对地址。符号的命名一般用字母编写不超过8个字节,最好不要使用很长的汉字进行描述,否则对程序的执行有很大的影响。

4.6 创建程序,用梯形图编程语言创建一个与模板相连结或与模板无关的程序并存储。创建程序是我们控制工程的重要工作之一,一般可以采用线形编程(基于一个块内,OB1)、分布编程(编写功能块FB,OB1组织调用)、结构化编程(编写通用块)。我们最常采用的是结构化编程和分布编程配合使用,很少采用线形编程。

4.7 下载程序到可编程控制器,完成所有的组态、参数赋值和编程任务之后,可以下载整个用户程序到可编程控制器。在下载程序时可编程控制器必须在允许下载的工作模式下(STOP或RUN-P),

RUN-P模式表示,这个程序将一次下载一个块,如果重写一个旧的CPU程序就可能出现冲突,所以一般在下载前将CPU切换到STOP模式。

5 WINCC程序的使用

5.1 简介,WINCC是在生产和过程自动化中解决可视化和控制任务的工业技术中性系统。具有控制自动化过程的强大功能,是基于个人计算机的 *** 作监视系统,它很容易结合标准的和用户的程序建立人机界面精确的满足生产实际要求。WINCC有两个版本RC版(具有组态和开发环境)、RT版(只有运行环境),我们一般使用的是RC版。

5.2 WINCC简单使用步骤

5.2.1 变量管理,首先确定通讯方式安装驱动程序,然后定义内部变量和外部变量,外部变量是受你买的WINCC软件授权限制的最大授权64K字节,内部变量没有限制。

5.2.2 画面生成,进入图形编辑器,图形编辑器是一种用于创建过程画面的面向矢量的作图程序。也可以使用包含在对象和样式库中的众多的图形对象来创建复杂的过程画面。可以通过动作编程将动态添加到单个图形对象上。

5.2.3 报警记录设置,报警记录提供了显示和 *** 作选项来获取和归档结果。可以任意地选择消息块、消息级别、消息类型、消息显示以及报表。为了在运行中显示消息,可以使用包含在图形编辑器中的对象库中的报警控件。

5.2.4 变量记录,变量记录是用来从运行过程中采集数据并准备将它们显示和归档。

5.2.5 报表组态,报表组态是通过报表编辑器来实现的。是为消息、 *** 作、归档内容和当前或已归档的数据定时器或事件控制文档的集成的报表系统,可以自由选择用户报表的形式。

5.2.6 全局脚本的应用,全局脚本就是C语言函数和动作的通称,根据不同的类型脚本被用于给对象组态动作并通过系统内部C语言编译器来处理。全局脚本动作用于过程执行的运行中。一个触发可以开始这些动作的执行。

5.2.7 用户管理器设置,用户管理器用于分配和控制用户的单个组态和运行系统编辑器的访问权限。每建立一个用户,就设置了WINCC功能的访问权利并独立的分配给此用户。至多可分配999个不同的授权。

5.2.8 交叉表索引,交叉索引用于为对象寻找和显示所有使用处,例如变量、画面和函数等。使用“链接”功能可以改变变量名称而不会导致组态不一致

可以这么理解。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的猜液功能。函数按照来源可大体分为:库函数和自定义函数:库函数:由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用自定义函数:由用户按需要写的函数穗侍物,用户将程序按照功能块划分(此处谈姿为面向功能的分析方法,以后你可能会接触到另一种被称为OOAD的面向对象的划分),根据不同的功能定义函数,实现此功能。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12541002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存