精华内容
下载资源
问答
  • 介绍了煤炭化验室常用的高温设备、真空泵、电热烘箱、电动机、压缩气体钢瓶、高温计毫伏表热电偶等设备仪器的正确使用及其管理,阐述了煤炭化验室药品使用保管的基本常识,重点探讨了自燃性物品、遇水易燃物、易燃...
  • 食品对于人类而言拥有着获取营养品味美食两个功能,而化验室常用仪器设备指南所蕴含的知识与资料定不会...该文档为化验室常用仪器设备指南,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 化验仪器设备操作规程.docx
  • 化验仪器设备管理制度汇编.doc
  • 化验室检验仪器设备档案.docx
  • 化验室试验仪器设备检定规程.docx
  • 行业分类-设备装置-一种焦油加工生产线及化验仪器清洗干燥装置.zip
  • 化验设备仪器分析培训讲义.docx
  • 化验设备仪器分析培训讲义全.doc
  • 化验煤炭氟氯氮的仪器化验煤炭氟氯氮的仪器 英特仪器 全自动煤炭定氮仪,检测煤炭氮含量仪器化验煤质氮含量设备 英特仪器:138.3923.4904 测试氮的仪器,石墨石油焦氮含量分析仪器化验石油焦氮的设备,半微量...

    化验煤炭氟氯氮的仪器 化验煤炭氟氯氮的仪器 英特仪器 全自动煤炭定氮仪,检测煤炭氮含量仪器,化验煤质氮含量设备

    英特仪器:138.3923.4904

    测试氮的仪器,石墨石油焦氮含量分析仪器,化验石油焦氮的设备,半微量蒸汽定氮仪

    产品使用条件:

      1、温度:0-40℃

      2、相对湿度:≤80%

      3、供电电源:电 压:220±22V 频 率: 50±0.5Hz

      4、载气:氦气,纯度高于99.8%。

      5、功率:不小于4.5KW.

      6、无强磁场干扰

    产品参数:

      1、测量范围:0.01-50%

      2、试样量 : 100mg左右;

      3、单次测定时间:35min左右;

      4、额定功耗: 4000W

    产品技术要求:

      1、定重复性(GB/T 19227-2008)≤0.08%

      2、控温精度:设定值±10℃

      3、控温范围:

      水解炉:室温~1200℃

      蒸汽发生炉:室温~500℃

      蒸馏炉:室温~500℃

    展开全文
  • 生物质燃料检测仪器解析 生物质燃料检测设备资讯 生物质燃料检测仪器解析 生物质燃料检测设备资讯 标创生物质颗粒检测设备,生物质燃料分析仪器,测试生物质颗粒的仪器,检测生物质燃料的设备化验生物质颗粒的机器...
  • 管理信息系统 医院的化验设备 这两者是用什么技术连接的? 原理是什么?
  • 质量控制与质量保证是水质化验室工作的重要组成部分。...质量保证体系是化验室内部实施质量管理的法规,覆盖了样品采集、检测过程、仪器设备、人员素质等全部质量控制要素,从而保证化验室所获得数据的可靠性。
  • 检验串口仪器探秘

    2019-11-10 07:31:54
    一直对盒子串口仪器接口缺乏系统的了解。...对于调试仪器接口时候就可以不用界面启动仪器和停止仪器了,可以直接用terminal启动仪器接口主方法这样传输数据就能断点调试,增加调试效率,替换之前写...

    一直对盒子串口仪器接口缺乏系统的了解。为什么仪器控制能启动停止,为什么能读到数据,接口结构为什么要那样写等等,特地系统的学习LIS连接TCP的秘密。

    1.为啥仪器控制能启动仪器和停止仪器接口
    启动
    启动仪器接口

    停止
    在这里插入图片描述

    在这里插入图片描述
    2.知道启动停止的机制后我们能做什么?
    对于调试仪器接口时候就可以不用界面启动仪器和停止仪器了,可以直接用terminal启动仪器接口主方法这样传输数据就能断点调试,增加调试效率,替换之前写globle猜测的方式(要注意仪器超时的问题)。
    在这里插入图片描述
    3.为什么执行主方法后能连接盒子的TCP
    重要的启动在$$Start^MI.MIF000
    在这里插入图片描述
    关键是对拼好的仪器端口串进行open命令启动tcp,同时设置连接的编码格式
    在这里插入图片描述
    在这里插入图片描述

    4.Mian循环方法解读
    一个字符一个字符读取命令
    在这里插入图片描述
    ASTM协议响应
    在这里插入图片描述
    读数据
    在这里插入图片描述
    解析保存结果
    在这里插入图片描述

    上传信息
    在这里插入图片描述

    事列代码

    MIFLISVMachine(mi)  
    	s mi=$g(mi) 
    	i '$l(mi) q
    	s ItemDeli=$li(^dbo.BTMIMachineParameterD(mi),12) //项目分隔符
    	s ResultDeli=$li(^dbo.BTMIMachineParameterD(mi),13) //结果分隔符
    	s AntDeli=$li(^dbo.BTMIMachineParameterD(mi),14) //抗生素分隔符
    	s SenDeli=$li(^dbo.BTMIMachineParameterD(mi),15) //药敏结果分隔符
    	s Port="|TCP|"_$li(^dbo.BTMIMachineParameterD(mi),17) //端口号
    	//控制字符
      	s stx=$c(2),etx=$c(3),ack=$c(6),enq=$c(5),eot=$c(4)
      	s lf=$c(10),cr=$c(13),nak=$c(21),(result,epis)="",etb=$c(23)
    	S $ZT="RuntimeError",$ECODE="",iError=0 //捕获运行时错误,并显示
    	//启动tcp连接,然后就会侦听tcp发来的消息和给tcp发送数据
    	i $$Start^MI.MIF000(mi) q
    	//循环执行Mian方法取或者发送数据到tcp
    	f  d Main i $$Stop^MI.MIF000(mi) q
      	c Port
      	q
    
     //在循环的Main方法读取一个字符直到收到ENQ的不可见字符控制命令(READ命令是阻塞的所以不会跳过去)
    Main r *R:10 e  d  q
      //收到ENQ才进入下面逻辑
      i $c(R)'=enq q
      s AllRecord=""
      d Trace^MI.MIF000(mi,"ENQ","H<--M")
      //先回复仪器我收到ENQ控制命令并且准备好接收数据了
      d ACK
      //循环等着读取数据,一直读到EOT结束(READ命令是阻塞的所以不会跳过去)
      f  r *R:10 q:$c(R)=eot  d
      .//这里没收到STX都认为是没用的数据退出掉
      .i $c(R)'=stx q
      .//收到STX后开始读取正式数据(调用包装的读取数据方法,还是指向READ阻塞读数据)
      .s record=$$Read^MI.MIF000(mi,"",lf) q:'$l(record)
      .d Trace^MI.MIF000(mi,record,"H<--M")
      .//把读取的记录拼接到总记录串上
      .s AllRecord=AllRecord_$p(record,etb,1)
      .//回复收到数据
      .d ACK
      d Trace^MI.MIF000(mi,$s($c(R)=eot:"EOT",1:R),"H<--M")
      //读取数据完成一轮就处理解析
      s (epis,rec,res,result,date,time,QC)=""
      f i=1:1:$l(AllRecord,cr) d
      .s rec=$p(AllRecord,cr,i)
      .s type=$tr($p(rec,"|")," ")
      .//判断为获取条码信息,给仪器上传标本信息
      .//格式:GetPatInfo|条码号|LISVMachine1.0|||||||||
      .//仪器要求格式:PatInfo|条码号|LISVMachine1.0|患者姓名|性别|年龄|科室|病区|诊断|采集日期|传输日期|通道^通道^通道
      .i type="GetPatInfo" d
      ..s epis=$tr($p(rec,"|",2)," ")
      ..s ^TMP($zn,$j,"ENQ",epis)=""
      .//判断为结果信息,解析结果
      .//格式:Result|条码号|通道|结果$c(13)
      .i type="Result" d  
      ..s epis=$tr($p(rec,"|",2)," ")
      ..s code=$tr($p(rec,"|",3)," ")
      ..s res=$tr($p(rec,"|",4)," ")
      ..s result=result_code_ResultDeli_res_ItemDeli
      .//格式:Last|条码号|END|$c(13)
      .i type="Last" d Last q
      d BUILD
      q
      
    Last	
    	s AllRecord=""
    	s epis=$tr($p(rec,"|",2)," ")
    	i $l(epis),$l(result) d
    	.d Save^MI.MIF000(mi,epis,result,date,time,QC)  
    	q
     
    BUILD
      i '$d(^TMP($zn)) q
      i '$d(^TMP($zn,$j)) q 
      s labno="" f  s labno=$o(^TMP($zn,$j,"ENQ",labno)) q:labno=""  d
      .d ScanOne^MI.MIF000(mi,labno)
      .s tcx=""
      .s chl="" f  s chl=$o(^TMP("MIFTESTCODE",$j,mi,labno,chl)) q:chl=""  d
      ..i $l(tcx) s tcx=tcx_"^"_chl
      ..e  s tcx=tcx_chl
      .i '$l(tcx) s tcx="Chl1^Chl2^Chl3^Chl4^Chl5"
      .s date=$zd(+$h,8)
      .s time=$tr($zt($p($h,",",2)),":")
      .s temepis=""
      .//取患者信息
      .s (PatName,Sex,Age,Location,Ward,Symptom,CollectDate,TransmitDate)=""
      .i $d(^dbo.RPVisitNumberI("IndexVisitNumber"," "_$zcvt(labno,"U"))) d
      ..s VisitNumberDR=$o(^dbo.RPVisitNumberI("IndexVisitNumber"," "_$zcvt(labno,"U"),""))
      ..//姓名
      ..s PatName=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),13)
      ..//性别
      ..s SpeciesDR=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),15)
      ..s Sex=""
      ..i $l(SpeciesDR) s Sex=$lg($g(^dbo.BTSpeciesD(SpeciesDR)),3)
      ..//年龄
      ..s Age=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),18)
      ..s AgeUnitDR=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),19)
      ..s AgeUnit=""
      ..i $l(AgeUnitDR) s AgeUnit=$lg($g(^dbo.BTAgeUnitD(AgeUnitDR)),3)
      ..s Age=Age_AgeUnit
      ..s LocationDR=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),22)
      ..//科室
      ..s Location=""
      ..i $l(LocationDR) s Location=$lg($g(^dbo.BTLocationD(LocationDR)),3)
      ..s WardDR=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),26)
      ..//病区
      ..s Ward=""
      ..i $l(WardDR) s Ward=$lg($g(^dbo.BTWardD(WardDR)),3)
      ..//诊断
      ..s Symptom=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),28)
      ..//采集日期
      ..s CollectDate=$lg($g(^dbo.RPVisitNumberD(VisitNumberDR)),51)
      ..//传输日期
      ..s TransmitDate=CollectDate
      .//要求格式:PatInfo|条码号|LISVMachine1.0|患者姓名|性别|年龄|科室|病区|诊断|采集日期|传输日期|通道^通道^通道
      .s str="PatInfo|"_labno_"|LISVMachine1.0|"_PatName_"|"_Sex_"|"_Age_"|"_Location_"|"_Ward_"|"_Symptom_"|"_CollectDate_"|"_TransmitDate_"|"_tcx
      .d Send(labno,str) 
      .k ^TMP($zn,$j,"ENQ",labno)
      q
    
    Send(epis,str)  ; send list of orders if exists
      w enq,*-3 d Trace^MI.MIF000(mi,"ENQ","H-->M")
      f j=1:1:10 r *R:1 i $c(R)=ack!($c(R)=enq) q
      //d trace^MIF000(mi,$s($c(R)=ack:"ACK",$c(R)=enq:"ENQ",$c(R)=nak:"NAK",1:R),"1H<--M")
      d Trace^MI.MIF000(mi,$s($c(R)=ack:"ACK",$c(R)=enq:"ENQ",$c(R)=nak:"NAK",1:R),"H<--M")
      i $c(R)=enq q
      i $c(R)'=ack w eot,*-3 d Trace^MI.MIF000(mi,"EOT","H-->M") q
      i $l(str)>241 d
      .s str1=$e(str,1,241)
      .s ret=$$SEND(str1,1)
      .s str2="2"_$e(str,242,$l(str))
      .s ret=$$SEND(str2,0)
      e  d
      .s ret=$$SEND(str,0)
      ;f j=1:1:10 r *R:1 i $c(R)=ack!($c(R)=enq) q
      ;d trace^MIF000(mi,$s($c(R)=ack:"ACK",$c(R)=enq:"ENQ",$c(R)=nak:"NAK",1:R),"2H<--M")
      w eot,*-3 d Trace^MI.MIF000(mi,"EOT","H-->M")
      q
     
    SEND(str,flag)  ; send string to instrument
      i flag=1 d
      .s str=str_etb
      .s chsum=$$CHSUM(str)
      e  d
      .s str=str_etx
      .s chsum=$$CHSUM(str)
      w stx,str,chsum,cr,lf,*-3 d Trace^MI.MIF000(mi,str_chsum,"H-->M")
      f j=1:1:6 r *R:1 i ($c(R)=ack)!($c(R)=eot) q
      i $c(R)=ack d Trace^MI.MIF000(mi,"ACK","H<--M") q 0
      i $c(R)=eot d Trace^MI.MIF000(mi,"EOT","H<--M") q 0
      i $c(R)=-1 w nak,*-3
      d Trace^MI.MIF000(mi,R,"H<--M")
      q 1
      
    CHSUM(x)  ; calculate check sum
      n (x) s z=0 f y=1:1:$l(x) s z=z+$a(x,y)
      s z=$e("0123456789ABCDEF",z#256\16+1)_$e("0123456789ABCDEF",z#16+1)
      q z
    ACK  ; send 'ack' to instrument
      w ack,*-3
      d Trace^MI.MIF000(mi,"ACK","H-->M")
      q
    
    RuntimeError
    	h 5
    	s iError=+$g(iError)+1
        d Trace^MI.MIF000(mi,"Error Code:"_$ECODE_",Error:"_$ZERROR,"Runtime Error")
        i iError>100  s ret=$$Stop^MI.MIF000(mi)
        Q    
          
    
    

    总结
    1.仪器接口一定要在mac里吗?
    接口没有要求,只是仪器控制启动进程那里拼串是mac调用,正常类方法也行,只是需要启动仪器控制的支持。
    2.调试仪器的时候只能写globle观察猜吗?
    可以直接terminal运行仪器接口的入口方法,然后进行断点调试,只是停止仪器时候可能需要到portal杀进程。
    3.仪器接口的核心命令就是用了OPEN命令和READ命令,为什么READ要分那么几次for循环读取呢,而不用一层循环一直READ?
    分层次读协议的体现更清晰,解析协议的是协议,读数据的是读数据逻辑。

    ASTM简单交互(ENQ开始、ACK中间回复、EOT结束)
    仪器给LIS发数据
    1.先发ENQ告诉LIS我要给你发数据
    2.LIS回复ACK给仪器
    3.仪器收到ACK后开发发数据给LIS,每段发送一STX控制开始LIS收到数据还是回ACK
    4.仪器如果发送数据完了后给LIS发送EOT告诉发送完毕(一个通信过程就完毕)
    在这里插入图片描述

    LIS给仪器发数据
    1.先发ENQ告诉仪器我要给你发数据
    2.仪器回复ACK给LIS
    3.仪器收到ACK后开发发数据给仪器,每段发送一STX控制开始仪器收到数据还是回ACK
    4.LIS如果发送数据完了后给仪器发送EOT告诉发送完毕(一个通信过程就完毕)
    在这里插入图片描述

    HL7简单交互(SB开始、CR分次,EB结束)
    HL7定义了消息交互结构,为:[SB]data[CR]data[CR][EB][CR]
    SB:消息开始控制字符
    EB:消息结束控制字符
    CR:消息换行控制字符

    仪器给LIS发数据
    1.先发SB给LIS告诉我要给你发数据
    2.LIS收到SB后准备接收发来的数据
    3.仪器接着发送要传输的数据(HL7格式的串,多个用CR分开发送)
    4.仪器发送完数据后发送EB、CR告诉LIS发送数据完毕
    在这里插入图片描述

    LIS给仪器发数据
    1.先发SB给仪器告诉我要给你发数据
    2.仪器收到SB后准备接收发来的数据
    3.LIS接着发送要传输的数据(HL7格式的串,多个用CR分开发送)
    4.LIS发送完数据后发送EB、CR告诉仪器发送数据完毕
    在这里插入图片描述

    以上说的ENQ,EOT,STX,ACK,SB,EB,CR都是ascii不可见字符,用不可见字符控制交互
    //控制字符
    stx= c ( 2 ) , e t x = c(2),etx= c(2),etx=c(3),ack= c ( 6 ) , e n q = c(6),enq= c(6),enq=c(5),eot= c ( 4 ) l f = c(4) lf= c(4)lf=c(10),cr= c ( 13 ) , n a k = c(13),nak= c(13),nak=c(21),etb=$c(23)

    附(C#模拟astm协议实现的虚拟仪器,重点就是txtLabNo_KeyDown触发的给LIS发数据和machSerialPort_DataReceived解析LIS发来的数据部分,帮助更深入了解交互)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    using System.IO;
    
    namespace LISVMachine
    {
        /// <summary>
        /// 绑定数据委托
        /// </summary>
        /// <param name="result"></param>
        delegate void BindDataDelegate(string result);
    
        public partial class FrmMian : Form
        {
            /// <summary>
            /// 通信模式,0:串口,1:文本,2:数据库
            /// </summary>
            private int Model = 0;
    
            /// <summary>
            /// ack
            /// </summary>
            private string ACK = "[6]";
    
            /// <summary>
            /// enq
            /// </summary>
            private string ENQ = "[5]";
    
            /// <summary>
            /// eot
            /// </summary>
            private string EOT = "[4]";
    
            /// <summary>
            /// stx
            /// </summary>
            private string STX = "[2]";
    
            /// <summary>
            /// etx
            /// </summary>
            private string ETX = "[3]";
    
            /// <summary>
            /// 存待发送信息
            /// </summary>
            private List<string> SendList = new List<string>();
    
            /// <summary>
            /// 存收到的字符串
            /// </summary>
            private string ReciveStr = "";
    
            /// <summary>
            /// 状态。0:正常,1:等待发送,2:等待接收
            /// </summary>
            private int State = 0;
    
            /// <summary>
            /// 连接串
            /// </summary>
            string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb";
    
            public FrmMian()
            {
                InitializeComponent();
            }
    
            private void FrmMian_Load(object sender, EventArgs e)
            {
                ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\db.mdb";
                //初始化下拉串口名称列表框
                string[] ports = SerialPort.GetPortNames();
                Array.Sort(ports);
                cmbPortName.Items.AddRange(ports);
                cmbPortName.SelectedIndex = cmbPortName.Items.Count > 0 ? 0 : -1;
                RefreshGrid("1");
            }
    
            /// <summary>
            /// 通信方式切换
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void cmbPortName_SelectedIndexChanged(object sender, EventArgs e)
            {
                ChangeModel();
            }
    
            /// <summary>
            /// 切换通信方式
            /// </summary>
            private void ChangeModel()
            {
                try
                {
                    if (machSerialPort.IsOpen)
                    {
                        WriteLog("关闭已打开串口");
                        machSerialPort.Close();
                    }
                    machSerialPort.PortName = cmbPortName.Text;
                    WriteLog("尝试启动串口:" + machSerialPort.PortName);
                    machSerialPort.Open();
                    WriteLog("启动串口:" + machSerialPort.PortName + "成功");
                    WriteLog("串口通信模式");
                    labInfo.Text = "波特率9600,数据位8,停止位1,校验位None。文本上传在Order文件夹下,结果数据在Result文件夹下,图片在Image文件夹下。数据库双向直接操作MachResult表上传和取结果";
    
                }
                catch (Exception ex)
                {
                    WriteLog("启动串口异常:" + ex.Message);
                    //现实异常信息给客户。                    
                    MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK);
                }
            }
    
    
            /// <summary>
            /// 扫描
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void txtLabNo_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (txtLabNo.Text != "")
                    {
                        //等待发送数据
                        State = 1;
                        SendList.Add("GetPatInfo|" + txtLabNo.Text + "|LISVMachine1.0|||||||||");
                        Send(ENQ);
                        txtLabNo.Text = "";
                    }
                }
            }
    
            /// <summary>
            /// 发送
            /// </summary>
            /// <param name="sendStr"></param>
            private void Send(string sendStr)
            {
                //串口打开的话就转给串口
                if (machSerialPort.IsOpen)
                {
                    //处理为不可见字符
                    sendStr = DealNotSeeChar(sendStr);
                    byte[] byteArray = System.Text.Encoding.Default.GetBytes(sendStr);
                    //转发给串口
                    machSerialPort.Write(byteArray, 0, byteArray.Count());
                    WriteLog("发送给LIS:" + DealNotSeeToSeeCharLIS(sendStr));
                }
                else
                {
                    WriteLog("发送给LIS:串口未打开,无法发送");
                }
            }
    
    
    
            /// <summary>
            /// 串口收到数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void machSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                int n = machSerialPort.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
                byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
                machSerialPort.Read(buf, 0, n);//读取缓冲数据
                string lineStr = System.Text.Encoding.Default.GetString(buf);
                string lineOld = lineStr;
                lineStr = DealNotSeeToSeeChar(lineStr);
                WriteLog("LIS给仪器:" + DealNotSeeToSeeCharLIS(lineOld));
                if (lineStr == ACK && State == 1)
                {
                    if (SendList.Count > 0)
                    {
                        string sendStr = SendList[0];
                        SendList.RemoveAt(0);
                        Send(STX);
                        Send(sendStr);
                    }
                    else
                    {
                        Send(EOT);
                        State = 0;
                    }
                }
                if (lineStr == ENQ)
                {
                    //等待接收数据
                    State = 2;
                    Send(ACK);
                    ReciveStr = "";
                }
                if (lineStr == EOT)
                {
                    //正常状态
                    State = 0;
                    //存数据
                    WriteLog("接收数据完毕,仪器分析中");
                    //要求格式:PatInfo|条码号|LISVMachine1.0|患者姓名|性别|年龄|科室|病区|诊断|采集日期|传输日期|通道^通道^通道
                    if (ReciveStr != "")
                    {
                        List<string> resListRet = DealPatInfo(ReciveStr);
                        if (resListRet != null && resListRet.Count > 0)
                        {
                            SendList.AddRange(resListRet);
                            WriteLog("仪器出结果");
                            Send(ENQ);
                            //待发送数据状态
                            State = 1;
                        }
                    }
                }
                //接收数据
                if (State == 2 && lineStr != ENQ && lineStr != EOT && lineStr != STX)
                {
                    ReciveStr += lineStr.Replace(STX, "");
                    Send(ACK);
                }
            }
    
    
    
            /// <summary>
            /// 写日志
            /// </summary>
            /// <param name="log"></param>
            private void WriteLog(string log)
            {
                //组装参数
                object[] paras = new object[] { log };
                this.Invoke(new BindDataDelegate(BindData), paras);
            }
    
            /// <summary>
            /// 绑定监听数据
            /// </summary>
            private void BindData(string log)
            {
                txtLog.Text += DateTime.Now.ToString("hh:mm:ss: ") + log + "\n";
            }
    
            /// <summary>
            /// 刷新表格数据
            /// </summary>
            /// <param name="log"></param>
            private void RefreshGrid(string code)
            {
                //组装参数
                object[] paras = new object[] { code };
                this.Invoke(new BindDataDelegate(BindGridData), paras);
            }
    
            /// <summary>
            /// 绑定监听数据
            /// </summary>
            private void BindGridData(string code)
            {
                dgData.DataSource = DBHelper.QryData(ConnectionString, "select * from MachResult");
            }
    
            /// <summary>
            /// 处理为不可见字符
            /// </summary>
            /// <param name="s"></param>
            /// <returns></returns>
            private string DealNotSeeChar(string s)
            {
                for (int i = 0; i <= 31; i++)
                {
                    s = s.Replace("[" + i + "]", (char)i + "");
                }
                s = s.Replace("[127]", (char)127 + "");
                return s;
            }
    
            /// <summary>
            /// 处理不可见字符
            /// </summary>
            /// <param name="data">数据</param>
            /// <returns>返回</returns>
            public string DealNotSeeToSeeChar(string data)
            {
                for (int i = 0; i <= 31; i++)
                {
                    data = data.Replace((char)i + "", "[" + i + "]");
                }
                data.Replace((char)127 + "", "[127]");
                return data;
            }
    
    
            /// <summary>
            /// 处理不可见字符
            /// </summary>
            /// <param name="data">数据</param>
            /// <returns>返回</returns>
            public string DealNotSeeToSeeCharLIS(string data)
            {
                for (int i = 0; i <= 31; i++)
                {
                    if (i == 6)
                    {
                        data = data.Replace((char)i + "", "[ACK]");
                    }
                    else if (i == 5)
                    {
                        data = data.Replace((char)i + "", "[ENQ]");
                    }
                    else if (i == 4)
                    {
                        data = data.Replace((char)i + "", "[EOT]");
                    }
                    else if (i == 3)
                    {
                        data = data.Replace((char)i + "", "[ETX]");
                    }
                    else if (i == 4)
                    {
                        data = data.Replace((char)i + "", "[STX]");
                    }
                    else
                    {
                        data = data.Replace((char)i + "", "[" + i + "]");
                    }
                }
                data.Replace((char)127 + "", "[127]");
                return data;
            }
    
            /// <summary>
            /// 定时器,定时检测上传数据和出结果
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void timerMian_Tick(object sender, EventArgs e)
            {
                string orderPath = Application.StartupPath + "\\Order";
                DirectoryInfo di = new DirectoryInfo(orderPath);
                FileInfo[] orders = di.GetFiles("*.imedicallis");
                WriteLog("检测Order下是否有*.imedicallis的上传文件");
                if (orders != null && orders.Length > 0)
                {
                    foreach (FileInfo f in orders)
                    {
                        string orderStr = TxtUtil.ReadTxt(f.FullName);
                        WriteLog("解析:" + f.FullName);
                        DealPatInfo(orderStr);
                        File.Delete(f.FullName);
                    }
                }
                WriteLog("查询数据库SendFlag为空的上传记录");
                DataTable dt = DBHelper.QryData(ConnectionString, "select * from MachResult where SendFlag is null");
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow r in dt.Rows)
                    {
                        List<string> randomRes = new List<string>();
                        for (int i = 0; i < 20; i++)
                        {
                            Random rand = new Random(DateTime.Now.Millisecond);
                            randomRes.Add((rand.NextDouble() * 100).ToString());
                        }
                        string UPChl = r["UPChl"].ToString();
                        string updateSq = "update MachResult set SendFlag='" + DateTime.Now.ToString("yyyyMMddhhmmss") + "'";
                        for (int i = 0; i < 20; i++)
                        {
                            if ((UPChl != "") && (!UPChl.Contains("Chl" + (i + 1))))
                            {
                                continue;
                            }
                            updateSq += ",Chl" + (i + 1) + "='" + randomRes[i] + "'";
                        }
                        updateSq += " where RowID=" + r["RowID"].ToString();
                        try
                        {
                            int ret = DBHelper.ExeSql(ConnectionString, updateSq);
                            if (ret == 1)
                            {
                                WriteLog("更新" + r["EpisNo"].ToString() + "数据库结果");
                            }
                        }
                        catch (Exception ex)
                        {
                            WriteLog("仪器数据库结果插入异常" + ex.Message);
                        }
                    }
                }
            }
    
            /// <summary>
            /// 处理患者信息出结果
            /// </summary>
            /// <param name="oderStr"></param>
            /// <returns></returns>
            private List<string> DealPatInfo(string oderStr)
            {
                List<string> retList = new List<string>();
                if (oderStr != "")
                {
                    string[] patInfoArr = oderStr.Split('|');
                    if (patInfoArr.Length >= 12)
                    {
                        if (patInfoArr[0] == "PatInfo")
                        {
                            string EpisNo = patInfoArr[1];
                            string PatName = patInfoArr[3];
                            string Sex = patInfoArr[4];
                            string PatAge = patInfoArr[5];
                            string Location = patInfoArr[6];
                            string Ward = patInfoArr[7];
                            string Diagnose = patInfoArr[8];
                            string CollDate = patInfoArr[9];
                            if (CollDate == "")
                            {
                                CollDate = DateTime.Now.ToString("yyyyMMdd");
                            }
                            string TransDate = patInfoArr[10];
                            if (TransDate == "")
                            {
                                TransDate = DateTime.Now.ToString("yyyyMMdd");
                            }
                            string Chl = patInfoArr[11];
                            if (EpisNo != "" && PatName != "")
                            {
                                List<string> randomRes = new List<string>();
                                for (int i = 0; i < 20; i++)
                                {
                                    Random rand = new Random(DateTime.Now.Millisecond);
                                    randomRes.Add((rand.NextDouble() * 100).ToString());
                                }
                                string sql = "insert into MachResult(EpisNo,PatName,PatAge,Sex,Location,Ward,Diagnose,CollDate,TransDate,UPChl,Chl1,Chl2,Chl3,Chl4,Chl5,Chl6,Chl7,Chl8,Chl9,Chl10,Chl11,Chl12,Chl13,Chl14,Chl15,Chl16,Chl17,Chl18,Chl19,Chl20,Img1,Img2,SendFlag) values('" + EpisNo + "','" + PatName + "','" + PatAge + "','" + Sex + "','" + Location + "','" + Ward + "','" + Diagnose + "','" + CollDate + "','" + TransDate + "','" + Chl + "','" + randomRes[0] + "','" + randomRes[1] + "','" + randomRes[2] + "','" + randomRes[3] + "','" + randomRes[4] + "','" + randomRes[5] + "','" + randomRes[6] + "','" + randomRes[7] + "','" + randomRes[8] + "','" + randomRes[9] + "','" + randomRes[10] + "','" + randomRes[11] + "','" + randomRes[12] + "','" + randomRes[13] + "','" + randomRes[14] + "','" + randomRes[15] + "','" + randomRes[16] + "','" + randomRes[17] + "','" + randomRes[18] + "','" + randomRes[19] + "','" + "Image\\Img1.bmp" + "','" + "Image\\Img2.bmp" + "','" + DateTime.Now.ToString("yyyyMMddhhmmss") + "')";
                                try
                                {
                                    int ret = DBHelper.ExeSql(ConnectionString, sql);
                                    RefreshGrid("1");
                                    string[] ChlArr = Chl.Split('^');
                                    for (int j = 0; j < ChlArr.Length; j++)
                                    {
                                        string chlOne = ChlArr[j];
                                        if (chlOne == "Chl1")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[0] + (char)13);
                                        }
                                        else if (chlOne == "Chl2")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[1] + (char)13);
                                        }
                                        else if (chlOne == "Chl3")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[2] + (char)13);
                                        }
                                        else if (chlOne == "Chl4")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[3] + (char)13);
                                        }
                                        else if (chlOne == "Chl5")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[4] + (char)13);
                                        }
                                        else if (chlOne == "Chl6")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[5] + (char)13);
                                        }
                                        else if (chlOne == "Chl7")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[6] + (char)13);
                                        }
                                        else if (chlOne == "Chl8")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[7] + (char)13);
                                        }
                                        else if (chlOne == "Chl9")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[8] + (char)13);
                                        }
                                        else if (chlOne == "Chl10")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[9] + (char)13);
                                        }
                                        else if (chlOne == "Chl11")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[10] + (char)13);
                                        }
                                        else if (chlOne == "Chl12")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[11] + (char)13);
                                        }
                                        else if (chlOne == "Chl13")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[12] + (char)13);
                                        }
                                        else if (chlOne == "Chl14")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[13] + (char)13);
                                        }
                                        else if (chlOne == "Chl15")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[14] + (char)13);
                                        }
                                        else if (chlOne == "Chl16")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[15] + (char)13);
                                        }
                                        else if (chlOne == "Chl17")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[16] + (char)13);
                                        }
                                        else if (chlOne == "Chl18")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[17] + (char)13);
                                        }
                                        else if (chlOne == "Chl19")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[18] + (char)13);
                                        }
                                        else if (chlOne == "Chl20")
                                        {
                                            retList.Add("Result|" + EpisNo + "|" + chlOne + "|" + randomRes[19] + (char)13);
                                        }
                                        else
                                        {
                                            WriteLog("非Chl1-Chl20的通道");
                                        }
                                    }
                                    retList.Add("Last|" + EpisNo + "|END|" + (char)13);
                                    StringBuilder sb = new StringBuilder();
                                    foreach (var v in retList)
                                    {
                                        sb.Append(v);
                                    }
                                    string resultPath = Application.StartupPath + "\\Result\\" + DateTime.Now.ToString("yyyyMMddhhmmss-") + EpisNo + ".lisres";
                                    TxtUtil.WriteTxt(resultPath, sb.ToString());
                                    WriteLog("生成文件到:" + resultPath);
                                }
                                catch (Exception ex)
                                {
                                    WriteLog("患者信息入库失败:" + ex.Message);
                                }
                            }
                            else
                            {
                                WriteLog("流水号和患者姓名不能为空");
                            }
                        }
                        else
                        {
                            WriteLog("患者信息没有PatInfo头,例如:PatInfo|条码号|LISVMachine1.0|患者姓名|性别|年龄|科室|病区|诊断|采集日期|传输日期|通道^通道^通道");
                        }
                    }
                    else
                    {
                        WriteLog("患者信息位数不足,例如:PatInfo|条码号|LISVMachine1.0|患者姓名|性别|年龄|科室|病区|诊断|采集日期|传输日期|通道^通道^通道");
                    }
                }
                return retList;
            }
    
            /// <summary>
            /// 重传
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnToLis_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < dgData.Rows.Count; i++)
                {
                    if ((bool)dgData.Rows[i].Cells["Check"].EditedFormattedValue == true)
                    {
                        if (dgData.Rows[i].Cells["RowID"] == null)
                        {
                            continue;
                        }
                        string RowID = dgData.Rows[i].Cells["RowID"].Value.ToString();
                        DataTable dt = DBHelper.QryData(ConnectionString, "select * from MachResult where RowID=" + RowID);
                        if (dt.Rows.Count >= 0)
                        {
                            StringBuilder sb = new StringBuilder();
                            foreach (DataRow r in dt.Rows)
                            {
                                string EpisNo = r["EpisNo"].ToString();
                                for (int j = 0; j < 20; j++)
                                {
                                    string chl = "Chl" + (j + 1);
                                    string res = r[chl].ToString();
                                    if (res != "")
                                    {
                                        sb.Append("Result|" + EpisNo + "|" + chl + "|" + res + (char)13);
                                    }
                                }
                                sb.Append("Last|" + EpisNo + "|END|" + (char)13);
                                string resultPath = Application.StartupPath + "\\Result\\" + DateTime.Now.ToString("yyyyMMddhhmmss-") + EpisNo + ".lisres";
                                TxtUtil.WriteTxt(resultPath, sb.ToString());
                                WriteLog("生成文件到:" + resultPath);
                                DBHelper.ExeSql(ConnectionString, "update MachResult set SendFlag='" + DateTime.Now.ToString("yyyyMMddhhmmss") + "' where RowID=" + r["RowID"].ToString());
                                WriteLog("更新" + r["RowID"].ToString() + "的SendFlag为当前时间");
                            }
                        }
                    }
                }
                MessageBox.Show("重传成功!", "提示", MessageBoxButtons.OK);
            }
    
            /// <summary>
            /// 查询
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnSelect_Click(object sender, EventArgs e)
            {
                string dateStr=dtDate.Value.ToString("yyyyMMdd");
                dgData.DataSource = DBHelper.QryData(ConnectionString, "select * from MachResult where CollDate='" + dateStr+"'");
            }
    
            /// <summary>
            /// 查全部
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                string dateStr = dtDate.Value.ToString("yyyyMMdd");
                dgData.DataSource = DBHelper.QryData(ConnectionString, "select * from MachResult");
            }
        }
    }
    
    
    展开全文
  • 嵌入式系统及其在医疗仪器设备应用 嵌入式系统是计算机技术、通信技术、半导体技术、微电子技术、语音图像数据传输技术,甚至传感器等先进技术具体应用对象相结合后的更新换代产品,反映当代最新技术的先进水平。...
    嵌入式系统及其在医疗仪器设备应用

       嵌入式系统是计算机技术、通信技术、半导体技术、微电子技术、语音图像数据传输技术,甚至传感器等先进技术和具体应用对象相结合后的更新换代产品,反映当代最新技术的先进水平。嵌入式系统是当今非常热门的研究领域,在PC市场已趋于稳定的今天,嵌入式系统市场的发展速度却正在加快。由于嵌入式系统所依托的软硬件技术得到了快速发展,因此嵌入式系统自身获得了快速发展。根据美国嵌入式系统专业杂志RTC报道,在21世纪初的10年中,全球嵌入式系统市场需求量具有比PC市场大10~100倍的商机。有机构估计,全世界嵌入式系统产品潜在的市场将超过1万亿美元。随着技术的发展,业内对嵌入式系统的定义也越来越清晰。它是微处理器、大规模集成电路、软件技术和各种具体的行业应用技术相结合的结果,其中各种软件技术占了嵌入式系统80%的工作量。嵌入式系统不同于一般PC 机上的应用系统,即使是针对不同的具体应用而设计的嵌入式系统之间的差别也很大。嵌入式系统一般功能单一、简单,且在兼容性方面要求不高,但是在大小、成本方面限制较多。可以说,嵌入式系统是不可垄断、需要不断创新的技术。

      嵌入式系统历史及发展趋势

      事实上,在很早以前,嵌入式这个概念就已经存在了。在通信方面,嵌入式系统在20世纪60年代就用于对电子机械电话交换的控制,当时被称为“存储式程序控制系统”(Stored Program Control)。

      嵌入式计算机的真正发展是在微处理器问世之后。1971年11月,Intel公司成功地把算术运算器和控制器电路集成在一起,推出了第一款微处理器Intel 4004,其后各厂家陆续推出了许多8位、16位的微处理器,包括Intel 8080/8085、8086,Motorola 的6800、68000,以及Zilog的Z80、Z8000等。以这些微处理器作为核心所构成的系统广泛地应用于仪器仪表、医疗设备、机器人、家用电器等领域。微处理器的广泛应用形成了一个广阔的嵌入式应用市场,计算机厂家开始大量地以插件方式向用户提供OEM产品,再由用户根据自己的需要选择一套适合的CPU板、存储器板以及各式I/O插件板,从而构成专用的嵌入式计算机系统,并将其嵌入到自己的系统设备中。

      为灵活兼容考虑,出现了系列化、模块化的单板机。流行的单板计算机有Intel公司的iSBC系列、Zilog公司的MCB等。后来人们可以不必从选择芯片开始来设计一台专用的嵌入式计算机,而是只要选择各功能模块,就能够组建一台专用计算机系统。用户和开发者都希望从不同的厂家选购最适合的OEM产品,插入外购或自制的机箱中就能形成新的系统,因此希望插件相互兼容,从而导致了工业控制微机系统总线的诞生。1976年Intel公司推出Multibus,1983年扩展为带宽达40MB/s的MultibusⅡ。1978年由Prolog设计的简单STD总线广泛应用于小型嵌入式系统。

      20世纪80年代可以说是各种总线层出不穷、群雄并起的时代。随着微电子工艺水平的提高,集成电路制造商开始把嵌入式应用中所需要的微处理器、I/O接口、A/D、D/A转换、串行接口以及RAM、ROM等部件全部集成到一个VLSI中,从而制造出面向I/O设计的微控制器,即俗称的单片机,成为嵌入式计算机系统异军突起的一支新秀。其后发展的DSP产品则进一步提升了嵌入式计算机系统的技术水平,并迅速渗入到消费电子、医疗仪器、智能控制、通信电子、仪器仪表、交通运输等各个领域。

      20世纪90年代,在分布控制、柔性制造、数字化通信和信息家电等巨大需求的牵引下,嵌入式系统进一步加速发展。面向实时信号处理算法的DSP产品向着高速、高精度、低功耗发展。TI推出的第三代DSP芯片TMS320C30,引导着微控制器向32位高速智能化发展。在应用方面,发展也较为迅速。特别是掌上电脑,1997年在美国市场上掌上电脑不过四五个品牌,而1998年底,各式各样的掌上电脑如雨后春笋般纷纷涌现出来。此外,Nokia推出了智能电话,西门子推出了机顶盒,Wyse推出了智能终端,NS推出了WebPAD。21世纪无疑是一个网络的时代,将嵌入式系统应用到各类网络中也必然是嵌入式系统发展的重要方向。嵌入式系统在各个领域应用的发展潜力巨大,其在医疗仪器领域的应用也越来越广泛。

      嵌入式系统

      嵌入式系统的定义及分类

      嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户应用程序等部分组成(见图1),用于实现对其他设备的控制、监视或管理等功能。

    嵌入式操作系统组成

      嵌入式系统一般指非PC系统,它包括硬件和软件两部分。硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。软件部分包括操作系统软件(OS)和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。

     

      嵌入式系统通常可按图2分类。嵌入式产品已经在航空航天、交通、电子、医疗仪器、通信、工控、金融、家电等行业得到广泛应用。

    嵌入式系统分类

      嵌入式系统的特点

      嵌入式系统的核心是嵌入式微处理器。嵌入式微处理器一般具备以下特点:

      (1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核的执行时间减少到最低限度;

      (2)具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断;

      (3)可扩展的处理器结构,以便最迅速地开发出满足应用的最高性能的嵌入式微处理器;

      (4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,如需要功耗只有mW甚至μW级。

      嵌入式系统同通用型计算机系统相比具有六大重要特征:

      (1)专用性强:嵌入式系统通常是面向特定应用的嵌入式CPU,与通用型的最大不同就是嵌入式CPU大多工作在为特定用户群设计的系统中,它通常都具有功耗低、体积小、集成度高等特点,能够把通用CPU中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统设计趋于小型化,移动能力大大增强,与网络的耦合也越来越紧密;

      (2)知识集成度高:嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具体应用相结合后的产物。这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统;

      (3)系统内核小:嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用中对处理器的选择更具有竞争力;

      (4)系统精简:嵌入式系统和具体应用有机地结合在一起,一般没有系统软件和应用软件的明显区分。它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,便具有较长的生命周期;

      (5)高实时性和可靠性:为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存储于磁盘等载体中;

      (6)系统开发需要专门的开发工具和环境:嵌入式系统本身不具备自主开发能力,设计完成以后用户通常不能直接对其中的程序功能进行修改,因此必须有一套开发工具和环境才能进行开发。

      嵌入式系统在医疗仪器中的应用

      医疗仪器设备的最新发展趋势

      进入2008年,越来越多的利好消息出现在医疗仪器设备领域。近期,德国、澳大利亚都分别明确表示要在儿童医疗和全民医疗领域加大投入。而我国和墨西哥这样的发展中人口大国也将在2008年继续其备受世人瞩目的医疗改革。这些政府级别的投入将增加全社会对医疗仪器设备的需求。随着生活水平的不断提高,人们对于自身健康的关注也提升到一个前所未有的高度。今天,越来越多的高科技手段开始运用到医疗仪器的设计中。心电图、脑电图等生理参数检测设备,各类型的监护仪器、超声波、X射线成影设备、核磁共振仪器以及各式各样的物理治疗仪都开始在各地医院广泛使用。远程医疗、HIS、病人呼叫中心、数字化医院等先进理念的出现和应用,使医院的管理比以往任何时候都更加完善和高效,同时病人享受到更加快捷方便和人性化的服务。

      在技术领域,医疗仪器设备则开始呈现向便携性和网络化发展的趋势。可以随身携带的血压计、血糖仪,可以在家庭或小型社康医院中使用的呼吸机、心电监护仪必然会有越来越大的市场需求。而网络化的进一步普及也正在进入医疗仪器设备领域,通过有线或无线技术,医生可以远程访问病人的资料;数字化网络化的医疗检测设备使病人不必再携带大量的检测资料奔波在医院的各个科室甚至是远隔千里的不同医院之间,从而节省了就医者的时间和重复检测的费用;而网络化的医疗仪器设备和系统也使远程医疗变为现实,身在某些不发达地区的重症患者有可能通过远程医疗获得高水平医生的救治而重获新生。在我国,由于医疗资源尤其是高端优质医疗资源的缺乏和地区间分布不均衡引起了广被诟病的“看病难”问题。医疗仪器设备网络化所带来的这些益处对解决该问题也有着非常现实的意义。

      嵌入式系统在医疗仪器设备中的应用

      由于医疗仪器设备固有的自身特点和以上提到的最新发展趋势的要求,用于医疗仪器设备的技术和系统也应该与这些特点和要求相适应。嵌入式系统应用于医疗仪器设备,符合发展趋势带来的要求和变化。

      医疗仪器领域大量医疗仪器的应用,如心脏起搏器、放射设备及分析监护设备,都需要嵌入式系统的支持。各种化验设备,如肌动电流描记器、离散光度化学分析、分光光度计等,都需要使用高性能的、专用化的DSP系统来提高其精度和速度。引入嵌入式系统后,现有的各种监护仪的功能与性能都将得到大幅度的提高。

     

      一般来说,医疗系统都非常庞大,但我们看到的一个趋势是便携式、低成本产品渐渐流行。便携医疗产品可分为两种:一种是手持产品,如用于患者监控的产品,像测量脉搏、血压等的产品,医生可以随身携带;另一种则不一定能够随身携带,但它们是低成本、简单的设备,一般用于设备较简单的医院。针对便携化的趋势,要求医疗电子设备必须具备体积小、功耗低、价格低和易于使用的特点。

      在医疗仪器的设计方面,有三个设计策略非常重要:一是采用模块化设计方法,采用这种方法可以在基本的平台上设计出不同型号的产品;二是背板设计方法,每个大系统一般都会有背板,上面可以插很多不同的板,它可以使系统的速度很快;三是便携产品。由于嵌入式系统具有的特点,上述医疗仪器设计策略都可以采用嵌入式系统实现。

      在医疗仪器应用中,嵌入式系统的普及率非常高。在设计过程中,根据需要对嵌入式系统重新编程,可避免前端流片(NRE)成本,减少和ASIC相关的订量,降低芯片多次试制的巨大风险。此外,随着标准的发展或者当需求出现变化时,还可以在现场更新。而且,设计人员能够反复使用公共硬件平台,在一个基本设计基础上,建立不同的系统,支持各种功能,从而大大降低了生成成本。使产品具有较长的生命周期,可以保护医疗仪器不会太快过时,医疗行业的产品生命周期比较长,因此这一特性非常重要。现代数字医疗仪器设备不但包括诊疗设备,而且还有数据存储服务器和接口软件。嵌入式系统可为医疗仪器设备设计、生产和使用提供先进的技术支持。

      嵌入式系统在医疗仪器领域的应用前景

      随着信息技术的发展,数字化产品空前繁荣。嵌入式软件已经成为数字化产品设计创新和软件增值的关键因素,是未来市场竞争力的重要体现。从医疗仪器领域来看,除了新的传感检测技术不断运用推广之外,对所采集信息的分析、存储和显示也提出了更高的目标。这就要求现代的医疗仪器具备更强大的计算和存储能力以及更稳定可靠的性能。另外,医疗仪器作为一个特殊的行业,又要求设备能够达到更高级别的环保要求。如何进一步地智能化、专业化、小型化,同时做到低功耗、零污染,将会是一个无止境的追求过程,这为嵌入式系统在医疗仪器中的应用提供了更广阔的天地和更高的要求。

      我国目前有19.2万家医疗卫生机构,拥有的医疗仪器设备中有15%是上世纪70年代前后的产品,需要更新换代,这将会推动未来几年甚至更长一段时间我国医疗仪器设备需求增长。2007是医疗体制改革启动之年,政府加大了公共卫生基础设施的投入,给医疗仪器带来较大的发展空间。根据“十一五”规划,2007年“新农村合作医疗”试点覆盖面将逐步扩大,2008年在全国基本推行,2010年实现基本覆盖农村居民的目标,这对于我国医疗仪器将是重大利好。同时,中国医疗仪器产品结构的调整,对嵌入式系统应用于医疗仪器也提供了一个很好的发展机会,同时也对嵌入式系统的开发者提出了新的挑战,开发出的产品除了应具有独特的创新功能外,开发者还应遵循一定的原则。只有这样,才能使嵌入式系统在医疗仪器中的应用事半功倍。

      参考文献

      [1] 代永陆,唐晓英,刘伟峰.基于嵌入式的多参数健康监护系统.电子应用技术,2006;(9).

      [2] 张海涛.嵌入式系统的设计及应用.北京:科学出版社,2007.

      [3] 孙天泽.机遇与竞争并存—2007年的嵌入式市场.程序员,2008;(2).


    本文引用通告地址: http://zou200904.spaces.eepw.com.cn/articles/trackback/item/49436
    展开全文
  • 化验室主要担负白酒生产过程中成品、半成品的控制分析、原料辅料分析、产品质量的检验分析方法的研究、改进、及车间级化验室所用标准溶液的配制、标定工作。对化验室工作基本要求是认真细致、实事求是、作风严谨、...

    (cr:SICOLAB)韶关企业化验室建设布置方案
    化验室主要工作和职责
    化验室主要担负白酒生产过程中成品、半成品的控制分析、原料辅料分析、产品质量的检验和分析方法的研究、改进、及车间级化验室所用标准溶液的配制、标定工作。对化验室工作基本要求是认真细致、实事求是、作风严谨、公正廉洁。
    1.负责成品、半成品的取样,原材料、辅料的抽样,及时准确地完成产成品、各种原材料的检验分析工作。原则上每天生产出来的成品与入库原料必须当天做出结果,出据《检验报告单》,报分管领导和有关部门。
    2. 严格执行国家关于质量记录和文件管理的有关规定,做好检验分析的原始记录。每批次原料及成品化验原始记录均载入档案,并清晰可查,妥善保管。
    3 保持与各有关部门、车间的及时联系沟通,共同对不合格的原辅料、半成品、成品进行控制,切实把住产品的质量关。
    4 在生产中出现异常情况时,加大抽查频率,以便及早发现存在的问题,找到解决的方法,提供科学数据来指导生产。
    5 参与企业科研工作, 为新产品开发研制和新工艺、新技术的应用研究提供准确的试验分析数据。
    6 对本室所做的一切化验结果负责,必须在化验记录后签署化验人员姓名。如怀疑所做的化验结果,应提前向部门领导汇报,以防止因此带来的质量事故。
    7 负责本室内分析仪器设备的使用维护保养,严格执行分析仪器管理制度有关规定, 保证仪器设备的正常运转。
    8 负责化验室药品的使用管理,严格执行化学药品管理制度、按照程序标准使用。
    9 在化验工作中,废水、废汽、废渣的排放应遵守国家环保有关规定, 防止环境污染, 保证化验人员的身体健康。
    10 保持化验室清洁卫生, 按卫生管理制度要求做好室内日常卫生和个人卫生工作。
    11 对整个化验工作过程安全负责, 严格执行安全管理制度,确保化验工作安全进行。
    12 组织对化验人员进行培训学习和再提高教育,努力提高化验人员的质量意识和专业知识技能。
    SICOLAB 企业化验室的建设
    化验室建设位置的选择
    一般情况下, 化验室应建在离生产车间、污水处理场、锅炉房和大型变压器较远的地方,以防止有害气体、灰尘对化验室的危害,消除振动、噪音和大电流设备、强磁场给分析检验带来的影响。为保持良好的气象条件,一般应为南北方向。
    化验室面积的考虑
    由于有关规范中, 未提供过有关化验室面积的确定方法, 致使各企业化验室面积存在很大的差异。面积太大,造成不必要的浪费;面积太小,化验工作人员多了,就感到非常拥挤。因此应当根据企业实际情况确定化验室的建筑面积。总的原则应该是方便工作, 要有足够的场所, 满足各项实验需要, 给化验人员提供舒适的工作环境。近几年,随着企业各种认证、换证复查等工作的正常开展, 上级领导经常到企业检查, 同行业也经常相互学习,而化验室又是一个必去的地方,为不感到拥挤,又不影响正常工作,可考虑建一个参观走廊。SICOLAB专注于提供实验室建设装修一站式服务

    化验室工作间的设置化验室工作间的设置应根据化验室规模和任务需要而定。一般大中型企业化验室可设化学分析检验室(用于样品处理及常规化学检测),色谱室(气相或液相色谱仪专用),精密仪器室(放置天平,分光光度计等分析仪器设备),钢瓶室(色谱分析气瓶用),粉碎室(原料分析样品处理用)及样品储存室,更衣室、办公室等。在确定这些工作间位置时,应根据工作性质、用途、相互间的影响,综合考虑分类设置,以便于工作和管理。如小型企业受建筑面积等条件的限制不能细分,但至少应设置用于常规化验分析的检验室和仪器室。

    展开全文
  • 生物质颗粒热量检测仪如何运用 生物质颗粒热量检测仪如何运用由英特生物质燃料热值化验仪器138.3923.4904 检测竹炭热值的设备,稻壳炭大卡化验设备,化验稻壳炭热量的仪器,木屑颗粒热值检测仪器,生物质颗粒热值...
  • 洁净实验室包括技术和设备的更新,研究人员增加现有研究员的能力提高等。实验室建设原则是满足实验室工作业务流程的优化及日常管理等方面的需要。设计主要考虑实验室的工艺流程、特殊实验室功能间的位置选择、...
  • 1、实验室要远离污染源,最好布置在厂区污染源的上风向,避免厂内粉尘有害气体对 分析结果的影响。 2、实验室要尽量远离振源、电磁源,避免或减少对精密仪器分析结果的影响。 3、实验室周围环境要安静、清洁,满足...
  • 现代炼油企业对实验室的分析检验数据的准确性有相当高的要求,工艺路线、生产方案,产品结构的制定和调整,依赖于分析检验结果和市场需求,所以实验室内配备了大量精密仪器设备和各种辅助设施,如果安装、放置的条件...
  • 我们在日常工作或书籍上,经常遇到分析、化验、检验、检测、测量、测试、计量、实验、试验等一些名词,表面上看有区别,但仔细想想又不知道到底有什么区别,请有识之士参与讨论。   计量的定义:   实现单位统一、...
  • 潮州企业化验室建设可实行方案,SICOLAB实验室技术小编给您介绍: 1、环境设计要求 ① 采用排气扇强制排风,其中一间实验室安装抽排气系统。 ② 演示讲台所有学生实验台均设供排水装置。 ③ 实验废液应收集,并...
  • 人工智能浪潮下:化验员的岗位就业分析概况 化验员岗位说明 作者:马振佳 文章来源:百度搜素 岗位名称:化验员、 所属部门:技术质量科 ...主要的工作职责:原料的化验 ... 化验仪器设备的管理及维护...
  • 医用培养箱、医用离心机、病理分析前处理设备、血液化验设备和器具、医用低温冷藏设备、专用消毒设备、体液处理设备、医用显微镜等; 自动生化分析仪、免疫分析仪、血球计数仪、细菌分析仪、尿液分析仪、血液透析...
  • 常见的身体检查仪器和方法

    千次阅读 2011-09-09 13:53:35
    仪器:  1 核磁共振 优点  1.MRI对人体没有损伤;  2.MRI能获得脑脊髓的立体图像,不像CT那样一层一层地扫描而有可能漏掉病变部位;  3.能诊断心脏病变,CT因扫描速度慢而难以胜任;...
  • 根据工艺参数生产要求及政策法规分析任务,建立化验室,购置必要的仪器设备及化学试剂,选拔培训合格的化验人员,实行严格的科学管理,使化验工作井然有序的进行. 1、污水处理厂实验室之化验室设计要求 1)房间布局...
  • 机械设备租赁(不配备操作人员的机械设备租赁,不包括金融租赁活动);汽车租赁(不包括带操作人员的汽车出租);房屋租赁业务;商务服务、商务代理;过境货物运输代理(国际多式联运);3C产品检测、维修服务。...
  • 云南高中、初中、小学标准化实验室的建设,实现实验室建设现代化、教学仪器配备标准化、实验室管理信息化、实验教学开展制度化,全面提高中小学实验室"建、配、管、用"的整体水平。 云南中小学智慧实验室建设方案...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 575
精华内容 230
关键字:

化验仪器和设备