您现在所在的是:

欧姆龙OMRON

回帖:0个,阅读:2353 [上一页] [1] [下一页]
1459
shenhong
文章数:257
年度积分:50
历史总积分:1459
注册时间:2004/3/27
发站内信
发表于:2005/3/20 15:35:00
#0楼
本文介绍了在Delphi编程方式下采用Mscomm控件实现工业现场数据交换的方法,并给出一个编程的例子。
1前言
Delphi是当今世界上最优秀的WINDOWS开发工具之一,它的可视化开发环境让用户在windows平台上快速开发出32位的windows应用程序,它以其良好的图形用户接口(GUI)、面向对象的程序设计和结构化的事件与驱动编程模式,使得编程效率提高,现场应用功能大大增强。欧姆龙株式会是全球知名的自动化控制和电子设备制造厂商,掌握着世界领先的自动化控制核心技术。OMRON公司的C200H系列PLC具有可靠性高、功能强大、编程方便等优点,在工业控制中占据着很重要的地位。本文具体探讨使用MSComm控件对OMRON PLC进行串行通信的实现方法。
2 MSComm控件简介
Microsoft Communication Control(简称MSComm)是Microsoft公司提供的简化Windows下进行串行通讯编程的ActiveX控件,ActiveX是Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM。ActiveX控件包括一系列的属性、方法和事件,使用ActiveX控件的应用程序和ActiveX控件之间的工作方式是客户/服务器方式,即应用程序通过ActiveX控件提供的接口来访问ActiveX控件的功能。
MSComm控件实际上是一些Windows API函数的有机集成,它以属性和事件的形式提供了对Windows通讯驱动程序API函数接口,为应用程序提供了通过串行接口收发数据的简便方法。因此,程序员只需在程序中设置和监视MSComm控件的属性和事件即可完成对串口的编程。
MSComm控件提供了两种处理通讯的方法:一是事件驱动方法;一是查询方法。
2.1事件驱动法
OnComm事件是MSComm控件提供的唯一的事件,当有数据到达端口或端口状态发生改变或有通讯错误时,都将触发OnComm事件,以获取和处理这些通讯事件和通讯中产生的错误,通过查询CommEvent属性值,可以获得关于通讯事件和通讯错误的完整信息,进而进行处理。这是一种功能很强的处理串行口错误的方法,具有程序响应及时,可靠性高的优点。
2.2查询法
MSComm控件的CommEvent属性返回通讯中产生的事件和错误类型,由控件自动检测和跟踪通信状态后设置。然后由控制软件进行分析和处理。

3 OMRON PLC串行通信协议
本例使用RS-232连接实现上位机链接。(1:1连接)
要启动上位机链接通讯,必须预先在PC设置好下述参数:
A.通讯方式
设置通讯方式为上位机链接通讯(缺省设置)
RS-232端口:置DM6645的位12~15为0
B.节点号设置
当使用1:1连接时,设PC节点号为00
RS-232端口:置在DM6648的位00~07中
C.标准端口设置
RS-232端口:置在DM6645的位00~03(0:标准;1:用户)
表1列出标准设置。
4 PLC的串口通讯协议
识别码和正文取决于传输的上位机的链接命令。当传送一个组合命令时,还将有第二个识别码(子识别码);
FCS(帧检查顺序)码由上位机计算,并设置在命令帧中。本凶后面将叙述FCS的计算。
命令帧可以有最多131个字符长。一个等于或大于132个字符的命令必须分成若干帧。命令分段,使用回车定键符(┓,CHR$(13),而不是终止符。终止符必须用在最后帧的末尾。
在对执行写操作的命令(如WR,WL,WC或WD)分段使,应注意不要将写入单独一个字的数据分在不同帧中,还有帧的分段应和字与字之间的分段一致。
应答帧格式:
来自PC的应答按下示格式返回:
识别码和正文取决于接收到的上位机链接命令。
结束码表示命令完成的状态(即,是否有错误发生。)
当应答帧超过132个字符,它必须分成若干帧。在每个帧的末尾将自动设置一个定键符(┓,CHR$(13),代替终止符。终止符必须设置在最后帧的末尾。
当传送一个帧时,在定界符或终止符前面安排一个FCS码,以检查传送时是否在数据错误。FCS是一个转换成2个ASCII字符的8位数据。这8位数据为从帧开始到帧正文结实(FCS之前)所有数据执行"异或"操作的结果。每次接受到一帧,计算FCS,与帧中所包含的FCS作比较从机时检查帧中间的数据错误。
5 编程实现
5.1初始化Mscomm控件
首先生成一个Form取名为Mainform。从VCL中拖取一个Mscomm放在Mainform上。在Mainform中将串行口打开程序如下:
procedure TmainForm. FormCreate(Sender:TObject);var
temp,loop:integer:begin
mscomm1.RTSEnable:=true;
mscomm1.Nu11Discard:=false;

mscomm1.InputLen:=0;
if mscomm1.PortOpen=false then
mscomm1.PortOpen:=true;
mscomm1.DTREnable:=true;
mscomm1.OutBufferCount:=0;
mscomm1.InBufferCount:=0;
loop:=ReaDM ('0000');
loop:=trunc (0.25*loop);
Ftemp1:=loop;
Ftemp2:=loop;
Ftemp3:=loop;
Ftemp4:=loop;
Labe135.Caption:=IntToStr (Trunc(loop));//显示温度
Maintimer.Enabled:=true;
temp:=ReadDM ('0010');
temp:=trunc (0.25*temp);
Labe133.Caption:=inttostr (temp);//显示温度设置上限
Labe139.Caption:=inttostr (readCNTSV('0100')div 60);//显示设置时间
Labe141.Caption:= '分';
YNPane1.SendToBank;
RadionButton1.Checked:=true;
WriteDM('6600', '0101');
end;
Mscomm的其它属性可以取默认属性。
5.2数据的发送和接收
现场采集的数据存放在PLC中的DM区中。监控程序通过串口提取或修改DM区的数据。
提取数据:
function TmainForm.ReadDM(value:string):integer;
var
loop1,loop2,loop3,loop4:integer
t1,t2,i:integer;
outdata,indata:string;
loop:string[20];begin
i:=1;
while i<3 do
begin
indata:=mscomm1.Input;
outdata:='@OORD'+value+'0001'+fcs('@OORD'+value+'0001')+'*'+char(13);
mscomm1.Output:=outdata;
sleep(10);
indata:=mscomm1.Input;
loop:=indata;
if(loop[6]='0') and (loop[7]='0')then
begin

i:=15;
if (ord(loop[0]=15) then
begin
if ((ord(loop[8])-57)<=0) then
loop1:=ord(loop[8])-48
else
loop1:=ord(loop[8])-55;
if ((ord(loop[9])-57)<=0) then
loop2:=ord(loop[9])-48
else
loop2:=ord(loop[9])-55;
if ((ord(loop[10])-57)<=0) then
loop3:=ord(loop[10])-48
else
loop3:=ord(loop[10])-55;
if ((ord(loop[11])-57)<=0) then
loop4:=ord(loop[11])-48
else
loop4:=ord(loop[11])-55;
result:=loop1*4096+loop2*256+loop3*16+loop4;
end else
result:=0;
end
else
begin
i:=i+1;
result:0;
end;
end;
end;
发送数据:
function TMainForm.WriteDM(value1:string:value2:string):boolean;
var
t1,t2,i:integer;
outdata,indata:string;
loop:string[20];
begin
i:=1;
while i<3 do
begin
indata:=mscomm1.Input;outdata:='@OOWD'+value+value2+'0001'+fcs('@OOWD'+value+value2+'0001')+'*'+char(13);
mscomm1.Output:=outdata;
sleep(10);

indata:=mscomm1.Input;
loop:=indata;
if(loop[6]='0') and (loop[7]='0')then
begin
i:=5;
result:=true;
end else
begin
i:=i+1;
result:=false;
end;
end;
end;
考虑到文章的篇幅有限,程序就简要介绍到这里。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

46.8003