11 static uint16_t Modbus_ReadUint16_From_2Bytes(uint8_t *pos)
21 static void Modbus_WriteUint16_To_2Bytes(uint8_t *pos,uint16_t dat)
28 static uint16_t CRC16(uint8_t *arr_buff,
size_t len)
32 for ( j=0; j<len; j++)
59 uint16_t crc1=CRC16(payload,payload_length-2);
60 uint16_t crc2=payload[payload_length-1];
62 crc2+=payload[payload_length-2];
78 uint16_t crc=CRC16(payload,payload_length-2);
80 payload[payload_length-2]=(crc&0xff);
81 payload[payload_length-1]=(crc>>8);
92 if(ctx==NULL || input_data ==NULL || input_data_length <=2 || buff==NULL || buff_length <=2 || buff_length<input_data_length)
102 size_t output_length=0;
104 switch(input_data[1])
119 memcpy(buff,input_data,input_data_length);
125 uint16_t start_addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
126 uint16_t length=Modbus_ReadUint16_From_2Bytes(&buff[4]);
127 uint8_t byte_count=length/8+((length%8!=0)?1:0);
130 output_length=5+byte_count;
132 if(output_length>buff_length)
137 for(
size_t i=0; i<length; i++)
146 buff[3+i/8]|=(0x01<<(i%8));
150 buff[3+i/8]&=(~(0x01<<(i%8)));
173 memcpy(buff,input_data,input_data_length);
179 uint16_t start_addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
180 uint16_t length=Modbus_ReadUint16_From_2Bytes(&buff[4]);
181 uint8_t byte_count=length/8+((length%8!=0)?1:0);
184 output_length=5+byte_count;
186 if(output_length>buff_length)
191 for(
size_t i=0; i<length; i++)
200 buff[3+i/8]|=(0x01<<(i%8));
204 buff[3+i/8]&=(~(0x01<<(i%8)));
225 memcpy(buff,input_data,input_data_length);
231 uint16_t start_addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
232 uint16_t length=Modbus_ReadUint16_From_2Bytes(&buff[4]);
237 uint8_t byte_count=length*2;
240 output_length=5+byte_count;
242 if(output_length>buff_length)
247 for(
size_t i=0; i<length; i++)
250 Modbus_WriteUint16_To_2Bytes(&buff[3+2*i],dat);
270 memcpy(buff,input_data,input_data_length);
276 uint16_t start_addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
277 uint16_t length=Modbus_ReadUint16_From_2Bytes(&buff[4]);
282 uint8_t byte_count=length*2;
285 output_length=5+byte_count;
287 if(output_length>buff_length)
292 for(
size_t i=0; i<length; i++)
295 Modbus_WriteUint16_To_2Bytes(&buff[3+2*i],dat);
316 memcpy(buff,input_data,input_data_length);
319 output_length=input_data_length;
323 uint16_t addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
324 uint16_t data=Modbus_ReadUint16_From_2Bytes(&buff[4]);
343 memcpy(buff,input_data,input_data_length);
346 output_length=input_data_length;
350 uint16_t addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
351 uint16_t data=Modbus_ReadUint16_From_2Bytes(&buff[4]);
361 if(input_data[0]!=ctx->
slave_addr && input_data[0]==0)
370 memcpy(buff,input_data,input_data_length);
378 uint16_t start_addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
379 uint16_t length=Modbus_ReadUint16_From_2Bytes(&buff[4]);
381 for(
size_t i=0; i<length; i++)
383 if((buff[7+i/8]&(0x01<<(i%8)))!=0)
400 if(input_data[0]!=ctx->
slave_addr && input_data[0]==0)
409 memcpy(buff,input_data,input_data_length);
417 uint16_t start_addr=Modbus_ReadUint16_From_2Bytes(&buff[2]);
418 uint16_t length=Modbus_ReadUint16_From_2Bytes(&buff[4]);
420 for(
size_t i=0; i<length; i++)
437 if(buff_length>=output_length)
442 ctx->
output(buff,output_length);
455 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
466 size_t output_length=8;
467 size_t input_length=5+number/8+((number%8==0)?0:1);
469 if(output_length>buff_length || input_length> buff_length)
478 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
479 Modbus_WriteUint16_To_2Bytes(&buff[4],number);
483 ctx->
output(buff,output_length);
489 for(
size_t i=0; i<number; i++)
491 data[i]=((buff[3+i/8]&(0x01<<(i%8)))!=0);
506 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
517 size_t output_length=8;
518 size_t input_length=5+number/8+((number%8==0)?0:1);
520 if(output_length>buff_length || input_length> buff_length)
529 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
530 Modbus_WriteUint16_To_2Bytes(&buff[4],number);
534 ctx->
output(buff,output_length);
540 for(
size_t i=0; i<number; i++)
542 data[i]=((buff[3+i/8]&(0x01<<(i%8)))!=0);
557 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
568 size_t output_length=8;
569 size_t input_length=5+number*2;
571 if(output_length>buff_length || input_length> buff_length)
580 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
581 Modbus_WriteUint16_To_2Bytes(&buff[4],number);
585 ctx->
output(buff,output_length);
591 for(
size_t i=0; i<number; i++)
593 data[i]=Modbus_ReadUint16_From_2Bytes(&buff[3+2*i]);
608 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
619 size_t output_length=8;
620 size_t input_length=5+number*2;
622 if(output_length>buff_length || input_length> buff_length)
631 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
632 Modbus_WriteUint16_To_2Bytes(&buff[4],number);
636 ctx->
output(buff,output_length);
642 for(
size_t i=0; i<number; i++)
644 data[i]=Modbus_ReadUint16_From_2Bytes(&buff[3+2*i]);
660 static bool Modbus_Master_Write_OX_05(
modbus_master_context_t *ctx,uint16_t start_addr,
bool *data,
size_t number,uint8_t *buff,
size_t buff_length)
662 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
668 size_t output_length=8;
669 size_t input_length=8;
671 if(output_length>buff_length || input_length> buff_length)
680 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
681 Modbus_WriteUint16_To_2Bytes(&buff[4],data[0]?(0xFF00):(0x0000));
682 buff[6]=number/8+((number%8!=0)?1:0);
688 ctx->
output(buff,output_length);
705 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
718 return Modbus_Master_Write_OX_05(ctx,start_addr,data,number,buff,buff_length);
721 size_t output_length=9+number/8+((number%8!=0)?1:0);
722 size_t input_length=8;
724 if(output_length>buff_length || input_length> buff_length)
733 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
734 Modbus_WriteUint16_To_2Bytes(&buff[4],number);
735 buff[6]=number/8+((number%8!=0)?1:0);
737 for(
size_t i=0; i<number; i++)
745 buff[7+i/8]|=(0x01<<(i%8));
749 buff[7+i/8]&=(~(0x01<<(i%8)));
756 ctx->
output(buff,output_length);
772 static bool Modbus_Master_Write_Hold_Register_06(
modbus_master_context_t *ctx,uint16_t start_addr,uint16_t *data,
size_t number,uint8_t *buff,
size_t buff_length)
774 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
780 size_t output_length=8;
781 size_t input_length=8;
783 if(output_length>buff_length || input_length> buff_length)
792 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
793 Modbus_WriteUint16_To_2Bytes(&buff[4],data[0]);
797 ctx->
output(buff,output_length);
814 if(ctx==NULL || data ==NULL || buff == NULL || number == 0 || buff_length == 0 || ctx->
output ==NULL ||ctx->
request_reply ==NULL)
827 return Modbus_Master_Write_Hold_Register_06(ctx,start_addr,data,number,buff,buff_length);
830 size_t output_length=9+number*2;
831 size_t input_length=8;
833 if(output_length>buff_length || input_length> buff_length)
842 Modbus_WriteUint16_To_2Bytes(&buff[2],start_addr);
843 Modbus_WriteUint16_To_2Bytes(&buff[4],number);
846 for(
size_t i=0; i<number; i++)
848 Modbus_WriteUint16_To_2Bytes(&buff[7+i*2],data[i]);
854 ctx->
output(buff,output_length);
bool Modbus_Master_Read_OX(modbus_master_context_t *ctx, uint16_t start_addr, bool *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取输出线圈
bool Modbus_Master_Write_Hold_Register(modbus_master_context_t *ctx, uint16_t start_addr, uint16_t *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机写保持寄存器
bool Modbus_Master_Write_OX(modbus_master_context_t *ctx, uint16_t start_addr, bool *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机写输出线圈
bool Modbus_Slave_Parse_Input(modbus_slave_context_t *ctx, uint8_t *input_data, size_t input_data_length, uint8_t *buff, size_t buff_length)
Modbus从机解析输入。 当从机接收到一帧数据后,调用此函数。 此函数会自动调用相关回调函数完成Modbus输出。
bool Modbus_Master_Read_IX(modbus_master_context_t *ctx, uint16_t start_addr, bool *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取输入点
bool Modbus_Payload_Check_CRC(uint8_t *payload, size_t payload_length)
检查一帧数据的crc
bool Modbus_Master_Read_Input_Register(modbus_master_context_t *ctx, uint16_t start_addr, uint16_t *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取输入寄存器
bool Modbus_Master_Read_Hold_Register(modbus_master_context_t *ctx, uint16_t start_addr, uint16_t *data, size_t number, uint8_t *buff, size_t buff_length)
Modbus主机读取保持寄存器
bool Modbus_Payload_Append_CRC(uint8_t *payload, size_t payload_length)
在数据帧末尾的添加crc校验
#define MODBUS_MAX_READ_REGISTERS
#define MODBUS_MAX_WRITE_BITS
#define MODBUS_MAX_READ_BITS
#define MODBUS_MAX_WRITE_REGISTERS
size_t(* request_reply)(uint8_t *data, size_t data_length)
请求数据(读串口输入),当Modbus请求发出后,会调用此函数等待从机回应,不可为NULL。
void(* output)(uint8_t *data, size_t data_length)
串口输出函数,当解析完成后,将调用此函数输出数据,不可为NULL。
bool(* read_IX)(size_t addr)
读取输入点(线圈)
void(* output)(uint8_t *data, size_t data_length)
串口输出函数,当解析完成后,将调用此函数输出数据,不可为NULL。
void(* write_hold_register)(size_t addr, uint16_t data)
写保持寄存器
bool(* read_OX)(size_t addr)
读输出线圈
uint16_t(* read_hold_register)(size_t addr)
读保持寄存器
void(* write_OX)(size_t addr, uint16_t data)
写输出线圈
uint16_t(* read_input_register)(size_t addr)
读输入寄存器