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

📄 modbus c源码.txt

📁 MOSBUS协议用C写的
💻 TXT
📖 第 1 页 / 共 4 页
字号:
          
        strmcpy(ModData, ModBusMessage + 3, ModBusIdx - 5);  
    /*  Print(" idx%d  ", ModBusIdx - 5);  /*test*/  
        /*  for(i = 3; i < ModBusIdx - 2; i++)  
        {  
            ModData[i - 3] = ModBusMessage[i];  
        }  
        ModData[i] = '\0';    
        */  
        *ModDataLen = ModBusIdx - 5;  
        /*  Print("{DataLen=%d}\n\r", *ModDataLen); */  
        return 1;  
    }  
    else    
    {  
        *ModDataLen = 0;  
        return 0;  
        /* CRC16 error */  
    /*  Print("{CRC16 Error}\n\r"); */  
    }      
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: ResponseFromModBusRtuSlave()                              
*输入参数:  共 8 个参数;  
*输出参数:  共 5 个参数;  
*返回值:  成功与否    1:成功, 2:失败;  
*需储存的参数: 共 0 个参数;    
*功能介绍:    
        (1)写参数到ModBusRtuSlave后,ModbusRtuSlave反馈字符串;  
                  
*修改日志:  
*[2006-3-1 12:34]  Ver. 1.00  
        开始编写;  
*[2006-3-1 12:48]        
        完成;  
*[2006-3-6 16:32]  
        strcpy(totalStr, ModBusMessage);  
        改为 strmcpy(totalStr, ModBusMessage, ModBusIdx);                                      
/*                                      */  
/*********************************************************************************/  
  
int ResponseFromModBusRtuSlave(int ModPort, unsigned char totalStr[],    
    unsigned char *ModAddr, unsigned char *ModFunction, unsigned short *ModDataAddr,    
    unsigned short *ModDataNum, unsigned ModTimeout, unsigned waitTime)  
{          
    unsigned char data;  
    unsigned long t;      
    unsigned short CRC16;      
    int ModBusIdx = 0;  
    int counter = 0;  
    unsigned char ModBusMessage[MOD_STR_MAX_LEN] = {'\0'};  
      
    while((!(IsCom(ModPort)) && (counter < waitTime)))  
    {  
        DelayMs(1);  
        counter ++;  
    }  
      
    StopWatchStart(MODBUS_STOP_WATCH);  
    do  
    {  
        while(IsCom(ModPort) && (ModBusIdx < MOD_STR_MAX_LEN - 1))  
        {  
                data = ReadCom(ModPort);  
                ModBusMessage[ModBusIdx ++]=data;  
                StopWatchStart(MODBUS_STOP_WATCH);  
            /*    Print("[%02X]",data); */  
        }  
        StopWatchReadValue(MODBUS_STOP_WATCH, &t);  
    }  
        while(t <= ModTimeout);  
              
    if (ModBusIdx == 0) return 0;  
    ModBusMessage[ModBusIdx] = '\0';  
    strmcpy(totalStr, ModBusMessage, ModBusIdx);  
    StopWatchStop(MODBUS_STOP_WATCH);  
              
      
    CRC16 = GetCRC16(ModBusMessage,ModBusIdx - 2);  
      
    if((unsigned char)(CRC16 >> 8 & 0x00FF) == ModBusMessage[ModBusIdx - 2] && (unsigned char)(CRC16 & 0x00FF) == ModBusMessage[ModBusIdx - 1])  
    {  
        *ModAddr = ModBusMessage[0];  
        *ModFunction = ModBusMessage[1];  
          
        *ModDataAddr = (unsigned short)((unsigned short)ModBusMessage[2] << 8 | ModBusMessage[3]);  
        *ModDataNum  = (unsigned short)((unsigned short)ModBusMessage[4] << 8 | ModBusMessage[5]);  
                      
        return 1;  
    }  
    else    
    {  
        return 0;  
        /* CRC16 error */  
    /*  Print("{CRC16 Error}\n\r"); */  
    }      
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: ResponseSingleBitFromModBus()                            
*输入参数:  共 8 个参数;  
*输出参数:  共 5 个参数;  
*返回值:  成功与否    1:成功, 2:失败;  
*需储存的参数: 共 0 个参数;    
*功能介绍:    
        (1)写参数到ModBusRtuSlave后,ModbusRtuSlave反馈字符串;  
                  
*修改日志:  
*[2006-3-7 14:40]  Ver. 1.00  
        开始编写;  
*[2006-3-7 14:40]        
        完成;                                          
/*                                      */  
/*********************************************************************************/  
  
int ResponseSingleBitFromModBus(int ModPort, unsigned char totalStr[],    
    unsigned char *ModAddr, unsigned char *ModFunction, unsigned short *ModDataAddr,    
    unsigned short *ModDataState, unsigned ModTimeout, unsigned waitTime)  
{          
    unsigned char data;  
    unsigned long t;      
    unsigned short CRC16;      
    int ModBusIdx = 0;  
    int counter = 0;  
    unsigned char ModBusMessage[MOD_STR_MAX_LEN] = {'\0'};  
      
    while((!(IsCom(ModPort)) && (counter < waitTime)))  
    {  
        DelayMs(1);  
        counter ++;  
    }  
      
    StopWatchStart(MODBUS_STOP_WATCH);  
    do  
    {  
        while(IsCom(ModPort) && (ModBusIdx < MOD_STR_MAX_LEN - 1))  
        {  
                data = ReadCom(ModPort);  
                ModBusMessage[ModBusIdx ++]=data;  
                StopWatchStart(MODBUS_STOP_WATCH);  
            /*    Print("[%02X]",data); */  
        }  
        StopWatchReadValue(MODBUS_STOP_WATCH, &t);  
    }  
        while(t <= ModTimeout);  
              
    if (ModBusIdx == 0) return 0;  
    ModBusMessage[ModBusIdx] = '\0';  
    strmcpy(totalStr, ModBusMessage, ModBusIdx);  
    StopWatchStop(MODBUS_STOP_WATCH);  
              
      
    CRC16 = GetCRC16(ModBusMessage,ModBusIdx - 2);  
      
    if((unsigned char)(CRC16 >> 8 & 0x00FF) == ModBusMessage[ModBusIdx - 2] && (unsigned char)(CRC16 & 0x00FF) == ModBusMessage[ModBusIdx - 1])  
    {  
        *ModAddr = ModBusMessage[0];  
        *ModFunction = ModBusMessage[1];  
          
        *ModDataAddr = (unsigned short)((unsigned short)ModBusMessage[2] << 8 | ModBusMessage[3]);  
        if(ModBusMessage[4])  *ModDataState  = 1;  
        else  *ModDataState  = 0;  
                      
        return 1;  
    }  
    else    
    {  
        return 0;  
        /* CRC16 error */  
    /*  Print("{CRC16 Error}\n\r"); */  
    }      
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: ChangeAllParameterDataByModBus()                              
*输入参数:  共  个参数;  
*输出参数:  共  个参数;  
*返回值:  无  
*需储存的参数: 共  个参数;      
*功能介绍:    
        (1) 将MODBUSSLAVE返回的数据字符转化为参数值;  
        (2) void *memcpy(void *dest, const void *src, size_t n)  
        (3) 四个字符的顺序应倒一下。              
*修改日志:  
*[2006-3-1 14:10]  Ver. 1.00  
        开始编写;  
*[2006-3-1 14:35]  
        完成;  
*[2006-3-6 15:57]  
        四个字符的顺序应倒一下。                                                      
/*                                      */  
/*********************************************************************************/  
  
void ChangeAllParameterDataByModBus(float parameterData[], unsigned char ModDataBack[], unsigned short num)  
{  
    int i;  
    char singleStr[5] = {'\0','\0','\0','\0','\0'};    
    float *pf;  
        float dataf = 0;          
        int len = 4;      
          
        pf = &dataf;  
              
    for(i = 0; i < num; i ++)  
    {  
        singleStr[0] = ModDataBack[i * 4 + 3];  
        singleStr[1] = ModDataBack[i * 4 + 2];  
        singleStr[2] = ModDataBack[i * 4 + 1];  
        singleStr[3] = ModDataBack[i * 4 ];  
        singleStr[4] = '\0';  
        memcpy(pf, singleStr, len);  
        parameterData[i] = *pf;  
    /*  Print("%-6.2f\t", parameterData[i]);    /*test*/  
    }  
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: ChangeAllButtonsDataByModBus()                            
*输入参数:  共  个参数;  
*输出参数:  共  个参数;  
*返回值:  无  
*需储存的参数: 共  个参数;      
*功能介绍:    
        (1) 将MODBUSSLAVE返回的数据字符转化为按钮值;                
*修改日志:  
*[2006-3-1 14:03]  Ver. 1.00  
        开始编写;    
*[2006-3-1 14:10]  
        完成;                                          
/*                                      */  
/*********************************************************************************/  
  
void ChangeAllButtonsDataByModBus(int buttonData[], unsigned char ModDataBack[], unsigned short num)  
{  
    unsigned char button8Data = 0;  
    int i, j;  
          
    for(j = 0; j < (int)(num / 8); j ++)    
    {  
        button8Data = ModDataBack[j];  
        for(i = 0; i < 8; i ++)  
        {  
            buttonData[i + j * 8] = (int)(button8Data & (int) pow(2, i)) / (int) pow(2, i);  
        }  
    }  
    button8Data = ModDataBack[j];  
    for(i = 0; i < num % 8; i ++)  
    {  
        buttonData[i + j * 8] = (int)(button8Data & (int) pow(2, i)) / (int) pow(2, i);  
    }      
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: WordDataToModbusStr()                            
*输入参数:  共  个参数;  
*输出参数:  共  个参数;  
*返回值:  无  
*需储存的参数: 共  个参数;      
*功能介绍:    
        (1)parameterData 或AIData转化为MODBUSSLAVE的WORD值的STR;  
        (2) void *memcpy(void *dest, const void *src, size_t n)  
        (3) 四个字符的顺序应倒一下。                  
*修改日志:  
*[2006-3-1 14:37]  Ver. 1.00  
        开始编写;  
*[2006-3-1 14:49]        
        完成;  
*[2006-3-6 15:57]  
        四个字符的顺序应倒一下。                                      
/*                                      */  
/*********************************************************************************/  
  
void WordDataToModbusStr(unsigned char writeCmdStr[], float data[], unsigned short num, unsigned short startAddr)  
{  
    int i;  
    char singleStr[5] = {'\0','\0','\0','\0','\0'};    
    float *pf;  
    unsigned char *pstr;  
        float dataf = 0;          
        int len = 4;      
          
        pf = &dataf;  
        pstr = singleStr;  
              
    for(i = 0; i < num; i ++)  
    {  
        *pf = data[i];  
        memcpy(pstr, pf, len);  
        writeCmdStr[startAddr + i * 4 + 3] = singleStr[0];  
        writeCmdStr[startAddr + i * 4 + 2] = singleStr[1];  
        writeCmdStr[startAddr + i * 4 + 1] = singleStr[2];  
        writeCmdStr[startAddr + i * 4 ] = singleStr[3];        
    }      
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: BitDataToModbusStr()                              
*输入参数:  共  个参数;  
*输出参数:  共  个参数;  
*返回值:  无  
*需储存的参数: 共  个参数;      
*功能介绍:    
        (1)data转化为MODBUSSLAVE的WORD值的STR;                  
*修改日志:  
*[2006-3-1 14:51]  Ver. 1.00  
        开始编写;    
*[2006-3-1 15:02]  
        完成;                                      
/*                                      */  
/*********************************************************************************/  
  
void BitDataToModbusStr(unsigned char writeCmdStr[], int data[], unsigned short num, unsigned short startAddr)  
{  
    int i, j;      
    unsigned char button8Data = 0;  
          
    for(j = 0; j < (int)(num / 8); j ++)    
    {  
        button8Data = 0;  
        for(i = 0; i < 8; i ++)  
        {  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -