序
公司搞工业的,面对不同的工业通讯数据协议,需要一个采集器(like ge.Collector)收集不同协议的数据,并将之数据使用指定格式上传到数据接收服务器,且本地做http发布服务。
设计
不同的工业采集2次开发模块可能会不同,有的是事件通知,有的是需要自己去要;因此需要一种通用的模式 —— 时序扫描模式。为了快速查找,因此我们从Dictionary派生一个CollectService,定义如下:
类似游戏中tick一样,通过容器式的自顶向下的扫描,嗯可以看到sender在这里,所有的数据都一样嘛一个管线发送就行了,好,现在看看定义的通用采集器:
为什么用hashtable了?数据源类型不一,要类型格式化的话哪的去配置类型了。还有一个好处就是快,更何况经常需要就是用名字查找呢。
好了,将他扔进ServiceHost派生出来的HttpServer吧。
创建个项目,引用该项目写个OPC实现,once more 在来个modbus;
好了,搞定!
其余的就见代码吧:http://yunpan.cn/cwUbz8BggI4aD 访问密码 8d70
蛋疼的一些事
开始时,没有巨合适的http server;大概找到一个什么嵌入式http server,看似ok,一用起来就惨不忍睹,先是长度问题,然后tcp连接中微软本身的一个bug,到底都很迅速搞定;那边接口非要他娘的rest,mvc router倒是巨容易,rest的参数在中间,没得办法慢就慢点吧,没法hash了,动态算找。后来出来了一些不错的微型http server,再然后wcf有这么个东西,巨爽快—— 用同事的话说,分分钟搞定!
OPC性能问题,搞了个叫什么Auto OPC的dll,开始用的其事件驱动模式 —— 竟然数据不能OK;还好可以用读取的方式,试了好一阵参数还好搞定。
采集服务器: