应用PCL和HP-GL/2实现带有标准刻度线的心电图打印
2010-10-09于良军杨继鹏李桂阳葛成名泰安市医疗器械维修管理站山东泰安7000山东服装职业学院信息工程系山东泰安7000山东省泰安荣军医院设备科山东泰安7000
于良军,杨继鹏,李桂阳,葛成名.泰安市医疗器械维修管理站,山东泰安 7000;.山东服装职业学院信息工程系,山东 泰安 7000;.山东省泰安荣军医院 设备科,山东泰安 7000
YU Liang-jun1,YANG Ji-peng2,LI Gui-yang3,GE Cheng-ming1
1.Taian Medical Equipment Maintenance Administration Station,Taian Shandong 271000,China; 2.Department of Information Engineering,Shandong Vocational College of Clothing,Taian Shandong 271000,China;3.Equipment Department, Taian Rongjun Hospital,Taian Shandong 271000,China
应用PCL和HP-GL/2实现带有标准刻度线的心电图打印
Realization of ECG Printing with Standard Scale Line by Using PCL and HP-GL/2
于良军1,杨继鹏2,李桂阳3,葛成名11.泰安市医疗器械维修管理站,山东泰安 271000;2.山东服装职业学院信息工程系,山东 泰安 271000;3.山东省泰安荣军医院 设备科,山东泰安 271000
YU Liang-jun1,YANG Ji-peng2,LI Gui-yang3,GE Cheng-ming1
1.Taian Medical Equipment Maintenance Administration Station,Taian Shandong 271000,China; 2.Department of Information Engineering,Shandong Vocational College of Clothing,Taian Shandong 271000,China;3.Equipment Department, Taian Rongjun Hospital,Taian Shandong 271000,China
使用激光打印机可以把心电图和标准刻度线打印在A4打印纸上,为了提高打印速度和效果,可利用PCL光栅命令打印刻度线、利用HP-GL/2向量图形命令绘制心电图。本文介绍了刻度线和心电图的打印原理,给出了有关的PCL和HP-GL/2命令,并提供了部分C语言程序。
PCL;HP-GL/2;像素点;刻度线;心电图
标准心电图纸是纵横都具有刻度线的方格纸,刻度线起到辅助观察和测量心电图电压、时限的作用。传统的心电图机使用带有刻度线的心电图纸,用热敏方式把心电图打印在心电图纸上。现在许多心电产品由计算机控制,利用激光打印机把心电图打印在A4打印纸上,打印纸上面没有刻度线,因此需要把刻度线打印出来,然后绘制出心电图波形。为了突出心电图波形,心电图用较粗的实线绘制,刻度线用虚线绘制。为了达到较快的打印速度和较佳的打印效果,可以把PCL和HP-GL/2两种命令结合起来打印。
1 标准心电图纸刻度线的打印原理
PCL光栅命令速度快,可用来打印刻度线。刻度线分为三种:5mm线、1mm线、0.25mm线。0.25mm线是在1mm线之间设立的刻度线,纵向的5mm线是通过多行横向的0.25mm线表示出来的。刻度线用若干像素点表示,当像素点置“1”时,表示该像素点打印,当置“0”时,表示该像素点不打印。5mm线打印点较密,置“1”的像素点较多,1mm线打印点较稀,置“1”的像素点较少。图1为横向和纵向均为5mm的刻度线像素点的设置情况。
图 1 5mm刻度线的像素点设置
在PCL光栅命令中,设置分辨率为300像素/英寸,由于1英寸=25.4mm,因此1mm=300/25.4,约等于11.8个像素点[1]。在图中,黑色圆点代表需打印的像素点,白色圆圈代表不需打印的像素点。5mm线为较密的虚线,因此采用每3个像素点设置1个打印点,如图中第0行、第60列等。1mm线较淡,每1mm(约11.8个像素点)设置1个打印点,如图中第12行、第48行、第36列等。0.25mm线每5mm(约60个像素点)设置1个点为打印点,如图中第3行、第3列等,所有横向的0.25mm线依次打印,就成为了纵向的5mm线。
在光栅方式下,1个字节包含8个像素,不能把像素点直接送到打印机输出,必须把像素数转换为字节数,并把所有的像素分配在相应的字节中,然后把字节送往打印机输出。现在设置这三条刻度线的打印点的分布情况。如图1所示,5mm线每3个像素点设置1个打印点,需要24位,即3个字节,才能使像素循环地均匀分配到相应的字节,其对应的2进制数为100100100100100100100100,分配到3个字节,其16进制值分别为92H、49H、24H。1mm线约每11.8个像素设置1个打印点,0.25mm线约每60个像素设置1个打印点,在横向1mm线和0.25mm线上,需要把这些像素分配到相应的字节中,并且指明像素位于字节中的哪一位。这三种刻度线的像素设置情况分别存入bit5、bit1和bit025三个数组中。当设定打印的宽度为width毫米时,可以把毫米转换为像素数,每行中包含的像素数为width*(300/25.4)。把每个像素位置除以8得到的商,为这个像素所在的字节,把这个像素位置对8求余数,得到该像素在本字节中的位设为m,然后利用0x80 >> m命令把这一位置1,即设为打印点[1]。
光栅图形要逐行打印,需依次把每行的打印数据送给打印机,应判定每行是5mm线、1mm线、0.25mm线,还是本行输出为空行。需要把纵向的高度height毫米转换为像素数,即行数。当行数被3整除时,设置为0.25mm线,其他情况设置为空行,把设置情况放入bit数组中。继续判断,当行数为11.8的5倍时,说明是5mm线,把bit与bit5进行或运算,打印5mm线;当行数为1、2、3、4倍时,说明是1mm米线,把bit与bit1进行或运算,打印1mm线。
方格纸的上下左右边界都要设置成双实线,左侧可以采用或0xc0位运算,对于右侧,要判断最右面一个像素点位于所在的字节的哪一位,然后把这一位后面的所有位置“0”。
2 心电图的绘制原理
心电图波形是连续曲线,可以看作矢量图形,若用PCL光栅命令打印,速度快,但算法复杂,用HP-GL/2向量图形绘制稍慢,但算法简单。为了突出心电图,可以设置较粗的线宽,
1个绘图仪单位=0.025mm,即1mm=40个绘图仪单位。在心电图纸上,横向(长度)表示时间,纵向(高度)表示电压,25mm长度表示1s,10mm高度表示1mV电压。需要建立采样值与长度、高度之间的对应关系。设A/D转换器采样率为500点/s,因1s心电图时间占用25mm长度,即1000个绘图仪单位,因此在横向上1个采样点对应2个绘图仪单位。设A/D转换器为8位,满量程为5mV,则其分辨率为5mV/256,因1mV电压占用10mm高度,即400个绘图仪单位,因此在纵向上1个采样分辨率值对应5/256×400=7.8125个绘图仪单位。
3 PCL打印控制命令[2,10]
PCL命令分为两类:一类是打印文本的命令;一类是打印光栅图形的命令。PCL命令的格式有两种:一种是ASCII码字符ESC加一个字符或一个数字组成;另一种是带参数的ESC命令序列,通常由5部分组成,即ESC字符、参数化字符、命令类型、值域、结束字符,命令结构为:[ESC字符][ 参数化字符][命令类型][值域][结束字符]。
ESC字符: 为开始符号,总是位于打印指令的开始,标识其后的一串字符为打印命令,其十六进制值为1B。
参数化字符:该字符告诉打印机输入的ESC指令序列超过两个字符,且指令参数化。
命令类型:表示要执行的指令的类型。
值域:大多数打印机指令都包含值域,通常用“#”表示。在实际过程中“#”用数字代替,表达不同的含义。
结束字符:为一个大写字符,表示本条指令的结束,每一条打印指令都包含一个结束字符,且位于该指令的最后。
PCL命令集比较复杂,现只介绍与光栅图形打印有关的命令:
ESCE 复位打印机。
ESC%1A 进入PCL模式,并将HP-GL/2的画笔位置作为当前活动位置。
ESC&l#A 指明纸张大小。#取26、100时分别表示A4及B5纸。
ESC&l#O 设置逻辑页面打印方向。#=0:垂直,坐标原点在左上角;#=1:水平;#=2:逆向垂直;#=3:逆向水平。
ESC*t#R 设置打印分辨率。#取75、100、150、200、300、600时,分别设置打印分辨率为75、100、150、200、300、600DPI。
ESC*r#F 光栅图形表示模式。#=0:按逻辑页打印光栅图形;#=3:按物理页打印光栅图形。
ESC*p#X X方向光标定位。
ESC*p#Y Y方向光标定位。
ESC*b#M #=0为非压缩模式。
ESC*r#A 进入光栅图形打印状态。#=0表示从最左端开始打印;#=1表示从当前光标位置开始打印。
ESC*b#W[光栅数据] 传送1行光栅数据,#取光栅行中的字节数,光栅数据表示所送字节的具体内容。
ESC*rB 结束光栅图形。
4 HP-GL/2向量图形打印控制命令[3-9]
HP-GL/2是HP激光打印机的向量图形打印命令,也是许多绘图仪(如Roland绘图仪)采用的绘图命令,它提供了画直线、矩形、圆、文本等丰富的命令,可以设置线的宽度,对于心电图曲线的绘制非常方便。HP-GL/2命令有4个组成部分:一个命令串、参数、分隔符及一个终结符,其格式为:
[命令串][参数][分隔符][终结符]。
不同的命令有不同个数的参数,分隔符用“,”表示,终结符用“;”表示。
绘制心电图用到的HP-GL/2命令如下:
ESC%-1B 进入HP-GL/2模式。
BP 开始绘图,无参数。
IN 初始化绘图仪,无参数。
DF 将绘图仪设置为特定的缺省值,坐标原点在左下角。
PWwidth width说明画笔的宽度。
WUtype type说明画笔宽度指令(PW)的宽度参数的解释模式,为0表示宽度单位为毫米,为1表示宽度是相对的。
PUx1,y1 提起画笔移到(x1,y1)位置。
PDx2,y2 落下画笔并移到(x2,y2)位置,PU与PD命令相结合可以画直线。
SPpen 选择画笔,此命令来源于绘图仪中的换笔,在激光打印机中此命令必须有,并且pen的值只能为1。
5 程序实现
根据上述原理,编制了利用PCL和HP-GL/2在A4纸上打印带有标准刻度线的心电图程序(如下)。本文给出了两个关键函数,其中print_table函数打印刻度线,4个参数分别表示表格起始位置相对于打印纸逻辑页面的左边距和上边距、宽度和高度,上下边框用双倍实线打印,在函数中省略了实现此功能的语句;plot_ecg函数绘制心电图,4个参数分别表示心电图起始位置相对于打印纸逻辑页面的左边距和上边距、心电图数据和心电图数据长度,各种距离用毫米表示。由于在HP-GL/2模式下,坐标原点在左下角,逻辑页面的长度为271.4mm,因此需把坐标原点位置从左下角移到左上角,采用271.4减去心电图起始位置相对于逻辑页面的上边距解决。Strprn和Charprn两个函数分别为打印字符串和单个字符,本文省略。
6 结果
图2是用HP激光打印机打印的方格及心电图,长度7.5cm,高度为5cm,心电图时间为3s。
图 2 HP激光打印机打印的方格及心电图
[1] 严又生.应用PCL实现矢量图形设计和输出[J].电脑编程技巧与维护,1996(8):65-67.
[2] 常鸣.惠普4系列激光打印机使用指南[M].北京:清华大学出版社,1995.
[3] 汤跃忠.HP GL/2及RTL绘图仪语言编程指南[M].北京:清华大学出版社,1994.
[4] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2000.
[5] 王国栋.常用打印机共性故障解决方法[J].医疗设备信息,2005(12):90-91.
[6] 孙文锋.十二导联心电信号采集及分析系统的研究[D].长春:吉林大学,2006.
[7] 刘建超,王进亮,白净.心电图机热敏打印系统的设计与实现[J].北京生物医学工程,2008(2):161-163.
[8] 施坚强,吴丹.基于ARM的热敏打印机系统[J].黑龙江科技信息,2008(28):70.
[9] 李元斌.心电图机打印系统的实验教学研究[J].软件导刊,2009(1):195-197.
[10] 时永乐,王培勇. 基于AVR的VGA显示和激光打印系统[EB/OL].(2006-10-23)[2009-11-02].http://www.redlib.cn/html/4052/2007/50586876.htm.
TP311.1
A
10.3969/j.issn.1674-1633.2010.07.013
1674-1633(2010)07-0034-04
2009-11-02
2010-04-15
作者邮箱:yjp70@126.com
Abstract: Laser printer can print ECG and standard scale line in A4 paper.In order to improve the speed and effect of printing,PCL grating commands can be used to print scale line, and HP-GL/2 vector graphics commands can be used to plot ECG. This paper presents the principle of printing scale line and ECG, lists the relevant PCL and HP-GL/2 commands, and provides a part of C language program.
Key words: PCL; HP-GL/2; pixel point; scale line; ECG