docker版jxTMS使用指南:数据源之modbus

news/2024/10/18 1:39:27/

本文讲解4.2版jxTMS如何用数据源访问modbus设备,整个系列的文章请查看:docker版jxTMS使用指南:4.2版升级内容

docker版本的使用,请参考docker版jxTMS使用指南

4.0版jxTMS的说明,请查看:4.0版升级内容

在docker镜像的/home/tms/python/app/module/目录下,笔者提供了dataSource_modbus.py文件,该文件就实现了用modbus来拉取数据。看完大家会发现,数据源和modbus的结合,简直简单到了极点。

继承自数据源的dataSource_modbus使用modbus_tk来执行modbus操作,核心就做了四件事:

1、初始化modbus连接:

self._master = modbus_tcp.TcpMaster(ip, port)

2、重载pull函数:

def pull(self, t):#从机地址s = t[2]#功能码f = t[3]#希望访问的寄存器号r = t[4]#希望访问的数量n = t[5]try:#读取寄存器return self._master.execute(s, f, r, n)except ConnectionRefusedError:#失联jxGo.log('warn',self._disConnectionMsg)except:pr = traceback.format_exc()jxGo.log('warn',f'modbus pull [{t[0]}.{t[1]}] error:{pr}')#执行到这里一定是出现了错误if self._errorNum < 3:#3次错误才动作self._errorNum = self._errorNum + 1else:self._errorNum = 0#错误不可避免,所以终止继续访问,等待下一个周期继续self.clearWandQueue()return None

3、增加一个start函数以封装setPullMode:

def start(self):#延迟10秒后执行以分散处理压力self.setPullMode(delayExec_seconds=10,taskInterval_milliseconds=self._taskInterval_milliseconds,interval_seconds=self._interval_seconds)

4、注册modbus类型的数据源:

def _newModbusDataSource(*args, **kw):return dataSource_modbus(*args, **kw)dataSource.register('modbus',_newModbusDataSource)

使用modbus数据源

注册后,在需要时执行下述命令即可:

self._dataSource = dataSource.New('modbus',afterPullDual=self._afterPull,informDual=self._setData,ip=sp30h_ip,port=sp30h_port,taskInterval_milliseconds=500,interval_seconds=300)

在docker镜像的/home/tms/python/app/sinosoarSP30H/目录下的site.py文件中sp30h_slave站点就是如此定义了自己的数据源。

其指定了_afterPull函数来执行拉取到数据的后处理:

def _afterPull(self, t, tv):if tv is None:return None#数据类型,在jxUtils中定义dt = t[6]#modbus读到的是一个元组v = tv[0]if dt == dataType_int16:if v >= 32767:#16位带符号整数v = jxUtils.trans2short(v)elif dt == dataType_uint32:#32位无符号整数v = jxUtils.trans2u32(v)#缩放倍率【modbus的寄存器使用16位无符号数,精度可能不够,所以有时需要使用倍率来进行缩放】rate = t[7]if rate > 0:return v * ratereturn v

sp30h_slave还封装了数据源的addWantReceiveOver、addWantReceive两函数:

def addWantReceiveOver(self, dn, receiveFunc):#为数据源支流添加访问入口return self._dataSource.addWantReceiveOver(dn, receiveFunc)def addWantReceive(self, dn, vn, slave, readFn, regid, num, dataType, rate, productStatement, compareStatement):#为数据源支流添加访问入口t = (dn,vn,slave,readFn,regid,num,dataType,rate)self._dataSource.addWantReceive(t,productStatement=productStatement,compareStatement=compareStatement)

现在只需要添加待拉取的数据点即可。这部分代码在docker镜像的/home/tms/python/app/sinosoarSP30H/目录下的几个device文件中,都是根据设备厂家提供的产品手册查到需要的寄存器信息依次调用即可,大家根据注释读下代码就可以理解了。

注:可能有同学说,怎么好像没有定义数据策略呢?原因很简单,数据源中拉取到的数据,先是根据拉取参数元组中的dn【设备名】、vn【变量名】已经存放到dict中了,然后又经过afterDual将其转换为合适的数据格式和精度了,所以各设备接收到的数据就已经是符合要求的数据了,自然就不再需要数据策略进行解析和转换了

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld


http://www.ppmy.cn/news/794285.html

相关文章

2023年华中杯数学建模C题空气质量预测与预警解题全过程文档及程序

2023年华中杯数学建模 C题 空气质量预测与预警 原题再现 空气污染对人类健康、生态环境、社会经济造成危害&#xff0c;其污染水平受诸多因素的影响&#xff0c;如 PM2.5、PM10、CO、气温、风速、降水量等&#xff0c;探究 PM2.5 等污染物浓度的因素&#xff0c;更精准的预测…

五.LLC谐振变换器

LLC 谐振变换器启动过程分析 LLC 谐振变换器的组成结构中包含容性器件&#xff0c;为了尽可能减小输出电压纹波&#xff0c;钳位输出电压&#xff0c;此时希望输出滤波电容尽可能的大&#xff0c;因此也会在启动的时候&#xff0c;电容两端电压近似为 0&#xff0c;系统对电容…

机器学习算法基础学习 # 集成学习之随机森林

随机森林(Random Forests) 是集成学习算法的一种。集成学习是通过组合多个学习器来完成学习任务。随机森林是结合多颗决策树来对样本进行训练和预测。随机森林通过随机扰动而令所有的树去相关。 随机森林可以使用巨量的预测器&#xff0c;甚至预测器的数量比观察样本的数量还多…

Office2016的PPT放映幻灯片放映卡死解决方法

今天写一篇软文&#xff0c;非技术&#xff0c;而是技巧。 不知道大家有没有遇到过&#xff0c;PPT在非放映状态的时候&#xff0c;一切正常&#xff0c;但是只要点击放映&#xff0c;立马就卡死了。 此问题可能由于电脑的独立显卡硬件加速和office软件兼容性不好造成的。 解…

关于在Windows10 上PPT 2016不能插入Flash动画问题

亲测可行&#xff1a; 官网补丁&#xff1a; https://gallery.technet.microsoft.com/scriptcenter/Registry-keys-to-reenable-7cd9f723/view/Discussions#content 下载后直接执行一下Reg即可&#xff1a; 微软官方提供的补丁包&#xff0c;无需自己手动修改注册表。 简单…

一键解决PPT的动画播放和动画排序问题!

对于每一个想要做好PPT&#xff0c;但又不想浪费时间的小伙伴来说&#xff0c;能够一键解决PPT里面的某些问题&#xff0c;不用挨个手动设置&#xff0c;是最好&#xff0c;且最舒服的操作了。因为我们制作PPT又不是只作一张&#xff0c;而是制作很多张。格式要统一&#xff0c…

包含动画的PPT转为PDF

目的&#xff1a;带动画的PPT转化为PDF&#xff0c;PDF的每一页是动画的一个步骤 方法&#xff1a;使用 宏 参考链接&#xff1a;https://www.codercto.com/a/70548.html 具体方法&#xff08;win、mac均可&#xff09;&#xff1a; 前提&#xff1a;需启用 宏 功能 步骤一 …