#define uint8 unsigned char
#define uint16 unsigned short
/*ModBus Header*/
typedef struct {
uint16 TransactionID;
uint16 ProtocolID;
uint16 Len;
} typeMBAP;
/*F3: Read Holding Registers*/
typedef struct {
uint16 Addr;
uint16 Count;
} typeF3Request;
typedef struct {
uint8 Len;
uint16 Data[];
} typeF3Response;
/*F6: Write Single Register*/
typedef struct {
uint16 Addr;
uint16 Data;
} typeF6Request;
typedef struct {
uint16 Addr;
uint16 Data;
} typeF6Response;
/*F16: Write Multiple registers*/
typedef struct {
uint16 Addr;
uint16 Count;
uint8 Len;
uint16 Data[];
} typeF16Request;
typedef struct {
uint16 Addr;
uint16 Count;
} typeF16Response;
/*F43: Read Device Identification*/
typedef struct {
uint8 MEIType;
uint8 IDCode;
uint8 ObjectID;
} typeF43Request;
/*ModBus packet structure*/
typedef struct {
typeMBAP MBAP;
uint8 Slave;
uint8 FCode;
union {
typeF3Request F3Req;
typeF3Response F3Rsp;
typeF6Request F6Req;
typeF6Response F6Rsp;
typeF16Request F16Req;
typeF16Response F16Rsp;
typeF43Request F43Req;
uint8 ExeptionCode;
};
} typeMB;
/************************ЗАПРОС*********************/
/*подготовка ModBus структуры для чтения регистров функцией F=3*/
send_leng = sizeof(typeMBAP)+2+sizeof(typeF3Request); /*длина пакета*/
packReq = (typeMB*)malloc(send_leng);
packReq->FCode = 3; /*номер функции*/
packReq->F3Req.Addr = swap_byte(0); /*начальный адрес регистров, в обратном порядке*/
packReq->F3Req.Count = swap_byte(8); /*количество запрашиваемых регистров, в обратном порядке*/
packReq->Slave = 1;
packReq->MBAP.TransactionID = 0;
packReq->MBAP.ProtocolID = 0;
packReq->MBAP.Len = swap_byte(sizeof(typeF3Request)+2);
err = send(sock, (char*)packReq, send_leng, 0); /*передача пакета*/
/********************ОТВЕТ*************************/
recv_leng = sizeof(typeMBAP)+2+sizeof(typeF3Response)+
swap_byte(packReq->F3Req.Count) * 2; /*вычисление предполагаемой длины ответа*/
packRsp = (typeMB*)malloc(recv_leng);
err = recv(sock, (char*)packRsp, recv_leng, 0); /*прием ответа*/
Вернуться в Связь InTouch с ПЛК
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12