PLC及其编程起步[.net]

声明:本人非专业人士,也未从事该领域的工作,若有错误地方,请多包涵。

概述

在工业控制领域,常常提到PLC,也就是Programmable Logic Controller(PLC)。随着工业的发展,传统的智能设备之间及智能设备与控制系统之间采用专门驱动程序实现信息共享的通讯方式已不能满足工业控制系统的发展需要。因此,为了能够解决工业系统硬件设备的升级改变为软件系统带来的不便,更好的实现不同设备厂家硬件产品的集成互连,增强系统的稳定性与可靠性,工业自动化软件接口的标准化、统一化成为工业控制领域必须面临的一个问题。

于是出现了PLC服务器,由服务器负责与底层的硬件通讯;PLC客户端不再直接与硬件直接通讯,而是通过PLC服务器中转。如此,客户端不需要再针对不同的硬件使用不同的通讯协议,而是使用统一的协议与PLC服务器通讯,大大简化了开发难度和时间。其架构示意如下图所示(图中使用的是OPC的服务器,下面会讲到)

DDE&OPC

PLC服务器与客户端之间通讯方式大体分为2种:DDE和OPC。

1. DDE

DDE即动态数据交换,最早由微软提出。动态数据交换基于windows消息机制,各应用程序间通过传递消息进行对话交换信息。windows dde消息传递采用client/server模式,客户(client)是数据的请求和接受者,而服务器(server)是数据的提供者,两者之间通过请求、应答、传输三个步骤来完成数据的传送。dde协议使用服务(service)、主题(topic)和数据项(item)三级命名来标识dde所传递的数据单元。一般情况下,服务(service)就是应用程序的文件名,主题是对服务器有意义的信息单元。每次dde客户与服务程序之间的对话都是先由客户启动的,所以在每次客户启动之前,dde服务器应当首先投入运行。

DDE的工作方式有冷连接(cool link)、温连接(warm link)和热连接(hot link)等3种。在冷连接方式下,当server中的数据发生变化后不主动通知client,但client可以随时从server读写数据;在温连接方式下,当server中的数据发生变化后马上通知client,client得到通知后将数据取回;在热连接方式下,当server中的数据发生变化后马上通知client,同时将变化的数据直接送给client。

DDE的网络形式称为netdde,它包含了dde的全部特征,是动态数据交换(dde)的扩充,可以在跨越网络的计算机之间使用。采用netdde后,两个或更多网络上的应用能够通过dde共享来建立网络上不同工作站之间的连接,从而实现站站之间的动态信息共享。

如果需要在.net平台开发PLC,可以使用NDde:https://ndde.codeplex.com/。这是一个开源库,dde的方式比较简单,基本上参照例子可以完成需要的功能。需要测试时,直接打开一个excel就可以作为服务器,连接格式:excel|sheet1!’r1c1’,“excel”是固定的,“sheet1”是指第一个sheet,“r1c1”是指第一行第一列。

DDE已经逐渐被淘汰,微软也已经把DDE从新操作系统中去除(貌似xp是最后一版)。

2.OPC

   OPC全称是OLE
for Process Control,相比较DDE复杂多。最初阶段的opc规范是由opc基金会的先驱fisher-rosemount、rockwell、opto 22、intellution、intuitive technology公司于1996年8月发布的,目前opc基金会成员在全球已超过300多个,其中包括世界上几乎所有主要的控制系统、仪器仪表、过程控制系统生产厂家。

opc以ole/com/dcom技术为基础,是ole(object linking and embedding)for process control的缩写,是微软公司的对象链接和嵌入技术在过程控制方面的应用。与dde一样,opc也采用client/server模式。opc服务器是数据源的提供者,数据源可以是plc、dcs、条形码读取器等控制设备,随控制系统的构成不同,作为数据源的opc服务器既可以是和opc应用程序在同一台计算机上运行的本地opc服务器,也可以是在另外计算机上运行的远程opc服务器。opc客户是数据的使用者,它按照opc接口规范从opc服务器获取所需要的数据。

opc服务器主要包括三部分:服务器(server)、组(group)和数据项(item)。服务器对象保存服务器和服务器作为opc组对象容器的所有信息。opc组对象包括公共组和局部组(私有组)两种,公共组由多个客户共享,局部组只隶属于一个opc客户。一个组可能代表一个特殊设备的数据项,opc 客户可以通过组对象来读写数据,并可以设定opc服务器应该提供给opc client数据的更新速率。opc 数据项是读写数据的最小逻辑单位(在实际应用中,可能是物理设备的寄存器或寄存器的某一位),其数据值以variant形式表示,每个数据项包括值(value)、品质(quality)和时间戳(time stamp)3个变量。在一个组对象中,opc 客户可以加入多个opc数据项。

opc客户与opc服务器的接口有自定义接口(custom interface)和自动化接口(automation interface)两种形式。自定义接口是一组com接口,主要用于采用c++语言的应用程序开发;自动化接口是自动化的ole接口,主要用于采用vb,delphi等基于脚本编程语言的应用程序开发。对于客户端应用程序的开发,采用自定义接口的方式运行效率高,但开发难度较大;采用自动化接口的方式运行效率低,但开发简单。这两种接口与opc服务器的通信方式如下图所示。

OPC的数据访问主要有同步数据访问和异步数据访问两种方式。同步数据访问时,opc服务器在将按照opc应用程序要求的数据返回之前,opc应用程序一直处于等待状态,也就是说,同步方式的数据访问在要求的动作没有完成前不能执行任何opc应用程序侧的处理。与之相比,异步方式的数据访问在对opc服务器提出数据访问要求后,立即返回到opc应用程序侧的主处理程序中,opc服务器完成数据访问时通知opc应用程序,opc应用程序从而得到数据访问结果。当opc应用程序采用自动化接口访问opc服务器时,同步和异步数据操作分别由syncread、syncwrite和asyncread、asyncwrite四个opc组对象的方法函数来实现。

OPC版本

OPC发展至今,存在3个版本,这也是初次接触的人会搞不清的地方。

version 1.0:OPC
Classic

version
2.0:OPC Unified Architecture (UA)

version 3.0:OPC .NET 4.0 (formerly OPC Express Interface or OPC Xi) ,is
based on Microsoft’s .NET Framework and uses Windows                   Communications Foundation (WCF) in place of COM/DCOM. The specification includes backward compatibility with OPC Classic.

OPC
Version 1.0

现在大多数的服务器都支持1.0的版本。下面主要说说这个版本,也是我接触过的版本。

OPC Classic中又分为下面三个部分:

数据采集技术(DA):OPC技术通常在数据采集软件中广泛应用。现在众多硬件厂商提供的产品均带有标准的OPC接口,OPC实现了应用程序和工业控制设 
  备之间高效、灵活的数据读写,可以编制符合标准OPC接口的客户端应用软件完成数据的采集任务。

历史数据访问(HDA):OPC提供了读取存储在过程数据存档文件、数据库或远程终端设备中的历史数据以及对其操作、编辑的方法。

报警和事件处理(AE):OPC提供了OPC服务器发生异常时,以及OPC服务器设定事件到来时向OPC客户发送通知的一种机制,通过使用OPC技术,能够更好的捕捉控制过程中的各种报警和事件并给予相应的处理。

开发资源

.net库:
去OPC基金会的官网下载,https://opcfoundation.org/。不过貌似要是会员才行。所以去网上能搜到,csdn就有,注意版本。

测试工具:

支持V1.0的工具, 下载matrikonopc的免费工具就行matrikonopc
explorer, matrikonopc server for simulation,官网http://www.matrikonopc.com/。

支持V2.0的工具,下载unified-automation提供的服务器、客户端,官网http://www.unified-automation.com/

支持V3.0的工具,3.0没研究过,不知道。:(

例子:相比DDE,使用OPC的二次开发库,想实现需要的功能还是有点难度的(针对第一次弄的人)。会在另一篇blog里面贴些网上收集的代码。

时间: 2024-08-06 03:41:58

PLC及其编程起步[.net]的相关文章

PLC梯形图编程练习修改版

PLC梯形图编程练习 交通灯控制 ? 更新:梯形图中引入辅助继电器后,灯不亮的问题得到了解决,同时我也发现原梯形图无法实现计数器的断电复位,且原版梯形图为了测试方便没有严格按照练习要求设定计时时间,新版梯形图对此做出了改进. ? SW2关闭时,红绿灯轮流自动亮比较容易实现,但是把SW2打开(即进入夜间模式)的梯形图加入后,仿真时红灯和绿灯即使得电也不亮. 我猜测原因是梯形图控制的一一对应原则在加入夜间模式的梯形图后出现了问题,我暂时没找出具体问题所在,没有想到较好的改进方案,把仿真失败的梯形图放

Unity SurfaceShader 编程起步

Unity SurfaceShader 编程起步 在14年年初的时候,曾经给自己定下了今年要实现的三个目标,其中之一就是学会编写自己的Shader,并能够投入到实际的项目应用之中.现在,转眼间日历已经翻到了6月份,而自己关于Shader的学习,还停留在三天打鱼两天晒网的零碎学习状态,自己心里很是着急.平时的工作任务多,挤掉了自己的学习时间是一方面.但更重要的,还是因为自己没有制定一个稳步的计划,来监督自己利用一切可以利用的时间完成学习的内容,相反,自己做的太过随意了.所以,继续以博文的形式来督促

为准大学生准备的C/C++编程起步教程

最近越来越多的其它领域的大佬陆陆续续来找我 “垂询” 编程起步的方法了,攥写本文一是考虑到逐个回复所费时间甚多,二者是鄙人的脑子实在不是很好用总是会出现记漏东西或者表述不清的情况. 希望这篇教程能够帮到各位初学者. 1.相关概念解析 如果后面理解东西出现了疑惑再跳回来看看:) A. 编辑器 / 编译器 / IDE / 开发环境 编辑器指的是你用来打字的工具(就像记事本或者小米便签),编译器是用来将你的代码从单纯的文本转化为程序的工具. 首先你需要用编辑器录入一段代码,然后保存为  后缀名与语言相

PLC状态机编程第一篇-状态机介绍

状态机的一般概念 过去我在学习PLC编程时,看的大部分书仅仅停留在软件的操作上,没有真正讲述如何组织程序,这里我们讲一个通用的描述控制算法的方法,就是状态机,和SFC很类似,其实SFC也是源于状态机啦.状态机是UML中的概念,在嵌入式开发中应用很广,但在PLC编程中基本没有流行.下面是一张用matlab画的状态机,包含了大部分基本元素.它描述的就是启保停电路,经典的控制...我们会在这个电路的基础上慢慢扩展. 这个状态机中包含两个状态,分别是Off和On,这两个状态只能有一个是激活的,这和SFC

PLC状态机编程-如何在STL中使用状态机

搞PLC编程多年,一直不知道状态机,学习matlab后,发现状态机编程异常方便,过去很多编程时的疑惑豁然开朗起来.今天跟大家分享一下如何在STL中使用状态机. 下面是用状态机描述的控制任务. 这个状态机较简单,那如何在STL中把它描述出来呢? 这里我们选择用JL指令...我就直接上代码了,一看便知.但JL程序只能用来表示单步状态,遇到并行状态就处理不了了..下次我们用ST语言来描述更复杂的状态机.. L     #state     //  把#state的值载入累加器       JL   

PLC可编程控制器概述

1.   可编程控制器的产生 PLC的诞生 1)      随着半导体技术,尤其是微处理器和微型计算机技术的发展,在20世纪70年代初期.中期,设计制造出可编程逻辑控制器PLC,它能完成顺序控制,仅有逻辑运算.定时.计数等控制功能. 2)      20世纪70年代末至80年代初,可编程控制器的处理速度大提高,增加了许多特殊功能,使得可编程控制器不仅可以进行逻辑控制,而且可以对模拟量进行控制. 3)      20世纪80年代以来,随着大规模和超大规模集成电路技术的迅猛发展,以16位和32位微处

挨踢部落故事汇(11):编程起步从0到1

Aris在大学期间对编程产生了兴趣,当时他的班主任是教Java的,看着老师用代码写出一些他们做不到的事,Aris便开始觉得编程是一件很牛逼的事情.从那时起,他就沉入到计算机的世界里,每周都会去图书馆借一些书回去,边对照书边敲代码执行,逐渐一个个小案例被成功的敲出来了,顿时他心生满满的成就感.但一味的跟着书编程,并不会一直运行成功,有一次因为书本的某个小错误,Aris没有发现,导致他执行不出结果,于是他通过百度.Google各种查询,最终找到解决方法.此后Aris觉得单单跟着书上敲是不行的,还需要

NPAPI插件编程起步

http://geeklu.com/2010/10/getting-started-with-npapi-plugin/ 2012-10-10 更新:https://code.google.com/p/chromium/issues/detail?id=139816 Chrome22之后貌似完全放弃10.5 Carbon之类的支持,所以Event Model需要进行设置,否则NPAPI插件在Chrome22下无法加载.NPP_New函数中进行如此设置 browser->setvalue(inst

DirectX API 编程起步 #02 窗口的诞生

先用 windows API 制作一个窗口出来,以后我们用 DirectX API 渲染的东西就会显示在这里,控制台那黑白的画面肯定是没法用的. 每次的代码都会更新到Github 首先贴出来目前为止的文件结构图,由上到下表示#include“XXXXX”关系 系统头文件的调用不包含在内 由于.h和.cpp都是对应出现的,我就不写的那么详细了 Main.cpp 是调用 SoftwareClass 类的主函数. 那么我们从上往下开始吧. Main.cpp 由于只用调用接下来的类成员函数就行,所以这个