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.

Benutzungsanweisungen
Hier sind die grundlegenden Schritte zur Verwendung der FreeModbus-Bibliothek:
- 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]);
}
}- 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.
下載看看是否為免費modbus開發庫
….