- 1. 1.1、编写原因
- 2. 1.2、版权说明
- 3. 1.3、更新记录
- 4. 4.1.1、Funktionscode枚举
- 5. 4.1.2、ModbusStatus枚举
- 6. 4.1.3、站信息结构
- 7. 4.1.4、生成访问Von der StationPDU单元函数
- 8. 4.1.5、AnalyseLesen的返回Daten函数
- 9. 4.1.6、Von der Station生成Lesen von DatenBefehl的AntwortMeldung函数
- 10. 4.1.7、Funktionscode检验函数
- 11. 4.1.8、生成TCP客户端Befehl函数
- 12. 4.1.9、生成TCPDer ServerAntwort函数
- 13. 4.1.10、CRC-Test检查
- 14. 4.1.11、生成读写RTUVon der Station的HauptstationBefehl函数
- 15. 4.1.12、生成Von der Station应答信息Meldung函数
- 16. 4.1.13、LRC-Test检查函数
- 17. 4.1.14、将ASCII消息转换为16 Einführung
- 18. 4.1.15、生成读写ASCIIVon der Station的Befehl函数
- 19. 4.1.16、生成ASCIIVon der Station应答HauptstationBefehl的函数
- 20. 4.2.1、RTUHauptstation对象与Von der Station对象
- 21. 4.2.2、RTUHauptstation对象初始化函数
- 22. 4.2.3、生成RTUHauptstation访问Von der StationBefehl函数
- 23. 4.2.4、RTUHauptstationAnalyseVon der Station的Antwort函数
- 24. 4.2.5、RTUHauptstationAnalyseVon der Station返回消息Befehl匹配函数
- 25. 4.2.6、RTUVon der StationAnalyseHauptstation访问Befehl函数
- 26. 4.2.7、TCP客户端对象与TCPDer Server对象
- 27. 4.2.8、TCP客户端对象初始化函数
- 28. 4.2.9、生成TCP客户端访问Der ServerBefehl函数
- 29. 4.2.10、TCP客户端AnalyseDer Server返回信息函数
- 30. 4.2.11、TCPDer ServerAnalyse客户端Befehl函数
- 31. 4.2.12、ASCIIHauptstation对象与Von der Station对象
- 32. 4.2.13、ASCIIHauptstation对象初始化函数
- 33. 4.2.14、生成访问ASCIIVon der Station的Befehl
- 34. 4.2.15、ASCIIHauptstationAnalyseVon der Station的Antwort函数
- 35. 4.2.16、ASCIIHauptstationAnalyseVon der Station返回消息Befehl匹配函数
- 36. 4.2.17、ASCIIVon der StationAnalyseHauptstation访问Befehl函数
- 37. 4.3.1、获取线圈Quantität值的函数
- 38. 4.3.2、获取Importieren Status值的函数
- 39. 4.3.3、获取保持Registerwert的函数
- 40. 4.3.4、获取输入Registerwert的函数
- 41. 4.3.5、设置单个线圈的值函数
- 42. 4.3.6、设置单个Registerwert的函数
- 43. 4.3.7、设置mehrere Werte的函数
- 44. 4.3.8、设置mehrere Registerwerte的函数
- 45. 4.3.9、Von der Station更新Erlangen Sie的线圈Quantität值的函数
- 46. 4.3.10、Von der Station更新Erlangen Sie的Importieren Status值的函数
- 47. 4.3.11、Von der Station更新保持Registerwert的函数
- 48. 4.3.12、Von der Station更新输入Registerwert得函数
Kapitel 1 前言
Modbus是全球Die一个真正用于Industrie-Standort的总线Vereinbarung。Modbus通讯在工业网络通讯中应用十Unterteilung广泛,而且方便,受zu大家的欢迎。
1.1、编写原因
一直以来,在我们自己的产品和项目中都多次使用Modbus通讯Vereinbarung。每次都是使用者自行开发或者网上Suche nach符合要求的Quellencode。但每次的应用都有不同,每次都需要很多的重复劳动。而且Vereinbarung站如应用软件的紧密结合也使得代码有些混乱。所以一直以来都想要开发一个比较通用的Vereinbarung栈能在后续的项目中复用,而不必每次都写一遍。现在利用项目研发的机会,开发一个自己的ModbusVereinbarung栈。
1.2、版权说明
本套软件最初虽然是为了我们自用而开发,但现已在GitHub上开源。所以任何人都可以Kopieren.、传播和使用,无论是个人学习还是商业应用都没有限制。对应用方法及修改欢迎探讨,但对于在使用过程中出现了任何问题我们均不负责。
软件Quellencode及其说明可以上GitHub自由Download,DownloadAdresse:https://github.com/foxclever/Modbus
1.3、更新记录
前一个版本我们已经实现了基于串行链路的Modbus RTU和基于Ethernet的Modbus TCP两种。在这一个版本中,我们添加了基于串行链路的Modbus ASCII方式。并对上一个版本中已知的问题做了修正。
软件设计及本Dokumentation更新记录如下:
| 版本 | 更新说明 | Der Autor | 日期 |
| V1.0.0 | 初版,共5Kapitel,介绍了主要API函数 | 木南 | 2015Jahr5月8日 |
| V1.1.0 | 添加了Die6、7两Kapitel | 木南 | 2016Jahr12月23日 |
| V1.1.5 | 修改了3、4、5三Kapitel的大部Unterteilung内容 | 木南 | 2018Jahr2月20日 |
| V2.0.0 | 增加了ASCIIRelated内容,并修改已知问题 | 木南 | 2018Jahr9月18日 |
| V2.1.0 | 增加了RTU和ASCII多HauptstationOperationen的类容;增加了TCP客户端多网段Operationen的内容。 | 木南 | 2019Jahr4月29日 |
Kapitel 2、PDU函数
在应用Daten单元我们处理ModbusDaten通讯的基本MeldungDas Format,这些基本是通用的,目前版本只支持01、02、03、04、05、06、15、16Funktionscode。
4.1.1、Funktionscode枚举
/*定义Modbus的OperationenFunktionscode,支持01、02、03、04、05、06、15、16Funktionscode*/
typedef enum {
ReadCoilStatus=0x01, /*Lesen Sie den Zustand(读多个输出位的Status)*/
ReadInputStatus=0x02, /*读输入位Status(读多个输入位的Status)*/
ReadHoldingRegister=0x03, /*Lesen Sie das Register(读多个保持Register.的Zahlenwert)*/
ReadInputRegister=0x04, /*Eingangsregister lesen(读多个输入Register.的Zahlenwert)*/
WriteSingleCoil=0x05, /*强制单个线圈(强制单个输出位的Status)*/
WriteSingleRegister=0x06, /*预制单ein Register.(设定一ein Register.的Zahlenwert)*/
WriteMultipleCoil=0x0F, /*强制多个线圈(强制多个输出位的Status)*/
WriteMultipleRegister=0x10 /*预制多ein Register.(设定多ein Register.的Zahlenwert)*/
}FunctionCode;
4.1.2、ModbusStatus枚举
/*定义Empfangzu指令检测Fehler.时的Fehler.码*/
typedef enum{
MB_OK=0x00,
InvalidFunctionCode=0x01,//不合法Funktion代码
IllegalDataAddress=0x02,//非法的DatenAdresse
IllegalDataValues=0x03,//非法的Daten值或者范围
OperationFail=0x04
}ModbusStatus;
4.1.3、站信息结构
/*定义用于传递要访问Von der Station(Der Server)的信息*/
typedef struct{
uint8_t unitID;
FunctionCode functionCode;
uint16_t startingAddress;
uint16_t quantity;
}ObjAccessInfo;
定义用于传递Von der Station(Der Server)访问的各种信息,包括站Nr.、Funktionscode、Ausgang Adresse和Anzahl。
4.1.4、生成访问Von der StationPDU单元函数
/*作为RTUHauptstation(TCP客户端)时,生成读写RTUVon der Station(TCPDer Server)对象的Befehl*/
uint16_t GenerateReadWriteCommand(ObjAccessInfo objInfo,bool *statusList,uint16_t *registerList,uint8_t commandBytes[]);
Parameter:ObjAccessInfo objInfo,要访问的Von der Station对象
bool *statusList,需要往下写的StatusQuantität对象Daten列表
uint16_t *registerList,需要往下写的Register.Quantität对象的Daten列表
uint8_t commandBytes[],生成的访问Befehl
返回值:生成的访问Befehl的Länge,以Bytes为单位。
4.1.5、AnalyseLesen的返回Daten函数
/*AnalyseHauptstation(客户端)从Der ServerLesen的Daten*/
void TransformClientReceivedData(uint8_t * receivedMessage,uint16_t quantity,bool *statusList,uint16_t *registerLister);
Parameter:uint8_t * receivedMessage,Empfangzu的信息Meldung
uint16_t quantity,Lesen的对象Anzahl
bool *statusList,Analyse出来的Lesenzu的Status对象的Daten列表
uint16_t *registerLister,Analyse出来的Lesenzu的Register.对象的Daten列表
返回值:无
4.1.6、Von der Station生成Lesen von DatenBefehl的AntwortMeldung函数
/*生成Hauptstation读访问的Antwort,包括0x01、0x02、0x03、0x04Funktionscode,返回相应信息的Länge*/
uint16_t GenerateMasterAccessRespond(uint8_t *receivedMesasage,bool *statusList,uint16_t *registerList,uint8_t *respondBytes);
Parameter:uint8_t *receivedMesasage,Empfangzu的主战读OperationenMeldung
bool *statusList,Lesen的Von der StationStatus对象Daten列表
uint16_t *registerList,Lesenzu的Von der StationRegister.对象Daten列表
uint8_t *respondBytes,生成的Von der StationAntwortMeldung信息
返回值:AntwortMeldung的Länge,以Bytes为单位
4.1.7、Funktionscode检验函数
/*检查Funktionscode是否Richtig.*/
ModbusStatus CheckFunctionCode(FunctionCode fc);
Parameter:FunctionCode fc,Funktionscode,由枚举定义
返回值:ModbusOperationenStatus,由枚举定义
4.1.8、生成TCP客户端Befehl函数
//生成读写Der Server对象的Befehl
uint16_t SyntheticReadWriteTCPServerCommand(ObjAccessInfo objInfo,bool *statusList,uint16_t *registerList,uint8_t *commandBytes);
Parameter:ObjAccessInfo objInfo,TCPDer Server访问信息对象
bool *statusList,写Der ServerStatusQuantität对象Daten列表
uint16_t *registerList,写Der ServerRegister.Quantität对象Daten列表
uint8_t *commandBytes,erzeugte Befehle.信息Meldung
返回值:Befehl的Länge,以Bytes为单位
4.1.9、生成TCPDer ServerAntwort函数
/*合成对Der Server访问的Antwort*/
uint16_t SyntheticServerAccessRespond(uint8_t *receivedMesasage,bool *statusList,uint16_t *registerList,uint8_t *respondBytes);
Parameter:uint8_t *receivedMesasage,Empfangzu的客户端Befehl信息Meldung
bool *statusList,读TCPDer Server的StatusQuantität对象Daten列表
uint16_t *registerList,读TCPDer Server的Register.Quantität对象Daten列表
uint8_t *respondBytes,生成的Antwort客户端Befehl的Antwort信息Meldung
返回值:Antwort信息MeldungLänge,以Bytes为单位
4.1.10、CRC-Test检查
/*通过CRC-TestEmpfang的信息是否Richtig.*/
bool CheckRTUMessageIntegrity (uint8_t *message,uint8_t length);
Parameter:uint8_t *message,待Prüfungen的DatenMeldung
uint8_t length,带教言的DatenMeldungLänge,以Bytes为单位
返回值:返回Prüfungen是否通过的Status信Nr.
4.1.11、生成读写RTUVon der Station的HauptstationBefehl函数
/*生成读写Von der StationDaten对象的Befehl,BefehlLänge包括2个PrüfungenBytes*/
uint16_t SyntheticReadWriteSlaveCommand(ObjAccessInfo slaveInfo,bool *statusList,uint16_t *registerList,uint8_t *commandBytes);
Parameter:ObjAccessInfo slaveInfo,Von der Station访问信息对象,由结构体定义
bool *statusList,写Von der StationStatusQuantitätDaten列表
uint16_t *registerList,写Von der StationRegister.QuantitätDaten列表
uint8_t *commandBytes,生成的访问BefehlMeldung
返回值:访问Befehl的Länge,以Bytes为单位
4.1.12、生成Von der Station应答信息Meldung函数
/*生成Von der Station应答Hauptstation的Antwort*/
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,
返回值:生成的Antwort信息Meldung的Länge,以Bytes为单位
4.1.13、LRC-Test检查函数
/*判断ASCIIDaten信息是否Richtig.*/
bool CheckASCIIMessageIntegrity(uint8_t *usMsg, uint16_t usLength)
Parameter:uint8_t *usMsg,待Prüfungen的消息列表,16 EinführungDaten
uint16_t usLength,待Prüfungen的消息列表的Länge
返回值:PrüfungenErgebnis,PrüfungenRichtig.返回“true”,否则返回“false”
4.1.14、将ASCII消息转换为16 Einführung
/*Empfangzu的ASCII消息转换为16 Einführung*/
bool CovertAsciiMessageToHex(uint8_t *aMsg, uint8_t *hMsg, uint16_t aLen);
Parameter:uint8_t *aMsg,ASCII码信息
uint8_t *hMsg,转换后的16 Einführung信息
uint16_t aLen,ASCII码信息的Länge
返回值:转换是否Richtig.,转换Richtig.返回“true”,否则返回“false”
4.1.15、生成读写ASCIIVon der Station的Befehl函数
/*生成读写Von der Station的Befehl,应用于Hauptstation,含Prüfungen及AnfangEnde符*/
uint16_t SyntheticReadWriteAsciiSlaveCommand(ObjAccessInfo slaveInfo, bool *statusList, uint16_t *registerList, uint8_t *commandBytes)
Parameter:ObjAccessInfo slaveInfo,Von der Station访问信息对象,由结构体定义
bool *statusList,写Von der StationStatusQuantitätDaten列表
uint16_t *registerList,写Von der StationRegister.QuantitätDaten列表
uint8_t *commandBytes,生成的访问BefehlMeldung
返回值:访问Befehl的Länge,以Bytes为单位
4.1.16、生成ASCIIVon der Station应答HauptstationBefehl的函数
/*生成应答Hauptstation的Antwort,应用于Von der Station*/
uint16_t SyntheticAsciiSlaveAccessRespond(uint8_t *receivedMessage, bool *statusList, uint16_t *registerList, uint8_t *respondBytes)
Parameter:uint8_t *receivedMesasage,接受zuHauptstationMeldung信息
bool *statusList,HauptstationBefehl要Lesen的StatusQuantität值列表
uint16_t *registerList,HauptstationBefehl要Lesen的Register.Quantität值列表
uint8_t *respondBytes,生成的Antwort信息Meldung
返回值:生成的Antwort信息Meldung的Länge,以Bytes为单位
Kapitel 3、应用封装函数
对应用级封装,我们只封装RTUHauptstation应用,RTUVon der Station应用、TCP客户端应用和TCPDer Server端应用四类。
4.2.1、RTUHauptstation对象与Von der Station对象
/* 定义被访问RTUVon der Station对象Typus */
typedef struct AccessedRTUSlaveType{
uint8_t stationAddress; //站Adresse
uint8_t cmdOrder; //gegenwärtigBefehl在Befehl列表中的位置
uint16_t commandNumber; //Befehl列表中Befehl的总数
uint8_t (*pReadCommand)[8]; //读Befehl列表
uint8_t *pLastCommand; //上一次Senden Sie的Befehl
uint32_t flagPresetCoil; //预置线圈控制标志位
uint32_t flagPresetReg; //预置Register.控制标志位
}RTUAccessedSlaveType;
/* 定义本地RTUHauptstation对象Typus */
typedef struct LocalRTUMasterType{
uint32_t flagWriteSlave[8]; //写一个站控制标志位,最多256个站,与站Adresse对应。
uint16_t slaveNumber; //Von der Station列表中Von der Station的Anzahl
uint16_t readOrder; //gegenwärtigVon der Station在Von der Station列表中的位置
RTUAccessedSlaveType *pSlave; //Von der Station列表
UpdateCoilStatusType pUpdateCoilStatus; //更新线圈Quantität函数
UpdateInputStatusType pUpdateInputStatus; //更新Importieren StatusQuantität函数
UpdateHoldingRegisterType pUpdateHoldingRegister; //更新保持Register.Quantität函数
UpdateInputResgisterType pUpdateInputResgister; //更新输入Register.Quantität函数
}RTULocalMasterType;
4.2.2、RTUHauptstation对象初始化函数
/*初始化RTUHauptstation对象*/
void InitializeRTUMasterObject(RTULocalMasterType *master,uint16_t slaveNumber,RTUAccessedSlaveType *pSlave,UpdateCoilStatusType pUpdateCoilStatus,UpdateInputStatusType pUpdateInputStatus,UpdateHoldingRegisterType pUpdateHoldingRegister,UpdateInputResgisterType pUpdateInputResgister);
Parameter:RTULocalMasterType *master,本地Hauptstation对象
uint16_t slaveNumber,Von der Station的Anzahl
RTUAccessedSlaveType *pSlave,Von der Station列表
UpdateCoilStatusType pUpdateCoilStatus,更新线圈Quantität函数指针
UpdateInputStatusType pUpdateInputStatus,更新StatusQuantität函数指针
UpdateHoldingRegisterType pUpdateHoldingRegister,更新保持Register.Quantität函数指针
UpdateInputResgisterType pUpdateInputResgister,更新输入Register.Quantität函数指针
返回值:无返回值
4.2.3、生成RTUHauptstation访问Von der StationBefehl函数
/*生成访问Der Server的Befehl*/
uint16_t CreateAccessSlaveCommand(ObjAccessInfo objInfo,void *dataList,uint8_t *commandBytes);
Parameter:ObjAccessInfo objInfo,Von der Station访问信息对象,由结构体定义
void *dataList,写Von der Station对象的Daten列表
uint8_t *commandBytes,erzeugte Befehle.Meldung
返回值:生成的访问Befehl的Länge,以Bytes为单位
4.2.4、RTUHauptstationAnalyseVon der Station的Antwort函数
/*Analyse收zu的Der ServerAntwort信息*/
void ParsingSlaveRespondMessage(uint8_t *recievedMessage,uint8_t *command);
Parameter:uint8_t *recievedMessage,Empfangzu的返回信息
uint8_t *command,已经下发zuVon der Station的Befehl列表
返回值:无
4.2.5、RTUHauptstationAnalyseVon der Station返回消息Befehl匹配函数
/*Empfangzu返回信息后,判断是否是Befehle senden列表中Befehl的返回信息*/
int FindCommandForRecievedMessage(uint8_t *recievedMessage,uint8_t (*commandList)[8],uint16_t commandNumber);
Parameter:uint8_t *recievedMessage,Empfang的Von der Station返回信息
uint8_t (*commandList)[8],Hauptstation下发过的Befehl列表
uint16_t commandNumber,存储的Befehl的条数
返回值:返回匹配Befehl所在的位置,无匹配时,返回“-1”
本函数只在RTUHauptstation中,访问的DatenQuantität大且频繁,或者访问多个Von der Station时使用,便于作Richtig.的DatenAnalyse。
4.2.6、RTUVon der StationAnalyseHauptstation访问Befehl函数
/*AnalyseEmpfangzu的信息,并返回合成的回复信息和信息的BytesLänge,通过回调函数*/
uint16_t ParsingMasterAccessCommand(uint8_t *receivedMesasage,uint8_t *respondBytes,uint16_t rxLength);
Parameter:uint8_t *receivedMesasage,Empfangzu的HauptstationMeldung信息
uint8_t *respondBytes,Erstellen von Reaktionen信息Meldung
uint16_t rxLength,Empfangzu的Meldung的Länge
返回值:生成的Antwort信息的Länge,以Bytes为单位
4.2.7、TCP客户端对象与TCPDer Server对象
/* 定义被访问TCPDer Server对象Typus */
typedef struct AccessedTCPServerType{
union {
uint32_t ipNumber;
uint8_t ipSegment[4];
}ipAddress; //Der Server的IPAdresse
uint32_t flagPresetServer; //写Der ServerBitte标志
WritedCoilListHeadNode pWritedCoilHeadNode; //可写的线圈Quantität列表
WritedRegisterListHeadNode pWritedRegisterHeadNode; //可写的保持Register.列表
struct AccessedTCPServerType *pNextNode; //下一个TCPDer Server节点
}TCPAccessedServerType;
/* 定义Der Server链表头Typus */
typedef struct ServerListHeadType {
TCPAccessedServerType *pServerNode; //Der Server节点指针
uint32_t serverNumber; //Der Server的Anzahl
}ServerListHeadNode;
/* 定义本地TCP客户端对象Typus */
typedef struct LocalTCPClientType{
uint32_t transaction; //Transaktionsidentifikator
uint16_t cmdNumber; //读Der ServerBefehl的Anzahl
uint16_t cmdOrder; //gegenwärtigVon der Station在Von der Station列表中的位置
uint8_t (*pReadCommand)[12]; //读Befehl列表
ServerListHeadNode ServerHeadNode; //Server对象链表的头节点
UpdateCoilStatusType pUpdateCoilStatus; //更新线圈Quantität函数
UpdateInputStatusType pUpdateInputStatus; //更新Importieren StatusQuantität函数
UpdateHoldingRegisterType pUpdateHoldingRegister; //更新保持Register.Quantität函数
UpdateInputResgisterType pUpdateInputResgister; //更新输入Register.Quantität函数
}TCPLocalClientType;
4.2.8、TCP客户端对象初始化函数
/*初始化TCP客户端对象*/
void InitializeTCPClientObject(TCPLocalClientType *client,uint16_t cmdNumber,uint8_t (*pReadCommand)[12],UpdateCoilStatusType pUpdateCoilStatus,UpdateInputStatusType pUpdateInputStatus,UpdateHoldingRegisterType pUpdateHoldingRegister,UpdateInputResgisterType pUpdateInputResgister);
Parameter:TCPLocalClientType *client,客户端对象
uint16_t cmdNumber,读Befehl的Anzahl
uint8_t (*pReadCommand)[12],读Befehl列表
UpdateCoilStatusType pUpdateCoilStatus,更新线圈Quantität函数指针
UpdateInputStatusType pUpdateInputStatus,更新StatusQuantität函数指针
UpdateHoldingRegisterType pUpdateHoldingRegister,更新保持Register.函数指针
UpdateInputResgisterType pUpdateInputResgister,更新输入Register.Quantität函数指针
返回值:无返回值
4.2.9、生成TCP客户端访问Der ServerBefehl函数
/*生成访问Der Server的Befehl*/
uint16_t CreateAccessServerCommand(ObjAccessInfo objInfo,void *dataList,uint8_t *commandBytes);
Parameter:ObjAccessInfo objInfo,访问Der Server信息对象
void *dataList,些Der Server对象Daten列表
uint8_t *commandBytes,生成的访问Der ServerBefehlMeldung
返回值:访问Befehl的Länge,以Bytes为单位
4.2.10、TCP客户端AnalyseDer Server返回信息函数
/*Analyse收zu的Der Server相应信息*/
void ParsingServerRespondMessage(uint8_t *recievedMessage);
Parameter:uint8_t *recievedMessage,接受zu的Der ServerAntwort信息
返回值:无
4.2.11、TCPDer ServerAnalyse客户端Befehl函数
/*AnalyseEmpfangzu的信息,Zurück zur AntwortBefehl的Länge*/
uint16_t ParsingClientAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes);
Parameter:uint8_t *receivedMessage,接受zu的客户端访问Befehl
uint8_t *respondBytes,生成的Der ServerAntwort信息
返回值:生成的Antwort信息Meldung的Länge,以Bytes为单位
4.2.12、ASCIIHauptstation对象与Von der Station对象
/* 定义被访问ASCIIVon der Station对象Typus */
typedef struct AccessedASCIISlaveType{
uint8_t stationAddress; //站Adresse
uint8_t cmdOrder; //gegenwärtigBefehl在Befehl列表中的位置
uint16_t commandNumber; //Befehl列表中Befehl的总数
uint8_t (*pReadCommand)[17]; //读Befehl列表
uint8_t *pLastCommand; //上一次Senden Sie的Befehl
uint32_t flagPresetCoil; //预置线圈控制标志位
uint32_t flagPresetReg; //预置Register.控制标志位
}AsciiAccessedSlaveType;
/* 定义本地ASCIIHauptstation对象Typus */
typedef struct LocalASCIIMasterType{
uint32_t flagWriteSlave[8]; //写一个站控制标志位,最多256个站,与站Adresse对应。
uint16_t slaveNumber; //Von der Station列表中Von der Station的Anzahl
uint16_t readOrder; //gegenwärtigVon der Station在Von der Station列表中的位置
AsciiAccessedSlaveType *pSlave; //Von der Station列表
UpdateCoilStatusType pUpdateCoilStatus; //更新线圈Quantität函数
UpdateInputStatusType pUpdateInputStatus; //更新Importieren StatusQuantität函数
UpdateHoldingRegisterType pUpdateHoldingRegister; //更新保持Register.Quantität函数
UpdateInputResgisterType pUpdateInputResgister; //更新输入Register.Quantität函数
}AsciiLocalMasterType;
4.2.13、ASCIIHauptstation对象初始化函数
/*初始化RTUHauptstation对象*/
void InitializeASCIIMasterObject(AsciiLocalMasterType *master,uint16_t slaveNumber,AsciiAccessedSlaveType *pSlave,UpdateCoilStatusType pUpdateCoilStatus,UpdateInputStatusType pUpdateInputStatus,UpdateHoldingRegisterType pUpdateHoldingRegister,UpdateInputResgisterType pUpdateInputResgister);
Parameter:AsciiLocalMasterType *master,ASCIIHauptstation对象
uint16_t slaveNumber,Von der Station的Anzahl
AsciiAccessedSlaveType *pSlave,Von der Station列表
UpdateCoilStatusType pUpdateCoilStatus,更新线圈Quantität回调函数
UpdateInputStatusType pUpdateInputStatus,更新StatusQuantität回调函数
UpdateHoldingRegisterType pUpdateHoldingRegister,更新保持Register.Quantität回调函数
UpdateInputResgisterType pUpdateInputResgister,更新输入Register.Quantität回调函数
返回值:无返回值
4.2.14、生成访问ASCIIVon der Station的Befehl
/*生成访问ASCIIVon der Station的Befehl*/
uint16_t CreateAccessAsciiSlaveCommand(ObjAccessInfo objInfo,void *dataList,uint8_t *commandBytes);
Parameter:ObjAccessInfo objInfo,Von der Station访问信息对象,由结构体定义
void *dataList,写Von der Station对象的Daten列表
uint8_t *commandBytes,erzeugte Befehle.Meldung
返回值:生成的访问Befehl的Länge,以Bytes为单位
4.2.15、ASCIIHauptstationAnalyseVon der Station的Antwort函数
/*Analyse收zu的Der Server相应信息*/
void ParsingAsciiSlaveRespondMessage(uint8_t *recievedMessage, uint8_t *command,uint16_t rxLength);
Parameter:uint8_t *recievedMessage,Empfangzu的返回信息
uint8_t *command,已经下发zuVon der Station的Befehl列表
uint16_t rxLength,Empfangzu的消息的Länge
返回值:无
4.2.16、ASCIIHauptstationAnalyseVon der Station返回消息Befehl匹配函数
/*Empfangzu返回信息后,判断是否是Befehle senden列表中Befehl的返回信息*/
int FindAsciiCommandForRecievedMessage(uint8_t *recievedMessage,uint8_t (*commandList)[17],uint16_t commandNumber);
Parameter:uint8_t *recievedMessage,Empfang的Von der Station返回信息
uint8_t (*commandList)[17],Hauptstation下发过的Befehl列表
uint16_t commandNumber,存储的Befehl的条数
返回值:返回匹配Befehl所在的位置,无匹配时,返回“-1”
本函数只在RTUHauptstation中,访问的DatenQuantität大且频繁,或者访问多个Von der Station时使用,便于作Richtig.的DatenAnalyse。
4.2.17、ASCIIVon der StationAnalyseHauptstation访问Befehl函数
/*AnalyseEmpfangzu的信息,并返回合成的回复信息和信息的BytesLänge,通过回调函数*/
uint16_t ParsingAsciiMasterAccessCommand(uint8_t *receivedMessage, uint8_t *respondBytes, uint16_t rxLength, uint8_t StationAddress);
Parameter:uint8_t *receivedMesasage,Empfangzu的HauptstationMeldung信息
uint8_t *respondBytes,Erstellen von Reaktionen信息Meldung
uint16_t rxLength,Empfangzu的Meldung的Länge
返回值:生成的Antwort信息的Länge,以Bytes为单位
Kapitel 4、Daten处理函数
具体应用中还涉及zu对Daten对想的处理,不同的应用Daten结构与处理方式千schlecht万别,所以定义一些回调函数(实际使用弱化的函数__weak关键字)用于Daten的处理。
4.3.1、获取线圈Quantität值的函数
/*获取想要Lesen的CoilQuantität的值*/
__weak void GetCoilStatus(uint16_t startAddress,uint16_t quantity,bool *statusList)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t startAddress,要Lesen对象的Ausgang Adresse
uint16_t quantity,要Lesen对象的Anzahl
bool *statusList,获取的线圈Quantität的Daten值列表
返回值:无
4.3.2、获取Importieren Status值的函数
/*获取想要Lesen的InputStatusQuantität的值*/
__weak void GetInputStatus(uint16_t startAddress,uint16_t quantity,bool *statusValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t startAddress,要Lesen对象的Ausgang Adresse
uint16_t quantity,要Lesen对象的Anzahl
bool *statusValue,获取的Importieren StatusQuantität的Daten值列表
返回值:无
4.3.3、获取保持Registerwert的函数
/*获取想要Lesen的保持Register.的值*/
__weak void GetHoldingRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t startAddress,要Lesen的保持Register.对象的Ausgang Adresse
uint16_t quantity,要Lesen的保持Register.的Anzahl
uint16_t *registerValue,获取的保持Register.的值
返回值:无
4.3.4、获取输入Registerwert的函数
/*获取想要Lesen的输入Register.的值*/
__weak void GetInputRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t startAddress,要Lesen的输入Register.的Ausgang Adresse
uint16_t quantity,要Lesen的输入Register.的Anzahl
uint16_t *registerValue,获取的输入Register.的值
返回值:无
4.3.5、设置单个线圈的值函数
/*设置单个线圈的值*/
__weak void SetSingleCoil(uint16_t coilAddress,bool coilValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t coilAddress,所需要预置值的Schleife Adresse
bool coilValue,所预置的值
返回值:无
4.3.6、设置单个Registerwert的函数
/*设置单ein Register.的值*/
__weak void SetSingleRegister(uint16_t registerAddress,uint16_t registerValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t registerAddress,所预置的保持Register.的Adresse
uint16_t registerValue,所预置的保持Register.的值
返回值:无
4.3.7、设置mehrere Werte的函数
/*设置多个线圈的值*/
__weak void SetMultipleCoil(uint16_t startAddress,uint16_t quantity,bool *statusValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t startAddress,要预置的多个线圈的Ausgang Adresse
uint16_t quantity,所要预知的线圈的Anzahl
bool *statusValue,要预知的线圈值的列表
返回值:无
4.3.8、设置mehrere Registerwerte的函数
/*设置多ein Register.的值*/
__weak void SetMultipleRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)
{
//如果需要Modbus TCP Server/RTU Slave应用中实现具体内容
}
Parameter:uint16_t startAddress,所预置的多个保持Register.的Ausgang Adresse
uint16_t quantity,所要预置的保持Register.的Anzahl
uint16_t *registerValue,预知的保持Registerwert的列表
返回值:无
4.3.9、Von der Station更新Erlangen Sie的线圈Quantität值的函数
/*更新读回来的Zustand der Coil*/
__weak void UpdateCoilStatus(uint16_t startAddress,uint16_t quantity,bool *stateValue)
{
//在客户端(Hauptstation)应用中实现
}
Parameter:uint16_t startAddress,Lesen值的线圈对象的Ausgang Adresse
uint16_t quantity,所Lesen的线圈的Anzahl
bool *stateValue,Lesen的Schleife Adresse的列表
返回值:无
本程序为默认处理函数,各个Hauptstation对象可以单独定义更新函数,若没有定义则调用本函数。
4.3.10、Von der Station更新Erlangen Sie的Importieren Status值的函数
/*更新读回来的Importieren Status值*/
__weak void UpdateInputStatus(uint16_t startAddress,uint16_t quantity,bool *stateValue)
{
//在客户端(Hauptstation)应用中实现
}
Parameter:uint16_t startAddress,所Lesen的Importieren Status对象的Ausgang Adresse
uint16_t quantity,所Lesen的Importieren Status对象的Anzahl
bool *stateValue,Lesenzu的Importieren Status对象的值
返回值:无
本程序为默认处理函数,各个Hauptstation对象可以单独定义更新函数,若没有定义则调用本函数。
4.3.11、Von der Station更新保持Registerwert的函数
/*更新读回来的保持Register.*/
__weak void UpdateHoldingRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)
{
//在客户端(Hauptstation)应用中实现
}
Parameter:uint16_t startAddress,所Lesen的保持Register.对象的Ausgang Adresse
uint16_t quantity,所Lesen的保持Register.对象的Daten
uint16_t *registerValue,Lesenzu的保持Register.对象值列表
返回值:无
本程序为默认处理函数,各个Hauptstation对象可以单独定义更新函数,若没有定义则调用本函数。
4.3.12、Von der Station更新输入Registerwert得函数
/*更新读回来的输入Register.*/
__weak void UpdateInputResgister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue)
{
//在客户端(Hauptstation)应用中实现
}
Parameter:uint16_t startAddress,所Lesen的输入Register.对象的Ausgang Adresse
uint16_t quantity,所Lesen的输入Register.对象的Anzahl
uint16_t *registerValue,Lesenzu的输入Registerwert得列表
返回值:无
本程序为默认处理函数,各个Hauptstation对象可以单独定义更新函数,若没有定义则调用本函数。
Kapitel 5 一些Related说明
对于ModbusVereinbarung栈的整个开发内容,前面已经说得很清楚了,接下来我们说明一下与开发没有直接关系的内容。
首先,关于我为什么开发这个Vereinbarung栈的问题。我们的初衷只是想能够在开发产品时不用每次都重写这一部Unterteilung,而是可以不断的改进和使用达zu复用的目的。当然在后来,我们觉得不只是我们自己可以使用,也可以将其公开,让任何愿意使用的人使用。Quellencode网址是:https://github.com/foxclever/Modbus
其次,ModbusVereinbarung有国标,包括三个文件。我们这个Vereinbarung栈就是按照国标开发的标准Vereinbarung,包括有读写各种Typus对象Daten的Funktion,在一般的工业应用场合是完全够的。三个标准文件:
GB/T 19582.1-2008 《基于ModbusVereinbarung的Industrielle Automatisierung网络规范 Die1部Unterteilung:Modbus应用Vereinbarung》
GB/T 19582.2-2008 《基于ModbusVereinbarung的Industrielle Automatisierung网络规范 Die1部Unterteilung:ModbusVereinbarung在串行链路上的实现指南》
GB/T 19582.3-2008 《基于ModbusVereinbarung的Industrielle Automatisierung网络规范 Die1部Unterteilung:ModbusVereinbarung在TCP/IP上的实现指南》
最后,欢迎大家使用这个Vereinbarung栈,但我们不就使用的最终Ergebnis负责。当然如果发现任何的不足,我们非常并欢迎大家将发现的问题告知我们,以便我们持续的改进之。
感谢您关注本软件,有需要的同仁可以上GitHubDownload,同时欢迎给我们提出改进意见,有兴趣的同仁可以关注我们的公众Nr.:
| ModbusVereinbarung栈综合实例Parameter列表 | ||||||||
| 站Adresse:1;Porter Rate:115200;Datenplatz:8;Stoppen Sie Platz:1;无Prüfungen | ||||||||
| Seriennummer. | Datentyp | 变QuantitätName | ParameterName | Adresse | 读写属性 | 取值范围 | 缺省值 | 描述 |
| 1 | uint32_t | beatTime | 心跳检测 | 40001 | 只读 | 每秒增加1次,监视Das System是否正常Betrieb | ||
| 2 | float | mbAI1 | 模拟Quantität测试 | 40003 | 只读 | mbAO1*3 | ||
| 3 | float | mbAO1 | 模拟Quantität测试 | 40005 | 读写 | 0~100.0 | 1.101 | |
| 4 | uint16_t | mbAI2 | 模拟Quantität测试 | 40007 | 只读 | mbAO2*2 | ||
| 5 | uint16_t | mbAO2 | 模拟Quantität测试 | 40008 | 读写 | 0~100 | 1 | 本站变Quantität |
| 1 | float | mbSalve1AI1 | 目标Von der Station1的模拟Quantität输入Parameter1 | 40009 | 只读 | 目标Von der Station1模拟Parameter | ||
| 2 | uint32_t | mbSalve1AI2 | 目标Von der Station1的模拟Quantität输入Parameter2 | 40011 | 只读 | 目标Von der Station1模拟Parameter | ||
| 5 | uint16_t | mbSalve1AI3 | 目标Von der Station1的模拟Quantität输入Parameter3 | 40013 | 只读 | 0 | 目标Von der Station1模拟Parameter | |
| 6 | uint16_t | mbSalve1AO1 | 目标Von der Station1的模拟Quantität输出Parameter1 | 40014 | 读写 | 101 | 目标Von der Station1模拟Parameter | |
| 7 | uint16_t | mbSalve1AO2 | 目标Von der Station1的模拟Quantität输出Parameter2 | 40015 | 读写 | 102 | 目标Von der Station1模拟Parameter | |
| 8 | uint16_t | mbSalve1AO3 | 目标Von der Station1的模拟Quantität输出Parameter3 | 40016 | 读写 | 103 | 目标Von der Station1模拟Parameter | |
| 1 | float | mbSalve2AI1 | 目标Von der Station2的模拟Quantität输入Parameter1 | 40017 | 只读 | 目标Von der Station2模拟Parameter | ||
| 2 | uint32_t | mbSalve2AI2 | 目标Von der Station2的模拟Quantität输入Parameter2 | 40019 | 只读 | 目标Von der Station2模拟Parameter | ||
| 5 | uint16_t | mbSalve2AI3 | 目标Von der Station2的模拟Quantität输入Parameter3 | 40021 | 只读 | 0 | 目标Von der Station2模拟Parameter | |
| 6 | uint16_t | mbSalve2AO1 | 目标Von der Station2的模拟Quantität输出Parameter1 | 40022 | 读写 | 目标Von der Station2模拟Parameter | ||
| 7 | uint16_t | mbSalve2AO2 | 目标Von der Station2的模拟Quantität输出Parameter2 | 40023 | 读写 | 0 | 目标Von der Station2模拟Parameter | |
| 8 | uint16_t | mbSalve2AO3 | 目标Von der Station2的模拟Quantität输出Parameter3 | 40024 | 读写 | 0 | 目标Von der Station2模拟Parameter | |
| 1 | float | mbSalve3AI1 | 目标Von der Station3的模拟Quantität输入Parameter1 | 40025 | 只读 | 目标Von der Station3模拟Parameter | ||
| 2 | uint32_t | mbSalve3AI2 | 目标Von der Station3的模拟Quantität输入Parameter2 | 40027 | 只读 | 目标Von der Station3模拟Parameter | ||
| 5 | uint16_t | mbSalve3AI3 | 目标Von der Station3的模拟Quantität输入Parameter3 | 40029 | 只读 | 0 | 目标Von der Station3模拟Parameter | |
| 6 | uint16_t | mbSalve3AO1 | 目标Von der Station3的模拟Quantität输出Parameter1 | 40030 | 读写 | 目标Von der Station3模拟Parameter | ||
| 7 | uint16_t | mbSalve3AO2 | 目标Von der Station3的模拟Quantität输出Parameter2 | 40031 | 读写 | 0 | 目标Von der Station3模拟Parameter | |
| 8 | uint16_t | mbSalve3AO3 | 目标Von der Station3的模拟Quantität输出Parameter3 | 40032 | 读写 | 0 | 目标Von der Station3模拟Parameter | |
| 1 | float | mbSalve4AI1 | 目标Von der Station4的模拟Quantität输入Parameter1 | 40033 | 只读 | 目标Von der Station4模拟Parameter | ||
| 2 | uint32_t | mbSalve4AI2 | 目标Von der Station4的模拟Quantität输入Parameter2 | 40035 | 只读 | 目标Von der Station4模拟Parameter | ||
| 5 | uint16_t | mbSalve4AI3 | 目标Von der Station4的模拟Quantität输入Parameter3 | 40037 | 只读 | 0 | 目标Von der Station4模拟Parameter | |
| 6 | uint16_t | mbSalve4AO1 | 目标Von der Station4的模拟Quantität输出Parameter1 | 40038 | 读写 | 目标Von der Station4模拟Parameter | ||
| 7 | uint16_t | mbSalve4AO2 | 目标Von der Station4的模拟Quantität输出Parameter2 | 40039 | 读写 | 0 | 目标Von der Station4模拟Parameter | |
| 8 | uint16_t | mbSalve4AO3 | 目标Von der Station4的模拟Quantität输出Parameter3 | 40040 | 读写 | 0 | 目标Von der Station4模拟Parameter | |
| 1 | bool | mbDI1 | 数字Quantität输入Parameter1 | 1 | 只读 | 数字QuantitätParameter | ||
| 2 | bool | mbDI2 | 数字Quantität输入Parameter2 | 2 | 只读 | 数字QuantitätParameter | ||
| 3 | bool | mbDI3 | 数字Quantität输入Parameter3 | 3 | 只读 | 数字QuantitätParameter | ||
| 4 | bool | mbDI4 | 数字Quantität输入Parameter4 | 4 | 只读 | 数字QuantitätParameter | ||
| 5 | bool | mbDO1 | 数字Quantität输出Parameter1 | 5 | 读写 | 数字QuantitätParameter | ||
| 6 | bool | mbDO2 | 数字Quantität输出Parameter2 | 6 | 读写 | 数字QuantitätParameter | ||
| 7 | bool | mbDO3 | 数字Quantität输出Parameter3 | 7 | 读写 | 数字QuantitätParameter | ||
| 8 | bool | mbDO4 | 数字Quantität输出Parameter4 | 8 | 读写 | 数字QuantitätParameter | ||
| 1 | bool | mbSalve1DI1 | 目标Von der Station1的数字Quantität输入Parameter1 | 9 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 2 | bool | mbSalve1DI2 | 目标Von der Station1的数字Quantität输入Parameter2 | 10 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 3 | bool | mbSalve1DI3 | 目标Von der Station1的数字Quantität输入Parameter3 | 11 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 4 | bool | mbSalve1DI4 | 目标Von der Station1的数字Quantität输入Parameter4 | 12 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 5 | bool | mbSalve1DO1 | 目标Von der Station1的数字Quantität输出Parameter1 | 13 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 6 | bool | mbSalve1DO2 | 目标Von der Station1的数字Quantität输出Parameter2 | 14 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 7 | bool | mbSalve1DO3 | 目标Von der Station1的数字Quantität输出Parameter3 | 15 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 8 | bool | mbSalve1DO4 | 目标Von der Station1的数字Quantität输出Parameter4 | 16 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 1 | bool | mbSalve2DI1 | 目标Von der Station2的数字Quantität输入Parameter1 | 17 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 2 | bool | mbSalve2DI2 | 目标Von der Station2的数字Quantität输入Parameter2 | 18 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 3 | bool | mbSalve2DI3 | 目标Von der Station2的数字Quantität输入Parameter3 | 19 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 4 | bool | mbSalve2DI4 | 目标Von der Station2的数字Quantität输入Parameter4 | 20 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 5 | bool | mbSalve2DO1 | 目标Von der Station2的数字Quantität输出Parameter1 | 21 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 6 | bool | mbSalve2DO2 | 目标Von der Station2的数字Quantität输出Parameter2 | 22 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 7 | bool | mbSalve2DO3 | 目标Von der Station2的数字Quantität输出Parameter3 | 23 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 8 | bool | mbSalve2DO4 | 目标Von der Station2的数字Quantität输出Parameter4 | 24 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 1 | bool | mbSalve3DI1 | 目标Von der Station3的数字Quantität输入Parameter1 | 25 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 2 | bool | mbSalve3DI2 | 目标Von der Station3的数字Quantität输入Parameter2 | 26 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 3 | bool | mbSalve3DI3 | 目标Von der Station3的数字Quantität输入Parameter3 | 27 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 4 | bool | mbSalve3DI4 | 目标Von der Station3的数字Quantität输入Parameter4 | 28 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 5 | bool | mbSalve3DO1 | 目标Von der Station3的数字Quantität输出Parameter1 | 29 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 6 | bool | mbSalve3DO2 | 目标Von der Station3的数字Quantität输出Parameter2 | 30 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 7 | bool | mbSalve3DO3 | 目标Von der Station3的数字Quantität输出Parameter3 | 31 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 8 | bool | mbSalve3DO4 | 目标Von der Station3的数字Quantität输出Parameter4 | 32 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 1 | bool | mbSalve4DI1 | 目标Von der Station4的数字Quantität输入Parameter1 | 33 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 2 | bool | mbSalve4DI2 | 目标Von der Station4的数字Quantität输入Parameter2 | 34 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 3 | bool | mbSalve4DI3 | 目标Von der Station4的数字Quantität输入Parameter3 | 35 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 4 | bool | mbSalve4DI4 | 目标Von der Station4的数字Quantität输入Parameter4 | 36 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 5 | bool | mbSalve4DO1 | 目标Von der Station4的数字Quantität输出Parameter1 | 37 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 6 | bool | mbSalve4DO2 | 目标Von der Station4的数字Quantität输出Parameter2 | 38 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 7 | bool | mbSalve4DO3 | 目标Von der Station4的数字Quantität输出Parameter3 | 39 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 8 | bool | mbSalve4DO4 | 目标Von der Station4的数字Quantität输出Parameter4 | 40 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 目标Von der Station1Parameter列表 | ||||||||
| 站Adresse:1;Porter Rate:9600;Datenplatz:8;Stoppen Sie Platz:1;无Prüfungen | ||||||||
| Seriennummer. | Datentyp | 变QuantitätName | ParameterName | Adresse | 读写属性 | 取值范围 | 缺省值 | 描述 |
| 1 | float | mbSalve1AI1 | 目标Von der Station1的模拟Quantität输入Parameter1 | 40001 | 只读 | 目标Von der Station1模拟Parameter | ||
| 2 | uint32_t | mbSalve1AI2 | 目标Von der Station1的模拟Quantität输入Parameter2 | 40003 | 只读 | 目标Von der Station1模拟Parameter | ||
| 5 | uint16_t | mbSalve1AI3 | 目标Von der Station1的模拟Quantität输入Parameter3 | 40005 | 只读 | 0 | 目标Von der Station1模拟Parameter | |
| 6 | uint16_t | mbSalve1AO1 | 目标Von der Station1的模拟Quantität输出Parameter1 | 40006 | 读写 | 目标Von der Station1模拟Parameter | ||
| 7 | uint16_t | mbSalve1AO2 | 目标Von der Station1的模拟Quantität输出Parameter2 | 40007 | 读写 | 0 | 目标Von der Station1模拟Parameter | |
| 8 | uint16_t | mbSalve1AO3 | 目标Von der Station1的模拟Quantität输出Parameter3 | 40008 | 读写 | 0 | 目标Von der Station1模拟Parameter | |
| 1 | bool | mbSalve1DI1 | 目标Von der Station1的数字Quantität输入Parameter1 | 1 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 2 | bool | mbSalve1DI2 | 目标Von der Station1的数字Quantität输入Parameter2 | 2 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 3 | bool | mbSalve1DI3 | 目标Von der Station1的数字Quantität输入Parameter3 | 3 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 4 | bool | mbSalve1DI4 | 目标Von der Station1的数字Quantität输入Parameter4 | 4 | 只读 | 目标Von der Station1数字QuantitätParameter | ||
| 5 | bool | mbSalve1DO1 | 目标Von der Station1的数字Quantität输出Parameter1 | 5 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 6 | bool | mbSalve1DO2 | 目标Von der Station1的数字Quantität输出Parameter2 | 6 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 7 | bool | mbSalve1DO3 | 目标Von der Station1的数字Quantität输出Parameter3 | 7 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 8 | bool | mbSalve1DO4 | 目标Von der Station1的数字Quantität输出Parameter4 | 8 | 读写 | 目标Von der Station1数字QuantitätParameter | ||
| 目标Von der Station2Parameter列表 | ||||||||
| 站Adresse:2;Porter Rate:9600;Datenplatz:8;Stoppen Sie Platz:1;无Prüfungen | ||||||||
| Seriennummer. | Datentyp | 变QuantitätName | ParameterName | Adresse | 读写属性 | 取值范围 | 缺省值 | 描述 |
| 1 | float | mbSalve2AI1 | 目标Von der Station2的模拟Quantität输入Parameter1 | 40001 | 只读 | 目标Von der Station2模拟Parameter | ||
| 2 | uint32_t | mbSalve2AI2 | 目标Von der Station2的模拟Quantität输入Parameter2 | 40003 | 只读 | 目标Von der Station2模拟Parameter | ||
| 5 | uint16_t | mbSalve2AI3 | 目标Von der Station2的模拟Quantität输入Parameter3 | 40005 | 只读 | 0 | 目标Von der Station2模拟Parameter | |
| 6 | uint16_t | mbSalve2AO1 | 目标Von der Station2的模拟Quantität输出Parameter1 | 40006 | 读写 | 目标Von der Station2模拟Parameter | ||
| 7 | uint16_t | mbSalve2AO2 | 目标Von der Station2的模拟Quantität输出Parameter2 | 40007 | 读写 | 0 | 目标Von der Station2模拟Parameter | |
| 8 | uint16_t | mbSalve2AO3 | 目标Von der Station2的模拟Quantität输出Parameter3 | 40008 | 读写 | 0 | 目标Von der Station2模拟Parameter | |
| 1 | bool | mbSalve2DI1 | 目标Von der Station2的数字Quantität输入Parameter1 | 1 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 2 | bool | mbSalve2DI2 | 目标Von der Station2的数字Quantität输入Parameter2 | 2 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 3 | bool | mbSalve2DI3 | 目标Von der Station2的数字Quantität输入Parameter3 | 3 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 4 | bool | mbSalve2DI4 | 目标Von der Station2的数字Quantität输入Parameter4 | 4 | 只读 | 目标Von der Station2数字QuantitätParameter | ||
| 5 | bool | mbSalve2DO1 | 目标Von der Station2的数字Quantität输出Parameter1 | 5 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 6 | bool | mbSalve2DO2 | 目标Von der Station2的数字Quantität输出Parameter2 | 6 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 7 | bool | mbSalve2DO3 | 目标Von der Station2的数字Quantität输出Parameter3 | 7 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 8 | bool | mbSalve2DO4 | 目标Von der Station2的数字Quantität输出Parameter4 | 8 | 读写 | 目标Von der Station2数字QuantitätParameter | ||
| 目标Von der Station1Parameter列表 | ||||||||
| 站Adresse:3;Porter Rate:9600;Datenplatz:8;Stoppen Sie Platz:1;无Prüfungen | ||||||||
| Seriennummer. | Datentyp | 变QuantitätName | ParameterName | Adresse | 读写属性 | 取值范围 | 缺省值 | 描述 |
| 1 | float | mbSalve3AI1 | 目标Von der Station3的模拟Quantität输入Parameter1 | 40001 | 只读 | 目标Von der Station3模拟Parameter | ||
| 2 | uint32_t | mbSalve3AI2 | 目标Von der Station3的模拟Quantität输入Parameter2 | 40003 | 只读 | 目标Von der Station3模拟Parameter | ||
| 5 | uint16_t | mbSalve3AI3 | 目标Von der Station3的模拟Quantität输入Parameter3 | 40005 | 只读 | 0 | 目标Von der Station3模拟Parameter | |
| 6 | uint16_t | mbSalve3AO1 | 目标Von der Station3的模拟Quantität输出Parameter1 | 40006 | 读写 | 目标Von der Station3模拟Parameter | ||
| 7 | uint16_t | mbSalve3AO2 | 目标Von der Station3的模拟Quantität输出Parameter2 | 40007 | 读写 | 0 | 目标Von der Station3模拟Parameter | |
| 8 | uint16_t | mbSalve3AO3 | 目标Von der Station3的模拟Quantität输出Parameter3 | 40008 | 读写 | 0 | 目标Von der Station3模拟Parameter | |
| 1 | bool | mbSalve3DI1 | 目标Von der Station3的数字Quantität输入Parameter1 | 1 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 2 | bool | mbSalve3DI2 | 目标Von der Station3的数字Quantität输入Parameter2 | 2 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 3 | bool | mbSalve3DI3 | 目标Von der Station3的数字Quantität输入Parameter3 | 3 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 4 | bool | mbSalve3DI4 | 目标Von der Station3的数字Quantität输入Parameter4 | 4 | 只读 | 目标Von der Station3数字QuantitätParameter | ||
| 5 | bool | mbSalve3DO1 | 目标Von der Station3的数字Quantität输出Parameter1 | 5 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 6 | bool | mbSalve3DO2 | 目标Von der Station3的数字Quantität输出Parameter2 | 6 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 7 | bool | mbSalve3DO3 | 目标Von der Station3的数字Quantität输出Parameter3 | 7 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 8 | bool | mbSalve3DO4 | 目标Von der Station3的数字Quantität输出Parameter4 | 8 | 读写 | 目标Von der Station3数字QuantitätParameter | ||
| 目标Von der Station1Parameter列表 | ||||||||
| 站Adresse:4;Porter Rate:9600;Datenplatz:8;Stoppen Sie Platz:1;无Prüfungen | ||||||||
| Seriennummer. | Datentyp | 变QuantitätName | ParameterName | Adresse | 读写属性 | 取值范围 | 缺省值 | 描述 |
| 1 | float | mbSalve4AI1 | 目标Von der Station4的模拟Quantität输入Parameter1 | 40001 | 只读 | 目标Von der Station4模拟Parameter | ||
| 2 | uint32_t | mbSalve4AI2 | 目标Von der Station4的模拟Quantität输入Parameter2 | 40003 | 只读 | 目标Von der Station4模拟Parameter | ||
| 5 | uint16_t | mbSalve4AI3 | 目标Von der Station4的模拟Quantität输入Parameter3 | 40005 | 只读 | 0 | 目标Von der Station4模拟Parameter | |
| 6 | uint16_t | mbSalve4AO1 | 目标Von der Station4的模拟Quantität输出Parameter1 | 40006 | 读写 | 目标Von der Station4模拟Parameter | ||
| 7 | uint16_t | mbSalve4AO2 | 目标Von der Station4的模拟Quantität输出Parameter2 | 40007 | 读写 | 0 | 目标Von der Station4模拟Parameter | |
| 8 | uint16_t | mbSalve4AO3 | 目标Von der Station4的模拟Quantität输出Parameter3 | 40008 | 读写 | 0 | 目标Von der Station4模拟Parameter | |
| 1 | bool | mbSalve4DI1 | 目标Von der Station4的数字Quantität输入Parameter1 | 1 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 2 | bool | mbSalve4DI2 | 目标Von der Station4的数字Quantität输入Parameter2 | 2 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 3 | bool | mbSalve4DI3 | 目标Von der Station4的数字Quantität输入Parameter3 | 3 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 4 | bool | mbSalve4DI4 | 目标Von der Station4的数字Quantität输入Parameter4 | 4 | 只读 | 目标Von der Station4数字QuantitätParameter | ||
| 5 | bool | mbSalve4DO1 | 目标Von der Station4的数字Quantität输出Parameter1 | 5 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 6 | bool | mbSalve4DO2 | 目标Von der Station4的数字Quantität输出Parameter2 | 6 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 7 | bool | mbSalve4DO3 | 目标Von der Station4的数字Quantität输出Parameter3 | 7 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
| 8 | bool | mbSalve4DO4 | 目标Von der Station4的数字Quantität输出Parameter4 | 8 | 读写 | 目标Von der Station4数字QuantitätParameter | ||
Antwort veröffentlichen