FreeModbus库介绍及Modbus变量アドレス解释

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

FreeModbus库介绍及Modbus变量アドレス解释

FreeModbus库介绍

FreeModbus是一个简单易用的Modbus RTU库,它允许同时运行多个独立的Modbus RTUスレーブ。这个库的特点在于它直接使用0xxxx-4xxxxレジスタ空间,无需手动処理レジスタマップ等繁琐問題,并且可以限制使用的最大レジスタの数。它提供了タイマータイマー。接口和シリアルポート收发接口,可以根据硬件需求进行設定,非常符合常规使用Modbus通信的思路。

FreeModbus库介绍及Modbus变量アドレス解释イラスト

Instructions for Use

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

  1. 搭建スレーブ 1.1 引入库:将FreeModbus库追加到你的工程中,并引入头文件#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)
   {
      // 此处追加シリアルポート送信代码
   }

   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 从シリアルポート受信データ:

   static void usart_rec_handler(char *buf, size_t len)   //シリアルポート受信中断函数
   {
      for (size_t i = 0; i < len; i++)
      {
         mdhandler->portRTUPushChar(mdhandler, buf[i]);
      }
   }
  1. 写入和読み取りスレーブレジスタ 2.1 読み取り入力コイル:
   mdBit bit;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdReadInputCoil(mdhandler->registerPool, addr, &bit);   //読み取り入力コイル,デバイスアドレス为10001
   if (ret == mdFALSE)
   {
      printf("Read failed\n");
   }

2.2 Read and hold register:

   mdU16 data;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdReadHoldRegister(mdhandler->registerPool, addr, &data);    //Read and hold register,アドレス为40001
   if (ret == mdFALSE)
   {
      printf("Read failed\n");
   }

2.3 写入入力コイル:

   mdBit bit = mdHigh;
   mdU32 addr = 0;
   mdSTATUS ret;
   ret = mdhandler->registerPool->mdWriteInputCoil(mdhandler->registerPool, addr, bit);   //写入入力コイル,アドレス为10001,高电平
   if (ret == mdFALSE)
   {
      printf("写入失敗\n");
   }

2.4 書き込み保持レジスタ:

   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 其他レジスタ操作API(おすすめ方式):

   /*不おすすめ*/
    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);  //Device address1~10000,addr=0 -> device1
    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);   //Device address10001~20000,addr=0 -> device10001
    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);//Device address30001~40000,addr=0 -> device30001
    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);//Device address40001~50000,addr=0 -> device40001
    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);

还有其他レジスタ操作API,比如mdReadCoil、mdReadInputCoil、mdReadInputRegister等,它们更符合Modbus变量アドレス的规范,可以更方便地読み取り和写入レジスタの値。

Modbus变量アドレス

Modbus变量アドレス表示了Modbus通信中不同レジスタ的位置和タイプ。这些アドレス是Modbusプロトコル的一部分,用于指定要読み取り或写入的レジスタ。以下是常见的Modbus变量アドレス及其含义:

  • 0xxxx:这是コイルレジスター·アドレス,对应Function Code 01(リードコイル)和Function Code 05(write single coil)。它们用于控制开关デバイス等,是読み書きができる。的。
  • 1xxxx:这是入力コイルレジスター·アドレス,对应Function Code 02(読み取り入力コイル)。它们用于表示入力信号,通常是読み取り専用的。
  • 3xxxx:这是入力レジスタ。アドレス,对应Function Code 04(Read input register)。すべてのレジスタ。表示一个16ビット符号なし整数,通常是読み取り専用的。
  • 4xxxx:这是レジスタアドレスを保持,对应Function Code 03(Read and hold register)、Function Code 06(単一保持レジスタの書き込み)和Function Code 16(複数書き込みレジスタを保持する。)。它们用于存储デバイス参数、ステータス等信息,是読み書きができる。的。

这些アドレスタイプ和機能コード是Modbus通信的核心部分,経由它们,你可以読み取り和写入デバイス的不同レジスタ,実装对デバイス的モニタリング和控制。

总之,FreeModbus库提供了方便的方式来作成Modbus RTUスレーブ,并进行レジスタ的読み取り和写入操作,而Modbus变量アドレス则定义了不同レジスタ的タイプ和功能,帮助

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

《 “FreeModbus库介绍及Modbus变量アドレス解释” 》 有 2 条コメント

Leave a Reply

Your email address will not be published. Required fields are marked *.