FreeModbus库介绍
FreeModbus是一个简单易用的Modbus RTU库,它允许同时运行多个独立的Modbus RTU从机。这个库的特点在于它直接使用0xxxx-4xxxx레지스터空间,无需手动处理레지스터 매핑等繁琐문제,并且可以限制使用的最大레지스터 수량。它提供了定时器인터페이스和시리얼 포트收发인터페이스,可以根据硬件需求进行설정,非常符合常规使用Modbus통신的思路。

使用설명
以下是使用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 ModbusRTUSlave회원가입Info 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("읽기失败\n");
}2.2 유지 레지스터 읽기 (FC03):
mdU16 데이터;
mdU32 addr = 0;
mdSTATUS ret;
ret = mdhandler->registerPool->mdReadHold회원가입(mdhandler->registerPool, addr, &데이터); //유지 레지스터 읽기 (FC03),주소为40001
if (ret == mdFALSE)
{
printf("읽기失败\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 데이터 = 0x1234;
mdU32 addr = 0;
mdSTATUS ret;
ret = mdhandler->registerPool->mdWriteHold회원가입(mdhandler->registerPool, addr, 데이터); //쓰기유지 레지스터,주소为40001,大小为0x1234
if (ret == mdFALSE)
{
printf("쓰기失败\n");
}2.5 其他레지스터操作API(推荐방식):
/*不推荐*/
mdSTATUS (*mdReadBit)(회원가입PoolHandle handler,mdU32 addr,mdBit *bit);
mdSTATUS (*mdWriteBit)(회원가입PoolHandle handler,mdU32 addr,mdBit bit);
mdSTATUS (*mdReadBits)(회원가입PoolHandle handler,mdU32 addr,mdU32 len,mdBit *bits);
mdSTATUS (*mdWriteBits)(회원가입PoolHandle handler,mdU32 addr,mdU32 len,mdBit *bits);
mdSTATUS (*mdReadU16)(회원가입PoolHandle handler,mdU32 addr,mdU16 *데이터);
mdSTATUS (*mdWriteU16)(회원가입PoolHandle handler,mdU32 addr,mdU16 데이터);
mdSTATUS (*mdReadU16s)(회원가입PoolHandle handler,mdU32 addr,mdU32 len,mdU16 *데이터);
mdSTATUS (*mdWriteU16s)(회원가입PoolHandle handler,mdU32 addr,mdU32 len,mdU16 *데이터);
/*推荐*/
mdSTATUS (*mdReadCoil)(회원가입PoolHandle handler, mdU32 addr, mdBit* bit); //设备주소1~10000,addr=0 -> 设备1
mdSTATUS (*mdReadCoils)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
mdSTATUS (*mdWriteCoil)(회원가입PoolHandle handler, mdU32 addr, mdBit bit);
mdSTATUS (*mdWriteCoils)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
mdSTATUS (*mdReadInputCoil)(회원가입PoolHandle handler, mdU32 addr, mdBit* bit); //设备주소10001~20000,addr=0 -> 设备10001
mdSTATUS (*mdReadInputCoils)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
mdSTATUS (*mdWriteInputCoil)(회원가입PoolHandle handler, mdU32 addr, mdBit bit);
mdSTATUS (*mdWriteInputCoils)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdBit* bits);
mdSTATUS (*mdReadInput회원가입)(회원가입PoolHandle handler, mdU32 addr, mdU16* 데이터);//设备주소30001~40000,addr=0 -> 设备30001
mdSTATUS (*mdReadInput회원가입s)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdU16* 데이터);
mdSTATUS (*mdWriteInput회원가입)(회원가입PoolHandle handler, mdU32 addr, mdU16 데이터);
mdSTATUS (*mdWriteInput회원가입s)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdU16* 데이터);
mdSTATUS (*mdReadHold회원가입)(회원가입PoolHandle handler, mdU32 addr, mdU16* 데이터);//设备주소40001~50000,addr=0 -> 设备40001
mdSTATUS (*mdReadHold회원가입s)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdU16* 데이터);
mdSTATUS (*mdWriteHold회원가입)(회원가입PoolHandle handler, mdU32 addr, mdU16 데이터);
mdSTATUS (*mdWriteHold회원가입s)(회원가입PoolHandle handler, mdU32 addr, mdU32 len, mdU16* 데이터);
还有其他레지스터操作API,比如mdReadCoil、mdReadInputCoil、mdReadInput회원가입等,它们更符合Modbus변수주소的사양,可以更方便地읽기和쓰기레지스터 값。
Modbus변수주소
Modbus변수주소表示了Modbus통신中不同레지스터的位置和유형。这些주소是Modbus프로토콜的一部分,用于指定要읽기或쓰기的레지스터。以下是常见的Modbus변수주소及其含义:
- 0xxxx:这是코일레지스터주소,对应기능 코드 01(읽기코일)和기능 코드 05(写单个코일)。它们用于控制开关设备等,是可读写的。
- 1xxxx:这是입력코일레지스터주소,对应기능 코드 02(읽기입력코일)。它们用于表示입력信号,通常是只读的。
- 3xxxx:这是입력 레지스터주소,对应기능 코드 04(입력 레지스터 읽기 (FC04))。每个레지스터表示一个16位无符号整数,通常是只读的。
- 4xxxx:这是유지 레지스터주소,对应기능 코드 03(유지 레지스터 읽기 (FC03))、기능 코드 06(写单个유지 레지스터)和기능 코드 16(写多个유지 레지스터)。它们用于存储设备매개변수、状态等信息,是可读写的。
这些주소유형和기능 코드是Modbus통신的核心部分,通过它们,你可以읽기和쓰기设备的不同레지스터,实现对设备的监控和控制。
总之,FreeModbus库提供了方便的방식来创建Modbus RTU从机,并进行레지스터的읽기和쓰기操作,而Modbus변수주소则定义了不同레지스터的유형和功能,帮助
下載看看是否為免費modbus開發庫
….