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

Instructions for Use
以下是使用FreeModbus库的基本步骤:
- 搭建スレーブ 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]);
}
}- 写入和読み取りスレーブレジスタ 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变量アドレス则定义了不同レジスタ的タイプ和功能,帮助
下載看看是否為免費modbus開發庫
….