返回首页
当前位置: 主页 > 精通Office > 其他教程 >

罗氏COBAS8000 LIS通信协议

时间:2014-08-22 21:45来源:知行网www.zhixing123.cn 编辑:麦田守望者

科室来了台罗氏的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]可不是,有可能就会附在整个框架后面。如果你是苦苦等待单独发送的来触发传输结束的话,你可要小心了,吵吵可是在这里吃了两小时亏。

好了,废话少说,上一部分代码吧,看看就能明白了:
1 private void LIS_DataReceived(object sender,SerialDataReceivedEventArgs e)

2 {

3

4 SerialPort sp = (SerialPort)sender;

5

6 byte[] btReceive= new byte[sp.BytesToRead];

7 int iReceived = sp.Read(btReceive, 0, sp.BytesToRead);

8 Log log = new Log();

9 // log.Write("接收数据:" + this.GetString(btReceive));

10

11 //仪器回复接受

12

13 if (btReceive[0] == (Int32)TransferSignal.ACK)

14 {

15 if(this.Sends.Count==0)

16 {

17 return;

18 }

19 if(SendCursor<this.Sends.Count-1)

20 {

21 SendCursor += 1;

22 byte[] sendBytes = Sends[SendCursor];

23 this.Send(sendBytes);

24

25 if(SendCursor==this.Sends.Count-1)

26 {

27 Sends.Clear();

28 this.State = ComState.Free;

29 }

30

31 }

32 }

33 //仪器回复不接受

34 if (btReceive[0] == (Int32)TransferSignal.NAK)

35 {

36 if (Sends.Count > 0)

37 {

38 Thread.Sleep(200);

39 byte[] sendBytes = Sends[SendCursor];

40 this.Send(sendBytes);

41 }

42 }

43 if (btReceive[0] == (Int32)TransferSignal.ENQ)

44 {

45

46 this.State = ComState.Reciveing;

47 this.Results.Clear();

48 this.Querys.Clear();

49

50 SendACK();

51

52 this.IsReceiving = true;

53 this.ReceivedString = "";

54

55 return;

56 }

57

58 if (this.IsReceiving == true)

59 {

60

61 this.ReceivedString += this.GetString(btReceive);

62 if (this.ReceivedString.IndexOf("<EOT>") >= 0)

63 {

64 log.Write("接收全部结果:" + this.ReceivedString);

65

66 this.ReceivedText = this.RemoveFrame(this.ReceivedString);

67

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

69

70 this.ResolveText(this.ReceivedText);

71

72 this.ReceivedText = "";

73 this.ReceivedString = "";

74 this.IsReceiving = false;

75

76 }

77

78 SendACK();

79

80 }

81

82 }

 


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

顶一下
(0)
0%
踩一下
(0)
0%
标签(Tag):LIS通信协议
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片