Open chzhm159 opened 3 years ago
一个比较接近实际情况的问题场景
笼统的来说以上场景带来如下问题:
综合以上问题寻找方案
方案探索 首先不可能自己从头开发一套已经有大把现成的CRM系统.但是目前的CRM系统绝大多数基于关系型数据库.那么如何处理大量工业数据? 如何数据实时统计分析? 如何数据可视化? 需要一个整合方案.
数据流向 | 应用场景 |
---|---|
1. 采集程序--->Database | 仅采集,直接录入数据库,且每秒写入数据量不是很大的情况 |
2. 采集程序--->MQ | 从消息队列中消费数据,希望独立处理数据的场景 |
3. 采集程序--->[MQ]--->Flink--->Cassandra | 通用一站式,解决方案 |
重点说一下第 3 种: 首先 MQ 为非必须项,但是如果不适用MQ,则消息的持久化,可靠性,需要自己维护.故前期为了减少工作量,依然选择走MQ 采集到原始数据后,针对不同的场景,基本的处理思路:
v2 路过,支持一下 同关注该领域,可惜技术栈为c/c++,不熟java... 那就提几条建议吧
@yyt6801 多谢,真的非常感谢,找不到同伴,一个人摸索前进的感觉太难受了。
数据量部分我的规划是这样的:
增加一层数据池的组件,方便程序的逻辑处理. 具体实现如下:
这样会对程序控制逻辑上的改变.以具体案例说明:(工控领域常用的PLC与软件的握手流程) 软件需要监控 设备中 A变量=1 时,读取 B变量的数值,并且将B变量数值存入数据库,然后将 C变量设置为1,然后监控A变量,当A变量=0时,再将C变量设置为0.
实现方式: 一. 基于目前功能,针对 A变量, 设置一个回调函数,读取间隔100ms,然后在这个回调函数中,需要设置全局变量,来控制当A=0时,与当A=1时的逻辑处理.同时先读取B,在设置C=1,然后判断当A=0时,再设置C=0. 此时有个问题,就是 A只有一个回调函数,且每隔100ms就会被重入,而此时 会存在多种情况,比如 数据库写入失败,或者变量C写入失败.所以需要通过一些全局变量来指示当前状态,以便对各种异常做处理.
二. 使用定时器,轮询 A,C变量当前数值:
当A=0,C=0时不做任何处理
当A=1,C=0时,读取B,处理完后,将C=1
当A=1,C=1时,不做任何处理,
当A=0,C=1时,将C=0. 至此, 回到了 A=0,C=0.
逻辑更加清晰
A,B,C变量的读写,都是与数据池交互即可,完全屏蔽了通信层,而且可以同时操作多个变量
代价是实时性较低,A,C的监控周期都是100ms,那么第1次读取到A=0,写入C=0后,下一个周期再读取C时,可能C依然为0,或许网络波动,导致C还没写入设备.此时 A=0,C=1,不做处理,相当于浪费了100ms. 但是带来的好处就是,软件状态与设备状态是同步的,且逻辑清晰,异常情况好处理.
方法二是借鉴了电控中控制思路,同时Labview中与 OPC Server也同样是这么处理. 同时经过了用软件控制设备生产的实际应用考验后,决定的.
几经波折,确定最终结构如下:
核心模块(Core)完成如下功能:
如需基于此库实现业务逻辑有2种方式:
达成目标
如何实现
分为三个模块
对于开发者