5.41 综合案例2.0-modbus协议控制变送器和六路继电器

news2024/11/30 13:44:07

modbus协议控制变送器和六路继电器

  • 案例说明
    • 1.器件
      • 光照温湿度变送器
      • 六路继电器
    • 2.测试前操作
    • 3.连线
  • 代码
  • 测试

案例说明

基于modbus协议,本案例实现了下述功能:
 (1)采集和上报温度、湿度、光照数据
 (2)控制6路继电器

1.器件

haas506或HD1(RTU)1
建大仁科-光照温湿度变送器1
郎汉德继电器1

光照温湿度变送器

链接: 建大仁科-光照温湿度变送器手册

 一款高精度感光变送器,输出数值计量单位为 Lux,设备采用壁挂防水外壳,壁挂式安装,防护等级 IP65。485 通信,标准 ModBus-RTU 通信协议,通信地址及波特率可设置,最远通信距离 2000 米,产品供电为 10-30V 宽电压供电,主要应用于农业大棚、花卉培养温室、农业大田、电子设备生产线等需要光照度监测的场合。

在这里插入图片描述

  • 建大仁科-光照温湿度变送器参数
    在这里插入图片描述
  • 硬件接线
    在这里插入图片描述

六路继电器

链接: 继电器手册

 采用标准 Modbus- RTU 协议的继电器设备,支持 RS485/232 或网络通信。支持宽电压供电(9-28V DC),多路输入输出控制,可广泛应用于工业生产、农业、智慧城市、写字楼等各类应用场景。
在这里插入图片描述

  • 继电器参数
    在这里插入图片描述在这里插入图片描述

2.测试前操作

(1)设置波特率
 因为“建大仁科光照温湿度变送器”和“郎汉德6路继电器”两个传感器公用一条rs485总线,所以,两个传感器需要设定为相同的工作波特率。“建大仁科光照温湿度变送器”默认工作波特率为4800, “郎汉德6路继电器”默认工作波特率为9600. 所以,本案例将“郎汉德6路继电器”默认工作波特率设定为4800,具体设置方法参考main.py。

(2)设置设备地址
 因为“建大仁科光照温湿度变送器”和“郎汉德6路继电器”两个传感器公用一条rs485总线,所以这两个设备的设备地址不应该相同(默认都是1)。所以本案例将继电器的设备地址改为3。即将继电器上的拨码开关中的第二个推上去。

在这里插入图片描述

3.连线

haas506
在这里插入图片描述
HD1(RTU)
在这里插入图片描述

代码

main.py

import utime
import modbus as mb
import yuanda_htb485
import zzio606

#初始化
def mb_init():
    ret = mb.init('modbus_485_4800')
    if ret < 0:
        raise ValueError("init modbus failed.")


'''
获取htb变送器温度,湿度,光照数据
htb变送器地址默认为1
'''
def test_htb485():
    htb485Obj = yuanda_htb485.HTB485(mb, 1)
    humidity = htb485Obj.getHumidity()
    temperature =  htb485Obj.getTemperature()
    brightness = htb485Obj.getBrightness()
    htb = htb485Obj.getHTB()
    
    print("temperature:", temperature/10,"℃")
    print("humidity:", humidity,"%RH")
    print("brightness:",brightness,"lx")
    print("htb:",htb)


'''
6路继电器,采用标准 Modbus- RTU 协议的继电器设备
将地址调为3
'''
def test_zzio606():
    zzio606Obj = zzio606.ZZIO606(mb, 3)
    zzio606Obj.openChannel(0)
    utime.sleep(1)
    zzio606Obj.openChannel(1)
    utime.sleep(1)
    zzio606Obj.openChannel(2)
    utime.sleep(1)
    zzio606Obj.openChannel(3)
    utime.sleep(1)
    zzio606Obj.openChannel(4)
    utime.sleep(1)
    zzio606Obj.openChannel(5)
    status = zzio606Obj.getChannelStatus()
    print("status", status[0])
    
    utime.sleep(5)
    
    zzio606Obj.closeChannel(0)
    utime.sleep(1)
    zzio606Obj.closeChannel(1)
    utime.sleep(1)
    zzio606Obj.closeChannel(2)
    utime.sleep(1)
    zzio606Obj.closeChannel(3)
    utime.sleep(1)
    zzio606Obj.closeChannel(4)
    utime.sleep(1)
    zzio606Obj.closeChannel(5)
    utime.sleep(1)
    status = zzio606Obj.getChannelStatus()
    print("status", status[0])


if __name__ == '__main__':
    mb_init()
    test_htb485()
    test_zzio606()
    mb.deinit()

yuanda_htb485.py

import ustruct

class HTB485(object):
    
    def __init__(self, mbObj, devAddr):
        self.mbObj = mbObj
        self.devAddr = devAddr
    
    def getHumidity(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        value = bytearray(4)
        ret = self.mbObj.readHoldingRegisters(self.devAddr, 0, 2, value, 200)
        if ret[0] < 0:
            raise ValueError("readHoldingRegisters failed. errno:", ret[0])
        
        humidity = ustruct.unpack('hh',value)
        return humidity[0]
    
    def getTemperature(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        value = bytearray(4)
        ret = self.mbObj.readHoldingRegisters(self.devAddr, 0, 2, value, 200)
        if ret[0] < 0:
            raise ValueError("readHoldingRegisters failed. errno:", ret[0])
        temperature = ustruct.unpack('hh',value)
        return temperature[1]
    
    def getBrightness(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        value = bytearray(4)
        ret = self.mbObj.readHoldingRegisters(self.devAddr, 2, 2, value, 200)
        if ret[0] < 0:
            raise ValueError("readHoldingRegisters failed. errno:", ret[0])
        brightness = ustruct.unpack('hh',value)
        return brightness[1]
    
    def getHTB(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        value = bytearray(10)
        ret = self.mbObj.readHoldingRegisters(self.devAddr, 0, 5, value, 200)
        if ret[0] < 0:
            raise ValueError("readHoldingRegisters failed. errno:", ret[0])
        htb = ustruct.unpack('hhhhh',value)
        return htb

zzio606.py

class ZZIO606(object):
    
    def __init__(self, mbObj, devAddr):
        self.mbObj = mbObj
        self.devAddr = devAddr

    def openChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeCoil(self.devAddr, chid, 0xff00, 200)
        return ret[0]

    def closeChannel(self, chid):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        ret = self.mbObj.writeCoil(self.devAddr, chid, 0, 200)
        return ret[0]
    
    def getChannelStatus(self):
        if self.mbObj is None:
            raise ValueError("invalid modbus object.")
        status = bytearray(1)
        ret = self.mbObj.readCoils(self.devAddr, 0, 6, status, 200)
        if ret[0] < 0:
            raise ValueError("modbus readCoils failed, errno:", ret[0])
        return status

board.json

{
  "name": "haas506",
  "version": "1.0.0",
  "io": {
      "modbus_485_4800": {
          "type": "MODBUS",
          "mode": 0,
          "port": 2,
          "baudrate": 4800,
          "priority": 0,
          "timeout": 200
      },
      "modbus_485_9600": {
        "type": "MODBUS",
        "mode": 0,
        "port": 2,
        "baudrate": 9600,
        "priority": 0,
        "timeout": 200
      },
      "cloud_led": {
        "type": "GPIO",
        "port": 9,
        "dir": "output",
        "pull": "pulldown"
      },
      "net_led": {
        "type": "GPIO",
        "port": 7,
        "dir": "output",
        "pull": "pulldown"
      }
  },
  "debugLevel": "ERROR",
  "repl": "disable"
}

测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全防御 --- IPSec理论(02)

附&#xff1a; 协议与模式分类 esp 和 ah 的分类&#xff1a; 数据的安全性&#xff1a;ESP有机密性&#xff1b;AH无机密性场景&#xff1a;ESP适合公网场景&#xff1b;AH适合内网 / 私网场景 &#xff08;数据的安全性主要依赖于传输端之间需要做认证&#xff09; 传输…

MyBatisPlus4-DML编程控制(增删改)、id生成策略、逻辑删除、乐观锁和悲观锁

1. id生成策略控制&#xff08;增&#xff09; 名称: TableId 类型: 属性注解 位置: 模型类中用于表示主键的属性定义上方 作用: 设置当前类中主键属性的生成策略 public class User {TableId(type IdType.AUTO)private Long id; }value: 设置数据库主键名称 type: 设置主键属…

vue完美模拟pc版快手实现短视频,含短视频详情播放

目录 一、预览 二、效果图 项目实现的demo效果图&#xff1a; 三、项目细节说明 1.项目结构、设计说明 2.项目可拓展能力题外话&#xff08;看不懂可以忽略&#xff09; 3.项目路由配置 4.框架布局页面源码 5.首页实现 四、总结 一、预览 本作品demo预览地址&#xff1…

测试工程师该何去何从?写给30+岁的测试工程师!

前言&#xff1a; 软件测试是为了发现程序中的错误而执行程序的过程。 通俗的说&#xff0c;软件测试需要在发布软件之前&#xff0c;尽可能的找软件的错误&#xff0c;尽量避免在发布之后给用户带来不好的体验&#xff0c;并要满足用户使用的需求。 首先今年行情肯定比去年好…

【Java|多线程与高并发】线程的中断的两种方法

文章目录 1.前言2. 方法1: 自定义标志位3. 方法2:使用标准库自带的标志位4.总结 1.前言 线程中断是指在一个线程执行的过程中&#xff0c;强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束. 本文主要介绍线程中断的两种方法…

电力通信机房如何管理?你绝对想不到!

在信息化建设中&#xff0c;机房运行是信息交换管理的核心。机房内的所有设备必须始终正常工作&#xff0c;否则一旦某个设备出现故障&#xff0c;就会对数据传输、存储和系统运行造成威胁&#xff0c;进而影响全局系统的运行。 机房内的3大安全隐患 01.典型的事故包括电气、消…

HighCharts图表的呈现

HighCharts用法说明地址&#xff1a;Highcharts API 文档 | Highcharts 通过地址打开会出现新版&#xff0c;也可以切换到旧版&#xff0c;以上图是旧版&#xff0c;旧版有详细的备注更方便使用 大致的界面呈现上方提供的地址可以实现&#xff0c;在这个地方主要说明几个注意点…

耗时108天,终于有人把金九银十面试必问的1309道Java面试题全部整理出来了

就目前大环境来看&#xff0c;跳槽成功的难度比往年高很多。一个明显的感受&#xff1a;互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;不少大厂&#xff0c;如阿里、腾讯、华为的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;其实&#xf…

AI安防视频融合平台EasyCVR服务启动异常的原因排查与解决

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持多协议、多类型的设备接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大…

求子网掩码的有效地址

第一步&#xff1a;通过题目可以得知&#xff0c;这个子网掩码属于C类&#xff0c;故ABCD四个选项&#xff0c;我们只需要看最后一位 第二步&#xff1a;题干给的是224&#xff08;我们只需要知道哪8位二进制数加起来等于224即可&#xff09; 很明显这个192<224&#xff1b…

在线时间戳在代码签名中起什么作用?

代码签名为可执行文件提供完整性证明&#xff0c;确保它们未被修改或损坏。许多现代操作系统需要代码签名机制&#xff0c;以保护其用户免受未知来源或没有真实性保证的软件代码的侵害。与HTTPS类似&#xff0c;证书颁发机构创建的受信任证书颁发给软件开发者&#xff0c;由软件…

Swin-Transformer网与源码

论文名称&#xff1a;Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 原论文地址&#xff1a; https://arxiv.org/abs/2103.14030 官方开源代码地址&#xff1a;https://github.com/microsoft/Swin-Transformer Pytorch实现代码&#xff1a; pytor…

燕小千AIGC大模型集成,实现企业文档的智能问答,燕千云v1.21.0全新版本与你“童”行!

5月26日&#xff0c;燕千云数智化业务服务平台发布了1.21版本&#xff0c;此次版本大升级主要围绕系统易用性提升&#xff0c;对在线客服、智能助理及企微移动端进行优化、新增上下游管理、重复问题分析等功能&#xff0c;多方面增加了IT服务的场景&#xff0c;从功能层面深化了…

CnOpenData上市公司社交媒体账号数据

一、数据简介 据《上市公司信息披露管理办法》&#xff0c;上市公司作为信息披露义务人&#xff0c;应真实、准确、及时、完整地向市场公开依法及自愿披露的信息。这些公开披露的信息包含但不仅限于公司基本情况、主要会计数据和财务指标、股东持股情况、高管薪酬情况等。上市公…

字节面试这么难?6年测开被暴虐.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

做长尾关键词究竟能给网络营销带来什么好处呢

众所周知&#xff0c;长尾关键词具有很强的目的性&#xff0c;就说明用户对于此种性质的关键词是有一定需求的&#xff0c;所以就很容易使用户准确的找到自己想要的内容&#xff0c;通过它带来的客户&#xff0c;转化为网站产品客户的概率会比目标关键词高很多&#xff0c;因此…

mysql8中的sys和mysql消失不见了

只要你没有主动删除过这个两个库&#xff0c;那么这两个库不见了是正常的。 rootubuntu:/etc/mysql/mysql.conf.d# mousepad mysqld.cnf skip-grant-tables 保存后关闭 service mysql restart -------------------------------------------------------------------------…

Qt学习之旅 - 标准对话框

文章目录 消息对话框错误对话框信息对话框提问对话框警告图标 其他标准对话框QColorDialog:颜色对话框QFileDialog:选择文件或者目录QFontDialog:选择字体QInputDialog: 允许用户输入一个值&#xff0c;并将赋值返回QPageSetupDialog:为打印机提供纸张相关选项QPrintDialog: 打…

【6.07 代随_50day】 买卖股票的最佳时机 III、买卖股票的最佳时机 IV

买卖股票的最佳时机 III、买卖股票的最佳时机 IV 买卖股票的最佳时机 III1.动态规划方法图解步骤递归代码 买卖股票的最佳时机 IV1.动态规划方法图解步骤代码 买卖股票的最佳时机 III 力扣连接&#xff1a;123. 买卖股票的最佳时机 III&#xff08;中等&#xff09; 1.动态规…