《可编程序控制器网络通讯及其程序设计研究之间的串行通信.pdf》由会员分享,可在线阅读,更多相关《可编程序控制器网络通讯及其程序设计研究之间的串行通信.pdf(2页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、微型电脑应用2002 年第 6 期 用 Delphi 实现计算机与 OMRON PLC 之间的串行通信 微型电脑应用2002 年第 6 期 用 Delphi 实现计算机与 OMRON PLC 之间的串行通信 同济大学 信控系 上海 200092 余振宏 蒋式勤 刁杰 谢威 摘要:摘要:以OMRON C200HG系列PLC为例介绍了用Delphi5.0实现上位机与PLC地通信,着重讨论了通信协议以及MSComm控件的属性设置、事件响应。关键词:串行通信,关键词:串行通信,Delphi5.0,PLC通信协议,通信协议,API函数函数 The Achievement of Serial Commun
2、ication between Computer and OMRON C200HG PLC by Using Delphi Abstract:Introduce the technology of serial communication between the computer and OMRON C200HG PLC by Using Delphi,mainly discuss the communication protocal,the protertiessetting and events response of MSComm by using the Delphi5.0 Key w
3、ords:serial communication,Delphi5.0,PLC communication protocol,API function 现代工业控制的监控系统及其他过程检测和控制系统,大多采用分布式监控系统的控制方式,要使其信息集中,功能分散的优点得以充分发挥,就必须进行上位机与下位机之间的数据通信。与此同时,可编程控制器(PLC)以其功能强大、通讯灵活、可靠性高、环境适应性好、编程简单、使用维护方便等优点而被作为下位机广泛应用于工业现场,而微机在数据处理及人机界面方面有得天独厚的优势,因此采用微机为上位管理机来进行工艺流程及工艺参数的显示、控制参数的修改等,这样不得不解决上位
4、管理机与下位控制机之间的通信问题。本文结合基于元胞自动机的电梯群控系统建模与仿真系统介绍如何运用delphi5.0实现上位机与OMRON C200HG PLC之间的通信。1 通信系统的硬件结构 1 通信系统的硬件结构 本仿真系统由一台通用PC(上位机)和OMRON C200HG PLC(下位机)组成。C200HG的CPU单元内带有RS-232C端口,其支持与PC串口的一对一串行通信。通过编制上位机的控制程序和相应的下位机程序就能实现上下位机之间数据的交互。2 上位机的串口通信 2 上位机的串口通信 用Delphi开发串口通信软件一般有两种方法:一是利用Windows的通信API函数,另一种是采
5、用Microsoft的MSComm控件。利用API编写串口通信程序较为复杂,需要掌握大量的通信知识,其优点是实现的功能强大,应用面广泛,适合于编写较为复杂的低层次通信程序。而利用MSComm控件则相对简单,该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作。考虑到与下位PLC的通信比较简单,通信过程中并没有涉及到复杂的底层操作,所以本仿真系统就选用Microsoft的MSComm控件。MSComm控件是VB中的OCX控件,可以通过选择菜单Componentimport active control,在Import ActiveX页内选择Microsoft Comm Cont
6、rol,点击Install安装,即可将其添加到Delphi中使用。MSComm控件的主要属性及事件 MSComm控件的主要属性及事件 CommPort:设置或返回串行端口号,缺省值1。Settings:设置或返回串口通信参数,格式为“波特率,奇偶校验位,数据位,停止位”。例如:MSComm1.Settings:9600,o/e,8,1 PortOpen:打开或关闭串行端口,格式为MSComm1.PortOpen:True|False InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清
7、空接收缓冲区。RThreshold:该属性为一阀值,它确定当接收缓冲区内的字节个数达到或超过该值后就产生代码为CommEvReceive的OnComm事件。SThreshold:该属性为一阀值,它确定当发送缓冲区内的字节个数少于该值后就产生代码为 CommEvSend的OnComm事件。InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。Input:从接收缓冲区读取一串字符。OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为
8、0来清空缓冲区。OutPut:向发送缓冲区传送一串字符。如果在通信过程中发生错误或事件,就会触发OnComm事件,并由CommEvent属性代码反映错误类型,在通信程序的设计中可根据该属性来执行不同的操作。CommEvent属性值很多我们主要用到的是CommEvReceive:值为2,接收缓冲区内字符数达到RThreshold指定的值。3 通信协议及上下位机的通信过程 3 通信协议及上下位机的通信过程 C200HG对通信端口有默认的标准设置,起动位:1 数据长度:7 停止位:2 奇偶校验:偶 波特率:9,600bps,也即MSComm1.Settings:9600,e,7,2 上下位机的链接通
9、信通过在上位机和PLC之间交换命令和应答实现。在一次交换中传输的命令或应答数据称为一帧,一个帧最多可包含131个数据字符。上位机的链接数据称命令帧,下位机返回的数据称应答帧。3.1命令帧格式 3.1命令帧格式 从上位机发送一个命令时,按下面的格式排列命令数据:图4-1 命令帧格式 识别码和正文取决于传输的上位机链接命令。当传送一个组合命令时,还将有第二个识别码(子识别码)。FCS(帧检查顺序)码由上位机计算并设置在命令帧中,有关计算方法在下面将详细叙述。命令帧可以有最多131个字符长,一个等于或大于132字符的命令必须分成若干帧。命令分段使用回车定界符,而不能使用终止符,终止符用在最后帧的结尾
10、。3.2应答帧格式 3.2应答帧格式 来自PLC的应答按下面的格式返回:图4-2 应答帧格式 识别码和正文取决于接收到的上位机链接命令。结束码表示命令完成的状态(有无错误发生)。当应答超过132个字符,必须分成若干帧,在每个帧的末尾将自动设置一个回车定界符代替终止符,终止符设置在最后帧的末尾。3.3 FCS函数的构成 3.3 FCS函数的构成 在上下位机的串行通信中,为了保证通信数据的正确性,C200HG在每条信息帧中定义了两位FCS校验码。规则是,FCS校验码以前的所有字符取其ASCII代码,对这些代码进行异或操作,将其结果转换为十六进制作为两位字符的ASCII代码,返回两位字符,这两位字符
11、就是这一帧的FCS校验码。下位机应答帧里的FCS校验码是由PLC硬件自动生成的,而上位机的FCS校验需用软件来完成,我们在这里可以定义FCS函数的入口参数和返回值:同一帧中的所有待校验字符作为一字符串定义为入口参数,返回值为两位FCS校验码。考虑到标准函数function Ord(X):Longint不支持变量操作,即X只能是立即数型的单个字符。这样,表达式Ord(Copy(instring,N,1)是非法的,将在程序中导致错误。解决的方法是,定义一个字符型变量,将Copy(instring,N,1)的返回值存入其中,对此变量的值进行穷举判别,然后根据判别结果用相应立即数型的单个字符返回值来替
12、换Ord(Copy(instring,N,1)的值。因为待校验字符串中所包括的字符集仅为0至F的十六进制数和写PLC IR区识别码的“W”“R”,一共只有十八种情况,所以穷举判别法是行之有效的,下为FCS校验函数:Function FCS(instring:string):variant;Var N,Result,Temp:Integer;Result:0;Temp:0;N:=1;Begin While Na then/a为发送帧的长度加1 Begin If copy(instring,N,1)0 then Begin Temp:=ord(0)End;./依次进行1,2,.,9,A,B,.,F
13、,W,R等的异或操作.If copy(instring,N,1)R then Begin Temp:=ord(R)End;Result:Result XOR Temp;N:N+1;End;Result:InttoHex(Result,2);End;4 程序设计及说明 4 程序设计及说明 编程中主要的问题就是编制上位机从PLC中取得数据以及上位机将数据写进PLC的存储区中的程序,下面以一个简单例子介绍这几个部分。在Form1中放置一Memo控件用于显示接收的数据,CommboBox1选择通信参数(Setting属性值),CommboBox2选择串口(CommPort属性值),按Button1开始
14、接收数据,按Button2停止接收,Timer1Timer作为定时从PLC中读取数据的定时器。其工作流程为,上位机定时相PLC请求发送数据当(由Timer1Timer触发),下位机接到请求后开始发送数据,当数据达到13个时,就会触发OnComm事件,从而进行判别并将数据显示在Memo控件中。procedure TForm1.Button1Click(Sender:TObject);begin MSComm1.InBufferCount:0;/清空接收缓冲区;MSComm1.outBufferCount:0;/清空输出缓冲区;MSComm1.InputLen:0;/Input读取整个缓冲区内容;
15、MSComm1.RThreshold:13;/每次接收到13个字符即产生OnComm事件,除去帧中其他代码,相当于每次接收的数据为4位16进制数;MSComm1.Settings:ComboBox1.Text;/本实验中选取9600,e,7,2 if CommboBox2.Textcom1 then/假设只考虑COM1和COM2两种情况;MSComm1.CommPort:1 else MSComm1.CommPort:2;MSComm1.PortOpen:true;/打开串口;MSComm1.DTREnable:true;/数据终端准备好;MSComm1.RTSEnable:true;/请求发
16、送;end;procedure TForm1.Button2Click(Sender:TObject);begin MSComm1.PortOpen:false;MSComm1.DTREnable:false;MSComm1.RTSEnable:false;end;procedure TForm1.MSComm1Comm(Sender:TObject);var recstr:Olevariant;begin if MSComm1.CommEvent2 then begin recstr:MSComm1.Input;/接收下位机上传的数据 if Copy(recstr,4,2)=RD then/
17、判断是否为应答帧 begin recstr:Copy(recstr,8,4);/除去帧中其他代码,读取帧中传输的数据部分 Memo1.text:Memo1.text+recstr;/将数据显示在Memo1控件中 end;end;procedure TForm1.Timer1Timer(Sender:Tobject);begin MSComm1.Enabled:=true;Senstr:=00RD0000000157*+#13;/向PLC请求发送数据 MSComm1.output:senstr;End;向PLC中写数据也很方便,它需要调用上面的FCS函数用软件方式产生发送帧中FCS校验码。其基本
18、格式为:senstr:=”00SC0252*+#13;/上位机写数据的命令 MSComm1.PortOpen:true;/打开串口;MSComm1.output:senstr;/上位机向PLC发送写数据的命令 Senstr:=00WR0001+(待传输的数据)+FCS校验码+*+#13;MSComm1.output:senstr;/将待传输的数据发送出去 5 5 结束语 结束语 上述程序在Delphi5.0调试通过,在上述读、写程序中,我们还可增加一些读写数据错误判断,从而保证读写的数据的准确性。这一程序方法可用于运用Delphi5.0来开发上位机软件,既能满足实时性要求较高的场合,有大大简化了编程难度,缩短了开发周期,同时还能方便开发丰富的图形界面,因此对广大非专业用户来说是一种很好的选择。参考书目参考书目 1.OMRON可编程控制器C200HG编程手册 OMRON公司,1997.1.修订 2.Delphi5从入门到精通 Marco Cantu著,王辉等译,电子工业出版社