2.14 haas506 2.0开发教程-高级组件库-modbus

2023-10-22 03:20

本文主要是介绍2.14 haas506 2.0开发教程-高级组件库-modbus,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

haas506 2.0开发教程-高级组件库-modbus

  • 1.Modbus slave仿真软件的使用
  • 2.案例
    • 案例一 对保持寄存器(holdRegister)进行数据读取和数据写入
    • 案例二 修改多个寄存器的值
    • 案例三 读取多个输入寄存器(InputRegisters)的值
  • 3.class-modbus

1.Modbus slave仿真软件的使用

需要先下载mbslave这个软件
链接: lmbslave官网.

  • Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(Defacto),并且现在是工业电子设备之间常用的连接方式

  • modbus报文模型在这里插入图片描述

  • Modbus Slave是Modbus子设备模拟工具,模拟设备发送串口信号。可以仿真32个从设备/地址域。每个接口都提供了对excel报表的OLE自动化支持。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。与Modbus Poll的用户界面相同,支持功能01, 02, 03, 04, 05, 06, 15, 16, 22 和23,监视串口数据。

(1)打开仿真软件
在这里插入图片描述
(2)点击setup进行slave definition
在这里插入图片描述
 在slave definition中设置Slave ID(modbus从机ID)、Function(功能)、Address(地址)、Quantity(寄存器个数)、数据显示的格式等。
在这里插入图片描述
 (3)编辑寄存器的值
框选所有数据,选择Display - Unsigned在这里插入图片描述
  双击当前值,跳出一个Edit Register编辑框,修改寄存器的值在这里插入图片描述
全部修改后如下图所示:
    当前数据显示是无符号整型格式,若想修改数据的显示格式,可以点击软件窗口栏中的”Display"选择一个合适的数据格式。
在这里插入图片描述
例如选择“HEX"之后,数据显示如下图所示:
在这里插入图片描述
(4)Connection连接配置
  点击软件窗口栏中的Connection选项,进行连接配置。
在这里插入图片描述
 配置项:Connection选择”Serial Port“,Port需要选择设备的RS485的串口端口号,例如当前设备的RS485的端口号为COM26(从我的电脑-设备管理器获取),那么Port就选择Port26。波特率选择9600(Modbus采用串口通信时的串口波特率,默认为 9600)、数据位选择"8 Data bits"、奇偶校验选择”None Parity-不校验"、停止位选择"1 stop bit"。
在这里插入图片描述
 详细的配置项如下图所示:

在这里插入图片描述
设置完毕
在这里插入图片描述

2.案例

案例说明:

  • 使用Modbus slave工具,进行读写串口数据功能测试
  • 需要连接TTL与RS485串口,modbus使用RS485进行通信。

案例一 对保持寄存器(holdRegister)进行数据读取和数据写入

烧录代码

● main.py

import modbus
import utime as time
time.sleep(5)
#初始化modbus:RS485串口id为2,波特率为9600,奇偶校验为0,响应超时为1000ms
modbus.init(2,9600,0,1000)
#建立20个字节的数组
readBuf=bytearray(20)
#读保持寄存器:设备ID是1,寄存器起始地址为0,连续读入10个寄存器数据, 响应超时为1000ms
modbus.readHoldingRegisters(1,0,10,readBuf,1000)
print('read data from register:',readBuf)
#写保持寄存器:设备ID是1,寄存器地址为0,往地址为0的寄存器写入的数据为200, 响应超时1000ms
time.sleep(5)
modbus.writeHoldingRegister(1,0,200,1000)
modbus.readHoldingRegisters(1,0,10,readBuf,1000)
print("read register again:",readBuf)
#关闭modbus
modbus.deinit()

● board.json


{"name": "haas506","version": "1.0.0","io": {            "serial1":{"type":"UART","port":0,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial2":{"type":"UART","port":1,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial3":{"type":"UART","port":2,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"}},"debugLevel": "ERROR","repl":"enable","replPort":0}

● 日志输出
打开串口助手,查看打印的日志信息

read data from register:bytearray(b'\x00\x00\xff\xff\x01\x00\xff\xff\x02\x00\xff\xff\x03\x00\xff\xff\x04\x00\xff\xff')
read register again: bytearray(b'\xc8\x00\xff\xff\x01\x00\xff\xff\x02\x00\xff\xff\x03\x00\xff\xff\x04\x00\xff\xff')

注意:每个寄存器包含高低2个字节,寄存器数据按照大端字节序排列,大端就是一个数据的低字节在高地址,高字节在低地址。例如地址为0的寄存器的数据是0x00C8,那么输出的时候,先输出C8然后输出00。
在这里插入图片描述

案例二 修改多个寄存器的值

● main.py

  import modbusimport utimeutime.sleep(5)#修改前五个寄存器值,每个寄存器包含高低2个字节  #注意:(寄存器数据按照大端字节序排列) 大端就是一个数据的低字节在高地址,高字节在低地址modbus.init(2,9600,0,1000)readBuf=bytearray(10)#读保持寄存器:设备ID是1,寄存器起始地址为0,连续读入5个寄存器数据, 响应超时为1000msmodbus.readHoldingRegisters(1,0,5,readBuf,1000)print('read data from register:',readBuf)print("write data into register...")writeBuf=bytearray([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])#写多个保持寄存器:设备ID是1,寄存器的起始地址为0,待写入寄存器的数据为200, 响应超时1000msret=modbus.writeMultipleHoldingRegisters(1, 0, 5, writeBuf, 1000)print("----ret=",ret)# ----ret= (0, 0, 5, 0)#读保持寄存器:设备ID是1,寄存器起始地址为0,连续读入5个寄存器数据, 响应超时为1000msmodbus.readHoldingRegisters(1,0,5,readBuf,1000)print("read register again:",readBuf)modbus.deinit()

● board.json

{"name": "haas506","version": "1.0.0","io": {            "serial1":{"type":"UART","port":0,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial2":{"type":"UART","port":1,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial3":{"type":"UART","port":2,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"}},"debugLevel": "ERROR","repl":"enable","replPort":0}

● 日志

read data from register: bytearray(b'\x00\x00\xff\xff\x01\x00\xff\xff\x02\x00')
write data into register...
read register again: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

● 原始数据表
在这里插入图片描述

● 修改后的数据表
在这里插入图片描述

案例三 读取多个输入寄存器(InputRegisters)的值

在仿真软件中如下设置:
(1)创建一张表
在这里插入图片描述
(2)在slave definition中,选择Function中的 input Registers,注意当前设备的id是1。
在这里插入图片描述
(3)适当修改几个寄存器的值
在这里插入图片描述
● main.py


import modbus as mb
import utime as time
def modbus_test():#初始化串口2-->RS485,波特率9600,奇偶校验为0,超时1000ms mb.init(2, 9600, 0, 1000)readBuf = bytearray(10)#params:设备Id,寄存器起始地址, 所要读取的寄存器个数, readBuf, 超时时间设置ret = mb.readInputRegisters(1, 0, 5, readBuf, 200)print(ret)print('readBuf:',readBuf)mb.deinit()if __name__ == '__main__':while True:time.sleep(1)modbus_test()

● board.json

{"name": "haas506","version": "1.0.0","io": {            "serial1":{"type":"UART","port":0,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial2":{"type":"UART","port":1,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"},"serial3":{"type":"UART","port":2,"dataWidth":8,"baudRate":115200,"stopBits":1,"flowControl":"disable","parity":"none"}},"debugLevel": "ERROR","repl":"enable","replPort":0}

● 日志
代码执行过程中会输出两个值,分别是readInputRegisters()函数的状态返回值和前5个寄存器中的值

(0, 10)
readBuf: bytearray(b'\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00')
(0, 10)
readBuf: bytearray(b'\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00')
(0, 10)
......

3.class-modbus

initdeinitwriteHoldingRegisterwriteMultipleHoldingRegisterswriteCoilwriteMultipleCoilsreadHoldingRegistersreadInputRegistersreadDiscreteInputsreadCoilsrecvsend
初始化Modbus关闭Modbus写单个保持寄存器写多个保持寄存器写单个线圈写多个线圈读多个保持寄存器值读取多个输入寄存器值读取多个离散输入值读取多个线圈值从机读取主机数据从机发行响应数据到主机

modbus.init(nodeName) - 初始化Modbus

函数功能:根据board.json中设备节点的配置初始化Modbus总线
参数说明:
参数类型必选参数?说明
nodeNamestringboard.json配置文件中Modbus设备节点的名称
board.json中的UART类型设备属性配置项说明如下:
属性字段数据类型属性值必选项?字段说明
typestringMODBUS节点类型,表明当前节点为Modbus节点,固定设置为MODBUS
modeint0、1Modbus物理通道类型,0表示串口,1表示TCP以太网。目前仅支持串口通道
portint0、1 等Modbus采用串口通信时的串口号
baudrateint9600、115200等Modbus采用串口通信时的串口波特率,默认为 9600
timeoutint200, 1000等Modbus采用串口通信时的超时参数,单位是毫秒(ms),默认为200ms
parityint0、1、2奇偶校验设置,默认 0
返回值:打开Modbus设备成功返回0;打开UART设备失败返回失败错误码

modbus.deinit() - 关闭Modbus

函数功能:反初始化Modbus总线
注意事项:需确保要关闭的Modbus处于init状态
参数说明:无
返回值:反初始化Modbus设备成功返回0;反初始化Modbus设备失败返回失败错误码

modbus.writeHoldingRegister(slave_addr, register_addr, register_value, timeout) - 写单个保持寄存器

函数功能:向从机写单个保持寄存器
注意事项:需确保此UART处于open状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
register_addrint写寄存器的地址
register_valueint写寄存器的数据
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的4元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
resp_addr响应地址
resp_value响应数据
exception_code响应异常代码

modbus.writeMultipleHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout) - 写多个保持寄存器

函数功能:向从机多个保持寄存器中写入数据
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
register_addrint待写寄存器的起始地址
reg_quantityint待写寄存器的数量,表示操作多少个寄存器
databytearray写寄存器的数据,每个寄存器包含高低两个字节,高位在前,低位在后
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的4元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
resp_addr响应地址
resp_quantity真实完成寄存器操作的数量
exception_code响应异常代码

modbus.writeCoil(slave_addr, coil_addr, coil_value, timeout) - 写单个线圈

函数功能:向从机某个线圈中写入数据
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
coil_addrint写线圈的地址
coil_valueint写线圈的数据
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的4元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
resp_addr响应地址
resp_value响应数据
exception_code响应异常代码

modbus.writeMultipleCoils(slave_addr, start_addr, reg_quantity, data, timeout) - 写多个线圈

函数功能:向从机多个线圈中写入数据
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
start_addrint写线圈的地址
reg_quantityint待写寄存器的数量,表示操作多少个寄存器
databytearray写寄存器的数据,每个寄存器包含高低两个字节,高位在前,低位在后
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的4元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
resp_addr响应地址
resp_quantity真实完成寄存器操作的数量
exception_code响应异常代码
modbus.readHoldingRegisters(slave_addr, start_addr, reg_quantity, data, timeout) - 读多个保持寄存器值
函数功能:向从机读取多个保持寄存器的值
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
start_addrint待读寄存器的起始地址
reg_quantityint待读寄存器的数量,表示操作多少个寄存器
databytearray读寄存器获得的数据,每个寄存器包含高低两个字节,高位在前,低位在后
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的2元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
respond_count读取到数据的字节数

modbus.readInputRegisters(slave_addr, start_addr, reg_quantity, data, timeout) - 读取多个输入寄存器值

函数功能:向从机读取多个输入寄存器的值
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
start_addrint待读寄存器的起始地址
reg_quantityint待读寄存器的数量,表示操作多少个寄存器
databytearray读寄存器获得的数据,每个寄存器包含高低两个字节,高位在前,低位在后
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的2元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
respond_count读取到数据的字节数
modbus.readDiscreteInputs(slave_addr, start_addr, reg_quantity, data, timeout) - 读取多个离散输入值
函数功能:向从机读取多个输入寄存器的值
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
start_addrint待读寄存器的起始地址
reg_quantityint待读寄存器的数量,表示操作多少个寄存器
databytearray读寄存器获得的数据,每个寄存器包含高低两个字节,高位在前,低位在后
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的2元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
respond_count读取到数据的字节数
modbus.readCoils(slave_addr, start_addr, reg_quantity, data, timeout) - 读取多个线圈值
函数功能:向从机读取多个线圈的值
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint请求的从机地址,0代表广播
start_addrint待读寄存器的起始地址
reg_quantityint待读寄存器的数量,表示操作多少个寄存器
databytearray读寄存器获得的数据,每个寄存器包含高低两个字节,高位在前,低位在后
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的2元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
respond_count读取到数据的字节数

modbus.recv() - 从机读取主机数据

函数功能:该函数仅供从机使用,用来接收主机发送的请求命令。接收的超时参数由 modbus.init 初始化时指定的 timeout 决定,默认为200毫秒。
注意事项:需确保此Modbus处于init状态
参数说明:
参数类型必选参数?说明
slave_addrint从机地址
databytearray响应数据,格式为: 响应代码 + 响应数据
timeoutint请求超时时间,单位是毫秒(ms)
返回值:返回一个tuple类型的2元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
length发送的响应帧的长度,包含CRC校验长度

modbus.send(slave_addr, data, timeout) - 从机发行响应数据到主机

函数功能:该函数仅供从机使用,用于发送响应数据给主机。接收的超时参数由 modbus.init 初始化时指定的 timeout 决定,默认为200毫秒。
注意事项:需确保此Modbus处于init状态
函数原型:modbus.send()
参数说明: 空
返回值:返回一个tuple类型的2元组,元组中的条目格式为:
status请求状态,0表示成功,其他表示失败,具体含义参考 STATUS
bytes接收到的数据,包含CRC校验数据

这篇关于2.14 haas506 2.0开发教程-高级组件库-modbus的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/w_hizyf_m/article/details/123576203
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/258769

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示