吵吵   2018-03-31  阅读:2,374

自从换了东华的LIS之后,所有仪器的接口都是用串口转网口再与服务器通信的。

服务器收到数据后,服务器通过服务器端的ObjectScript脚本语言可以对数据进行处理,然后把结果保存到服务器或者把Order通过tcp发送回仪器。

因此Object是要类似于php,可以操作Socket或者TCP链接的,否则就没法玩。

最近把cache TCP通信研究了一遍,因为有些设备需要把结果发给服务器,但是如果用vism.ocx去连接服务器的话,有些设备电脑竟然用不了这个控件,或者用起来假死,报错什么的。

但是大部分电脑对Socket的支持还是比较好的,基本上用c#2.0,通过socket方式,只要是windows的电脑都能搞定,也不用去注册什么控件了。

按照东华传统的服务端模式的话还是有个问题。服务器进程启动了,但是如果客户端程序关了或者断开连接,服务端的程序就假死,得手工去重启一下,这个相当麻烦。

还是自己写代码实现吧。

1、TCP通信

cache的TCP通信在I\O操作里面,可以通过System Manager Portal里面去查询,大概是这么几个函数:

OPEN 打开设备,实际上就是根据参数来打开一个Socket或者说TCP连接。

USE 使用设备,什么意思呢?就是在用其它函数比如read write之前说明一下用的那个设备,比如你在terminal中操作的话use 0 write “ok”,意思是使用当前terminal的这个对话,输出ok。因而如果是多个连接的话的,你需要用use来调整用那个连接来操作。

read 读取数据。READ *var:timeout 。一定记得前面加个* ,加了*号的是当做字符变量来用的,没加的就是字符串。一开始我没加*,然后timerout设置为10,结果数据老是收不全。折腾了一上午才明白不加*,那就是接收字符串。

write 写入数据。WRITE var,*-3 。记得带上*-3这个参数,否则写入缓存,不会直接发送出去。

2、JOB函数

明白了TCP的使用,接下来就有个问题了,如果我们用terminal里面来建立一个TCP连接,那我把terminal关了,这个进程就结束了,难道我要一直开一个终端在那里么?

哈哈,你这么想就有点傻了。

我们可以人为启动一个进程执行特定的程序呀,类似在操作系统中Process.Start,或者类似线程,这个在Cache中叫做JOB。

JOB Disp^monitor

意思是启动一个进程执行monitor.mac中的Disp函数,这个进程只有程序报错或者代码执行玩了才会推出。

启动之后我们在portal的process里面可以看到这个进程,点击detail可以看到这个进程的详细情况:

可以在这里terminate掉,可以用函数$ZU(4,PROCESSID)干掉它,当然最好的做法就是while(loop=true),即控制循环停止,代码执行完了自己退出最好。

3、Read函数报错的问题

解决了上面的问题,开始测试,但是还是发现问题了。

当客户端断开连接之后,服务端调用Read函数首次会报错,然后程序就挂了,这和东华原来的程序为什么会假死可能是同一个原因。

这个问题要咱解决呢?想了半天还有办法。

只是断开后的第一调用Read报错,之后服务端又可以重新接受新的连接,因此我们只需要忽略这个报错,或者把这个报错当做是客户端断开的标志就可以了。

我们用try catch把这个错误捕捉了,好让线程和程序可以继续跑下去。

TRY {

}
CATCH exceptionvar
{
WRITE !,”this is the error routine”
WRITE !,”the error was: “,$ZERROR
}

说句题外话,ObjectScript原本就支持括号分割的,用…来缩进看起来真TM费劲,各位还是以后不要写用.缩进的代码了吧。

4、未完待续。

现在我终于实现了文本类型结果传输用一个相同的终端SocketClient就可以了,它负责把文件通过socket发送回服务器,然后服务器负责解析和保存结果。

测试了一下,连接上后基本不会断网,客户端断开了,重新连接立马可以连接上。

嗯,基本可以了,但是还有两个问题。

1、一个端口对应多个Socket连接的问题,比如多台仪器都向同一个端口发数据怎么解决?这个可以参考JOB在TCP控制应用,它还是搞了一套非阻塞式的编程方式。

2、拔了网线的问题,即心跳机制的问题。如果网线拔了,客户端和服务端是都没有办法知道网络断了的,所以需要心跳机制来确保TCP连接,这个要实现的话可以自己定义。

5、总结

其实objectscrpit还是挺强大的,功能还是不输于php,就是语法再简洁和易读一点就好了。

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

吵吵 吵吵

一条回应:“Cache数据库的TCP仪器接口实现”

  1. 新闻头条说道:

    文章不错非常喜欢

发表评论

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