工控编程吧
标题: 基于Delphi的厦门宇电AI仪表上位机控制软件的编制 [打印本页]
作者: qq263946146 时间: 2019-11-12 10:34
标题: 基于Delphi的厦门宇电AI仪表上位机控制软件的编制
摘要:
厦门宇电公司的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;
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过程以及宇电的仪表通讯协议。需要指出的是在读取过程中需要注意对某些特殊数据的处理,其中包括小数点的处理以及负数的处理。
A. 小数点的处理
在仪表数据的读取过程中,当你获得了仪表的返回数据后,必须按照AI通讯协议对返回的数据进行分析和计算。其中存在一个问题,通过计算后有的数据可能是实际数据的10倍,而有的数据可能与实际数据相同。根据笔者的观察,在仪表说明书中允许带小数点的数据都需要进行10倍处理,即将返回数据计算得到的结果然后作除10计算才能得到正确的数据。
B. 负数的处理
在仪表数据的读取过程中,往往会碰到负数的问题,此时按照AI通讯协议计算得到的数据往往会很大并且数值与实际数值不符。对于这种小于零的数据需要进行负数处理。但是如何识别一个负数呢?其实对于负数而言,当其被读取时其高位往往大于127,于是我们可以通过判断高位来识别负数。当识别到负数后,我们要显示正确的数据就存在一个转换,从二进制的角度分析可知仪表返回的数据的高位的最高位为标志位,当其为0时代表正数,当其为1时代表负数。根据以上分析,如果我们需要得到负数的数值,只需将计算出来的数据减去65536即可。
以下是接收过程中的一些处理程序:
接收过程:
var
p : PChar;
begin
p := Buffer;
buffer为SPCOMM的接收过程中所接收到的数据。
负数处理过程:
if (p7>127 then
ReData:=((p6+p7*256)-65536)/10
else
ReData := (p6+p7*256)/10;
p6、p7是接收到数据的第7位和第8位的转化为整数后的值,可以通过p6:=ord(p[6])(p为接收过程中的p)获得。根据以上过程得到的数据ReData再经过小数点分析及即可得到与仪表一致的数据。
1.2.3 状态的读取
仪表的状态包括运行状态及报警状态,可以通过读取仪表的第21号参数同时获取。
读取21号参数时,仪表返回的参数值是系统仪表的运行状态值,由于各个位代表的仪表运行状态不同,所以需要对其进行分析。返回数据的第3位代表停止位,第2位代表暂停位,其余的0位和1位代表运行位。只要2和3位不为1即代表仪表处于运行状态。所以当我们检测仪表的运行状态时,我们只需要对这些位进行识别即可。
读取21号参数时,仪表同时会返回报警状态,通过对报警状态位的识别,可以获取仪表的报警状态。MV值的0、1、2、3位分别代表仪表的上限报警、下限报警、正偏差报警、负偏差报警状态,其为1有效。
1.2.4 参数设定
对于参数的设定可以参考仪表通讯协议以及过程SetData,其需要注意的是其数据的计算、小数点处理以及负数的处理。其处理方式与数据的读取基本相同,在此不再详细讲叙。
2.结语
通过以上方法可以实现仪表与计算机的数据交换,并且具有程序简单、模块化、运行可靠、功能全面等特点。
该程序源代码已被本公司广泛应用于AI仪表的工业应用软件中。
宇电通讯应用,可以参考下面视频教程与源代码。
欢迎光临 工控编程吧 (https://www.gkbc8.com/) |
Powered by Discuz! X3.4 |