西门子唐山授权代理商
本文对在Delphi中使用ActiveX控件,使用行间汇编,用Delphi调用可执行应用程序三种方法实现串口通信进行了阐述。不过在Delphi中进行串口编程并不象作者所说的那样令人头疼,我就知道几个很好用的串口程序是用Delphi编写的(我不太会用Delphi)。
Delphi 是新一代可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,Delphi系列开发工具在国际各媒体上曾获得过三十多项大奖,是全球公认的快速应用开发工具技术的先驱者,他越来越在构架企业信息系统方面发挥着重要作用。
它的功能很强大,但在对串口通信的控制上Delphi的帮助文档和其他书籍中很少提及,可这是在开发应用系统时会经常遇到却又令人头痛的事情。下面介绍三种解决方案,以实现接收和发送数据的功能。
一、 使用ActiveX控件
由于Delphi中没有串口控件可用,所以首先需要把ActiveX控件MSCOMM加到元件选项板上。这是一个非常好的控件它不仅能对串口进行操作,而且还可以对Modem进行控制。下面结合一个具体的实例来说明如何用MSCOMM控件开发出串口通信程序。
创建一个Communication.dpr工程,把窗体的Name属性变为Commbbbb,将标题改为The Communication Test,选择File/Save As将新的窗体存储为CommFrm.pas,接下来将控件添加到主窗体中。
通过设置页可选定进行数据传输的通信端口和端口的波特率、奇偶校验、数据位和停止位,通信时每传输一个字符都将触发响应事件,在通信页“传输显示”位置可看到当前正在进行传输的数据。同时当出现回车换行符时将整行内容显示在memDisplay新的一行中,而全部接收的内容还将存在一个文件中。部分源代码如下:
变量说明
var
Commbbbb: TCommbbbb;
ss :bbbbbb;
savef,readf :file of char;
i,j :longint;
初始化
procedure TCommbbbb.bbbbCreate(Sender: Tbbbbbb);
begin
mscomm.commport:=1;
mscomm.settings:='9600,n,8,1';
mscomm.bbbbblen:=1;
mscomm.inbuffercount:=0;
mscomm.portopen:=true;
ss:='';
i:=0;
j:=0;
assignfile(savef,'save1');
rewrite(savef);
assignfile(readf,'read1');
reset(readf);
end;
设置确定
procedure TCommbbbb.btnConfirmClick(Sender: Tbbbbbb);
begin
if mscomm.portopen then
mscomm.portopen:=false;
mscomm.commport:=strtoint(edtCommport.text);
mscomm.settings:=edtCommsetting.Text;
end;
传输事件
procedure TCommbbbb.MSCommComm(Sender: Tbbbbbb);
var
filenrc :char;
buffer :variant;
s1:bbbbbb;
c :char;
begin
case mscomm.commEvent of
comEvSend:
begin
while not(eof(readf)) do
begin
read(readf,filenrc);
mscomm.output:=filenrc;
[NextPage]
j:=j+1;
lblDisplay.caption:=inttostr(j);
if mscomm.outbuffercount>=2 then
break;
end;
end;
comEvReceive:
begin
buffer:=mscomm.bbbbb;
s1:=buffer;
c:=s1[1];
ss:=ss+c;
i:=i+1;
lblDisplay.caption:=c+inttostr(i);
write(savef,c);
if (c=chr(10))or(c=chr(13)) then
begin
lblDisplay.caption:='cr'+inttostr(i);
memDisplay.lines.add(ss);
ss:='';
end;
end;
end;
end;
当然还有许多串口控制的ActiveX控件,有控件用是方便,但是是否说没有控件就不能用Delphi本身解决问题呢。那么就请来看一下下面的解决方案:
二、使用行间汇编
对于硬件的控制,汇编语言是方便的了,而Delphi中又允许使用行间汇编那么来看一下怎样使用行间汇编接收下位机传来的数据,在下面的例子中我们简化了问题,比如我们通过COM2接收400个传来的字符并将这些内容保存在AAA.DAT文件中当接收完毕后显示‘Receive end’。但是为什么说我们简化了问题呢,因为实际情况中双方通信可能是约定传送字符的个数,也可能约定的是规定好的起始字符和结束字符,或是多种条件同时约定待各种条件全部满足时才表示完成一次成功的接收否则如有一个条件未满足都表示接收失败需要重新传送。这些约定在使用了行间汇编的Delphi程序中都可实现。下面的程序就是按一个按钮进入的一个简化的串口接收程序。
procedure Tbbbb1.Button1Click(Sender: Tbbbbbb);
一、plc的软件系统
PLC的软件可分为两大部分:系统软件和用户程序。系统软件由PLC制造厂商固化在机内,用以控制可编程控制器本身的动作。用户程序由PLC的使用者编址并输入,用于控制外部对象的运行。
1、系统软件
系统软件又可分为系统管理程序、用户指令解释程序及标准程序模块和系统调用。
1)系统管理程序
系统管理程序是系统软件中重要的部分,,管控制PLC的运作。其作用包括三个方面:一是运行管理,即对控制PLC何时输入、何时输出、何时计算、何时自检、何时通信等作时间上的分配管理。二是存储空间管理,即生成用户环境。由它规定各种参数、程序的存放地址,将用户使用的数据参数、存储地址转化为实际的数据格式及物理地址,将有限的资源变为用户可很方便地直接使用的元件。三是系统自检程序,它包括各种系统出错检测、用户程序语法检验、句法检验,警戒时钟运行等。PLC正是在系统管理程序的控制下,按部就班地工作的。
2)用户指令解释程序
众所周知,任何计算机终都是执行机器语言指令的。但用机器语言编程却是非常复杂的事情。PLC可用梯形图语言编程。把使用者直观易懂的梯形图变成机器懂得的机器语言,这就是解释程序的任务。解释程序将梯形图逐条解释,翻译成相应的机器语言指令,由CPU执行这些指令。
3)标准程序模块和系统调用
这部分软件由许多独立的程序块组成。各程序块完成不同的功能,有些完成输入、输出处理,有些完成特殊运算等。PLC的各种具体工作都是由这部分程序来完成的。这部分程序的多少决定了PLC性能的强弱。
整个系统软件是一个整体,其质量的好坏很大程度上会影响PLC的性能。很多情况下,通过改进系统软件就可在不增加任何设备的条件下,大大改善PLC的性能。因此PLC的生产厂商对PLC的系统软件都非常重视,其功能也越来越强。
2、用户程序
用户程序是PLC的使用者针对具体控制对象编制的程序。在小型PLC中,用户程序有三种形式:指令表(STL)、梯形图(LAD)和顺序功能流程图(SFC)。
二、PLC的编程语言
由于PLC是专为工业控制需要而设计的,因而对于使用者来说,编程时完全可以不考虑微处理器内部的复杂结构,不必使用各种计算机使用的语言,而把PLC内部看作由许多“软继电器”等逻辑部件组成,利用PLC提供的变成语言来编制控制程序。
PLC提供的编程语言通常有三种:梯形图、指令表和顺序功能流程图。
1、梯形图编程
梯形图表达式是在原电器控制系统中常用的接触器、继电器梯形图基础上演变而来的。它的大优点是形象、直观和实用,为广大电气技术人员所熟知,是PLC的主要编程语言。
PLC的梯形图与电器控制系统梯形图的基本思想是一致的,但也有很大的区别(详见第6章),表面看起来完全一样的继电器线路与梯形图,它们产生的效果可能一样,也可能不完全一样,甚至某些作用完全相反。PLC的梯形图使用的是内部继电器、定时/计数器等,都是由软件实现的。其主要特点是使用方便,修改灵活。这是传统电器控制的继电器梯形图硬件接线所无法比拟的。
图1所示是用OMRON公司C系列P型机编号的自保持电路梯形图。这里0506的触点与启动触点0000并联。当0000接通,0506工作后,0506线圈可由自己的触点保持。若0001通,则0506断。
图1 自保持电路梯形图
2、指令语句表编程
指令语句表语言类似于微机中的助记符语言。它是可编程控制器基础的编程语言。所谓指令语句表编程,是用一个或几个容易记忆的字符来代表可编程控制器的某种操作功能。每个生产厂家使用的助记符是各不相同的,因此同一个梯形图书写的语句形式不尽相同。语句是用户程序的基础单元,每个控制功能由一个或多个语句的用户程序来执行。每条语句是规定CPU如何动作的指令,它的作用和微机的指令一样,而且PLC的语句也是由操作码和操作数组成的,故其表达式也和微机指令类似。
PLC的语句为
操作码+操作数 或 操作码+标识符+参数
其中,操作码用来指定要执行的功能,告诉CPU应该进行什么操作;操作数内包含执行该操作所必需的信息,告诉CPU用什么地方的东西来执行此操作。具体指令的说明在后面的章节有详细的介绍。
表1是图1所示梯形图相对应的指令表。
表1 指令表
3、顺序功能流程图编程
顺序功能流程图编程(SFC)是一种较新的编程方法。它的作用是用功能图来表达一个顺序控制过程。目前国际电工协会(IEC)也正在实施发展这种新的编程标准。
使用SFC作为一种步进控制语言,用这种语言可以对一个控制过程进行控制,并显示该过程的状态。将用户应用的逻辑分成步和转换条件,来代替一个长的梯形图程序。这些步和转换条件的显示,使用户可以看到在某个给定时间中机器过程处于什么状态。
图2所示是一个顺序钻孔的顺序功能流程图编程的例子。方框中数字代表顺序步,每一步对应于一个控制任务,每个顺序步的步进条件以及每个顺序执行的功能可以写在方框右边。
图3 顺序功能流程图编程示例