⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus-rtu.c

📁 This is my code (with PIC 18F458) for Modbus RTU Network. I have written by Ccs laguage
💻 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 + -