FreeModbus库介绍及Modbus변수주소解释

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

FreeModbus库介绍及Modbus变量地址解释

FreeModbus库介绍

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

FreeModbus库介绍及Modbus变量地址解释插图

使用설명

以下是使用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 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]);
      }
   }
  1. 쓰기和읽기从机레지스터 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변수주소则定义了不同레지스터的유형和功能,帮助

실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

《 “FreeModbus库介绍及Modbus변수주소解释” 》 有 2 条评论

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注