一、引言
为了满足广大用户对通讯功能应用的要求,在三垦VM05系列变频器中对通讯功能进行了加强,机器本身标准配置了RS232与RS485通讯接口,可方便地实现一对一或一对多通讯。三垦变频器的使用说明书中介绍了采用VB6.0实现通讯的实例,因VB6.0中自带一个可实现通讯的MSCOMM控件,可以比较方便的完成通讯功能。Delphi5.0为Inprise公司开发的一款优秀的可视化软件开发工具,因其短小精悍、真编译、易学易用等优点,逐渐成为越来越多程序员喜爱的开发工具。遗憾的是,Delphi自身没有实现串行通讯功能的控件,当然我们可以采用Windows的API函数或内欠汇编程序完成通讯功能,但如此需要我们熟悉复杂的API函数、汇编程序、多线程、消息处理机制以及掌握大量的通信知识等技术。但是,Delphi深受广大程序员爱好的一个非常重要的原因是因为Delphi有着众多的强大的第三方控件,SPCOMM就是一款流行的应用于Delphi中的串口通讯控件。她因其源代码完全采用面向对象的PASCAL语言编写而能与Delphi很好的结合,经过编译安装后的控件可以与Delphi自身的控件一样的使用。
二、三垦VM05变频器通讯功能简介
由于篇幅所限,关于通讯的基本知识不是本文介绍的要点,读者可以参考相关的书籍。三垦VM05变频器通讯的电文格式主要有两种形式:①ASCII形式:以ASCII代码文字构成的电文的一种形式。②BINARY形式:以16进制数据构成变频器的编号及数据部分的一种形式。ASCII形式电文长度较BINARY形式长,故电文传送时间要比BINARY形式的长些,但ASCII形式电文可以实现强大通讯要求的功能,所以是本文介绍的重点。
1、 ASCII形式电文构成形式如下:
①开始代码为“*”,即ASCII代码的2AH。
②③变频器编号,固定为2个字节,范围为1~32。如1号变频器写为:01。
④指令代码,变频器的指令代码,参考下面的描述。
⑤数据,与指令代码配合的操作数,可参考三垦变频器说明书的指令代码说明。
⑥校验和,将①~⑤的数据以二进制求和,取得到结果的低2位16进制数的补码,最后将bit7设为0,bit6设为1。
⑦⑧终止代码,可以由变频器功能码Cd151决定采用CR+LF和CR两种形式。
注:CR,回车符ASCII 的0DH;LF,换行符ASCII的0AH。
2、指令代码。
三垦变频器的标准电文中共有27种命令。限于篇幅需要,本文只简单介绍几个常用的命令,其他命令可以参考三垦变频器的使用说明书中的描述。
3、变频器参数设定
其他参数均采用默认值。其中与通讯有关的参数为:波特率Cd148=1(4800 bps),奇偶校验位Cd149=1(奇数),停止位Cd150=1(1位),终止代码Cd151=0(CR+LF)。
三、采用SPCOMM控件完成上位机对三垦变频器的控制。
1、SPCOMM控件的安装。
为了让SPCOMM控件能像Delphi本身自带的控件一样使用,必须进行安装与编译。首先将SPCOMM.PAS等文件拷贝到Delphi的安装目录Delphi5lib下,然后打开Delphi5,选择下拉菜单 Component中的 Install Component选项,在 Unit file name处点击Browse按钮,在Delphi5lib下选择SPCOMM.PAS,其他各项可用默认值,点击 OK按钮。编译安装成功后,在System控件面板中会出现一个红色COM 232字样控件(如下图所示)。现在就可以像使用Delphi自带控件一样使用SPCOMM控件了。
2、窗体的建立以及程序的编写。
拖动一个SPCOMM控件到窗体上,然后布置如下的界面,全部源程序如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, SPComm, Buttons, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Comm1: TComm;
Edit1: TEdit;
BitBtn1: TBitBtn;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
StatusBar1: TStatusBar;
function SumCheck(s:string):integer;
procedure SendCommand(s:string);
procedure BitBtn1Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
Procedure FormCreate(Sender: TObject);
Procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Str_Send,Str_Input:string;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: Tobject );//窗体创建时对一些参数初始化
begin
Comm1.BaudRate:=4800; //设置波特率为4800
Comm1.CommName:=COM1; //设置通讯口为COM1
Comm1.Parity:=Odd; //设置校验位为奇校验(Odd)
Comm1.StopBits:=_1; //设置停止位为1位
Comm1.StartComm; //启动通讯口
end;
Function TForm1.SumCheck(s:string):integer; //自建立校验和函数
var Str_Sum,i:integer;
begin
Str_Sum:=0;
for i:=1 to length(s) do
begin
Str_Sum:=Str_Sum + Ord(s[i]);
Application.ProcessMessages ; //转让系统控制权
end;
Str_Sum:=(((0-Str_Sum) And 127) Or 64);
Result:=Str_Sum;
end ;
procedure Tform1.SendCommand(s:string);
var i:integer;
begin
for i:=1 to length(s) do //完成对字符串的发送
begin
Comm1.WriteCommData(@s[i],1);
Application.ProcessMessages;
end
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Str_Send:=Edit1.Text; //将Edit1输入的字符串设为命令的开始部分
Str_Send:=Str_Send + Chr(sumcheck(str_send))+ #13 + #10; //对电文增加校验和以及CR+LF
StatusBar1.Panels[1].Text:=Str_Send; //将命令显示在状态条上,便于查看
SendCommand(Str_Send); //发送控制命令
end;
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin //以下程序为将接收到的数据显示在Memo1上。
SetLength(Str_Input, BufferLength);
Move(Buffer^, PChar(Str_Input)^, BufferLength);
Memo1.Lines.Add(Str_Input);
Memo1.Invalidate;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Comm1.StopComm; //程序退出时关闭通讯口
end;
end.
以上程序在Windows2000 Professional,Delphi5.0环境下编译通过。
四、结束语
将以上的程序编译运行,然后将计算机的COM1口连接到三垦变频器的RS232通讯口上(参考三垦变频器使用说明书),并设定好前文所示的变频器参数,就可以实现通讯了。如在发送的命令框里输入:*01O00500,按发送按钮,就可以将频率设定为5HZ,同时Memo1里增加了返回的代码。输入*01P,变频器可以实现正转。由于返回的电文里含有回车与换行符,大家可以发现Memo1自动的换行显示。本文为了使程序简洁易懂,并未加任何通讯错误处理与花哨的界面,大家在此程序的基础上修改后即可满足您对三垦变频器监控的要求。
参考文献:
1、《三垦变频器VM05系列使用说明书》-三垦力达电气(江阴)有限公司。
2、《Delphi 5 开发指南》 电子工业出版社 王忠 迟忠先 编著。