C++Builder编程实现IXS系列X射线光机的控制

2015-03-16 09:10刘龙郝萌吴庆星黄宁
电脑知识与技术 2015年1期
关键词:串口通信

刘龙 郝萌 吴庆星 黄宁

摘要:针对VJ Technologies公司IXS系列X射线光机,分析其RS232接口,使用C++ Builder编程实现了对光机的控制。其中,串口通信采用了MSCOMM控件,串口信息读取则采用了多线程。根据通信协议,要求上位机和X射线光机每750ms内要通信一次,因此采用C++类实现和封装了上述内容和协议。通过类成员函数可以设置光机工作电压和电流,控制光机的启停,读取和解码光机的运行状态和故障信息,完成每750ms的Watch dog通信。此外,类实现方式可方便地创建多个实例,实现对多台光机的控制,从应用的结果看,效果良好。

关键词:C++Builder;X射线光机;RS232;串口通信;MSCOMM

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)01-0060-03

Software Implementation for Controlling IXS Series X-ray Tube Using C++ Builder

LIU Long,HAO Meng,WU Qing-xing, HUANG Ning

(1.Ministry of Education Key Laboratory of Radiation Physics of Institute of Nuclear Science and Technology of Sichuan University,Chengdu 610064, China)

Abstract: In this paper, C++ Builder platform,MSCOMM ActiveX Control and multithread programming are used, to communicate with IXS series X-ray generator of VJ Technologies company. The wrapped C++ class encapsulates the MSCOMM Control and protocol, can setup the voltage, current, open and close the x-ray generator, read and decode the status and error message from the generator, the watch dog timer per 750ms is implemented too. Furthermore, the computer can control multi x-ray generator easily, according to the result of practice, the effect of this design is good.

Key words: C++Builder; ray generator; RS232; serial communication; MSCOMM

X射線的产生相对简单容易,由于其能够穿透物质,可以通过测量成像的方法得到物质内部的信息,因此广泛应用在安检、探伤、医疗等领域[1]。X射线光机是产生X射线的常用设备,目前的商用X射线光机功能已非常完善,不仅可以控制光机的开停,还可以在线设置能量和束流的大小。

商业X射线光机大都带有操作和控制软件,其作用一般用于光机诊断和调试。由于光机提供的操作程序是独立的执行程序和界面,功能单一,不能和主应用程序集成,使用起来很不方便。例如,在安检应用中,当用户按“检测”按钮时需要同时启动光机、皮带电机、数据采集,而不能让用户在三个程序中分别去操作,那样很麻烦,而且时间不统一。因此,在实际应用中,需要开发光机的通信接口模块,在主程序中采用通信接口实现对光机的控制。

1 IXS系列X射线光机

IXS是VJ Technologies公司的X-Ray Generator系列产品,其技术在国际上具有领先优势,其光机运行稳定、可靠,输出电流和电压可以根据需要进行调节,并且对过流、过压和温度过高等现象具有保护措施[2]。IXS系列X射线光机自带有控制器(Controller),上位机可以通过控制器的RS232接口,获取光机的状态,从而控制光机的运行,达到实现与应用的紧密耦合。 图1为扇形束束流的光机实物图[2],图中右下角为光机控制器。

IXS光机的RS232协议默认通信参数为“9600,N,8,1”,没有使用硬件握手和软件握手,硬件连接只需要RXD,TXD,GND三根信号线,软件实现也比较简单[3]。

IXS对信息包采用了ASCII编码,进行了简单的封装,所有的命令和报告都以开始,结束,例如:

CMDARG

CMD

RPT

其中,为开始符号(0x02),为结束符号(0x0d),CMD、ARG和RPT分别代表ASCII编码的命令、参数和报告。IXS的部分命令见表 1:

从表1可看出,光机控制器收到上位机信息后会发生响应,上位机读取响应信息,即可知道光机的运行状态。例如,发送‘MON命令,可得到目前的电压、电流、温度、灯丝状态等编码信息。

如果操作不当,X射线会造成辐射损伤,为保证安全,IXS光机采用了看门狗机制,即控制器在收到上位机的命令后,会启动看门狗计时器(Watch dog timer),若在接下来的750ms内没有收到新命令和消息,控制器会自动关闭电压和电流。所以,为确保X射线光机正常安全运行,上位机必须在750ms内和光机通信一次,当没有其他命令时,通常定时发送WDTE命令。这样,当通信异常,或上位机出现故障,甚至上位机断电时,光机也会在750ms内自动关闭,避免事故的发生。

图2为正常使用时,上位机和光机的交互图,上位机设置光机的电压和电流后,打开光机,并在750ms内重复发送看门狗信号,维持光机的开状态,使用结束后关闭光机,使用期间需要读取和解析光机的返回信息,也可以发送“MON”命令主动查询光机的状态。

2 软件设计实现

要实现与X射线光机之间的通信,软件上需要匹配操作的串口硬件,实现对串口的双向读写,同时还要实现光机的通信协议,按协议要求发送和解析命令[4]。

C++ Builder具有丰富的VCL控件库,可高效开发界面,对C++语言和COM技术的支持也很强大,因此我们选用了C++ Builder作为开发平台[4-10]。在C++Builder中可以安装MSCOMM ActiveX控件,实现对RS232串口的控制,这样就可以不讨论RS232通信的底层实现,而把软件重点放在协议的解析和实现上[5-7]。

我们在C++ Builder中定义了TVJXRay类,用于封装MSCOMM控件和光机通信协议。其类设计见图3。

从图3可以看出,TVJXRay类中持有MSCOMM控件的指针,因此可以在TVJXRay中对串口进行操作,TVJXRay类对象在TMainForm的OnCreate()函数中被创建和初始化,通过其构造函数把MSCOMM控件指针传递给了TVJXRay对象。

当然,要在TVJXRay类中创建MSCOMM控件的实例也是可以的,只是单独编写代码创建COM控件比较麻烦,我们采用了VCL的控件管理方式,在主窗體中自动创建控件[6]。

从图3还可看到,TVJXRay类派生自TThread类,这是由于程序需要监测串口,为了使串口操作不占用主线程,采用了多线程的方式,需要对Execute()函数进行重载,主要的任务是解析控制器发来的命令,以及每750ms内重置看门狗通信计时器。Execute()函数的部分实现代码如下:

void __fastcall TVJXray::Execute()

{AnsiString RBuffer,RcvText;

if(!pcomm→PortOpen) return;

RBuffer=pcomm→Input;

RcvText="";

do

{if(pcomm→InBufferCount)

{ RBuffer=pcomm→Input;

RcvText+=RBuffer;

Response(RcvText); //Response Process

}

if(m_RayOn)

{ pcomm→Output=WDTE;

Sleep(600); //<750ms

}

Sleep(10);

}while(!Terminated);

}

虽然也可以使用MSCOMM控件的OnComm()事件,接收和处理串口的信息,但是那样的话必须在TMainForm中去处理,增加了TVJXRay类和TMainForm类的耦合,对增加的每个串口都要分别处理OnComm()消息,不利于多串口的开发。

由于采用了C++类实现方式,封装了光机的通信协议,当应用中有多个这样的光机时,只需要创建一个新的TVJXRay()实例就可以了,图3中就创建了2个实例,即一台上位机可以控制多台光机同时工作。

运行结果

C++ Builder不仅可以快速做出漂亮的界面,而且支持COM控件和多线程机制,COM控件可以在设计时拖放到主界面上,实现控件的设置和初始化;封装的TThread类也很方便,重载Execute()函数就实现了多线程,因此,C++ Builder是一个不错的基于C++语言的快速开发平台[9-10]。

通过MSCOMM控件,实现了串口的通信,继承C++ Builder的Thread类,实现了多线程,同时,采用类封装了IXS系列光机控制器的通信协议,在应用程序中实现了对IXS系列的射线光机的控制,可以监测其运行状态,实现看门狗通信,同时也支持对多台光机光机的控制,从实际运行的结果看,效果良好。

参考文献:

[1] 屠耀元. 射线检测技术[M]. 上海: 上海世界图书出版社, 1997.

[2] IXS系列X射线光机[EB/OL]. [2014-10-24]. www.vjt.com.

[3] 何小海,严华. 微机原理与接口技术[M]. 北京: 科学出版社, 2006.

[4] 高迎慧. C++Builder实现RS-232串口通信的研究[J]. 仪器仪表用户, 2009(6): 37-38.

[5] 张志明. MSCOMM ActiveX控件在网络监测系统串行通信编程中的应用[J]. 电子质量, 2002(10): 25-30.

[6] 李海燕. 基于ActiveX控件的串口通信技术[J]. 电脑与电信, 2007(12): 58-60.

[7] Jan Axleson.串行端口大全[M]. 北京:中国电力出版社,2001.

[8] Erich Gamma, etc. Design Patterns: Elements of Reusable Object-Oriented Software[M]. Pearson education, Inc. 2002.

[9] 范逸之. C++ Builder与RS-232串行通信控制[M]. 北京: 清华大学出版社, 2002.

[10] 余明兴,吴明哲,黄世阳等. Borland C++Builder6程序设计经典[M] . 北京: 科学出版社, 2004.

猜你喜欢
串口通信
基于Android的电解质分析仪设计与实现
基于Qt和Flash的嵌入式Linux软件架构设计
串口通信在智能家居监控系统中的应用
基于Python实现设备控制台的集中控制和管理
基于OpenCV的室内照明智能控制系统设计与实现
基于Qt5的MODBUS协议编程与实现
基于MSP430单片机的窄带无线数据传输模块的设计
便携式数传电台测试系统的设计与实现
基于MFC的AUV多传感器数据采集系统设计及测试
基于LabVIEW的温度测量系统设计