为什么选择python开发
简单!!!
怎么解决同时采集多个设备问题
因python程序的GIL锁机制,导致即使开启多线程,也不能保证同步执行,在计算密集型任务中,因为GIL确保了在任何给定时间只有一个线程可以执行Python字节码。因此采用多进程解决采集设备多并发的问题。
带屏幕的EMS
个人选择做带屏幕的EMS,因为个人亲身体验来看,这样不仅可节省资源,在满足ems基本功能的前提下。又适应了物联网发展的趋势。
基本设计
EMS最大的一个挑战就是不同的项目,有不一样的数据点表,怎么解决这个问题,就是将各个设备的点表存储成单个点表。然后根据项目需要,加载不同的点表。
软件架构设计
这里将EMS软件架构划分成,数据采集服务、数据清洗服务、数据业务逻辑、API服务、后端管理平台、前端管理平台。最重要的就是数据采集服务。
数据库选择
前期如果是工商业柜体,则数据量不会很大,数据点位大概在2000点以内。而且还需要有很多附加的关系表。因此没必要采用influxdb这种时许数据库,为了降低难度,个人采用更熟悉的mysql数据库。如何使用influxdb数据库会在后续篇章描述。
数据采集服务
在main.py中开启数据采集服务。以及在数据库中查询相关的需要开启的进程的设备。我将各个设备按如下划分成几个进程,PCS一个进程、BMS一个进程、不管有几个电表,合并到一个进程,温湿度传感器、空调等其他设备开一个进程。故障保护一个进程,防逆流和需量保护一个进程。剩余有光伏的话,也会再开启一个进程。
数据库equipments设计
第一步查询设备
SELECT * from tbl_equipments
第二步,根据上面描述的情况,和数据库查询出的字段,建立进程,如下示例。
Process(target=acquisition_pcs.process,
args=(logger,1,'127.0.0.1', '502', interval_in_seconds)).start()
第三步编写进程相关代码,其实基本都是modbus协议,基本就是modbusRTU和modbusTCP两个协议。
进程的内容
检查连接-连接对应的设备点表-查询-解析数据-入库
modbus库采用modbus_tk
点表设计
如此重复将所有的进程编写完成,最后在main.py中加上日志操作。则完成相关采集服务。
logger = logging.getLogger('myems-modbus-tcp')
# specifies the lowest-severity log message a logger will handle,
# where debug is the lowest built-in severity level and critical is the highest built-in severity.
# For example, if the severity level is INFO, the logger will handle only INFO, WARNING, ERROR, and CRITICAL
# messages and will ignore DEBUG messages.
logger.setLevel(logging.ERROR)
# create file handler which logs messages
fh = RotatingFileHandler('myems-modbus-tcp.log', maxBytes=1024*1024, backupCount=1)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(fh)
# send logging output to sys.stderr
logger.addHandler(logging.StreamHandler())