当前位置: 首页 > news >正文

工业级开发中的一些常识

这是一个朋友问我的问题,说实话,我没看清他想问什么,不过看来他对工业现场开发的一系列开发知识,术语,习惯不是很了解,干脆,我讲讲好了。
原文如下:
肖老师您好,今天面试接到这样一个问题,采集设备的数字信号或模拟信号,并且处理之后放到数据库;主要是温度,和空气质量的数据
  老师能否给点意见,最好是Java;是否是有某些硬件会接收那个设备的数字信号,然后我们就可以调用那个接收信号设备的接口得到数据;
还说要知道什么传输协议呢?
我的回答:
这个实际上应该算数字电路和模拟电路这两本书的知识了。
不过呢,我做过一点工业控制软件,了解一点,我讲讲我的看法哈,讲得不好,叫做我学艺不精,回去学习再来过哈,呵呵。
在工业现场,有各种设备,如一个开关的状态,嗯,门是开着的还是关着的,还有温度啊,压力啊,转速啊什么的,是求值的。大家看着很乱,很多设备的,有的大型设备,一台就有几千个量,都要采集,大家说乱不乱?
呵呵,其实不乱的,一点都不乱,因为前人早就把工业现场能看得见的参量,归大类,总结为两类输出:
1、开关量:就是前面说的开关状态,注意哦,有很多开关不止两种状态的,但大面上看,都在这几种状态中变来变去,这种变量就叫开关量。嗯,有笔记本的朋友,你们打开合上屏幕,屏幕会变黑,这就是一个开关在起作用,这也是开关量采集。没有笔记本的,嗯,台式机的肚几眼,就是电源开关啦,那个也是开关量,嗯Reset也是,这些都是双状态开关量。多状态例子也有啊,家里有老实电风扇的没有,那几个按钮,1、2、3档风速,多状态,明白了吧。
2、模拟量:就是前面采集的温度、压力啊,转速什么的。这种参量的采集,有个鼎鼎有名的称谓,A/D转换,大家听说过没有,就是把外部模糊的电压、电流,转换为具体的整形数。当然,还有D/A转换,就是把整形数再转换回去,获得控制电流和电压什么的。
不过,这些都是硬件工程师的事情,我们软件工程师呢,其实获得数据一般都是在某个硬件设备的端口读数字了,前面的转换细节,无需我们关心的。这个读口,可以是PC机的IO地址段(去看看汇编语言),其实arm等嵌入式设备也有类似的设计,开发说明书都有读口和打口的方法,硬件工程师只要把线接上,我们就能读出状态变化。
当然,如果对端设备够智能,比如人家内嵌单片机,也可以是从串口读,甚至从网卡读,都可以的。嗯,多说一点哈,网卡其实也是一个开关量设备,最底层的驱动,其实是把网卡从网络上接收到的电平,翻译成数字0,1,经过协议层层转换,才是我们看到的协议报文什么的。
开关量相对简单,比如我们预设低电平是0,那么,当外部总线是+5V或者-5V(取决与硬件工程师设计啊),那么,我们读到的就是1,如果是0V,就是0,就这么简单,当然,如果系统是12V工作,12V来做1也可以啦。
我当年被人弄过一次,有个硬件工程师把线接错了,两根线接到同一根电源5V端子上,而且都带着负载,这下完蛋了,由于这根端子带不起两个并联负载,电压被拉低,除2,只有2.5V。可怜我的程序,一晚上都在0~1之间跳变,屏幕上一个红灯老是闪个不停。
我熬了一个通宵都找不到问题,最后,第二天人家上班,另外一个硬件工程师过来,5秒钟就找到问题了。这个通宵算白熬了。我倒!这叫硬件不出手,软件急的像条狗,呵呵,想起来都郁闷。
模拟量就复杂多了,因为这里面有个很重要的问题,就是采样精度。记得我当年用的比较多的是8235这块片子,它精度是12bits的,就是可以把一个电压量程,细分4096个段,应该是0~FFF,也就是说,不管外面怎么连接,我们读到的数字,是0~4095这个区间的。
这当然是unsigned int了,至于这个数字代表温度多少度,还是压力多少帕,根据前级采样的设备量程自己换算去。硬件也有不行的时候,呵呵,它没办法传单位过来,这要我们软件来转换的。
比如说,我以前买了一个红外线温度探头,它量程是-20~1000度,6000多块呢,它可以输出电流,也可以输出电压,由于电压只有3.8V,而电流可以是0~12A,显然电流精度大得多,我们当时用的就是电流输入来测的。
我这里读到的0~FFF,对应过去就是0~12A,再对应到现场温度,就是-20~1000这么1020个温度。至于比例换算,自己算去。呵呵,大家觉得乱不乱?
应该说,12bits,在工业应用上,精度已经很高了,因为工业现场没那么高的精度,不过,也有更高精度的采样芯片,那个价格哦,涨的就嗖嗖的了。
一般要是16bits精度的,应该就是军用级了。像导弹制导上面的,我估计精度更高。呵呵。
有个例子,像现在高端的数码相机,一般就采用14bits的采样精度,就牛叉得很了,像宾得的K10D,主要卖点就是14bits采样,人家称为中端典范,旗舰产品,牛吧。呵呵。
好了,啰嗦了这么多,其实就是一点工控简单入门的知识啦,也没什么的。
当数据都采集回来了,怎么丢数据库,就不说了吧。一般的关系型数据库都可以,比如说MySQL,SQLServer什么的。
但是,也不能一概而论,工业设备采样有频率要求,一般说来,越精细的设备,频率要求越高。对于太高频的设备,关系型数据库的速度就跟不上了,不能用。
这其实就是我现在正在研究的话题,RTDB,工业级实时数据库。这是另外一大类数据库,特点是功能比较弱,不支持什么SQL访问,但是就是速度快。我们一个基本需求都是20000点/秒的入库速度,还要并发50路查询请求,每个请求还要做插值计算什么的,但是,响应时间不允许超过200ms。Oracel来都都得挂,呵呵。
那怎么办?玩Hash,B+树什么的呗。
Java肯定玩不转,C++都够呛,很多得用纯C,还得在底层自己实现优化。我这段时间光算Olog(2)n,算了几百次,计算书写了几十页,都在算这个效率。
至于协议就简单了,任何时候,通讯双方要传数据,就得遵守一定规约,这个规约就是协议,就是你先说话还是我先说话,咱们怎么同步动作,然后,你先传什么,再传什么,我再来接收,要不要回复你收到没有,什么的,其实很简单。
协议可以自己写,不过,对外的接口,建议尽量靠标准协议,以后好跟别的设备互连啊。说白了,你采集了数据总不能自己拽手里,得拿给大家用不是。嗯,注意哦,一旦数据到了你手里,你就叫采集设备了,上层还可能有其他设备向你要数据的,最后形成一张大网,工业现场的数据管控,运维分析,灾难重演和预防,运营决策分析,就全都展开了。
大家看完晕不晕,呵呵。
嗯,建议大家有兴趣的话,好好学,这个行业是可以轻易产生出百万富翁的。
ok,大家慢慢看哈,有问题再问。
=======================================================
在线底价购买《0bug-C/C++商用工程之道》
(直接点击下面链接或拷贝到浏览器地址栏)
http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0
肖舸

相关文章:

  • 第一个shell
  • Android环境搭建及相关命令
  • c# asp.net 日历控件(9)
  • 献给各位已婚者
  • 上海世博会园区进行首次试运行
  • SQL Server 数据库故障修复顶级技巧之一
  • Rose HA for SQL2008的安装之一
  • 服装企业的信息管理及主要对象
  • Team Fundation Server 2010 五
  • 自定义控件开发
  • 争夺NO.1........
  • 6666
  • 用Eclipse平台进行c/c++开发
  • NHibernate测试的几个小问题
  • Qt 第一章 建立连接
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Android交互
  • Java多线程(4):使用线程池执行定时任务
  • JAVA多线程机制解析-volatilesynchronized
  • Java反射-动态类加载和重新加载
  • jquery cookie
  • Magento 1.x 中文订单打印乱码
  • nginx 负载服务器优化
  • node.js
  • node-glob通配符
  • PermissionScope Swift4 兼容问题
  • php ci框架整合银盛支付
  • socket.io+express实现聊天室的思考(三)
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue2 SSR 的优化之旅
  • Vue实战(四)登录/注册页的实现
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 机器学习中为什么要做归一化normalization
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端路由实现-history
  • 数组的操作
  • 微信小程序开发问题汇总
  • 微信小程序--------语音识别(前端自己也能玩)
  • 赢得Docker挑战最佳实践
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • $.each()与$(selector).each()
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)nginx 安装、启停
  • (java)关于Thread的挂起和恢复
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (转载)虚函数剖析
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ... 是什么 ?... 有什么用处?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET/C# 使用 SpanT 为字符串处理提升性能