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