FreeModbus库介绍及Modbus变QuantitätAdresse解释

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

FreeModbus库介绍及Modbus变QuantitätAdresse解释缩略图
🌐 Diese Seite ist noch nicht auf Deutsch verfügbar. Die chinesische Version wird angezeigt. Zurück zur chinesischen Seite.

FreeModbus库介绍

FreeModbus是一个Einfach zu bedienen的Modbus RTU库,它允许同时Betrieb多个独立的Modbus RTU从机。这个库的特点在于它直接使用0xxxx-4xxxxRegister.空间,无需手动处理Registerabbildung等繁琐问题,并且可以限制使用的最大Anzahl der Register。它提供了定时器Schnittstelle和Die Serie收发Schnittstelle,可以根据硬件需求进行配置,非常符合常规使用ModbusKommunikation的思路。

FreeModbus库介绍及Modbus变QuantitätAdresse解释插图

Benutzungsanweisungen

以下是使用FreeModbus库的基本步骤:

  1. 搭建从机 1.1 引入库:将FreeModbus库添加zu你的工程中,并引入头文件#include “mdrtuslave.h”。 1.2 创建Modbus RTU从机:
   #include "mdrtuslave.h"

   #define SLAVE_ID 5
   #define BUAD_RATE 9600
   static ModbusRTUSlaveHandler mdhandler;

   static mdVOID popchar(ModbusRTUSlaveHandler handler, mdU8 c)
   {
      // 此处添加Die SerieSenden Sie代码
   }

   static void ModbusInit()
   {
      struct ModbusRTUSlaveRegisterInfo info;
      info.slaveId = SLAVE_ID;
      info.usartBaudRate = BUAD_RATE;
      info.mdRTUPopChar = popchar;
      mdCreateModbusRTUSlave(&mdhandler, info);
   }

   ModbusInit();

1.3 调用心跳函数:

   #define TIMER_UTIME  100  //定时器周期为100us

   static void timer_handler(void)  //100us定时器回调函数
   {
      mdhandler->portRTUTimerTick(mdhandler, TIMER_UTIME);
   }

1.4 从Die SerieEmpfangDaten:

   static void usart_rec_handler(char *buf, size_t len)   //Die SerieEmpfang中断函数
   {
      for (size_t i = 0; i < len; i++)
      {
         mdhandler->portRTUPushChar(mdhandler, buf[i]);
      }
   }
  1. 写入和Lesen从机Register. 2.1 Lesen输入线圈:
   mdBit bit;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdReadInputCoil(mdhandler->registerPool, addr, &bit);   //Lesen输入线圈,Geräte Adresse为10001
   if (ret == mdFALSE)
   {
      printf("Lesen gescheitert\n");
   }

2.2 Lesen und halten Register:

   mdU16 data;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdReadHoldRegister(mdhandler->registerPool, addr, &data);    //Lesen und halten Register,Adresse为40001
   if (ret == mdFALSE)
   {
      printf("Lesen gescheitert\n");
   }

2.3 写入输入线圈:

   mdBit bit = mdHigh;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdWriteInputCoil(mdhandler->registerPool, addr, bit);   //写入输入线圈,Adresse为10001,高电平
   if (ret == mdFALSE)
   {
      printf("写入失败\n");
   }

2.4 写入保持Register.:

   mdU16 data = 0x1234;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdWriteHoldRegister(mdhandler->registerPool, addr, data);  //写入保持Register.,Adresse为40001,大小为0x1234
   if (ret == mdFALSE)
   {
      printf("写入失败\n");
   }

2.5 其他Register.OperationenAPI(推荐方式):

   /*不推荐*/
    mdSTATUS (*mdReadBit)(RegisterPoolHandle handler,mdU32 addr,mdBit *bit);
    mdSTATUS (*mdWriteBit)(RegisterPoolHandle handler,mdU32 addr,mdBit bit);
    mdSTATUS (*mdReadBits)(RegisterPoolHandle handler,mdU32 addr,mdU32 len,mdBit *bits);
    mdSTATUS (*mdWriteBits)(RegisterPoolHandle handler,mdU32 addr,mdU32 len,mdBit *bits);
    mdSTATUS (*mdReadU16)(RegisterPoolHandle handler,mdU32 addr,mdU16 *data);
    mdSTATUS (*mdWriteU16)(RegisterPoolHandle handler,mdU32 addr,mdU16 data);
    mdSTATUS (*mdReadU16s)(RegisterPoolHandle handler,mdU32 addr,mdU32 len,mdU16 *data);
    mdSTATUS (*mdWriteU16s)(RegisterPoolHandle handler,mdU32 addr,mdU32 len,mdU16 *data);

   /*推荐*/
    mdSTATUS (*mdReadCoil)(RegisterPoolHandle handler, mdU32 addr, mdBit* bit);  //Geräte Adresse1~10000,addr=0 -> Ausrüstung1
    mdSTATUS (*mdReadCoils)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
    mdSTATUS (*mdWriteCoil)(RegisterPoolHandle handler, mdU32 addr, mdBit bit);
    mdSTATUS (*mdWriteCoils)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
    mdSTATUS (*mdReadInputCoil)(RegisterPoolHandle handler, mdU32 addr, mdBit* bit);   //Geräte Adresse10001~20000,addr=0 -> Ausrüstung10001
    mdSTATUS (*mdReadInputCoils)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
    mdSTATUS (*mdWriteInputCoil)(RegisterPoolHandle handler, mdU32 addr, mdBit bit);
    mdSTATUS (*mdWriteInputCoils)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
    mdSTATUS (*mdReadInputRegister)(RegisterPoolHandle handler, mdU32 addr, mdU16* data);//Geräte Adresse30001~40000,addr=0 -> Ausrüstung30001
    mdSTATUS (*mdReadInputRegisters)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdU16* data);
    mdSTATUS (*mdWriteInputRegister)(RegisterPoolHandle handler, mdU32 addr, mdU16 data);
    mdSTATUS (*mdWriteInputRegisters)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdU16* data);
    mdSTATUS (*mdReadHoldRegister)(RegisterPoolHandle handler, mdU32 addr, mdU16* data);//Geräte Adresse40001~50000,addr=0 -> Ausrüstung40001
    mdSTATUS (*mdReadHoldRegisters)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdU16* data);
    mdSTATUS (*mdWriteHoldRegister)(RegisterPoolHandle handler, mdU32 addr, mdU16 data);
    mdSTATUS (*mdWriteHoldRegisters)(RegisterPoolHandle handler, mdU32 addr, mdU32 len, mdU16* data);

还有其他Register.OperationenAPI,比如mdReadCoil、mdReadInputCoil、mdReadInputRegister等,它们更符合Modbus变QuantitätAdresse的规范,可以更方便地Lesen和写入Registerwert。

Modbus变QuantitätAdresse

Modbus变QuantitätAdresse表示了ModbusKommunikation中不同Register.的位置和Typus。这些Adresse是ModbusVereinbarung的一部Unterteilung,用于指定要Lesen或写入的Register.。以下是Häufig的Modbus变QuantitätAdresse及其含义:

  • 0xxxx:这是线圈Register-Adresse,对应Function Code 01(Lesen线圈)和Function Code 05(Schreiben Sie eine einzelne Schleife.)。它们用于Steuerung SchalterAusrüstung等,是可读写的。
  • 1xxxx:这是输入线圈Register-Adresse,对应Function Code 02(Lesen输入线圈)。它们用于表示输入信Nr.,通常是只读的。
  • 3xxxx:这是Eingabe der Registeradresse,对应Function Code 04(Eingangsregister lesen)。每ein Register.表示一个16位无符Nr.整数,通常是只读的。
  • 4xxxx:这是保持Register-Adresse,对应Function Code 03(Lesen und halten Register)、Function Code 06(写单个保持Register.)和Function Code 16(写多个保持Register.)。它们用于存储AusrüstungParameter、Status等信息,是可读写的。

这些AdresseTypus和Funktionscode是ModbusKommunikation的核心部Unterteilung,通过它们,你可以Lesen和写入Ausrüstung的不同Register.,实现对Ausrüstung的监控和控制。

总之,FreeModbus库提供了方便的方式来创建Modbus RTU从机,并进行Register.的Lesen和写入Operationen,而Modbus变QuantitätAdresse则定义了不同Register.的Typus和Funktion,帮助

Techniken术语(共 6 个)—— Klick auf展开
Modbus RTU基于串行链路的ModbusVereinbarung,使用BinärsystemCodierung和CRC-Test
FunktionscodeModbusFunktionscode指定读/写OperationenTypus,如01读线圈、03Lesen Sie das Register
Register.Modbus Register.存储Daten单元,Unterteilung线圈/离散输入/保持/输入Register.四类
Die SerieBerechnung机与外部Ausrüstung进行串行Kommunikation的物理Schnittstelle
线圈Modbus位可读Schreiben von Daten,Adresse从00001开始
保持Register.Modbus 16位可读Schreiben von Daten,Adresse从40001开始
来源/Werkzeuge信息 —— Klick auf展开
来源 Modbus Chinesisches Netzwerk(modbus.cn) —— Inländisch führend.ModbusKommunikationsprotokoll Technologie Gemeinschaft Klassifizierung Modbus Programmierung 字数 4488 字 · 阅读约 12 Unterteilung钟 更新 2023-10-27 永久链接 https://www.modbus.cn/25674.html
Empfohlene Werkzeuge: Modbus Debugger-Assistent WeChat-Applet
Modbus Chinesisches Netzwerk官方推出的Modbus Debugging-Tools,支持 Modbus RTU/TCP 实时KommunikationTests、Register.读写、线圈控制、Daten监控和MeldungUnterteilung析。 keine Installation erforderlich,Mikro-Suche「Modbus DebuggingAssistenten.」Benutzt werden kann.。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

《 “FreeModbus库介绍及Modbus变QuantitätAdresse解释” 》 有 2 条Kommentare

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.