Einführung in die FreeModbus-Bibliothek und Erklärung der Modbus-Variablenadresse

kostenlosKostenloses technisches Material

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

Einführung in die FreeModbus-Bibliothek und Erklärung der Modbus-Variablenadresse

FreeModbus-Bibliothek vorgestellt

FreeModbus ist eine einfach zu bedienende Modbus-RTU - Bibliothek, die es ermöglicht, mehrere unabhängige Modbus-RTU - Slaves gleichzeitig auszuführen. Diese Bibliothek ist dadurch charakterisiert, dass sie den 0xxxx - 4xxxx-Registerraum direkt verwendet, ohne lästige Probleme wie die Registerzuordnung manuell zu handhaben und die maximale Anzahl der verwendeten Register begrenzt werden kann. Es bietet eine Timer-Schnittstelle und eine serielle Transceiver-Schnittstelle, die je nach Hardwareanforderungen konfiguriert werden kann, was sehr gut im Einklang mit der üblichen Verwendung der Modbus-Kommunikation ist.

Einführung in die FreeModbus-Bibliothek und Erklärung der Modbus-VariablenadresseAbbildung

Benutzungsanweisungen

Hier sind die grundlegenden Schritte zur Verwendung der FreeModbus-Bibliothek:

  1. Erstellen eines Slaves1.1 Einführung der Bibliothek: Fügen Sie die FreeModbus-Bibliothek zu Ihrem Projekt hinzu und führen Sie die Headerdatei #include "mdrtuslave.h" ein. 1.2 Erstellen eines Modbus-RTU - Slaves:
   #include "mdrtuslave.h"

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

   static mdVOID popchar(ModbusRTUSlaveHandler handler, mdU8 c)
   {
      // 此处添加串口发送代码
   }

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

   ModbusInit();

1.3 Aufrufen der Herzschlagfunktion:

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

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

1.4 Empfangen von Daten vom seriellen Anschluss:

   static void usart_rec_handler(char *buf, size_t len)   //串口接收中断函数
   {
      for (size_t i = 0; i < len; i++)
      {
         mdhandler->portRTUPushChar(mdhandler, buf[i]);
      }
   }
  1. Schreiben und Lesen von Slave-Registern2.1 Leseneingangsspulen:
   mdBit bit;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdReadInputCoil(mdhandler->registerPool, addr, &bit);   //读取输入线圈,设备地址为10001
   if (ret == mdFALSE)
   {
      printf("读取失败n");
   }

2.2 Lesen-Halt - Register:

   mdU16 data;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdReadHoldRegister(mdhandler->registerPool, addr, &data);    //读取保持寄存器,地址为40001
   if (ret == mdFALSE)
   {
      printf("读取失败n");
   }

2.4 Schreiben-Halt - Register:

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

2.4 Schreiben Sie ein Register:

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

2.5 Zusätzliche Register-Bedienung API (empfohlen):

   /*不推荐*/
    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);  //设备地址1~10000,addr=0 -> 设备1
    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);   //设备地址10001~20000,addr=0 -> 设备10001
    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);//设备地址30001~40000,addr=0 -> 设备30001
    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);//设备地址40001~50000,addr=0 -> 设备40001
    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);

Es gibt auch andere Register-Manipulations - APIs wie mdReadCoil, mdReadInputCoil, mdReadInputRegister usw., die besser mit den Spezifikationen von Modbus-Variablenadressen konform sind und das Lesen und Schreiben von Registerwerten leichter machen.

Modbus-Variablen - Adressen

Die Adresse der Modbus-Variablen gibt den Standort und den Typ der verschiedenen Register in der Modbus-Kommunikation an. Diese Adressen sind Teil des Modbus-Protokolls und werden verwendet, um das zu lesen oder zu schreiben. Hier sind die gängigen Adressen der Modbus-Variablen und ihre Bedeutungen:

  • 0xxxx: Dies ist die Adresse des Spulenregisters, die den Funktionscode 01 (Lese-Spule) und den Funktionscode 05 (Schreiben einzelner Spulen) entspricht. Sie werden verwendet, um Schaltgeräte usw. zu steuern und sind lesbar und schreibbar.
  • 1xxxx: Dies ist die Adresse des Eingangsspulenregisters und entspricht dem Funktionscode 02 (Eingangsspulen lesen). Sie werden verwendet, um Eingangssignale darzustellen und sind in der Regel nur gelesen.
  • 3xxxx: Dies ist die Eingabe-Register - Adresse, die dem Funktionscode 04 entspricht (Eingabe-Register lesen). Jedes Register repräsentiert eine 16 - Bit-unsignierte Ganzzahl, die normalerweise nur gelesen wird.
  • 4xxxx: Dies ist die Hold-Register - Adresse, die den Funktionscode 03 (Lesen eines Hold-Registers), den Funktionscode 06 (Schreiben eines einzelnen Hold-Registers) und den Funktionscode 16 (Schreiben mehrerer Hold-Registers) entspricht. Sie werden verwendet, um Informationen wie Gerätesparameter, Status usw. zu speichern und sind lesbar und schreibbar.

Diese Adresstypen und Funktionscodes sind der Kernteil der Modbus-Kommunikation, mit denen Sie die verschiedenen Register des Geräts lesen und schreiben können, um die Überwachung und Kontrolle des Geräts zu ermöglichen.

Zusammenfassend bietet die FreeModbus-Bibliothek einen bequemen Weg, um Modbus-RTU - Slaves zu erstellen und Register-Lese - und Schreiboperationen durchzuführen, während Modbus-Variablenadressen die Typen und Funktionen verschiedener Register definieren, um Ihnen helfen zu können.

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

《 “Einführung in die FreeModbus-Bibliothek und Erklärung der Modbus-Variablenadresse” 》 有 2 条评论

Antwort veröffentlichen

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