in IndustrialDeviceController/Software/HighLevelApp/drivers/modbus/modbus_transport_rtu.c [129:204]
static int32_t modbus_find_pdu_len(uint8_t *pdu)
{
// it's error response, pdu is two bytes
if (pdu[0] & 0x80) {
return 2;
}
int32_t length = 0;
switch (pdu[0]) {
case FC_READ_COILS:
case FC_READ_DISCRETE_INPUTS:
case FC_READ_HOLDING_REGISTERS:
case FC_READ_INPUT_REGISTERS:
// 1 byte function code + 1 byte byte count + n bytes values
length = 2 + pdu[1];
break;
case FC_WRITE_COILS:
case FC_WRITE_HOLDING_REGISTERS:
case FC_WRITE_SINGLE_COIL:
case FC_WRITE_SINGLE_REGISTER:
// 1 byte function code + 2 bytes start addr, 2 byte quantity
length = 5;
break;
case FC_READ_EXCEPTION_STATUS:
// 1 byte function code + 1 byte output data
length = 2;
break;
case FC_DIAGNOSTICS:
// 1 byte function code, 2 byte sub-function , 2 bytes data
length = 5;
break;
case FC_GET_COMM_EVENT_COUNTER:
// 1 byte function code, 2 byte status, 2 bytes event count
length = 5;
break;
case FC_GET_COMM_EVENT_LOG:
length = 2 + pdu[1];
break;
case FC_REPORT_SERVER_ID:
length = 5;
break;
case FC_READ_FILE_RECORD:
case FC_WRITE_FILE_RECORD:
length = 2 + pdu[1];
break;
case FC_MASK_WRITE_REGISTER:
length = 7;
break;
case FC_READ_WRITE_REGISTERS:
length = 2 + pdu[1];
break;
case FC_READ_FIFO_QUEUE:
length = 2 + pdu[1];
break;
case FC_MEI:
// FC_MEI is not supported now as the pdu lenth cann't be found
// in pdu and not fixed.
default:
length = -1;
break;
}
return length;
}