首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
在Windows下用Delphi开发微机与PLC的串行通信程序
中华工控网
收藏本文     查看收藏
在Windows95下用Delphi开发微机与PLC的串行通信程序</P><P> 鲁昌华 徐 稳</P><P>   摘 要:在Windows95下利用Delphi实现微机与PLC的串行通信的 几种方法。<BR>   关键词:串行通信 Delphi 动态链接库DLL 构件 句柄 设备控制 块DCB 可编程控制器 PLC</P><P>   在自动测量和控制系统中,常常需要在上位机(微机)和PLC(可编程控制器) 之间进行数据交 换和发送控制信号,串行通信是其主要手段,我们在开发一套自动测试系统时就是采用串行 通信的方法,即由上位机向PLC发送命令,控制其进行各种测试线路的切换。</P><P> 1 通信协议<BR>   在本系统中微机和PLC采用一对一通信连接,上位机作主局,PLC作子局。通信开始时由上位 机向PLC发出呼叫,PLC收到上位机的呼叫后应答,并返回应答信号,然后上位机发首标,PL C应答,接着上位机发数据块,PLC应答,数据全部发完后上位机发一结束标志,至此上位机 与PLC的通信结束。<BR>   上述通信协议可用图1描述<BR> <br><A HREF="/editor/uploadfiles/learns01/200310231641361147.gif" TARGET=_blank><IMG SRC="/editor/uploadfiles/learns01/200310231641361147.gif" border=0 alt=按此在新窗口浏览图片 onload="javascript:if(this.width>580)this.width=580"></A></P><P> <BR> 该协议使用的传输控制字符有:<BR>   ENQ(查询):在需要通信时作为发送方的请求。<BR>   ACK(认可):接收方给发送方的应答,表示正确接收信息包。<BR>   SOH(首标):表示要传送的是首标。<BR>   ETB(数据结束):标志数据块的结束。<BR>   STX(文本开始):标志数据块的开始。<BR>   ETX(文本结束):标志文本块的结束。<BR>   EOT(结束):表示传送结束。<BR>   LRC:纵向冗余校验码,即对前面所有的传输码进行异或计算。 </P><P> 2 Windows95下用Delphi实现串行通信<BR>   在Windows95环境下用Delphi3.0实现串行通信有3种方法:①使用VB的通信构件MSComm ;② 调用Windows95下的API函数来完成通信;③熟悉C/C++或其它语言的用户可以将自己的程序 编译链接为DLL(动态链接库),这样Delphi就可以调用DLL里的函数来通信。下面就这3种方 法分别加以讨论。<BR> 2.1 使用VB通信构件<BR>   在使用VB构件之前,首先要将VB构件文件MSComm32.OCX安装到Delphi的动态构件库中。打开 主菜单Component选择Import ActiveX Control...项,在弹出的对话框里选中Microsoft Co mm Control5.0(安装VB5.0后必有此项),再单击Install按钮。此时Delphi载入VB构件文件并重新编译DCL(Delphi Component Library)。编译完成后,MSComm的小按钮出现在ActiveX 页中,这时程序就可以使用此 构件了。应该注意的是,安装前要确保VB通信构件的控制文件MSComm32.OCX(在VB4.0以上版 本中)在编译DCL之前已在\Windows\System下。接着向窗体中 添加1个MSComm构件并进行串行口的初始化,初始化子例程序如下:</P><P> Procedure TForm1.FormCreate(Sender:TObject);<BR> begin<BR> MSComm1.CommPort:=2; {使用COM2口为通信口}<BR> MSComm1.InBufferSize:=1024; {设定接收队列长度为<BR> 1KB}<BR> MSComm1.OutBufferSize:=1024; {设定发送队列长度为<BR> 1KB}<BR> MSComm1.Settings:=‘9600,N,8,1';{波特率9600b/s,无校验,8个数据位,1 个停止位}<BR> MSComm1.InputLen:=0; {读取整个接收缓冲区内容}<BR> MSComm1.InputBufferCount:=0; {清除接收缓冲区}<BR> MSComm1.PortOpen=:True; {打开串行口}<BR> End;<BR>   用Input属性从接收对列读入字符串:ReadBuffer:=MSComm1.Input;用Output属性发送字 符串:MSComm1.Output:=WriteBuffer;然后根据上述通信协议,即可快速编制出通信软件 。<BR> 2.2 调用Windows95下的API函数<BR>   Windows95对通信功能的支持非常强,它增加了一系列用于通信的API函数供用户调用。同样 ,要进行串行通信,也需要先对串口进行初始化。Windows95把串行口作为设备文件,对串 口操作就是对文件操作。因此,必须先为串口分配1个文件句柄,以后对串口操作都将通过 这个文件句柄来完成。初始化过程如下:<BR>   (1)调用CreateFile函数为串口分配1个文件句柄。<BR>   Var HComm:THandle;<BR>   HComm:=CreateFile(‘COM2',GENERICREAD or GENERICWRITE ,0,@NULL,OPENEXISTING,FILEFLAGOVERLAPPED,0);<BR>   如果对串行口1操作,用字符串COM1代替COM2即可。<BR>   (2)调用SetupComm函数设置串行口的输入和输出缓存区。<BR>   SetupComm(HComm,1024,1024);<BR>   (3)填充1个DCB(设备控制块)结构来设置通信参数。通过调用GetCommState函数 获得当前系统的DCB结构,按需要赋值给DCB的成员,如波特率、奇偶校验、数据位、停止位 等,最后将创建后的DCB结构作为参数传给SetCommState函数就可以初始化串口了。</P><P>   Var DCB:TDCB;<BR>   GetCommState(HComm,DCB);<BR>   BuildCommDCB(‘9600,N,8,1',DCB);<BR>   SetCommState(HComm,DCB);<BR>   (4)用PurgeComm函数来清除接收缓存区的内容。<BR>   PurgeComm(HComm,PurgeRXCLEAR);</P><P>   (5)串行口的初始化完成后,接下来的工作就是根据通信协议发送和接收串行口上的数据。R eadFile函数用于接收数据,WriteFile函数用于发送数据。</P><P>   Var<BR>   OverLapped:TOverLapped;<BR>   DataIn:Byte;<BR>   DataOut:Byte;<BR>   BufferSize:Integer;<BR>   COMSTAT cs;<BR>   ReadFile(HComm,DataIn,cs.cbInQue,BufferSize,@OverLapped);<BR>    {从串行口读输入缓存的字节,存入DataIn变量中}<BR>   WriteFile(HComm,DataOut,cs.cbOutQue,BufferSize,@OverLapped); <BR>    {向串行口写输出缓存的字节,要写的数据存放在DataOut}<BR>   按照上述步骤,再根据前面的通信协议,即可完成串行通信。<BR> 2.3 调用其它语言编写的DLL<BR>   由于这里所说的其它语言包含面很广,可以是开发人员所熟悉的编程语言(只要其支持DLL即 可),如C和C++等,所以如何编写DLL就不再详述了。将编写好的DLL进行编译,然后把编译 通过后的DLL放在\Windows\System子目录下,在Delphi下打开1个单元文件,将DLL里的所 有函数在单元文件中声明,格式如下:</P><P>   unit UnitName;<BR>   interface<BR>   procedure p1(param1:type1;param2:type2;...);stdcall;<BR>   external‘DLLName';<BR>   …<BR>   implementation<BR>   end</P><P>   其中UnitName为单元文件名,p1为调用过程名,param1、param2为参数名,type1、type2为 参数类型名,DLLName为DLL名。串行通信时,只要将此单元包含进编程单元就行了。</P><P> 3 结 论<BR>   对使用Delphi开发Windows95下与PLC进行串行通信程序的3种方法进行比较可以得出这样的 结论:<BR>   (1)使用VB通信构件不但能够实现API的所有功能,而且程序简单明了。<BR>   (2)调用Windows95的API通信函数,可以设计和开发出各种通信软件,但编程复杂。<BR>   (3)第3种方法适合那些熟悉其它编程语言的开发人员。<BR>   以上所有程序均在Windows95中文版下使用Delphi3.0调试通过。</P><P> 作者单位:合肥工业大学计算机系(230061)</P><P> 参考文献</P><P>  1 李汉涛,杨长春.Windows下三线制串行通信的实现方法.电脑技 术,1998;(7)<BR>  2 王仲文译.精通串行通信.北京:电子工业出版社</P><P>
 

状 态: 离线

公司简介
产品目录

公司名称: 中华工控网
联 系 人: 客服中心
电  话: 0755-26546361
传  真: 0755-26585268
地  址: 深圳市南山区创业路现代城华庭1栋6A
邮  编: 518054
主  页:
 
该厂商相关技术文摘:
智能仪器仪表的发展特点与前景分析
电动机性能虚拟仪器测试系统设计与实现
视频监控护航高铁安全运营
基于PLC,触摸屏及变频器对吹膜机的改造
永宏PLC应用于自助图书借还终端机
基于永宏PLC的GSM通讯原理及其应用
改善汽车生态学、安全性和舒适性,四大测试分析是关键
改善汽车生态学、安全性和舒适性,四大测试分析是关键
数控技术的发展趋势及产业化
数控技术发展战略与发展途径的思考
用Energid 的软件进行机器人的抓取和操作
如何借助RFID技术升级企业信息管理水平
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved