📄 modbus-rtu.c
字号:
#use delay(clock=40000000)
#use rs232(baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7 )
int16 lengthOfQueryMessage_output=0;
int16 lengthOfResponseMessage_input=0;
int16 lengthOfResponseMessage_output=0;
int16 lengthOfQueryMessage_input=0;
int8 functionCode_Send=0;
int8 functionCode_Receive=0;
int1 StartQueryMessage=0;
int1 StartResponseMMessage=0;
int1 StartReceiveMessage=0;
int1 status=0; //0:RDA wait querry message
//1:RDA wait response message
int8 queryMessage[8]; //phai xac dinh ro so luong
int8 responseMessage[15]; //phai xac dinh ro so luong
int8 value=0;
int8 count=0;
int8 Stage_ID=0x02;
int8 command=0;
//****************************Receive*******************************************
int8 CRC[2];
int8 NumberPoint_bits=0;
int8 NumberPoint_bytes=0;
int16 StartingAddress=0;
int16 CoilAddress=0; //function 05
int8 ByteCount=0; //function 01
int8 check=0; //test khi gui sai address
//*****************************************************************************
void transmit ()
{
int8 i;
for (i=0;i<lengthOfResponseMessage_output;i++)
{
putc(responseMessage[i]);
}
}
//******************************************************************************
void response(int8 *Message)
{
int8 i=0;
for (i=0;i<lengthOfResponseMessage_output;i++)
{
putc(Message[i]);
}
//EReceive;
// output_low(pin_c2); //RX
}
//******************************************************************************
void getCRC(int8 *message, int8 length,int8 *check) // chuong trinh con tinh CRC
{
int16 CRCFull = 0xFFFF;
int8 CRCHigh = 0xFF, CRCLow = 0xFF;
int16 CRCLSB;
int i,j;
for ( i = 0; i < length; i++)
{
CRCFull = (int16)(CRCFull ^ message[i]);
for (j = 0; j < 8; j++)
{
CRCLSB = (int16)(CRCFull & 0x0001);
CRCFull = (int16)((CRCFull >> 1) & 0x7FFF);
if (CRCLSB == 1)
CRCFull = (int16)(CRCFull ^ 0xA001);
}
}
check[1] = CRCHigh = (int8)((CRCFull >> 8) & 0xFF);
check[0] = CRCLow = (int8)(CRCFull & 0xFF);
}
/*
//******************************************************************************
void SendQueryMessage()
{
int8 i=0;
GetCRC(&queryMessage, (int8)(lengthOfQueryMessage - 2),&CRC);
queryMessage[lengthOfQueryMessage - 2] = CRC[1]; //CRC LOW FIRST
queryMessage[lengthOfQueryMessage - 1] = CRC[0];
for (i = 0; i < lengthOfQueryMessage; i++)
{
putc(queryMessage[i]);
}
}*/
//******************************************************************************
void ConvertInt16ToByte(int16 value,int8 HiValue,int8 LoValue)
{
LoValue = (int8)(value % 256);
HiValue = (int8)(value / 256);
}
//*********************HAM MODBUS***********************************************
void ReadCoilStatus(int8 slaveAddress, int16 startingAddress, int16 quantityOfCoils)
{
lengthOfQueryMessage_output = 8;
if (quantityOfCoils % 8 == 0)
lengthOfResponseMessage_input = 5 + quantityOfCoils / 8;
else
lengthOfResponseMessage_input = 6 + quantityOfCoils / 8;
queryMessage[0] = slaveAddress;
queryMessage[1] = 1; //function
ConvertInt16ToByte((int16)startingAddress-1,queryMessage[2],queryMessage[3]);
ConvertInt16ToByte(quantityOfCoils,queryMessage[4],queryMessage[5]);
functionCode_Send = 0x01;
// SendQueryMessage();
}
void ReadInputStatus(int8 slaveAddress, int16 startingAddress, int quantityOfInputs)
{
}
void ReadHoldingRegisters(int8 slaveAddress, int16 startingAddress, int quantityOfRegisters)
{
}
void ReadInputRegisters(int8 slaveAddress, int16 startingAddress, int quantityOfInputRegisters)
{
}
void ForceSingleCoil(int8 slaveAddress, int16 CoilAddress, int DataToWrite)
{
}
void PresetSingleRegister(int8 slaveAddress, int16 RegisterAddress, int8 DataToWrite)
{
}
void ForceMultipleCoils(int8 slaveAddress, int16 StartingAddress, int quantityOfCoils, int8 *ValueToWrite)
{
}
void PresetMultipleRegisters(int8 slaveAddress, int16 StartingAddress, int8 *ValueToWrite[])
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -