Kapitel 1 Vorwort
Modbus ist das weltweit erste Busprotokoll, das in der Industrie eingesetzt wird. Modbus-Kommunikation ist in der industriellen Netzwerkkommunikation sehr weit verbreitet und bequem, wird von allen willkommen.
1.1 Gründe schreiben
Das Modbus-Kommunikationsprotokoll wird in unseren eigenen Produkten und Projekten schon immer wieder verwendet. Jedes Mal entwickeln die Benutzer selbst oder suchen im Internet nach dem erforderlichen Quellcode. Jede Anwendung ist jedoch anders und erfordert jede Menge Wiederholung. Und die enge Kombination von Protokollstationen wie Anwendungssoftware verursacht auch etwas Verwirrung im Code. Es war also immer der Wunsch, einen allgemeineren Protokollstack zu entwickeln, der in späteren Projekten wiederverwendet werden kann, ohne jedes Mal schreiben zu müssen. Jetzt nutzt das Projekt die Gelegenheit, um einen eigenen Modbus-Protokollstack zu entwickeln.
1.2 Urheberrecht erklärt
Diese Software wurde ursprünglich für unseren eigenen Gebrauch entwickelt, ist aber jetzt Open Source auf GitHub. Jeder kann also kopieren, verbreiten und verwenden, und es gibt keine Einschränkungen für das persönliche Lernen oder kommerzielle Anwendungen. Die Anwendungsmethoden und Änderungen sind willkommen zu diskutieren, aber wir sind nicht verantwortlich für irgendwelche Probleme, die während der Nutzung auftreten.
Der Software - Qu ell code und seine Besch reib ungen sind kosten los auf Git Hub her unter gela den : https ://github.com/foxclever/Modbus
1.3 Aktualisierung der Aufzeichnungen
In der vorherigen Version haben wir sowohl Modbus RTUs auf serieller Links als auch Modbus TCPs auf Ethernet implementiert. In dieser Version haben wir den Modbus ASCII-Modus auf Basis von seriellen Verbindungen hinzugefügt. Es wurden auch Fehler behoben, die in der vorherigen Version bekannt waren.
Das Software-Design und die Aktualisierung dieses Dokuments sind wie folgt dokumentiert:
| Version | Update-Anweisungen | V1.0.0 | Autor |
| Datum | Erste Version, 5 Kapitel, die wichtigsten API-Funktionen beschreiben. | Munn | 8. Mai 2015 |
| V1.1.0 | Kapitel 6 und 7 hinzugefügt | Munan | 23. Dezember 2016 |
| V1.1.5 | Änderungen an den meisten Kapiteln 3, 4 und 5 | Munan | 20. Februar 2018 |
| V2.0.0 | Hinzufügung von ASCII-Inhalten und Behebung bekannter Probleme | Munan | 18. September 2018 |
| V2.1.0 | Hinzufügung von Klassenkapazität für RTU - und ASCII-Multi - Master-Betriebs; Hinzufügung von TCP-Client - Multi-Segment - Operationen. | Munan | 29. April 2019 |
Kapitel 2, PDU-Funktion
In der Anwendung der Dateneinheit verarbeiten wir die grundlegenden Nachrichtenformate der Modbus-Datenkommunikation, die im Grunde allgemein sind, die aktuelle Version unterstützt nur Funktionscodes 01, 02, 03, 04, 05, 06, 15, 16.
4.1.1 Funktionscode aufzählen
ReadCoilStatus = 0x01 und / * Read-Coil - Status (Zustand, in dem mehrere Ausgangsbits gelesen werden) * /
typedef enum {
ReadCoilStatus = 0x01 und / * Lesen-Spule - Zustand (Zustand, in dem mehrere Ausgangsbits gelesen werden) * /
ReadInputStatus = 0x02, / * Eingabe-Bit - Status lesen (Zustand mehrerer Eingabe-Bit lesen) * /
ReadHoldRegister = 0x03 und / * Read Hold Register (Lesen von mehreren Hold Registers) * /
ReadInputRegister = 0x04, / * Eingangsregister lesen (Werte aus mehreren Eingangsregistern lesen) * /
WriteSingleCoil = 0x05 und / * Einzelspule erzwungen (Zustand eines einzelnen Ausgangsbits erzwungen) * /
WriteSingleRegister = 0x06, / * Vorgefertigte Einzelregister (Ein Register ist ein Wert festgelegt) * /
WriteMultipleCoil = 0x0f, / * Erzwingen mehrerer Spulen (Zustand von mehreren Ausgangsbits erzwungen) * /
WriteMultipleRegister = 0x10 / * Vorgefertigte mehrere Register (Einstellungen für mehrere Registerwerte) * /
} FunctionCode;
4.1.2, Modbus-Status - Aufzählung
/ * Definiert den Fehlercode beim Erhalt von Befehlserkennungfehlern * /
typedef enum{
MB _ OK = 0x00,
InvalidFunctionCode = 0x01, / / Ungültiger Funktionscode
IllegalDataAddress = 0x02, / / Illegale Datenadresse
IllegalDataValues = 0x03, / / Illegaler Datenwert oder Bereich
OperationFail = 0x04
} ModbusStatus;
4.1.3, Stationsinformationsstruktur
/ * Definieren Sie die Informationen, die übertragen werden sollen, um auf die Slave-Station (Server) zuzugreifen * /
typedef struct{
uint8_t UnitID;
FunktionCode FunktionCode;
uint16_t beginnendAddresse;
uint16_t quantity;
} ObjAccessInfo;
Definieren Sie die verschiedenen Informationen, die von der Station (Server) zugegriffen werden, einschließlich der Stationsnummer, Funktionscode, Startadresse und Anzahl.
4.1.4 Erstellen von Zugriffsfunktionen von PDU-Einheiten
/ * Generieren Sie Befehle zum Lesen und Schreiben von Objekten von RTU-Slaven (TCP-Server) als RTU-Master (TCP-Client) * /
uint16_t erzeugenReadWriteCommand(ObjAccessInfo objInfo, bool * statusList, uint16_t * registerList, uint8_t commandBytes[]);
Parameter:ObjAccessInfo objInfo, Slave-Objekt, auf das zugegriffen wird
bool * statusList, Datenliste von Statusvolumen-Objekten, die nach unten geschrieben werden müssen
uint16_t * registerList, Datenliste von Registervolumen-Objekten, die nach unten geschrieben werden müssen
uint8_t commandBytes[], generierte Zugriffskommandos
gibt einen Wert zurück:Die Länge des generierten Zugriffsbefehls, in Bytes.
4.1.5, Resolvieren von gelesenen Daten
/ * Resolvieren von Daten vom Host (Client) vom Server gelesen * /
void TransformClientReceivedData (uint8_t * receivedMessage, uint16_t quantity, bool * statusList, uint16_t * registerLister);
Parameter:uint8_t * receivedMessage, empfangene Nachricht
uint16_t quantity, Anzahl der gelesenen Objekte
bool * statusList, Liste der gelesenen Statusobjekte
uint16_t * registerLister, die aufgelöste Datenliste von gelesenen Registerobjekten
gibt den Wert zurück:无
4.1.6 Erstellen von Antwortnachrichten für Lese-Daten - Befehle von der Station
/ * Erstellen von Antwort für Lese-Zugriff von der Master-Station, einschließlich 0x01, 0x02, 0x03, 0x04 Funktionscode, die Länge der entsprechenden Informationen zurückgeben * /
uint16_t GenerateMasterAccessRespond (uint8_t * receivedMesasage, bool * statusList, uint16_t * registerList, uint8_t * respondBytes);
Parameter:uint8_t * receivedMesasage, empfangene Master-Leseoperationsnachricht
bool * statusList, Liste der gelesenen Slave-Status - Objekte
uint16_t * registerList, gelesenes Slave-Register - Objekt-Datenliste
uint8_t * respondBytes, erzeugte Slave-Antwort - Nachricht
gibt den Wert zurück:Die Länge der Antwortnachricht in Bytes
4.1.7, Funktionscode-Prüffunktion
/ * Funktionscode-Prüfungsfunktion * /
ModbusStatus CheckFunctionCode (FunctionCode fc);
Parameter:FunctionCode fc, Funktionscode, durch Aufzählung definiert
Rückgabewert:Modbus-Betriebszustand, durch Aufzählung definiert
4.1.8, TCP-Client - Befehl-Funktion erzeugen
/ / Befehl zum Lesen und Schreiben von Serverobjekten erzeugen
uint16_t SyntheticReadWriteTCPServerCommand (ObjAccessInfo objInfo, bool * statusList, uint16_t * registerList, uint8_t * commandBytes);
Parameter:ObjAccessInfo objInfo, TCP-Server Zugriffsinformationsobjekt
bool * statusList, Schreiben einer Liste von Objektdaten für den Serverstatus
uint16_t * registerList, Schreib-Server - Register-Menge - Objekt-Datenliste
uint8_t * commandBytes, erzeugte Befehlsnachricht
gibt den Wert zurück:Länge des Befehls in Bytes
4.1.9, Erstellen einer TCP-Server - Antwort-Funktion
/ * Synthetische Antwort auf einen Serverzugriff * /
uint16_t SyntheticServerAccessRespond (uint8_t * receivedMesasage, bool * statusList, uint16_t * registerList, uint8_t * respondBytes);
Parameter:uint8_t *receivedMesasage, empfangene Client-Befehl - Nachricht
bool *statusList, Lesen der Status-Menge - Objekt-Datenliste des TCP-Servers
uint16_t * registerList, Lesen der Register-Menge - Objekt-Datenliste des TCP-Servers
uint8_t * respondBytes, generierte Antwort-Informations - Nachricht
als Antwort auf den Client-Befehl gibt Wert zurück:Antwort-Informations - Nachrichten-Länge in Bytes
4.1.10, CRC-Prüfung
/ * Überprüfen Sie, ob die empfangenen Informationen korrekt sind * /
bool CheckRTUMessageIntegrity (uint8_t * message, uint8_t length);
Parameter:uint8_t * message, Datennachricht zu überprüfen
uint8_t length, Datennachricht Länge in Bytes
Rückgabewert:gibt ein Zustandssignal zurück, das überprüft, ob es erfolgreich ist
4.1.11, erzeugt eine Master-Befehl - Funktion, die RTU-Sklaven - Stationen lesen und schreiben kann
/ * Generiert einen Befehl zum Lesen und Schreiben von Slave-Datenobjekten mit einer Länge von 2 Checkbytes * /
uint16_t SyntheticReadWriteSlaveCommand (ObjAccessInfo slaveInfo, bool * statusList, uint16_t * registerList, uint8_t * commandBytes);
Parameter:ObjAccessInfo slaveInfo, Zugriff auf ein Informationsobjekt von der Station, definiert durch die Struktur
bool * statusList, Schreiben von Datenlisten von Statusvolumen von der Station
uint16_t * registerList, Schreiben von Datenlisten von Statusvolumen von der Station
uint8_t * commandBytes, Die generierte Zugriffsbefehlmeldung
gibt den Wert zurück:Länge des Zugriffsbefehls in Bytes
4.1.12, Erstellen von Slave-Antwort - Nachrichten
/ * Erstellen von Slave-Antwort - Nachrichten von Master-Stationen * /
uint16_t SyntheticSlaveAccessRespond (uint8_t * receivedMesasage, bool * statusList, uint16_t * registerList, uint8_t * respondBytes);
Parameter:uint8_t * receivedMesasage,
bool * statusList,
uint16_t * registerList,
uint8_t * respondBytes,
gibt den Wert zurück: Die Länge der vongenerierten Antwortnachricht in Bytes
4.1.13, LRC-Check - Check-Funktion
/ * Beurteilen, ob die ASCII-Daten korrekt sind * /
CheckASCIIMessageIntegrity (uint8_t * usMsg, uint16_t usLength)
Parameter:uint8_t * usMsg, Liste der Nachrichten, die überprüft werden sollen, hexadezionale Daten
uint16_t usLength, die Länge der Liste der Nachrichten, die überprüft werden sollen
gibt den Wert zurück:Prüft das Ergebnis, gibt „true" zurück, gibt „false" zurück
4.1.14 Konvertieren von ASCII-Nachrichten in Hexadezimal
/ * Konvertieren von empfangenen ASCII-Nachrichten in Hexadezimal * /
bool CovertAsciiMessageToHex (uint8_t * aMsg, uint8_t * hMsg, uint16_t aLen);
Parameter:uint8_t * aMsg, ASCII-Code - Informationen
uint8_t * hMsg, umgewandelte hexadezimal-Informationen
uint16_t aLen, Länge der ASCII-Code - Informationen
gibt den Wert zurück:ist die Umwandlung korrekt, die Umwandlung gibt „true" zurück, andernfalls gibt es „false" zurück
4.1.15, generieren Sie ASCII-Slaven - Befehlfunktion
/ * generieren Sie Befehle für die Slave-Station, die auf die Master-Station angewendet werden, Enthält Check-Sum - Start-End - Zeichen * /
uint16_t SyntheticReadWriteAsciiSlaveCommand(ObjAccessInfo slaveInfo, bool * statusList, uint16_t * registerList, uint8_t * commandBytes)
Parameter:ObjAccessInfo slaveInfo, Zugriffsinformationsobjekt von der Station, definiert durch die Struktur
bool * statusList, Schreiben von Stationsstatus-Volumen - Datenliste
uint16_t * registerList, Schreiben von Stationsregister-Volumen - Datenliste
uint8_t * commandBytes, erzeugte Zugriff Befehlmeldung
gibt den Wert zurück:Länge des Zugriffsbefehls in Bytes
4.1.16 Funktion, um ASCII-Antworten für Master-Befehle von Slaves zu generieren
/ * Erstellen einer Antwort für Master-Befehle, die an Slaves angewendet wird * /
uint16_t SynthetischAsciiSlaveAccessRespond (uint8_t * receivedMessage, bool * statusList, uint16_t * registerList, uint8_t * respondBytes)
Parameter:uint8_t * receivedMesasage, Akzeptierte Nachricht zum Host
bool * statusList, Liste der Statuswerte, die vom Host-Befehl gelesen werden sollen
uint16_t * registerList, Master-Befehl Liste der zu lesen Registergrößen
uint8_t * respondBytes, generierte Antwortnachrichten
Rückgabewert:Die Länge der generierten Antwortnachrichten in Bytes
Kapitel 3, Anwendung der Verpackungsfunktion
Für die Anwendungsebene Encapsulation, wir kapseln nur RTU Master-Anwendung, RTU Slave-Anwendung, TCP-Client - Anwendung und TCP-Server - Anwendung vier Kategorien.
4.2.1, RTU-Master - und Slave-Objekte
/ * Definieren des Typs von RTU-Slaven - Objekten, auf die zugegriffen wird * /
typedef struct AccessedRTUSlaveType{
uint8_t stationAddresse; / / Station Adresse
uint8_t cmdOrder; Position des aktuellen Befehls in der Befehlsliste
uint16_t Befehlsnummer; / / Gesamtzahl der Befehle in der Befehllliste
uint8_t (* pReadCommand) [8] Lesebefehlslliste
uint8_t * pLastCommand; Der letzte Befehl, der gesendet wurde.
uint32_t FlagPresetCoil; / / Voreinstelltes Spule-Steuerungs - Flagge
uint32_t flagPresetReg; / / Vorinstelltes Register-Steuerungs - Flag-Bit
} RTUAccessedSlaveType;
/ * Definiert den lokalen RTU-Master - Objekttyp * /
typedef struct LocalRTUMasterType{
uint32_t FlagWriteSlave [8]; // Schreiben Sie ein Stationssteuerungsflag für maximal 256 Stationen, das der Stationsadresse entspricht.
uint16_t slaveNumber; Anzahl der Stationen in der Stationsliste
uint16_t readOrder; Der aktuelle Standort in der Liste der Stationen
RTUAccessedSlaveType * pSlave; Von der Station Liste
UpdateCoilStatusType pUpdateCoilStatus; / / Aktualisieren Sie die Funktion der Spule
UpdateInputStatusType pUpdateInputStatus; / / Aktualisieren der Eingabe-Status - Funktion
UpdateHoldRegisterType pUpdateHoldRegister; / / Aktualisieren der Aufbewahrungsregister-Größe Funktion
UpdateInputResgisterTyp pUpdateInputResgister; / / Aktualisieren Sie die Eingabe-Register - Funktion
} RTULocalMasterType;
4.2.2, RTU-Master - Objektinitialisierungsfunktion
/ * Initialisieren Sie RTU-Master - Objekt * /
void InitializeRTUMasterObject (RTULocalMasterType * master, uint16_t slaveNumber, RTUAccessedSlaveType * pSlave, UpdateCoilStatusType pUpdateCoilStatus, UpdateInputStatusType pUpdateInputStatus, UpdateHoldingRegisterType pUpdateHoldingRegister, UpdateInputResgisterType pUpdateInputResgister);
Parameter:RTULocalMasterType * master, Lokal Master-Objekt
uint16_t slaveNumber, Anzahl Slave-Stationen
RTUAccessedSlaveType * pSlave, Slave-Liste
UpdateCoilStatusType pUpdateCoilStatus, Aktualisieren Sie den Funktionszeiger für die Spulevolumen
UpdateInputStatusType pUpdateInputStatus, Aktualisieren Sie den Funktionszeiger für die Statusvolumen
UpdateHoldingRegisterType pUpdateHoldingRegister, Aktualisieren Sie den Funktionszeiger für die Haltungsregistervolumen.
UpdateInputResgisterType pUpdateInputResgister, Aktualisieren Eingabe-Register - Quantität-Funktion Zeiger
Rückgabewert:Kein Rückgabewert
4.2.3, Erstellen von RTU-Master - Station-Zugriff Befehl-Funktion
/ * Erstellen von Befehlen für den Zugriff auf den Server * /
uint16_t CreateAccessSlaveCommand (ObjAccessInfo objInfo, void * dataList, uint8_t * commandBytes);
Parameter:ObjAccessInfo objInfo, Zugriff auf ein Informationsobjekt von der Station, definiert durch die Struktur
void * dataList, Schreiben von Datenliste von Station-Objekten
uint8_t * commandBytes, die generierte Befehlmeldung
gibt einen Wert zurück:Die Länge des generierten Zugriffsbefehls in Bytes
4.2.4, RTU-Master - Antwortfunktion des Slaves
/ * Die empfangenen Server-Antwortinformationen * /
void ParsingSlaveRespondMessage (uint8_t * receivedMessage, uint8_t * command);
Parameter:uint8_t * recievedMessage, erhaltenen Rückgabe
uint8_t * command, der an die Befehlslliste der Slave-Station
ausgegeben wurde, um den Wert zurückzugeben:无
4.2.5, RTU-Master - Station löst die Befehl-Matching - Funktion von Slave-Nachricht zurückgegeben
/ * Nach Erhalt der Rückmeldung wird entschieden, ob es sich um die Rückmeldung eines Befehls in der Send-Befehlsliste handelt * /
int FindCommandForReceivedMessage(uint8_t * receivedMessage,uint8_t (* commandList) [8],uint16_t commandNumber);
Parameter:uint8_t * recievedMessage, Empfangene Rückgabe von Slave-Stationen
uint8_t (* commandList) [8], eine Liste von Befehlen, die von der Hauptstation ausgegeben wurden
uint16_t commandNumber, Anzahl der gespeicherten Befehle
Rückgabewert:Gibt die Position des übereinstimmenden Befehls zurück, wenn es keine Übereinstimmung gibt, gibt "-1" zurück
Diese Funktion wird nur in der RTU-Master - Station verwendet, wenn die Datenmenge groß und häufig aufgreift, oder wenn mehrere Slaves aufgreift werden, um die korrekte Datenanalyse zu erleichtern.
4.2.6, die RTU-Funktion
/ * analysiert die empfangenen Informationen und gibt die synthetische Antwort und die Bytelänge der Informationen zurück, indem sie die Rückruffunktion * /
uint16_t ParsingMasterAccessCommand (uint8_t * receivedMesasage, uint8_t * respondBytes, uint16_t rxLength);
Parameter:uint8_t *receivedMesasage, empfangene Nachricht
uint8_t * respondBytes, erzeugen Sie eine Antwort Nachricht
uint16_t rxLength, die Länge der empfangenen Nachricht
gibt den Wert:Die Länge der generierten Antwortinformationen in Bytes
4.2.7, TCP-Client - und TCP-Server - Objekte
/ * Definieren Sie den Typ des aufgerufenen TCP-Server - Objekts * /
typedef struct AccessedTCPServerType{
Union {
uint32_t IPNumber;
uint8_t ipSegment [4];
ipAdresse; / / IP-Adresse des Servers
uint32_t FlagPresetServer; / / Schreiben des Server-Anforderungs - Flaggs
Schreiben Sie eine Bewertung für WritedCoilListHeadNode pWritedCoilHeadNode / / Liste der schreibbaren Spulen
WritedRegisterListHeadNode pWritedRegisterHeadNode; / / Liste der schreibbaren Aufbewahrungsregister
struct AccessedTCPServerType * pNextNode; Der nächste TCP-Server
} TCPAccessedServerType;
/ * Definiert den Header-Typ der Serverkette * /
typedef struct ServerListHeadType {
TCPAccededServerType * pServerNode; / / Serverknotenzeiger
uint32_t ServerNumber; / / Anzahl der Server
}ServerListHeadNode;
/ * Definiert den lokalen TCP-Client - Objekttyp * /
typedef struct LocalTCPClientType{
uint32_t Transaktion; / / Transaktionsbezeichner
uint16_t cmdNumber; Anzahl der Befehle, die vom Server gelesen werden
uint16_t cmdOrder; Der aktuelle Standort in der Liste der Stationen
uint8_t (* pReadCommand) [12]; Lesebefehlslliste
ServerListHeadNode ServerHeadNode; / / Kopfknoten der verknüpften Liste von Serverobjekten
UpdateCoilStatusType pUpdateCoilStatus; / / Aktualisieren Sie die Funktion der Spulenmenge
UpdateInputStatusType pUpdateInputStatus; / / Aktualisieren der Eingabe-Status - Funktion
UpdateHoldRegisterType pUpdateHoldRegister; / / Aktualisieren der Aufbewahrungsregister-Größenfunktion
UpdateInputResgisterTyp pUpdateInputResgister; / / Aktualisieren Sie die Eingabe-Register - Funktion
} TCPLocalClientType;
4.2.8, TCP-Client - Objektinitialisierungsfunktion
/ * TCP-Client - Objekt initialisieren * /
void InitializeTCPClientObject(TCPLocalClientType * client, uint16_t cmdNumber, uint8_t (* pReadCommand)[12],UpdateCoilStatusType pUpdateCoilStatus,UpdateInputStatusType pUpdateInputStatus,UpdateHoldingRegisterType pUpdateHoldingRegister,UpdateInputResgisterType pUpdateInputResgister);
Parameter:TCPLocalClientType * client, Clientobjekt
uint16_t cmdNumber, Anzahl der Befehle zum Lesen
uint8_t (* pReadCommand) [12], Leseliste von Befehlen
UpdateCoilStatusType pUpdateCoilStatus, Aktualisieren Sie den Funktionszeiger für die Anzahl der Spulen
UpdateInputStatusType pUpdateInputStatus, Aktualisieren Status-Menge - Funktionszeiger
UpdateHoldingRegisterType pUpdateHoldingRegister, Aktualisieren Halte-Register - Funktionszeiger
UpdateInputResgisterType pUpdateInputResgister, Aktualisieren Eingabe-Register - Menge - Funktionszeiger
Rückgabewert:Kein Rückgabewert
4.2.9, Erstellen eines TCP-Client - Zugriffserver-Befehls
/ * Erstellen eines Zugriffserver-Befehls * /
uint16_t CreateAccessServerCommand(ObjAccessInfo objInfo, void * dataList, uint8_t * commandBytes);
Parameter:ObjAccessInfo objInfo, Zugriffserver-Informationsobjekt
void * dataList, Datenliste für Serverobjekte
uint8_t * commandBytes, erzeugte Zugriffserver-Befehlsmeldung
gibt den Wert zurück:Länge des Zugriffsbefehls, in Bytes
4.2.10, TCP-Client - Resolver-Server - Funktion zur Rückgabe von Informationen
/ * Resolviert die empfangenen Informationen des Servers * /
Void ParsingServerRespondMessage (uint8_t * recievedMessage);
Parameter:uint8_t * recievedMessage, Empfangene Serverantwort
gibt den Wert zurück:无
4.2.11, TCP-Server - Parsing-Client - Befehlfunktion
/ * Parsiert die empfangenen Informationen und gibt die Länge des Antwortbefehls zurück * /
uint16_t ParsingClientAccessCommand(uint8_t * receivedMessage, uint8_t * respondBytes);
Parameter:uint8_t * receivedMessage, empfangener Clientzugriff
uint8_t * respondBytes, erzeugte Serverantwort
gibt den Wert zurück:Die Länge der generierten Antwortnachricht in Bytes
4.2.12, ASCII-Master - und Slave-Objekte
/ * Definieren des aufgeregebenen ASCII-Slave - Objekttyps * /
typedef struct AccessedASCIISlaveType {
uint8_t stationAddresse; / / Adresse der Station
uint8_t cmdOrder; Position des aktuellen Befehls in der Befehlsliste
uint16_t Befehlsnummer; / / Gesamtzahl der Befehle in der Befehllliste
uint8_t (* pReadCommand) [17]; Lesebefehlslliste
uint8_t * pLastCommand; / / Letzter gesendete Befehl
uint32_t FlagPresetCoil; / / Voreinstelltes Spule-Steuerungs - Flag-Bit
uint32_t flagPresetReg; / / Voreinstelltes Register-Steuerungs - Flag-Bit
} AsciiAccessedSlaveType;
/ * Definiert den lokalen ASCII-Master - Objekttyp * /
typedef struct LocalASCIIMasterType{
uint32_t FlagWriteSlave [8]; // Schreiben Sie ein Stationssteuerungsflag für maximal 256 Stationen, das der Stationsadresse entspricht.
uint16_t slaveNumber; Anzahl der Stationen in der Stationsliste
uint16_t readOrder; / / Aktuelle Position des Slaves in der Liste der Slaves
AsciiAccessedSlaveType * pSlave; / / Liste von Slaves
UpdateCoilStatusType pUpdateCoilStatus; / / Aktualisieren Sie die Funktion der Spule
UpdateInputStatusType pUpdateInputStatus; / / Aktualisieren der Eingabe-Status - Funktion
UpdateHoldRegisterType pUpdateHoldRegister; / / Aktualisieren der Aufbewahrungsregister-Größe Funktion
UpdateInputResgisterTyp pUpdateInputResgister; / / Aktualisieren der Eingangsregisterfunktion
} AsciiLocalMasterType;
4.2.13, ASCII-Master - Objektinitialisierungsfunktion
/ * RTU-Master - Objekt initialisieren * /
void InitializeASCIIMasterObject (AsciiLocalMasterType * master, uint16_t slaveNumber, AsciiAccessedSlaveType * pSlave, UpdateCoilStatusType pUpdateCoilStatus, UpdateInputStatusType pUpdateInputStatus, UpdateHoldingRegisterType pUpdateHoldingRegister, UpdateInputResgisterType pUpdateInputResgister);
Parameter:AsciiLocalMasterType * master, ASCII-Master - Objekt
uint16_t slaveNumber, Anzahl der Slaves
AsciiAccessedSlaveType * pSlave, Liste der Slaves
UpdateCoilStatusType pUpdateCoilStatus, Aktualisieren Sie die Rückruffunktion für die Spule
UpdateInputStatusType pUpdateInputStatus, Aktualisieren Sie die Rückruffunktion für die Zustandsmenge
UpdateHoldingRegisterType pUpdateHoldingRegister, Aktualisieren Sie die Rückruffunktion für die Aufbewahrungsregistermenge
UpdateInputResgisterType pUpdateInputResgister, Aktualisieren Sie die Rückruffunktion für die Eingabe-Registermenge
Rückgabewert:Kein Rückgabewert
4.2.14, Erstellen von Befehlen für den Zugriff auf ASCII-Slaven
/ * Erstellen von Befehlen für den Zugriff auf ASCII-Slaven * /
uint16_t CreateAccessAsciiSlaveCommand (ObjAccessInfo objInfo, void * dataList, uint8_t * commandBytes);
Parameter:ObjAccessInfo objInfo, Zugriff auf ein Informationsobjekt von der Station, durch die Struktur definiert
void * dataList, Schreiben einer Datenliste von einem Stationobjekt
uint8_t * commandBytes, generierte Befehlmeldung
gibt den Wert zurück:Länge des generierten Zugriffsbefehls, in Bytes
4.2.15, ASCII-Master - Antwortfunktion von Slaves
/ * ParsingAsciiSlaveRespondMessage (uint8_t * receivedMessage, uint8_t * command, uint16_t rxLength);
Void ParsingAsciiSlaveRespondMessage(uint8_t * receivedMessage, uint8_t * command, uint16_t rxLength);
Parameter:uint8_t * recievedMessage, die empfangene Rückgabe
uint8_t * command, die an die Befehlslliste der Station ausgegeben wurde
uint16_t rxLength, die Länge der empfangenen Nachricht
gibt den Wert zurück:无
4.2.16 ASCII-Master - Auflösung von Nachrichten-Befehl - Übereinstimmung von Slave-Stationen
/ * Nach Erhalt der Rückmeldung wird entschieden, ob es sich um eine Rückmeldung eines Befehls in der Send-Befehlsliste handelt * /
int FindAsciiCommandForReceivedMessage(uint8_t * receivedMessage,uint8_t (* commandList)[17],uint16_t commandNumber);
Parameter:uint8_t * recievedMessage, empfangene Nachricht vom Slave
uint8_t (* commandList) [17] Liste von Befehlen, die von der Hauptstation ausgegeben wurden
uint16_t commandNumber, Anzahl der gespeicherten Befehle
Rückgabewert:Gibt den Ort des entsprechenden Befehls zurück, gibt „-1" zurück, falls es keine Übereinstimmung gibt
Diese Funktion wird nur in der RTU-Master - Station verwendet, wenn große und häufige Datenmengen aufgerufen werden, oder wenn mehrere Slave-Stationen aufgerufen werden, um eine korrekte Datenanalyse zu ermöglichen.
4.2.17, ASCII Slave Parsing Master-Access - Befehl
/ * Parsiert die empfangenen Informationen und gibt die synthetische Antwort-Information und die Byte-Länge der Informationen zurück, indem Sie die Rückruffunktion * /
uint16_t ParsingAsciiMasterAccessCommand (uint8_t * receivedMessage, uint8_t * respondBytes, uint16_t rxLength, uint8_t StationAddress);
Parameter:uint8_t * receivedMesasage, empfangene Nachricht von der Hoststation
uint8_t * respondBytes, erzeugen Antwort Nachricht
uint16_t rxLength, die Länge der empfangenen Nachricht
Rückgabewert:Die Länge der erzeugten Antwort-Informationen, in Byte
Kapitel 4, Datenverarbeitung Funktion
Die spezifische Anwendung beinhaltet auch die Verarbeitung von Daten, die unterschiedlichen Anwendungsdatenstrukturen und - verarbeitungsmethoden sind sehr unterschiedlich, so definieren Sie einige Callback-Funktionen (eigentlich verwenden Sie die geschwächte Funktion _ _ weak Schlüsselwort) für die Datenverarbeitung.
4.3.1 Funktion, um den Wert der Spulen zu erhalten
/ * Holen Sie den Wert der Coil, die Sie lesen möchten * /
__ weak void GetCoilStatus(uint16_t startAddress,uint16_t quantity,bool * statusList)
{
/ / Wenn Sie spezifische Inhalte in der Modbus TCP Server / RTU Slave-Anwendung implementieren müssen
}
Parameter:uint16_t startAddress, die Startadresse des Objekts zum Lesen
uint16_t quantity, die Anzahl des Objekts zum Lesen
bool * statusList, eine Liste von Datenwerten für die Menge der gewünschten Spulen
gibt den Wert zurück:无
4.3.2, Funktion zum Abrufen des Eingabestatuswertes
/ * Abrufen des Wertes des InputStatus * /
__ weak void GetInputStatus(uint16_t startAddress, uint16_t quantity, bool * statusValue)
{
/ / Wenn Sie spezifische Inhalte in der Modbus TCP Server / RTU Slave-Anwendung implementieren müssen
}
Parameter:uint16_t startAddress, um die Anfangsadresse des Objekts zu lesen
uint16_t quantity, um die Anzahl des Objekts zu lesen
bool * statusValue, eine Liste von Datenwerten für die Menge des Status eingegeben erhalten
Rückgabewert:无
4.3.3 Funktion, die den Wert des Hold-Registers abnimmt
/ * Abrufen des Wertes des Hold-Registers, das gelesen werden soll * /
GetHoldingRegister(uint16_t startAddress, uint16_t quantity, uint16_t * registerValue)
{
/ / Wenn die Implementierung spezifischer Inhalte in der Modbus TCP Server / RTU Slave-Anwendung erforderlich ist
}
Parameter:uint16_t startAddress, die Anfangsadresse des zu liesenden Haltregister-Objekts
uint16_t quantity, die Anzahl der zu liesenden Haltregisters
uint16_t * registerValue, der Wert des zu liesenden Haltregisters
Rückgabewert:无
4.3.4 Funktion zum Abrufen von Eingabe-Register - Werten
/ * Holen Sie den Wert des Eingangsregisters ab, das Sie lesen möchten * /
GetInputRegister(uint16_t startAddress, uint16_t quantity, uint16_t * registerValue)
{
// Wenn die Modbus TCP Server / RTU Slave-Anwendung spezifische Inhalte implementiert werden muss
}
Parameter:uint16_t startAddress, Startadresse des zu lesen Eingaberegisters
uint16_t quantity, Anzahl der zu lesen Eingaberegisters
uint16_t * registerValue, der Wert des zu lesen Eingaberegisters
Rückgabewert:无
4.3.5, Wertfunktion für einzelne Spule festlegen
/ * Wert für einzelne Spule festlegen * /
__ weak void SetSingleCoil(uint16_t coilAddress, bool coilValue)
{
// Wenn die Modbus TCP Server / RTU Slave-Anwendung spezifische Inhalte implementieren muss, gibt
}
Parameter:uint16_t coilAddress, die Spule-Adresse des vordefinierten Wertes
bool coilValue, der vordefinierte Wert
zurück:无
4.3.6, Funktion zum Festlegen eines einzelnen Registerwerts
/ * Festlegen eines einzelnen Registerwerts * /
__ weak void SetSingleRegister(uint16_t registerAddress, uint16_t registerValue)
{
// Wenn die Modbus TCP Server / RTU Slave-Anwendung spezifische Inhalte implementiert werden muss, gibt
}
Parameter:uint16_t registerAddress, die Adresse des vordefinierten Aufbewahrungsregisters
uint16_t registerValue, den Wert des vordefinierten Aufbewahrungsregisters
zurück:无
4.3.7 Funktion, um mehrere Werte von Spulen zu setzen
/ * Wert für mehrere Spulen festlegen * /
__ weak void SetMultipleCoil(uint16_t startAddress, uint16_t quantity, bool * statusValue)
{
/ / Wenn die Implementierung spezifischer Inhalte in der Modbus TCP Server / RTU Slave-Anwendung erforderlich ist
}
Parameter:uint16_t startAddress, Startadresse für mehrere Spule, die vorgegeben werden sollen
uint16_t quantity, Anzahl der Spule, die vorgegeben werden sollen
bool * statusValue, Liste der Spulewerte, die vorgegeben werden sollen
Rückgabewert:无
4.3.8, Funktion zum Festlegen mehrerer Registerwerte
/ * Festlegen mehrerer Registerwerte * /
__ weak void SetMultipleRegister(uint16_t startAddress, uint16_t quantity, uint16_t * registerValue)
{
/ / Wenn die Implementierung spezifischer Inhalte in der Modbus TCP Server / RTU Slave-Anwendung erforderlich ist
}
Parameter:uint16_t startAddress, die Anfangsadresse für mehrere vordefinierte Aufbewahrungsregister
uint16_t quantity, die Anzahl der vordefinierten Aufbewahrungsregister.
uint16_t * registerValue, Liste der vorbekannten Werte für die Aufbewahrung des Registers
Rückgabewert:无
4.3.9, Funktion, um die von der Station erfassten Spulenwerte zu aktualisieren
/ * Aktualisiert den gelesenen Spulenstatus * /
__weak void UpdateCoilStatus(uint16_t startAddress, uint16_t quantity, bool * stateValue)
{
Implementieren Sie den
}
- Parameter in der Client-Applikation:uint16_t startAddress, die Startadresse des Spule-Objekts, das den Wert liest.
uint16_t quantity, Anzahl der gelesenen Spule
bool * stateValue, Liste der gelesenen Spule-Adressen
Rückgabewert:无
Dieses Programm ist die Standardverarbeitung Funktion, jedes Master-Objekt kann die Aktualisierungsfunktion individuell definieren, wenn es keine Definition gibt, rufen Sie diese Funktion auf.
4.3.10, Funktion zum Aktualisieren des von der Station abgerufenen Eingabestatuswertes
/ * Aktualisieren des gelesenen Eingabestatuswertes * /
__ weak void UpdateInputStatus(uint16_t startAddress, uint16_t quantity, bool * stateValue)
{
Implementiert in der Client-Anwendung (Mainstream)
}
Parameter:uint16_t startAddress, die Startadresse des gelesenen Eingabe-Status - Objekts
uint16_t quantity, die Anzahl der gelesenen Eingabe-Status - Objekte
bool * stateValue, der Wert des gelesenen Eingabe-Status - Objekts
Rückgabewert:无
Dieses Programm ist die Standardverarbeitung Funktion, jedes Host-Objekt kann die Update-Funktion individuell definieren, wenn es keine Definition gibt, rufen Sie diese Funktion auf.
4.3.11, Funktion zum Aktualisieren des Haltregisterwertes von der Station
/ * Aktualisieren des zurückgelesenen Haltregisters * /
UpdateHoldingRegister(uint16_t startAddress, uint16_t quantity, uint16_t * registerValue)
{
Implementieren Sie
}
- Parameter in der Client-Applikation:uint16_t startAddress, gelessene Startadresse des Haltungsregisterobjekts
uint16_t quantity, gelessene Daten des Haltungsregisterobjekts
uint16_t * registerValue, gelessene Liste der Haltungsregisterobjekte Werte
Rückgabewert:无
Dieses Programm ist die Standardverarbeitungsfunktion, jedes Master-Objekt kann die Aktualisierungsfunktion individuell definieren, wenn es keine Definition gibt, aufrufen Sie diese Funktion.
4.3.12 Aktualisieren Sie die Eingangsregister von der Station
/ * Aktualisieren Sie das Eingaberegister * /
__ weak void UpdateInputResgister(uint16_t startAddress, uint16_t quantity, uint16_t * registerValue)
{
Implementieren Sie die
}
- Parameter in der Client-Anwendung:uint16_t startAddress, Startadresse des gelesenen Eingabe-Register - Objekts
uint16_t quantity, Anzahl der gelesenen Eingabe-Register - Objekte
uint16_t * registerValue, Liste der gelesenen Eingabe-Register - Werte.
Rückgabewert:无
Dieses Programm ist die Standardverarbeitungsfunktion, jedes Master-Objekt kann die Aktualisierungsfunktion individuell definieren, wenn es keine Definition gibt, rufen Sie diese Funktion auf.
Kapitel 5 Einige Hinweise
Für die gesamte Entwicklung des Modbus-Protokollstacks, die bereits sehr deutlich gesagt wurde, werden wir als nächstes erklären, was nicht direkt mit der Entwicklung zu tun hat.
Z un ächst einmal die Frage , warum ich diesen Protokoll sta ck entwick elt habe . Uns ere urspr üng liche Ab sicht ist , dass wir bei der Entwicklung von Produk ten diesen Teil nicht jedes Mal neu schre iben müssen , sondern kontin ui er lich verbess ern und verw enden können , um wieder ver wend bar zu sein . Sp ä ter hatten wir natürlich das Gefü hl , dass wir es nicht nur für uns selbst benut zen konnten , sondern auch für alle , die es benut zen wollten , öffent lich machen konnten . Die Qu ell - Web se ite ist : https ://github.com/foxclever/Modbus
Zweitens hat das Modbus-Protokoll einen nationalen Standard, der drei Dokumente enthält. Unser Protokoll-Stack ist ein Standardprotokoll, das gemäß nationalen Standards entwickelt wurde, einschließlich der Funktion, verschiedene Arten von Objektdaten zu lesen und zu schreiben, und in der allgemeinen industriellen Anwendung ist völlig ausreichend. Drei Standard-Dokumente:
GB / T 19582.1 Spezifikation für industrielle Automatisierungsnetzwerke auf Basis des Modbus-Protokolls - Teil 1: Modbus-Anwendungsprotokoll
GB / T 19582.2 - 2008 Spezifikation für industrielle Automatisierungsnetzwerke auf Basis des Modbus-Protokolls - Teil 1: Leitfaden für die Implementierung des Modbus-Protokolls über serielle Verbindungen
GB / T 19582.3 Spezifikation für industrielle Automatisierungsnetzwerke auf Basis des Modbus-Protokolls - Teil 1: Leitfaden für die Implementierung des Modbus-Protokolls auf TCP / IP
Schließlich sind wir alle herzlich eingeladen, diesen Protokollstack zu verwenden, aber wir sind nicht verantwortlich für das Endergebnis der Verwendung. Natürlich, wenn wir irgendwelche Mängel finden, sind wir sehr und begrüßen Sie uns mitzuteilen, dass Sie das Problem finden, damit wir es kontinuierlich verbessern können.
Vielen Dank für Ihr Interesse an dieser Software, die benötigten Kollegen können sie auf GitHub herunterladen, und gleichzeitig willkommen, uns Verbesserungen vorzuschlagen, interessierte Kollegen können unsere öffentliche Seite folgen:
| Modbus-Stack umfassende Instanz Parameterliste | ||||||||
| Station Adresse: 1; Baudrate: 115200; Datenbit: 8; Stoppbit: 1; Keine Überprüfung | ||||||||
| Sequenznummer | Datentyp | Variablename | Name des Parameters | Adresse | Lesen-Schreiben - Attribut | Wertebereich | Standardwert | Beschreibung |
| 1 | uint32_t | beatTime | Herzschlag-Erkennung | 40001 | Read-only | Zunahme pro Sekunde, um den ordnungsgemäßen Betrieb des Systems zu überwachen | ||
| 2 | float | mbAI1 | Analogen-Test | 40003 | Read-only | mbAO1 * 3 | ||
| 3 | float | mbAO1 | Analogen-Test | 40005 | Lesen und schreiben | 0 ~ 100.0 | 1.101 | |
| 4 | uint16_t | mbAI2 | Analog-Test | 40007 | Nur Lesen | mbAO2 * 2 | ||
| 5 | uint16_t | mbAO2 | Analog-Test | 40008 | Lesen und Schreiben | 0 ~ 100 | 1 | lokale Variable |
| 1 | float | mbSalve1AI1 | Ziel-Slave - Station1 Analog-Eingabe - Parameter1 | 40009 | Nur lesen | Ziel-Slave - Station1 - Simulationsparameter | ||
| 2 | uint32_t | mbSalve1AI2 | Ziel-Slave - Station1 - Simulationsparameter 2 | 40011 | Nur lesen | Ziel-Slave - Station1 - Simulationsparameter | ||
| 5 | uint16_t | mbSalve1AI3 | Analog-Eingabe - Parameter für Ziel-Slave - Station1 | 40013 | Nur lesen | 0 | Analog-Parameter für Ziel-Slave - Station1 | |
| 6 | uint16_t | mbSalve1AO1 | Analog-Ausgabe - Parameter für Ziel-Slave - Station1 | 40014 | Lesen und Schreiben | 101 | Simulation von Zielen von Station 1 Parameter | |
| 7 | uint16_t | mbSalve1AO2 | Analog-Ausgabeparameter für Ziel-Slave - Station1 | 40015 | Lesen und Schreiben | 102 | Analog-Ausgabeparameter für Ziel-Slave - Station1 | |
| 8 | uint16_t | mbSalve1AO3 | Analog-Ausgabeparameter für Ziel-Slave - Station1 3 | 40016 | Lesen und Schreiben | 103 | Zielsklave1 Simulation Parameter | |
| 1 | float | mbSalve2AI1 | Zielsklave2 Simulation Eingabe Parameter 1 | 40017 | Nur Lesen | Zielsklave2 Simulation Parameter | ||
| 2 | uint32_t | mbSalve2AI2 | Analog-Eingabe - Parameter für Ziel-Slave - Station2 | 40019 | Read-Only | Analog-Eingabe - Parameter für Ziel-Slave - Station2 | ||
| 5 | uint16_t | mbSalve2AI3 | Analog-Eingabe - Parameter für Ziel-Slave - Station2 | 40021 | Read-Only | 0 | Analog-Eingabe - Parameter für Ziel-Slave - Station2 | |
| 6 | uint16_t | mbSalve2AO1 | Analog-Ausgabeparameter 1 | 40022 | Lesen und Schreiben | Analog-Ausgabeparameter 2 | ||
| 7 | uint16_t | mbSalve2AO2 | Analog-Ausgabeparameter 2 | 40023 | Lesen und Schreiben | 0 | Zielsklave2 Simulation Parameter | |
| 8 | uint16_t | mbSalve2AO3 | Zielsklave2 Simulation Ausgabe Parameter 3 | 40024 | Lesen und Schreiben | 0 | Zielsklave2 Simulation Parameter | |
| 1 | float | mbSalve3AI1 | Ziel-Slave - Station3 - Analog-Eingabe - Parameter1 | 40025 | Read Only | Ziel-Slave - Station3 - Analog-Eingabe - Parameter | ||
| 2 | uint32_t | mbSalve3AI2 | Ziel-Slave - Station3 - Analog-Eingabe - Parameter2 | 40027 | Read Only | Ziel-Slave - Station3 - Analog-Eingabe - Parameter | ||
| 5 | uint16_t | mbSalve3AI3 | Analog-Eingangsparameter für Zielslave Station 3 | 40029 | Read-only | 0 | Analog-Eingangsparameter für Zielslave Station 3 | |
| 6 | uint16_t | mbSalve3AO1 | Analog-Ausgangsparameter für Zielslave Station 3 1 | 40030 | Lesen und schreiben | Zielslave Station 3 Simulation Parameter | ||
| 7 | uint16_t | mbSalve3AO2 | Zielslave Station 3 Simulation Ausgabe Parameter 2 | 40031 | Lesen und Schreiben | 0 | Zielslave Station 3 Simulation Parameter | |
| 8 | uint16_t | mbSalve3AO3 | Analog-Ausgabeparameter für Ziel-Slave - Station3 | 40032 | Lesen und Schreiben | 0 | Analog-Ausgabeparameter für Ziel-Slave - Station3 | |
| 1 | float | mbSalve4AI1 | Analog-Eingangparameter für Ziel-Slave - Station4 | 40033 | Nur Lesen | Analog-Ausgabeparameter für Ziel-Slave - Station4 | ||
| 2 | uint32_t | mbSalve4AI2 | Analog-Eingangsparameter für Ziel-Slave - Station4 | 40035 | Read-only | Analog-Eingangsparameter für Ziel-Slave - Station4 | ||
| 5 | uint16_t | mbSalve4AI3 | Analog-Eingangsparameter für Ziel-Slave - Station4 3 | 40037 | Nur lesen | 0 | Ausgabeparameter des Zielsklaven 4 | |
| 6 | uint16_t | mbSalve4AO1 | Ausgabeparameter des Zielsklaven 4 | 40038 | Lesen und Schreiben | Ausgabeparameter des Zielsklaven 4 | ||
| 7 | uint16_t | mbSalve4AO2 | Ziel-Slave - Station4 - Analog-Ausgabeparameter 2 | 40039 | Lesen und Schreiben | 0 | Ziel-Slave - Station4 - Analog-Ausgabeparameter | |
| 8 | uint16_t | mbSalve4AO3 | Ziel-Slave - Station4 - Analog-Ausgabeparameter 3 | 40040 | Lesen und Schreiben | 0 | Ziel-Sklavenstation4 analoge Parameter | |
| 1 | bool | mbDI1 | Digitale Menge Eingabe Parameter 1 | 1 | Lesen-nur | Digitale Menge Parameter | ||
| 2 | bool | mbDI2 | Digitale Menge Eingabe Parameter 2 | 2 | Lesen-nur | Größenparameter | ||
| 3 | bool | mbDI3 | Größen-Eingabeparameter 3 | 3 | Lese-nur | Größen-Eingabeparameter | ||
| 4 | bool | mbDI4 | Größen-Eingabeparameter 4 | 4 | Lese-nur | Digitale Größe Parameter | ||
| 5 | bool | mbDO1 | Digitale Größe Ausgabe Parameter 1 | 5 | Lesen und Schreiben | Digitale Größe Parameter | ||
| 6 | bool | mbDO2 | Digitale Größe Ausgabe Parameter 2 | 6 | Lesen und Schreiben | Zahlen Parameter | ||
| 7 | bool | mbDO3 | Digitale Ausgabe Parameter 3 | 7 | Lesen und schreiben | Zahlen Parameter | ||
| 8 | bool | mbDO4 | Digitale Ausgabe Parameter 4 | 8 | Lesen und schreiben | Parameter der numerischen Größe | ||
| 1 | bool | mbSalve1DI1 | Zielslave 1 Parameter der numerischen Größe Eingabe 1 | 9 | Nur gelesen | Zielslave 1 Parameter der numerischen Größe Eingabe 2 | ||
| 2 | bool | mbSalve1DI2 | Zielmenge aus der Station 1 numerische Eingabe Parameter 2 | 10 | Nur lesen | Zielslave-Station1 - numerische Größenparameter | ||
| 3 | bool | mbSalve1DI3 | Zielslave-Station1 - numerische Größenparameter 3 | 11 | nur für Lesen | Zielslave-Station1 - numerische Größenparameter | ||
| 4 | bool | mbSalve1DI4 | Zielslave-Station1 - numerische Größenparameter 4 | 12 | nur für Lesen | Zielslave Station1 numerische Größenparameter | ||
| 5 | bool | mbSalve1DO1 | Zielslave Station1 numerische Größen Ausgabe Parameter 1 | 13 | Lesen und Schreiben | Zielslave Station1 numerische Größenparameter | ||
| 6 | bool | mbSalve1DO2 | Zielslave Station1 numerische Größen Ausgabe Parameter 2 | 14 | Lesen und Schreiben | Zielmenge von Station 1 numerische Parameter | ||
| 7 | bool | mbSalve1DO3 | Zielslave Station1 numerische Größenparameter Ausgabe3 | 15 | Lesen und Schreiben | Zielslave Station1 numerische Größenparameter | ||
| 8 | bool | mbSalve1DO4 | Zielslave Station1 numerische Größenparameter Ausgabe4 | 16 | Lesen und Schreiben | Zielmenge von Station 1 numerische Parameter | ||
| 1 | bool | mbSalve2DI1 | Zielslave-Station2 numerische Größenparameter 1 | 17 | nur für Lesen | Zielslave-Station2 numerische Größenparameter | ||
| 2 | bool | mbSalve2DI2 | Zielslave-Station2 numerische Größenparameter 2 | 18 | nur für Lesen | Zielslave-Station 2 - numerische Größenparameter | ||
| 3 | bool | mbSalve2DI3 | Zielslave-Station 2 - numerische Größenparameter 3 | 19 | nur für Lesen | Zielslave-Station 2 - numerische Größenparameter | ||
| 4 | bool | mbSalve2DI4 | Zielslave-Station 2 - numerische Größenparameter 4 | 20 | nur für Lesen | Zielslave-Station2 - numerische Parameter | ||
| 5 | bool | mbSalve2DO1 | Zielslave-Station2 - numerische Ausgabeparameter1 | 21 | Lesen und Schreiben | Zielslave-Station2 - numerische Parameter | ||
| 6 | bool | mbSalve2DO2 | Zielslave-Station2 - numerische Ausgabeparameter2 | 22 | Lesen und schreiben | Zielslave-Station 2 - numerische Parameter | ||
| 7 | bool | mbSalve2DO3 | Zielslave-Station 2 - numerische Ausgabeparameter 3 | 23 | Lesen und Schreiben | Zielslave-Station 2 - numerische Parameter | ||
| 8 | bool | mbSalve2DO4 | Zielslave-Station 2 - numerische Ausgabeparameter 4 | 24 | Lesen und Schreiben | Zielslave-Station 2 numerische Größe Parameter | ||
| 1 | bool | mbSalve3DI1 | Zielslave-Station 3 numerische Größe Eingabe Parameter 1 | 25 | Read-only | Zielslave-Station 3 numerische Größe Parameter | ||
| 2 | bool | mbSalve3DI2 | Zielslave-Station 3 numerische Größe Eingabe Parameter 2 | 26 | Read-only | Ziel von Station 3 Zahl Parameter | ||
| 3 | bool | mbSalve3DI3 | Zielslave-Station3 - Zahlenparameter-Eingabe - Zahlenparameter 3 | 27 | Nur lesen | Zielslave-Station3 - Zahlenparameter-Eingabe - Zahlenparameter | ||
| 4 | bool | mbSalve3DI4 | Zielslave-Station3 - Zahlenparameter-Eingabe - Zahlenparameter 4 | 28 | Nur lesen | Zielslave Station 3 numerische Größenparameter | ||
| 5 | bool | mbSalve3DO1 | Zielslave Station 3 numerische Größen Ausgabe Parameter 1 | 29 | Lesen und Schreiben | Zielslave Station 3 numerische Größenparameter | ||
| 6 | bool | mbSalve3DO2 | Zielslave Station 3 numerische Größen Ausgabe Parameter 2 | 30 | Lesen und Schreiben | Ziel von Station 3 Zahl Parameter | ||
| 7 | bool | mbSalve3DO3 | Zielslave Station 3 numerische Ausgabe Parameter 3 | 31 | Lesen und Schreiben | Zielslave Station 3 numerische Ausgabe Parameter | ||
| 8 | bool | mbSalve3DO4 | Zielslave Station 3 numerische Ausgabe Parameter 4 | 32 | Lesen und Schreiben | Zielslave-Station 3 - numerische Größenparameter | ||
| 1 | bool | mbSalve4DI1 | Zielslave-Station 4 - numerische Größenparameter 1 | 33 | - nur-lesen | Zielslave-Station 4 - numerische Größenparameter | ||
| 2 | bool | mbSalve4DI2 | Zielslave-Station 4 - numerische Größenparameter 2 | 34 | - nur-lesen | Zielslave-Station4 - numerische Größenparameter | ||
| 3 | bool | mbSalve4DI3 | Zielslave-Station4 - numerische Größenparameter 3 | 35 | Read-only | Zielslave-Station4 - numerische Größenparameter | ||
| 4 | bool | mbSalve4DI4 | Zielslave-Station4 - numerische Größenparameter 4 | 36 | Read-only | Ziel von Station 4 Zahlen Parameter | ||
| 5 | bool | mbSalve4DO1 | Zielschicht aus der Station 4 numerische Ausgabe Parameter 1 | 37 | Lesen und schreiben | Ziel von Station 4 Zahlen Parameter | ||
| 6 | bool | mbSalve4DO2 | Zielergabe der numerischen Menge von Station4 Parameter2 | 38 | Lesen und schreiben | Ziel von Station 4 Zahlen Parameter | ||
| 7 | bool | mbSalve4DO3 | Zielslave-Station4 - numerische Ausgabeparameter 3 | 39 | Lesen und Schreiben | Zielslave-Station4 - numerische Parameter | ||
| 8 | bool | mbSalve4DO4 | Zielslave-Station4 - numerische Ausgabeparameter 4 | 40 | Lesen und Schreiben | Ziel-Slavenstation4 Zahlen Quantitätsparameter | ||
| Ziel-Slavenstation1 Parameterliste | ||||||||
| Station-Adresse: 1; Baudrate: 9600; Datenbit: 8; Stopbit: 1; Keine Überprüfung | ||||||||
| Sequenznummer | Datentyp | Variablename | Parametername | Adresse | Lesen-Schreiben - Eigenschaft | Wertebereich | Standardwert | Beschreibung |
| 1 | float | mbSalve1AI1 | Ziel-Slave - Station1 analoge Eingabeparameter1 | 40001 | nur Lesen | Ziel-Slave - Station1 analoge Parameter | ||
| 2 | uint32_t | mbSalve1AI2 | Analog-Eingangsparameter für Ziel-Slave - Station1 | 40003 | Read-only | Analog-Eingangsparameter für Ziel-Slave - Station1 | ||
| 5 | uint16_t | mbSalve1AI3 | Analog-Eingangsparameter für Ziel-Slave - Station1 3 | 40005 | Nur lesen | 0 | Ausgabeparameter für die Analog-Ausgabe von Zielslave 1 | |
| 6 | uint16_t | mbSalve1AO1 | Ausgabeparameter für die Analog-Ausgabe von Zielslave 1 | 40006 | Lesen und Schreiben | Zielslave 1 Analog-Ausgabeparameter | ||
| 7 | uint16_t | mbSalve1AO2 | Zielslave Station1 analoge Ausgabe Parameter 2 | 40007 | Lesen und Schreiben | 0 | Zielslave Station1 analoge Ausgabe Parameter | |
| 8 | uint16_t | mbSalve1AO3 | Zielslave Station1 analoge Ausgabe Parameter 3 | 40008 | Lesen und Schreiben | 0 | Ziel-Slave - Station1 - Analogparameter | |
| 1 | bool | mbSalve1DI1 | Ziel-Slave - Station1 - numerische Eingabeparameter 1 | 1 | Lesen-nur | Ziel-Slave - Station1 - numerische Eingabeparameter | ||
| 2 | bool | mbSalve1DI2 | Ziel-Slave - Station1 - numerische Eingabeparameter 2 | 2 | Lesen-nur | Zielslave Station1 numerische Größe Parameter | ||
| 3 | bool | mbSalve1DI3 | Zielslave Station1 numerische Größe Eingabe Parameter 3 | 3 | nur lesen | Zielslave Station1 numerische Größe Parameter | ||
| 4 | bool | mbSalve1DI4 | Zielslave Station1 numerische Größe Eingabe Parameter 4 | 4 | nur lesen | Zielslave Station1 numerische Größenparameter | ||
| 5 | bool | mbSalve1DO1 | Zielslave Station1 numerische Größenparameter Ausgabe1 | 5 | Lesen und Schreiben | Zielslave Station1 numerische Größenparameter | ||
| 6 | bool | mbSalve1DO2 | Zielslave Station1 numerische Größenparameter Ausgabe2 | 6 | Lesen und Schreiben | Zielmenge von Station 1 numerische Parameter | ||
| 7 | bool | mbSalve1DO3 | Zielslave1 numerische Größenparameter Ausgabe3 | 7 | Lesen und Schreiben | Zielslave1 numerische Größenparameter | ||
| 8 | bool | mbSalve1DO4 | Zielslave1 numerische Größenparameter Ausgabe4 | 8 | Lesen und Schreiben | Zielslave Station1 Zahlen Quantitätsparameter | ||
| Zielslave Station2 Parameterliste | ||||||||
| Station-Adresse: 2; Baudrate: 9600; Datenbit: 8; Stoppbit: 1; Keine Überprüfung | ||||||||
| Sequenznummer | Datentyp | Variablename | Parametername | Adresse | Eigenschaften lesen | Wertebereich | Standardwert | Beschreibung |
| 1 | float | mbSalve2AI1 | Analog-Eingabe - Parameter für Ziel-Slave - Station2 | 40001 | Nur Lesen | Analog-Parameter für Ziel-Slave - Station2 | ||
| 2 | uint32_t | mbSalve2AI2 | Analog-Eingangsparameter für Ziel-Slave - Station2 | 40003 | Lese-nur | Analog-Eingangsparameter für Ziel-Slave - Station2 | ||
| 5 | uint16_t | mbSalve2AI3 | Analog-Eingangsparameter für Ziel-Slave - Station2 3 | 40005 | Nur lesen | 0 | Simulation von Zielen von Station 2 Parameter | |
| 6 | Messbarkeit | Messbarkeit] Messbarkeit | Ziel analoge Ausgabe Parameter 1 von Station 2 | 40006 | Lesen und schreiben | Simulation von Zielen von Station 2 Parameter | ||
| 7 | uint16_t | mbSalve2AO2 | Ziel-Slave - Station2 - Analog-Ausgabeparameter 2 | 40007 | Lesen und Schreiben | 0 | Ziel-Slave - Station2 - Analog-Ausgabeparameter | |
| 8 | uint16_t | mbSalve2AO3 | Ziel-Slave - Station2 - Analog-Ausgabeparameter 3 | 40008 | Lesen und Schreiben | 0 | Ziel-Slave - Station2 - Analogparameter | |
| 1 | bool | mbSalve2DI1 | Ziel-Slave - Station2 - Digitaleingabe-Parameter1 | 1 | Lesen-nur | Ziel-Slave - Station2 - Digitaleingabe-Parameter | ||
| 2 | bool | mbSalve2DI2 | Ziel-Slave - Station2 - Digitaleingabe-Parameter2 | 2 | Lesen-nur | Zielslave-Station2 - numerische Größenparameter | ||
| 3 | bool | mbSalve2DI3 | Zielslave-Station2 - numerische Größenparameter 3 | 3 | nur für Lesen | Zielslave-Station2 - numerische Größenparameter | ||
| 4 | bool | mbSalve2DI4 | Zielslave-Station2 - numerische Größenparameter 4 | 4 | nur für Lesen | Zielslave-Station 2 numerische Parameter | ||
| 5 | bool | mbSalve2DO1 | Zielslave-Station 2 numerische Ausgabeparameter 1 | 5 | Lesen und Schreiben | Zielslave-Station 2 numerische Parameter | ||
| 6 | bool | mbSalve2DO2 | Zielslave-Station 2 numerische Ausgabeparameter 2 | 6 | Lesen und Schreiben | Zielslave-Station 2 numerische Größenparameter | ||
| 7 | bool | mbSalve2DO3 | Zielslave-Station 2 numerische Größen Ausgabeparameter 3 | 7 | Lesen und Schreiben | Zielslave-Station 2 numerische Größenparameter | ||
| 8 | bool | mbSalve2DO4 | Zielslave-Station 2 numerische Größen Ausgabeparameter 4 | 8 | Lesen und Schreiben | Ziel-Slavenstation2 Zahlen Quantitätsparameter | ||
| Ziel-Slavenstation1 Parameterliste | ||||||||
| Stationsadresse 3; Baudrate: 9600; Datenbit: 8; Stopbit: 1; Keine Überprüfung | ||||||||
| Sequenznummer | Datentyp | Variablename | Parametername | Adresse | Lesen und Schreiben Eigenschaften | Wertebereich | Standardwert | Beschreibung |
| 1 | float | mbSalve3AI1 | Analog-Eingabe - Parameter für die Ziel-Slave - Station3 | 40001 | Lesen nur | Analog-Parameter für die Ziel-Slave - Station3 | ||
| 2 | uint32_t | mbSalve3AI2 | Analog-Eingabe - Parameter für Ziel-Slave - Station3 | 40003 | Lese-nur | Analog-Eingabe - Parameter für Ziel-Slave - Station3 | ||
| 5 | uint16_t | mbSalve3AI3 | Analog-Eingabe - Parameter für Ziel-Slave - Station3 | 40005 | reines Lesen | 0 | Zielsklave Station3 Simulation Parameter | |
| 6 | uint16_t | mbSalve3AO1 | Zielsklave Station3 Simulation Ausgabe Parameter 1 | 40006 | Lesen und Schreiben | Zielsklave Station3 Simulation Parameter | ||
| 7 | uint16_t | mbSalve3AO2 | Ziel-Slave - Station3 - Analog-Ausgabeparameter 2 | 40007 | Lesen und Schreiben | 0 | Ziel-Slave - Station3 - Analog-Ausgabeparameter | |
| 8 | uint16_t | mbSalve3AO3 | Ziel-Slave - Station3 - Analog-Ausgabeparameter 3 | 40008 | Lesen und Schreiben | 0 | Simulation von Zielen von Station 3 Parameter | |
| 1 | bool | mbSalve3DI1 | MBSalve3DI2 | 1 | Nur lesen | Ziel von Station 3 Zahl Parameter | ||
| 2 | bool | MBSalve3DI2 | MBSalve3DI2 | 2 | MBSalve3DI2 | Zielslave Station 3 numerische Größenparameter | ||
| 3 | bool | mbSalve3DI3 | Zielslave Station 3 numerische Größenparameter Eingabe 3 | 3 | Read-only | Zielslave Station 3 numerische Größenparameter | ||
| 4 | bool | mbSalve3DI4 | Zielslave Station 3 numerische Größenparameter Eingabe 4 | 4 | Read-only | Zielslave Station 3 numerische Größenparameter | ||
| 5 | bool | mbSalve3DO1 | Zielslave Station 3 numerische Größen Ausgabe Parameter 1 | 5 | Lesen und Schreiben | Zielslave Station 3 numerische Größenparameter | ||
| 6 | bool | mbSalve3DO2 | Zielslave Station 3 numerische Größen Ausgabe Parameter 2 | 6 | Lesen und Schreiben | Zielslave Station 3 numerische Größenparameter | ||
| 7 | bool | mbSalve3DO3 | Zielslave Station 3 numerische Größen Ausgabe Parameter 3 | 7 | Lesen und Schreiben | Zielslave Station 3 numerische Größenparameter | ||
| 8 | bool | mbSalve3DO4 | Zielslave Station 3 numerische Größen Ausgabe Parameter 4 | 8 | Lesen und Schreiben | Ziel-Slave - Station3 Zahlen Quantitätsparameter | ||
| Ziel-Slave - Station1 Parameterliste | ||||||||
| Station-Adresse 4; Baudrate: 9600; Datenbit: 8; Stoppbit: 1; Keine Überprüfung | ||||||||
| Seriennummer | Datentyp | Variablename | Parametername | Adresse | Eigenschaften lesen | Wertebereich | Standardwert | Beschreibung |
| 1 | float | mbSalve4AI1 | Analog-Eingabe - Parameter für die Ziel-Slave - Station4 | 40001 | Nur Lesen | Analog-Parameter für die Ziel-Slave - Station4 | ||
| 2 | uint32_t | mbSalve4AI2 | Analog-Eingabe - Parameter für Ziel-Slave - Station4 | 40003 | Lese-nur | Analog-Eingabe - Parameter für Ziel-Slave - Station4 | ||
| 5 | uint16_t | mbSalve4AI3 | Analog-Eingabe - Parameter für Ziel-Slave - Station4 3 | 40005 | reines Lesen | 0 | Zielslave Station 4 Simulation Parameter | |
| 6 | uint16_t | mbSalve4AO1 | Zielslave Station 4 Simulation Ausgabe Parameter 1 | 40006 | Lesen und Schreiben | Zielslave Station 4 Simulation Parameter | ||
| 7 | uint16_t | mbSalve4AO2 | Ziel-Slave - Station4 - Analog-Ausgabeparameter 2 | 40007 | Lesen und Schreiben | 0 | Ziel-Slave - Station4 - Analog-Ausgabeparameter | |
| 8 | uint16_t | mbSalve4AO3 | Ziel-Slave - Station4 - Analog-Ausgabeparameter 3 | 40008 | Lesen und Schreiben | 0 | Ziel-Slave - Station4 - Analogparameter | |
| 1 | bool | mbSalve4DI1 | Ziel-Slave - Station4 - numerische Eingabeparameter1 | 1 | Read-only | Ziel-Slave - Station4 - numerische Eingabeparameter | ||
| 2 | bool | mbSalve4DI2 | Ziel-Slave - Station4 - numerische Eingabeparameter2 | 2 | Read-only | Ziel von Station 4 Zahlen Parameter | ||
| 3 | bool | mbSalve4DI3 | Zielslave-Station 4 numerische Größe Eingabe Parameter 3 | 3 | nur für Lesen | Zielslave-Station 4 numerische Größe Parameter | ||
| 4 | bool | mbSalve4DI4 | Zielslave-Station 4 numerische Größe Eingabe Parameter 4 | 4 | nur für Lesen | Zielslave-Station 4 numerische Größenparameter | ||
| 5 | bool | mbSalve4DO1 | Zielslave-Station 4 numerische Größen Ausgabeparameter 1 | 5 | Lesen und Schreiben | Zielslave-Station 4 numerische Größenparameter | ||
| 6 | bool | mbSalve4DO2 | Zielslave-Station 4 numerische Größen Ausgabeparameter 2 | 6 | Lesen und Schreiben | Zielslave-Station4 - numerische Ausgabeparameter | ||
| 7 | bool | mbSalve4DO3 | Zielslave-Station4 - numerische Ausgabeparameter 3 | 7 | Lesen und Schreiben | Zielslave-Station4 - numerische Ausgabeparameter | ||
| 8 | bool | mbSalve4DO4 | Zielslave-Station4 - numerische Ausgabeparameter 4 | 8 | Lesen und Schreiben | Ziel von Station 4 numerische Größenparameter | ||
Antwort veröffentlichen