吵吵   2014-08-21  阅读:4,156

科室来了台罗氏的COBAS8000,两个模块,一个免疫的E602,一个生化的c750。

想着是罗氏的产品,而且之前有e601和c501等机器,估计LIS联机用原来的接口就行了,结果测试的时候,才发现还有些差异的。

至于到底有什么不同,可以看看官方的手册,有一章可是详细简述了其不同之处:

Differences to the MODULAR ANALYTICS EVO analyzer / cobas®6000 analyzer series

This section describes the main differences in the ASTM protocols used with cobas® 8000 data manager and MODULAR ANALYTICS EVO analyzer / cobas®6000 analyzer series.

至于你想要这个文档,那么先博客下面有QQ群,请认证加入。

如果你是新手,不会LIS接口编程,出门左转看吵吵教程去。

言归正传,看看我遇到的问题:

1、质控传输号不对。

对于罗氏的机器来讲,质控传输的内容是以质控的批号作为样本号传输到LIS的,但是批号是经常更换的,为了不用经常去设置参数,因此我们固定了质控架。程序自动判断,当为质控的时候,取架子号(rackNo)+位置号(Position)合并为样本号来传输。

由于8000的ResultRecord格式有所变化,6000的接口传输过来的质控号变成了只有架子号,没有位置号,这将会导致无法区分质控水平的问题,因此,接口还是得改。

2、报警位置不对。

一般来说,当仪器测试的结果大于线性的时候,我们以>临床可报告范围来报告结果。例如Bnpro,大于350000的结果都是以>350000的结果来报告的。

大部分仪器在结果中已经就加入了>号,罗氏是比较奇葩的仪器,非要搞出个comment Record跟在Result Record后面来提供一些报警信息。

比如大于就是这样子的:

00519|20140812100519||||N||||1||||||||||F|
C|1|I|^^^^|G|
R|1|^^^91/1/not|35000|pg/mL|^TECH\^NORM\^CRIT\^US492^MU1#e602#1#2^4^0|
C|1|I|26^PANIC value over (upper) Technical Limit|I|
L|1|N|

比如小于就是这样子的:

|20140812141857|e602^2^MU1#e602#1#2^4^0|
C|1|I|27^PANIC value over (lower) Technical Limit|I|
L|1|N|
20

所以为了在传输的时候就将大于和小于符号加入,还是得修改接口。

至于如何传输,我们只讲解大概的,需要注意的有以下几点:

1、传输是ASTM协议的时候,是大框架的,也就是所有的一次数据都放在一个 low-level protocol。换言之不管是head record还是patient record 都是放到一起后组成[STX][CONTENT][ETX][C1][C2][CR][LF],然后发送的。

为什么说是大框架,因为有些仪器是小框架,把一个个record分别打包发送的。

2、因为是大框架传输,因此涉及到了内容过长的问题,就会用[ETB]来截断,所以需要接收所有内容后再整合。

3、[ENQ]不用怀疑是单独发送的,但是[EOT]可不是,有可能就会附在整个框架后面。如果你是苦苦等待单独发送的来触发传输结束的话,你可要小心了,吵吵可是在这里吃了两小时亏。

好了,废话少说,上一部分代码吧,看看就能明白了:

private  void LIS_DataReceived(object sender,SerialDataReceivedEventArgs e)
        {
            
            SerialPort sp = (SerialPort)sender;
            
            byte[] btReceive= new byte[sp.BytesToRead];
            int iReceived = sp.Read(btReceive, 0, sp.BytesToRead);
            Log log = new Log();
           // log.Write("接收数据:" + this.GetString(btReceive));

            //仪器回复接受

            if (btReceive[0] == (Int32)TransferSignal.ACK)
            {
                if(this.Sends.Count==0)
                {
                    return;
                }
                if(SendCursor<this.Sends.Count-1)
                {
                    SendCursor += 1;
                    byte[] sendBytes = Sends[SendCursor];
                    this.Send(sendBytes);

                    if(SendCursor==this.Sends.Count-1)
                    {
                        Sends.Clear();
                        this.State = ComState.Free;
                    }
                    

                }
            }
            //仪器回复不接受
            if (btReceive[0] == (Int32)TransferSignal.NAK)
            {
                if (Sends.Count > 0)
                {
                    Thread.Sleep(200);
                    byte[] sendBytes = Sends[SendCursor];
                    this.Send(sendBytes);
                }
            }
            if (btReceive[0] == (Int32)TransferSignal.ENQ)
            {
                
                    this.State = ComState.Reciveing;
                    this.Results.Clear();
                    this.Querys.Clear();

                    SendACK();

                    this.IsReceiving = true;
                    this.ReceivedString = "";

               
                    return;
            }
           
            
            
            
                
            

            if (this.IsReceiving == true)
            {
                
                this.ReceivedString += this.GetString(btReceive);
                if (this.ReceivedString.IndexOf("<EOT>") >= 0)
                {
                    log.Write("接收全部结果:" + this.ReceivedString);
                    
                    
                    
                    this.ReceivedText = this.RemoveFrame(this.ReceivedString);

                    //log.Write("去除框架全部结果:" + this.ReceivedText);
                        
                    this.ResolveText(this.ReceivedText);
                        

                    this.ReceivedText = "";
                    this.ReceivedString = "";
                    this.IsReceiving = false;

                 }
                    
                SendACK();

            } 
            
            
          
        }

额别告诉我你不会c# 看不懂,语言本是一通百通,啥不会编程?凑啥热闹呢。



吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

一条回应:“罗氏COBAS8000 LIS通信协议”

发表评论

电子邮件地址不会被公开。 必填项已用*标注