在DELPHI中实现与AB PLC的通讯_vb与ab的plc之间通讯

其他范文 时间:2020-02-28 02:25:03 收藏本文下载本文
【www.daodoc.com - 其他范文】

在DELPHI中实现与AB PLC的通讯由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“vb与ab的plc之间通讯”。

在DELPHI中实现与AB PLC的通讯

【字体:大 中 小】 引言

美国罗克韦尔自动化公司的Allen-Bradley系列PLC是一个著名的可编程控制器产品,其产品体系基本上涵盖了工业控制产品的各个领域,并以其先进性、可靠性在各行各业的自动控制领域中得到了广泛的应用。在应用AB PLC时,上位计算机监控软件的开发我们可以使用罗克维尔自动化公司的RSView32或其他公司的组态软件,也可以自己用开发工具来开发。

作为一个优秀的RAD(快速应用开发)开发工具,Delphi在广大开发设计人员中也得到了广泛的应用。它不仅开创了“构件(Component)”时代,而且还拥有非常出色的编译器,极大地提高了开发人员开发程序的效率。

下面介绍在DELPHI中如何调用RSLinx的C SDK实现与AB PLC的通讯的方法。RSLinx简介与配置

罗克韦尔自动化公司的RSLinx软件是A-B PLC通用的通信配置软件(2.2以上的版本支持对以太网的网关配置),它是一个链接Allen-Bradley 网络和设备到Microsoft Windows应用程序中的完全的32位通讯软件,应用的范围包括RSLogix和RSNetWorx的设备编程、网络组态,RSView32人机界面应用程序,还有用Microsoft Office、Web页或Visual Basic开发的数据查询应用程序等。RSLinx也是一个OPC数据服务器和DDE服务器。

RSLinx目前主要有以下六个版本:RSLinx Lite、RSLinx Single Node、RSLinx OEM、RSLinx Profeional、RSLinx Gateway、RSLinx SDK。在RSLinx OEM以后的4个版本均支持开发OPC应用程序或C-API客户程序,并在RSLinx SDK中包括了开发OPC应用程序或C-API客户程序的技术资料。

在与A-B PLC进行通讯之前必须连接好正确的物理连接。比如用DH+网络通讯的话,要在计算机上安装1784-PKTX通讯网卡,并正确接线。物理连接完成后在RSLinx中选择相应的通讯驱动进行配置。如果配置成功后,可在RSWho窗口内显示出配置的网络和连接的PLC。

通讯驱动配置完成后,再配置客户应用程序使用的通讯口。在RSLinx的菜单上选择CommunicationsConfigure Client Applications…,弹出配置窗口如图1所示。

在这个窗口中选择相应的通讯驱动,图1显示的是1KT:0选择了AB_DF1-1驱动。2 在DELPHI中编写通讯程序

由于RSLinx C SDK只提供了基于C/C++语言的API,这些API都储存在动态链接库DTL32.DLL中,如果要在DELPHI中调用,这就需要掌握在DELPHI中调用储存在DLL(动态链接库)中的函数的方法。

图1 如不会使用,可联系本人球球:1102956688 2.1 调用方法

(1)静态调用

静态调用就是使用一个外部声明子句显式装载使用的函数,使DLL在应用程序开始执行前即被装入。例如有一个叫MaxLib.dll的动态链接库,其中包含一个函数: Function Max(I1,I2:Integer):Integer;静态调用的引用如下:

Implementation Function Max(I1,I2:Integer):Integer;far;stdcall;external „MaxLib‟;

这种方法要在单元的interface 部分用external 指示字列出要从DLL中调用的例程。Far指令表明可以被其他段,例如其他单元调用的子例程。所有在单元接口中声明的子例程在缺省情况下都是Far类型的,其相反的指令是near。

如果external后什么也不跟,必须用{$L}编译指令预先指定一个DLL名字,如:{$L MaxLib.dll}。

但是使用静态调用方法时,程序无法在运行时间里决定DLL的调用。在DELPHI中使用DLL时,例程的标识符必须与DLL中相应输出例程的标识符完全一致(尽管DELPHI本身大小写不敏感)。(2)动态调用或隐式装入

使用Windows API函数Loadlibrary和GetprocAddre可以实现在运行时间时的动态装载DLL,并调用其中的过程。

例如: Type

TMyFunc=Function(I1,I2:Integer):Integer;Stdcall;Var MyFunc: TMyFunc;MyHandle:THandle;

MyHandle:=LoadLibrary(„MaxLib‟);

If MyHandle

Raise Exception.Create(„动态链接库调用失败,错误代码是:‟+Inttostr(Getlasterror))

else

@MyFunc:=GetProcAddre(MyHandle,„Max‟);

if not Aigned(MyFunc)then Raise Exception.Create(„GetProcAddre调用失败,错误代码是:‟+inttostr(getlasterror))

else MaxInt:=MyFunc(200,500);Freelibrary(Myhandle);// 卸载DLL 2.2 类型转换

由于DELPHI使用的是Object Pascal语言,当转换C函数到Pascal语言相等的说明时,把C函数及其数据类型转换到正确的Pascal类型是非常重要的。

(1)数据类型转换

附表列出了部分数据类型的转换

(2)函数调用转换

在Object Pascal中,过程或函数的参数在调用时的传递顺序是自左向右的,而C函数调用则是自右向左的,因此在静态调用时必须指定Stdcall参数,强制使过程或函数的参数按自右向左调用。使用Stdcall方式,能保证不同语言写的DLL的兼容性,同时它也是WINDOWS API的约定方式。

2.3 RsLinx C SDK函数在DELPHI中的声明

根据上面DELPHI调用DLL的原则,下面用静态调用列出了部分RsLinx C SDK库中函数的调用方法。

implementation

Function DTL_INIT(id:LongInt):SmallInt;stdcall;external„dtl32.dll‟;

Function DTL_C_CONNECT(Id:LongInt;Name:PChar;NullP: Pointer):SmallInt;stdcall;external„dtl32.dll‟;

Function DTL_DISCONNECT(id:LongInt):SmallInt;stdcall;external„dtl32.dll‟;

Function DTL_C_DEFINE(var id:LongInt;DefStr:PChar): SmallInt;stdcall;external„dtl32.dll‟;

Function DTL_UNDEF(id:LongInt):SmallInt;stdcall;external„dtl32.dll‟;

Function DTL_READ_W(id:LongInt;Buf:Pointer;var stat:LongInt;DelayTime:LongInt):SmallInt;stdcall;external„dtl32.dll‟;

Function DTL_WRITE_W(id:LongInt;Buf:Pointer;

var stat:LongInt;DelayTime:LongInt):SmallInt;stdcall;external„dtl32.dll‟;

DTL_INIT函数的功能是初始化DTL通讯库,id是分配给DTL函数定义表的数目,成功返回0。

DTL_C_CONNECT函数的功能是建立一个通讯连接,成功返回0。

DTL_DISCONNECT函数的功能是断开一个通讯连接,成功返回0。

DTL_C_DEFINE函数比较重要,它定义读取或写入的数据表,DefStr是定义的数据表的字符串,如果成功函数返回0,并且把赋予此数据表的句柄放在id中,供读取或写入函数用。

DTL_UNDEF函数的功能是删除一个已定义的数据表,成功返回0。

DTL_READ_W函数的功能是从数据表中读取数据。Id是在DTL_C_DEFINE函数中定义的数据表,Buf是存放读入数据的缓冲区,stat是函数执行完写入的状态,DelayTime是以毫秒为单位的函数执行完毕的最长等待时间。

DTL_WRITE_W函数的功能是向数据表中写入数据。参数定义与DTL_READ_W函数相同,只不过这时的Buf是向定义的数据表写入数据的缓冲区。

2.4 例程

本例在DELPHI中的表单中定义了一个标签Label1,用来指示与RSLinx的通讯是否成功;定义了两个按钮,分别是读取和写入数据,数据地址是N7:0,长度是20。当按写入按钮时,程序生成20个随机数写入到PLC的N7:0中,当按读取按钮时,程序从N7:0开始读取20个整数,并在表单的列表框中显示出来。表单如图2所示。

变量定义、创建窗口、关闭窗口、读取数据、写入数据过程的源程序如下:

var Rst,i: Integer;Data:array [0..20> of SmallInt;Str,DefStr:string;Handle,IOStat:LongInt;Implementation {加入上述DTL函数} procedure TForm1.FormCreate(Sender: TObject);begin Str:=”;rst:=1;rst:=DTL_INIT(1);

if rst=0 then rst := DTL_C_CONNECT(0,PChar(Str),nil);if rst=0 then Label1.Caption:=„RSLinx连接成功‟

else Label1.Caption:=„RSLinx连接失败‟;

end;procedure TForm1.FormDestroy(Sender: TObject);begin DTL_DISCONNECT(0);

end;procedure TForm1.Btn_ReadClick(Sender: TObject);

begin DefStr:=„$N7:0,20,WORD,READ,1KT:0,001,PLC5,0‟;

if DTL_C_DEFINE(Handle, PChar(DefStr))=0 then begin rst:=DTL_READ_W(handle, @Data, IOStat, 1000);DTL_UNDEF(Handle);end;ListBox1.Clear;if rst=0 then for I:=0 to 19 do begin FmtStr(Str,„N7:%d=%d‟, [I,Data[I>>);

ListBox1.Items.Add(Str);end;end;procedure TForm1.Btn_WriteClick(Sender: TObject);begin DefStr:=„$N7:0,20,WORD,MODIFY,1KT:0,001,PLC5,0‟;

if DTL_C_DEFINE(Handle, PChar(DefStr))=0 then begin rst:=DTL_WRITE_W(handle, @Data, IOStat, 1000);DTL_UNDEF(Handle);end;end;以上程序在DELPHI5.0、6.0环境下测试通过。由于RSLinx C SDK中函数很多,在此不能一一列举,如要使用其它函数,只要按上述的方法转换即可。

浅析多层结构及其在Delphi中的实现

浅析多层结构及其在Delphi中的实现二层结构的退出在传统的二层C/S结构数据库应用中,客户端的机器执行应用程序,连接到后端的数据库服务器中存取应用系统所需资料,因为应用系统......

VB中串口通讯的实现

VB中串口通讯的实现.txt VB中串口通讯的实现------------------一、概述 串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。......

在竞争与合作中实现双赢

在竞争与合作中实现双赢蔡丽君黄丽芝古代日本的老渔民发现如果将几条剩性活泼的沙丁鱼放入一群被打捞的懒惰的鲇鱼当中.由于好动的沙丁鱼在鲇鱼中乱窜,给鲇鱼带来一中危机感,它......

在平凡中实现梦想

在平凡中实现梦想——“中国梦•劳动美•我与学院共发展”主题演讲稿 尊敬的各位领导,各位老师,亲爱的同学们,大家下午好!我是来自学院房地产经济管理系的一名普通教师。我今天......

在传承与创新中实现新突破

在传承与创新中实现新突破——记明珠宾馆房务部业绩再创新高 2016年6月27号,明珠宾馆上半年财务节点,房务部营业额同比增长32%,超额完成上半年业绩任务。7月份,日营业额继续飘红......

下载在DELPHI中实现与AB PLC的通讯word格式文档
下载在DELPHI中实现与AB PLC的通讯.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文