基于Delphi的AI仪表上位机控制软件的编制

2018年02月07日

摘要:厦门宇电公司的AI系列仪表在工业现场应用广泛,但关于使用Delphi开发AI仪表的监控软件的资料却很少,本文根据自己对AI仪表上位机监控软件的开发经历,详细介绍了基于Delphi开发AI仪表通用程序的过程,其中包括对于AI仪表数据的读写的程序介绍以及在数据读写过程应注意的一些问题。

关键词:Delphi AI仪表 串行通讯

    引言:厦门宇电公司的AI系列仪表具有功能强大,操作简单,控制性能好等特点,并已在工业现场得到了广泛的应用。然而仪表在实际的工业应用中,往往需要利用计算机对其所采集的数据进行读取、保存,以及对于仪表自身参数进行读取与设定。为此宇电公司为用户提供了AI系列仪表的串行通讯接口模块,安装此模块后,用户能够方便地通过计算机232口实现与仪表的数据交换。本文就AI-708P仪表作为范例,详细介绍如何利用Delphi开发AI系列仪表的上位机监控软件。

1.具体实现

    AI仪表是通过计算机串口与计算机连接的,其具有自己的串行通讯协议,软件开发者可以根据此通讯协议实现对仪表的数据读取与设定,以及对仪表状态的读取与设定。网上对于AI仪表通讯程序的例程多为VB编制,并且程序较为简单,功能较为单一,不利于二次开发者对仪表进行全面开发。在此笔者自己针对708P型温度控制器编制了一个AI仪表的上位机监控软件以实现计算机对AI仪表监控。本文根据自己的开发经历,详细介绍了基于delphi开发AI仪表上位机通用程序的开发全过程,以及在开发过程中所应注意的一些事项。
1.1程序功能介绍
    本软件为AI仪表通用监控软件,其包括以下功能:
1. AI仪表检测与识别
2. AI仪表参数的读取与设定
3. AI仪表的状态读取与设定
在下面将对以上功能的实现作相应介绍。
1.2功能实现
    在开发过程中,为了缩短开发周期,软件中使用了第三方控件SPCOMM实现串行通讯功能,当然如果读者感兴趣可以自己尝试使用WINDOWS API函数自行编制此功能,对于WINDOWS API函数以及控件SPCOMM的使用方法,在本文中不作介绍,读者可以参看相关资料。在介绍程序功能前必须先说明两个过程:
    A. 读仪表参数过程TAI.ReadData(var msg: TMessage)程序代码如下:
var
NO1,NO2,NO3,NO4,NO5,NO6,NO7,NO8:Cardinal;
{NO1,NO2,NO3,NO4,NO5,NO6,NO7,NO8分别对应要发送的8个数据}
s : string;
p : PChar;
begin
NO1 := 128 + msg.WParam;//对于读数据过程WParam保存要读仪表的地址
NO2 := NO1;
NO3 := 82;
NO4 := msg.LParam; //对于读数据过程LParam保存要读的参数的参数地址
NO5 := 0;
NO6 := 0;
NO7 := 82 + msg.WParam;
NO8 := msg.LParam; 
s := chr(NO1)+chr(NO2)+chr(NO3)+chr(NO4)+chr(NO5)+chr(NO6)+chr(NO7)+chr(NO8);
p := PChar(s);
Comm1.WriteCommData(p,Length(s));
end;

    B. 写仪表参数过程TAI.SetData(var msg: TMessage) 程序代码如下:
var
NO1,NO2,NO3,NO4,NO5,NO6,NO7,NO8:Integer;
{NO1,NO2,NO3,NO4,NO5,NO6,NO7,NO8分别对应要发送的1~8位}
s:string;
p:PChar;
begin
NO1 := 128 + Meter_Addr;// Meter_Addr为全局变量,保存仪表地址
NO2 := NO1;
NO3 := 67;
NO4 := msg.WParam;//对于写过程WParam保存要写参数的参数地址
{按协议要求,计算出NO5、NO6、NO7以及NO8的值}
NO5 := (msg.LParam mod 256);// 对于写过程LParam保存要写参数值
NO6 := (msg.LParam div 256);
NO7 := ((67 + Meter_Addr + msg.LParam + msg.WParam *256) mod 256);
NO8 := ((67 + Meter_Addr + msg.LParam + msg.WParam *256) div 256);
s := chr(NO1)+chr(NO2)+chr(NO3)+chr(NO4)+chr(NO5)+chr(NO6)+chr(NO7)+chr(NO8);
p := PChar(s);
Comm1.WriteCommData(p,Length(s));
end;

    在程序中定义两个消息常量:
WM_Set = WM_USER + 100
WM_Read = WM_USER + 200

    通过发送以上两个消息并附带相应的参数,实现对以上两个过程的调用,从而实现对消息对仪表数据的读取与设定。以上两个过程按照AI仪表通讯协议,计算出每一位发送的数据,然后组合成字符串,一次性发送给仪表。每个参数代表的意义见程序解释。
1.2.1 AI仪表检测
    在实际应用中,计算机往往不止连接一个仪表,所以需要对不同地址仪表进行检索和识别:
    对于仪表检索是通过对地址的辨识实现的,利用AI通讯协议的读动作读取不同地址的仪表的地址参数,如果此时会返回值,并且其读回的数据与发送所设定的地址变量值相等,则确定检索到此地址的仪表,并添加到仪表队列中。
    对于仪表的识别即对已存在的仪表的识别的,即仪表必须有其明确且独立的地址。识别仪表关键在识别仪表的段数(单段或多段),对于不同段数的仪表,其某些参数地址所对应的参数意义有所不同。在软件中是通过读取一个固定参数地址的数据实现的,比如说:对于多段仪表来说,读取某一段的数据时(其参数地址通常都会大于25),仪表会返回相应参数地址的返回值,然而对于单段仪表,向该地址发送数据仪表并不会作任何反应。
1.2.2 AI仪表参数读取
    软件能够读取仪表内所有可读取的数据,包括采集的数据、控制数据以及对仪表的设定。自动识别小数点位数,按仪表表盘显示格式显示读取的数据。对于仪表的读取过程实现可以参看以上的ReadData过程以及宇电