Modbus驱动库—libmodbus的使用

原创 电子电路开发学习 2021-08-17 10:46

这篇文章是接上一篇Modbus协议简介,主要介绍Modbus实际项目应用—libmodbus驱动库的使用,断断续续写了近一周时间。

都有哪些内容?

  • 为什么要使用驱动库

  • libmodbus简介

  • libmodbus常用函数

  • Windows平台使用libmodbus

  • Linux平台使用libmodbus

  • ARM平台使用libmodbus

  • libmodbus从机地址限制的问题

  • 测试代码获取

为什么要使用驱动库?

上一篇文章,我们介绍了Modbus协议物理层和协议层,我们知道了Modbus是一种总线协议,它可以基于串口或网口,以基于串口的Modbus-RTU为例,我们需要在Windows或Linux下实现一个上位机,上位机的功能是读写Modbus接口传感器设备的数据,或者是和单片机等从设备进行交互。

当需要向某个从机寄存器写入某个值时,如向01地址的设备,0x0105保持寄存器写入1个数据:0x0190为例,那么需要构建这样一个数据帧:

主机发送:01 06 01 05 01 90 99 CB

01表示从机地址,06功能码表示写单个保持寄存器,0105表示寄存器地址,0190表示写入寄存器的数值,99 CB为CRC校验值。

如果从机正确的收到了数据,会回复一个数据帧:

从机回复:01 06 01 05 01 90 99 CB

所以作为主机,写数据的流程是:

  1. 构建一个Modbus-RTU数据帧
  2. 等待从机响应的数据
  3. 如果响应数据正确,说明写入成功,否则写入失败。

读数据也是同样的流程,我们可以基于串口发送、串口接收函数、定时器等,自己写一个Modbus驱动库,来实现对从设备的读写。当然,也可以直接使用别人写好的Modbus驱动库,比如libmodbus,本文将介绍如何使用libmodbus驱动库,Windows/Linux/ARM平台实现Modbus主机和从机。

libmodbus简介

libmodbus,是一个基于C语言实现的Modbus驱动库,作者是Stephane,支持Linux, Mac OS X, FreeBSD, QNX and Win32操作系统,主要应用在PC上,用来开发上位机,也可以对源代码进行交叉编译,以适配更多的平台,比如ARM Linux。源代码开源,遵循 LGPL-2.1 许可。目前最新版本是3.1.6,Github仓库最新提交时间是2021年5月21日。

官方网站:www.libmodbus.org

开源地址:

github.com/stephane/libmodbus

GitHub仓库

libmodbus支持如下功能:

  • 支持Modbus-RTU和Modbus-TCP

  • 支持常用功能码,如01/02/03/04/05/06/07/0F/10/11/16/17

  • 支持线圈类型读写、寄存器读写、离散量读取等

  • 支持广播地址0,从机地址1-247

  • 支持浮点数和整形数据转换,大端小端等多种模式

  • 参数根据Modbus_Application_Protocol_V1_1b.pdf官方标准文档设计,比如最大读写线圈个数,最大读写寄存器个数等。

  • 源代码基于C编写,方便在各平台移植,只有11个文件。

libmodbus常用函数

libmodbus库函数非常简洁,读写操作函数对于RTU和TCP完全通用,RTU和TCP切换只需要修改一行代码就可以实现无缝切换。

modbus_t *mb;
int ret;
//创建一个modbus-rtu对象,指定串口号,波特率,校验位,数据位,停止位
//成功返回指针,否则返回NULL, 会调用malloc申请内存
mb = modbus_new_rtu("/dev/ttySP1"115200'N'81);    //linux
mb = modbus_new_rtu("COM1"115200'N'81);        //windows
//创建modbus-tcp对象,指定IP地址和端口号
mb = modbus_new_tcp("127.0.0.1"502);    //TCP/IP

//设置从机地址,成功返回0, 否则返回-1
ret = modbus_set_slave(mb, slave);

//连接Modbus主机,成功返回0, 否则返回-1
ret = modbus_connect(mb);

//设置响应超时时间1s,200ms
ret = modbus_set_response_timeout(mb, 1200000);

//读取寄存器数据,起始地址2, 数量5, 保存到table数组中
//成功返回5, 否则返回-1
uint16_t *table;
ret = modbus_read_registers(mb, 25, table);

//modbus设备关闭和释放内存
modbus_close(mb);
modbus_free(mb);

//写单个寄存器, 地址2写入56, 成功返回1,否则返回-1
ret = modbus_write_register(mb, 256);

//写多个寄存器, 地址12起始,写入5个数据,成功返回5,否则返回-1
uint16_t table[5] = {1122334455};
ret = modbus_write_registers(mb, 125, table);

//写单个线圈,线圈地址写入TRUE,成功返回1,否则返回-1
ret = modbus_write_bit(mb, 11, TRUE);

//查看错误信息
char *err_str;
err_str = modbus_strerror(errno);

Windows平台libmodbus 使用

以Windows下使用libmodbus实现从机和主机为例,Linux下类似。

1.获取源代码

使用Git工具下载GitHub代码仓库源代码到本地,这样可以获取到最新的libmodbus代码,但是也会有一些Bug。

git clone https://github.com/stephane/libmodbus/

如果下载速度缓慢,可以到我的Gitee仓库下载:

git clone https://gitee.com/whik/libmodbus

或者到官方仓库下载最新稳定发布版本v3.1.6:

libmodbus.org/releases/libmodbus-3.1.6.tar.gz

下载完成之后,解压到本地,Linux系统可以使用tar -zxvf libmodbus-3.0.6.tar.gz命令行解压:

源代码

我们重点关注以下3个文件夹:doc,src,tests。

  • doc,doc文件夹包含库的使用文档,文件名就是函数名,介绍每个函数的使用方法,参数定制,返回值说明,示例代码等。

帮助文档
  • src,src文件夹是libmodbus库源文件和头文件,我们只需要把这些文件添加到工程中,然后包含头文件就可以直接使用了。

源代码
  • tests,tests文件夹包含libmodbus使用示例,

测试代码

包括Modbus-RTU/TCP客户端和服务器单元测试,随机测试,效率测试,读写10万个线圈状态,10万个寄存器,记录消耗时间。

//部分代码
nb_points = MODBUS_MAX_READ_BITS;
start = gettime_ms();
for (i=0; i<n_loop; i++) {
    rc = modbus_read_bits(ctx, 0, nb_points, tab_bit);
    if (rc == -1) {
        fprintf(stderr"%s\n", modbus_strerror(errno));
        return -1;
    }
}
end = gettime_ms();
elapsed = end - start;

官方提供的测试代码太繁琐,后面我们会写两个简单的示例程序,来演示主机和从机的使用。

2.生成config.h配置文件

无论是Windows还是Linux,在使用libmodbus库之前,我们需要先调用configure工具来生成config.h文件和Makefile。configure工具会根据当前系统环境,生成适用于当前平台的config.h文件。

在libmodbus库文件夹下执行./configure命令。

whik@windows_7 MINGW64 /d/libmodbus-3.1.6
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for strings.h... yes
    .......
checking for inttypes.h... yes
config.status: creating tests/unit-test.h
config.status: executing libtool commands

    libmodbus 3.1.6
    ===============

    prefix:                 /usr/local
    sysconfdir:             ${prefix}/etc
    libdir:                 ${exec_prefix}/lib
    includedir:             ${prefix}/include

    compiler:               gcc
    cflags:                 -g -O2
    ldflags:

    documentation:          no
    tests:                  yes

整个过程需要1分钟左右的时间,等待运行完成之后,会发现在当前目录下多了一些文件,主要是config.hMakefile

如果想使用libmodbus官方提供的测试代码,可以直接在根目录执行make命令,就可以直接编译tests目录下的测试代码,Linux系统可以使用make install命令进行和安装。

3.编写测试代码

新建一个文件夹my_test,把libmodbus/src文件夹中的.c和.h文件,config.h复制到my_test。

学习了libmodbus常用函数之后,我们就可以写一个简单的测试代码了。

Modbus-RTU主机测试:test_rtu_master.c,实现对地址为1的从机设备,读取地址15/16/17的保持寄存器数据,进行+1操作后,再写入。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "modbus.h"

#define PORT_NAME "COM1"

int main(int argc, char *argv[])
{
    int ret;
    uint16_t table[3];
    modbus_t *mb;
    char port[20];
    printf("argc = %d, argv[1] = %s\n", argc, argv[1]);
    if(argc == 2)
        strcpy(port, argv[1]);
    else 
        strcpy(port, PORT_NAME);
    printf("libmodbus modbu-rtu master demo: %s, 115200, N, 8, 1\n", port);

    mb = modbus_new_rtu(port, 115200'N'81);

    if (mb == NULL)
    {
        modbus_free(mb);
        printf("new rtu failed: %s\n", modbus_strerror(errno));
        return 0;
    }

    modbus_set_slave(mb, 1);
    ret = modbus_connect(mb);

    if(ret == -1)
    {
        modbus_close(mb);
        modbus_free(mb);
        printf("connect failed: %s\n", modbus_strerror(errno));
        return 0;
    }
    while(1)
    {
        ret = modbus_read_registers(mb, 0x0F3, table);
        if(ret == 3)
            printf("read success : 0x%02x 0x%02x 0x%02x \n", table[0], table[1], table[2]);
        else
        {
            printf("read error: %s\n", modbus_strerror(errno));
            break;
        }

        for(int i = 0; i < 3; i++)
            table[i] += 1;

        ret = modbus_write_registers(mb, 0x0F3, table);
        if(ret == 3)
            printf("write success: 0x%02x 0x%02x 0x%02x \n", table[0], table[1], table[2]);
        else
        {
            printf("write error: %s\n", modbus_strerror(errno));
            break;
        }
        Sleep(1000);
    }

    modbus_close(mb);
    modbus_free(mb);
    system("pause");
    return 0;
}

Modbus-RTU从机测试:test_rtu_slave.c,创建从机设备,地址为1,初始化了3个保持寄存器,地址分别为15/16/17,数据分别为0x1001/0x1002/0x1003

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "modbus.h"

#define PORT_NAME "COM2"

int main(int argc, char *argv[])
{
    int ret = 0;
    uint8_t device = 1;
    uint8_t *query;
    modbus_t *mb;
    modbus_mapping_t *mb_mapping;
    char port[20];
    printf("argc = %d, argv[1] = %s\n", argc, argv[1]);
    if(argc == 2)
        strcpy(port, argv[1]);
    else 
        strcpy(port, PORT_NAME);

    printf("libmodbus modbu-rtu slave demo: %s, 115200, N, 8, 1\n", port);

    mb = modbus_new_rtu(port, 115200'N'81);

    if (mb == NULL)
    {
        modbus_free(mb);
        printf("new rtu failed: %s\n", modbus_strerror(errno));
        return 0;
    }

    //register: 15/16/17
    mb_mapping = modbus_mapping_new_start_address(000015300);
    if(mb_mapping == NULL)
    {
        modbus_free(mb);
        printf("new mapping failed: %s\n", modbus_strerror(errno));
        return 0;
    }

    //保持寄存器数据
    mb_mapping->tab_registers[0] = 0x1001;
    mb_mapping->tab_registers[1] = 0x1002;
    mb_mapping->tab_registers[2] = 0x1003;

    modbus_set_slave(mb, device);
    ret = modbus_connect(mb);

    if(ret == -1)
    {
        modbus_free(mb);
        printf("connect failed: %s\n", modbus_strerror(errno));
        return 0;
    }
    printf("create modbus slave success\n");
    while(1)
    {
        do {
            ret = modbus_receive(mb, query);    //轮询串口数据,
        } while (ret == 0);

        if(ret > 0//接收到的报文长度
        {
            printf("len=%02d: ", ret);
            for(int idx = 0; idx < ret; idx++)
            {
                printf(" %02x", query[idx]);
            }
            printf("\n");

            modbus_reply(mb, query, ret, mb_mapping);
        }
        else
        {
            printf("quit the loop: %s", modbus_strerror(errno));
            modbus_mapping_free(mb_mapping);
            break;
        }
    }

    modbus_close(mb);
    modbus_free(mb);
    return 0;
}

4.编译测试代码

现学了Makefile语法,凑合用。需要注意的是,windows下libmodbus依赖于ws2_32.dll库,需要添加编译参数-lws2_32:

.PHONY: all

all: test_rtu_master test_rtu_slave
test_rtu_master : test_rtu_master.o modbus.o modbus-tcp.o modbus-rtu.o modbus-data.o 
    gcc test_rtu_master.o modbus.o modbus-tcp.o modbus-rtu.o modbus-data.o -o test_rtu_master -lws2_32
test_rtu_slave : test_rtu_slave.o modbus.o modbus-tcp.o modbus-rtu.o modbus-data.o 
    gcc test_rtu_slave.o modbus.o modbus-tcp.o modbus-rtu.o modbus-data.o -o test_rtu_slave -lws2_32

test_rtu_slave.o : test_rtu_slave.c
    gcc test_rtu_slave.c -c -I.
test_rtu_master.o : test_rtu_master.c
    gcc test_rtu_master.c -c -I.
modbus.o : modbus.c
    gcc modbus.c -c -I.
modbus-rtu.o : modbus-rtu.c
    gcc modbus-rtu.c -c -I.
modbus-tcp.o : modbus-tcp.c
    gcc modbus-tcp.c -c -I.
modbus-data.o : modbus-data.c
    gcc modbus-data.c -c -I.

clean:
    rm -rf *.o *.exe

最终的文件目录:

测试文件

Windows下Make工具我使用的是Qt自带的mingw32-make.exe工具,位于\Qt5.7.0\Tools\mingw530_32\bin目录下,执行mingw32-make命令进行,会对两个测试文件进行编译:

whik@Windows_7 MINGW64 /d/my_test
$ mingw32-make.exe
gcc test_rtu_master.c -c -I.
gcc modbus.c -c -I.
gcc modbus-tcp.c -c -I.
gcc modbus-rtu.c -c -I.
gcc modbus-data.c -c -I.
In file included from modbus-data.c:24:0:
./config.h:171:0: warning: "WINVER" redefined
 #define WINVER 0x0501
 ^
In file included from D:/Program/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/windows.h:10:0,
                 from D:/Program/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/winsock2.h:23,
                 from modbus-data.c:19:
D:/Program/Qt5.7.0/Tools/mingw530_32/i686-w64-mingw32/include/sdkddkver.h:162:0: note: this is the location of the previous definition
 #define WINVER  _WIN32_WINNT
 ^
gcc test_rtu_master.o modbus.o modbus-tcp.o modbus-rtu.o modbus-data.o -o test_rtu_master -lws2_32
gcc test_rtu_slave.c -c -I.
gcc test_rtu_slave.o modbus.o modbus-tcp.o modbus-rtu.o modbus-data.o -o test_rtu_slave -lws2_32

会在当前目录下生成目标文件:test_rtu_master.exetest_rtu_slave.exe

这里,我的电脑本机虚拟了两个串口COM1和COM2,两个串口直接进行连接。

先启动从机设备,配置为COM1:

$ ./test_rtu_slave.exe "COM1"

再启动主机设备,配置为COM2:

$ ./test_rtu_master.exe "COM2"
测试结果

可以看到,从机可以正确的对接收的数据帧进行相应,主机可以正确的进行读取和写入。

如果需要测试Modbus-TCP,只需要修改modbus设备创建函数:

//modbus-rtu
mb = modbus_new_rtu(port, 115200'N'81);

//modbus-tcp
mb = modbus_new_tcp("127.0.0.120"502);    //指定IP地址

其他无需任何改动!

Linux平台下libmodbus使用

Ubuntu下使用libmodbus和Windows几乎一样:

//1.解压
tar -zxvf libmodbus-3.0.6.tar.gz

//2.配置
./configure

//3.编译
make

//4.安装
make install

测试文件和Windows几乎一样,不过不需要ws2_32库的支持了。

(来自:blog.csdn.net/qq_30650153/article/details/83385626

ARM平台下libmodbus使用

ARM开发板下使用libmodbus,需要使用交叉编译器进行交叉编译,生成so库文件。

1.解压:

tar -zxvf libmodbus-3.0.6.tar.gz

2.创建安装目录:

mkdir install

3.配置编译选项:

./configure --host=arm-fsl-linux-gnueabi --enable-static --prefix=[安装路径]/install/

4.编译:make

5.安装:make install

在install目录会生成3个文件夹:include lib share

进入install/lib目录,执行file libmodbus*,出现如下打印信息,信息中有“ARM”说明libmodbus库移植成功。

libmodbus.a:        current ar archive
libmodbus.la:       libtool library file, 
libmodbus.so:       symbolic link to `libmodbus.so.5.0.5'
libmodbus.so.5:     symbolic link to `libmodbus.so.5.0.5'
libmodbus.so.5.0.5: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

libmodbus.so、libmodbus.so.5、libmodbus.so.5.0.5复制到ARM开发板中的/usr/lib目录下

执行cp libmodbus.so* /usr/lib

如果出现无法创建的问题(cannot create ‘/usr/lib/libmodbus.so*’: Read-only file system)。

可以执行 wr cp libmodbus* /usr/lib

测试与使用,和Windows一样,对测试文件使用ARM交叉编译器进行编译。

(来自:www.cnblogs.com/happybirthdaytoyou/p/11301612.html)

libmodbus 从机地址限制的问题

libmodbus支持1-247从机地址,0为广播地址,但是有些非标准的Modbus传感器,并不是采用0作为广播地址,而是0xfe作为广播地址:

广播地址0xfe

所以使用libmodbus会出现报错终止运行的问题,这是因为libmodbus源代码中限制了从机地址1-247,我们只需要修改源代码即可。

modbus-rtu.c文件95行:

modbus-rtu

modbus-tcp.c文件80行:

modbus-tcp

只需要修改这两个数值就可以取消从机地址限制的问题。

详细的从站最大地址限制问题排查记录,可以查看:

blog.csdn.net/qingzhuyuxian/article/details/80391553

其实这个问题,早在2011年,就有人在官方GitHub仓库提Issues了:

github.com/stephane/libmodbus/issues/38

issue

对此问题,作者的答复是,为了遵循Modbus官方标准,所以一直以来都没有进行修改。

测试代码获取

关注公众号:电子电路开发学习(ID:mcu149),后台回复【libmodbus】获取文中介绍的两个测试文件、Makefile和我修改好从机地址最大值的驱动库。

(建议复制过去不会错)

更多

  • [分享]免费/中文/功能强大的Modbus调试软件:MThings

  • [干货]手把手教你从网上白嫖PCB 3D封装库

  • [开源]采样率12G,带宽6G的示波器模拟前端电路是什么样的?

  • [人物]图灵是同性恋?冯诺依曼是最强大脑
  • 如何写出易于维护的Verilog代码?
  • 一文看懂485总线
  • 一文看懂Modbus协议
  • 一文看懂I2C协议
  • 一文看懂SPI协议
  • 一文看懂UART协议1
  • 一文看懂UART协议2
电子电路开发学习 单片机点灯小能手,电子行业从业者。开发板评测、嵌入式开源项目分享、学习笔记记录。可能不会经常更新,但每一篇都是精心编写。
评论
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 73浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 51浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 168浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 44浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 86浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 68浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 71浏览
  • 国产光耦合器正以其创新性和多样性引领行业发展。凭借强大的研发能力,国内制造商推出了适应汽车、电信等领域独特需求的专业化光耦合器,为各行业的技术进步提供了重要支持。本文将重点探讨国产光耦合器的技术创新与产品多样性,以及它们在推动产业升级中的重要作用。国产光耦合器创新的作用满足现代需求的创新模式新设计正在满足不断变化的市场需求。例如,高速光耦合器满足了电信和数据处理系统中快速信号传输的需求。同时,栅极驱动光耦合器支持电动汽车(EV)和工业电机驱动器等大功率应用中的精确高效控制。先进材料和设计将碳化硅
    克里雅半导体科技 2024-11-29 16:18 170浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 101浏览
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 70浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 41浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 105浏览
  • 在电子技术快速发展的今天,KLV15002光耦固态继电器以高性能和强可靠性完美解决行业需求。该光继电器旨在提供无与伦比的电气隔离和无缝切换,是现代系统的终极选择。无论是在电信、工业自动化还是测试环境中,KLV15002光耦合器固态继电器都完美融合了效率和耐用性,可满足当今苛刻的应用需求。为什么选择KLV15002光耦合器固态继电器?不妥协的电压隔离从本质上讲,KLV15002优先考虑安全性。输入到输出隔离达到3750Vrms(后缀为V的型号为5000Vrms),确保即使在高压情况下,敏感的低功耗
    克里雅半导体科技 2024-11-29 16:15 128浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 106浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 86浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦