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

📄 modbus c源码.txt

📁 MOSBUS协议用C写的
💻 TXT
📖 第 1 页 / 共 4 页
字号:
            button8Data += data[i + j * 8] * (int) pow(2, i);  
        }  
        writeCmdStr[startAddr + j] = button8Data;  
    }  
      
    if(num % 8)  
    {  
        button8Data = 0;  
        for(i = 0; i < num % 8; i ++)  
        {  
            button8Data += data[i + j * 8] * (int) pow(2, i);  
        }  
        writeCmdStr[startAddr + j] = button8Data;  
    }  
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: ReadWordFromModBusSlave()                            
*输入参数:  共 2 个参数;  
*输出参数:  共 1 个参数;  
*返回值:  成功与否;  
*需储存的参数: 共 1 个参数;    
*功能介绍:    
        (1) 从触摸屏中读取设定参数值;  
        (2) 读取指令为 01 03 HA LA HN LN HC LC;其中 01 为MODBUSSLAVE的地址,  
            03 为读连续多个WORD寄存器的功能码,HA LA 为第一个寄存器的高低位地址,  
            HN LN 为寄存器数量的高低位,HC LC 为CRC校验码;  
        (3) 触摸屏reset后各个参数归零,7188检测到此状态后向除摸屏发送设定参数;  
*修改日志:  
*[2005-11-28 16:51]    Ver. 1.00  
        开始编写;  
*[2005-11-28 18:10]      
        完成初稿,未测试;  
*[2006-3-3 9:38]  
        static unsigned char oldModDataBack[400];改为形参;  
*[2006-3-3 17:58]  
        增加int kind形参;    
*[2006-3-6 16:34]        
        strmcpy(oldModDataBack, ModDataBack, ModDataLenBack);    
*[2006-3-9 12:33]  
        去掉        
        (strmcmp(oldModDataBack, ModDataBack, ModDataLenBack))                                    
/*                                      */  
/*********************************************************************************/  
  
int ReadWordFromModBusSlave(int kind, int comPort, float parameterData[], unsigned short num,    
    unsigned short ModDataAddr, int parameterEEPROMAddr, unsigned char oldModDataBack[])  
{              
    float parameterJudge[50];      
      
    unsigned char readCmdStr[15];  
    unsigned char ModAddr = 1;  
    unsigned char ModFunction = 3;  
    unsigned short ModDataNum;        
    unsigned short readCmdLen = 6;  
    int isReadOK = 0;      
      
    unsigned char ModAddrBack = 0;  
    unsigned char ModFunctionBack = 0;  
    unsigned char ModByteNumBack = 0;  
    unsigned char ModDataBack[MOD_STR_MAX_LEN] = {'\0'};  
  
    unsigned char ModDataLenBack = 0;  
      
/*  unsigned short ModWord[100];    */  
      
    int parameterDecimalEEPROM[PARAMETER_DATA_NUM] = PARAMETER_DECIMAL_EEPROM;  /* adjust */  
    int parameterStartAddr = 0;  
    char i7188Addr[5];  
    strcpy(i7188Addr, I7188_ADDRESS);      /* adjust */  
      
    if(kind == 1)  
    {  
        strcpy(i7188Addr, I7188_ADDRESS);  
    }  
    else if(kind == 2)  
    {  
        strcpy(i7188Addr, I7188_ADDRESS_2);  
    }  
    else if(kind == 3)  
    {  
        strcpy(i7188Addr, I7188_ADDRESS_3);  
    }  
          
    ModDataNum = (unsigned short)num * 2;  
          
    readCmdStr[0] = ModAddr;  
    readCmdStr[1] = ModFunction;    
    readCmdStr[2] = (unsigned char)(ModDataAddr >> 8 & 0x00FF);  
    readCmdStr[3] = (unsigned char)(ModDataAddr & 0x00FF);  
    readCmdStr[4] = (unsigned char)(ModDataNum >> 8 & 0x00FF);  
    readCmdStr[5] = (unsigned char)(ModDataNum & 0x00FF);      
    readCmdStr[6] = '\0';  
      
    ClearCom(comPort);  
    SendRtuCmdToModBus(comPort, readCmdStr, readCmdLen);  
          
    isReadOK = ReadModBusRtuSlave(comPort, &ModAddrBack, &ModFunctionBack, &ModByteNumBack,    
        ModDataBack, &ModDataLenBack, MOD_TIMEOUT, MOD_WAITTIME);  
      
    if (1 == isReadOK)  
    {      
        if((ModAddr == ModAddrBack) && (ModFunction == ModFunctionBack) && (ModByteNumBack == ModDataLenBack))    
        {  
            if (ModDataNum * 2 == ModDataLenBack)      /*!!!*/  
            {                      
                ChangeAllParameterDataByModBus(parameterJudge, ModDataBack, num);      
            /*  Print(" %f  %f  %f \t", parameterData[0], parameterData[1],parameterData[2]);    
                Print("\n%f  %f  %f \t", parameterJudge[0], parameterJudge[1],parameterJudge[2]);    
            */  if(parameterJudge[0] >= 0.1)    /* 以温度设定值为判断点判断正确性 */  
                {  
                /*  Print(" cp1.5 \n"); */  
                      
                    if(Datamcmp(parameterData, parameterJudge, num))  
                    {  
                        Print(" cp1.6 \n");  
                        ChangeAllParameterDataByModBus(parameterData, ModDataBack, num);      
                      
                        if(IS_RS485)  Set485DirToTransmit(COMPORT1);  
                        SendParameterDataToPCForwardly(COMPORT1, parameterData, i7188Addr);  
                        if(IS_RS485)  WaitTransmitOver(COMPORT1);  
                        if(IS_RS485)  {DelayMs(2); Set485DirToReceive(COMPORT1);}  
                      
                        WriteDataToEEPROM(parameterData, parameterDecimalEEPROM, num, parameterEEPROMAddr, parameterStartAddr);  
                    }  
                      
                    strmcpy(oldModDataBack, ModDataBack, ModDataLenBack);  
                }  
                else  
                {  
                    /*未初始化,发送数据以初始*/                      
                    WriteMultipleWordToModBusSlave(comPort, parameterData, num, ModDataAddr);  
                }  
            /*  Print("\n %f  %f  %f \t", parameterData[0], parameterData[1],parameterData[2]); */  
            }  
            return 1;  
        }  
        else  
        {  
            /*收到的字符串不匹配*/  
            return 0;  
        }  
    }  
    else  
    {  
        /*未收到字符串或CRC校验出错*/  
        return 0;  
    }  
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: ReadBitFromModBusSlave()                              
*输入参数:  共 2 个参数;  
*输出参数:  共 1 个参数;  
*返回值:  成功与否;  
*需储存的参数: 共 1 个参数;    
*功能介绍:    
        (1) 从触摸屏中读取按钮值;  
        (2) 读取指令为 01 01 HA LA HN LN HC LC;其中 01 为MODBUSSLAVE的地址,  
            01 为读连续多个BIT线圈的功能码,HA LA 为第一个BIT的高低位地址,  
            HN LN 为BIT数量的高低位,HC LC 为CRC校验码;  
*修改日志:  
*[2005-11-28 18:10]    Ver. 1.00  
        开始编写;  
*[2005-11-28 18:42]      
        完成初稿,未测试;  
*[2006-3-3 9:38]  
        static unsigned char oldModDataBack[400];改为形参;  
*[2006-3-3 17:58]  
        增加int kind形参;  
*[2006-3-6 16:35]  
        strmcpy(oldModDataBack, ModDataBack, ModDataLenBack);    
*[2006-3-9 12:35]  
        去掉  (strmcmp(oldModDataBack, ModDataBack, ModDataLenBack))                                                    
/*                                      */  
/*********************************************************************************/  
  
int ReadBitFromModBusSlave(int kind, int comPort, int buttonData[], unsigned short num,    
    unsigned short ModDataAddr, int buttonNVRAMAddr, unsigned char oldModDataBack[])  
{      
    int buttonJudge[30];  
    unsigned char readCmdStr[15];  
    unsigned char ModAddr = 1;  
    unsigned char ModFunction = 1;    
    unsigned short ModDataNum;    
    unsigned short readCmdLen = 6;  
    int isReadOK = 0;      
      
    unsigned char ModAddrBack = 0;  
    unsigned char ModFunctionBack = 0;  
    unsigned char ModByteNumBack = 0;  
    unsigned char ModDataBack[300] = {'\0'};  
  
    unsigned char ModDataLenBack = 0;  
      
/*  unsigned short ModBit[100]; */  
    char i7188Addr[5];  
    strcpy(i7188Addr, I7188_ADDRESS);      /* adjust */  
      
    if(kind == 1)  
    {  
        strcpy(i7188Addr, I7188_ADDRESS);  
    }  
    else if(kind == 2)  
    {  
        strcpy(i7188Addr, I7188_ADDRESS_2);  
    }  
    else if(kind == 3)  
    {  
        strcpy(i7188Addr, I7188_ADDRESS_3);  
    }  
      
    ModDataNum = (unsigned short)num;  
      
    readCmdStr[0] = ModAddr;  
    readCmdStr[1] = ModFunction;    
    readCmdStr[2] = (unsigned char)(ModDataAddr >> 8 & 0x00FF);  
    readCmdStr[3] = (unsigned char)(ModDataAddr & 0x00FF);  
    readCmdStr[4] = (unsigned char)(ModDataNum >> 8 & 0x00FF);  
    readCmdStr[5] = (unsigned char)(ModDataNum & 0x00FF);      
    readCmdStr[6] = '\0';  
      
    ClearCom(comPort);  
    SendRtuCmdToModBus(comPort, readCmdStr, readCmdLen);  
          
    isReadOK = ReadModBusRtuSlave(comPort, &ModAddrBack, &ModFunctionBack, &ModByteNumBack,    
        ModDataBack, &ModDataLenBack, MOD_TIMEOUT, MOD_WAITTIME);  
      
    if (1 == isReadOK)  
    {          
        if((ModAddr == ModAddrBack) && (ModFunction == ModFunctionBack) && (ModByteNumBack == ModDataLenBack))    
        {  
            ChangeAllButtonsDataByModBus(buttonJudge, ModDataBack, num);          
                              
            if(Bitmcmp(buttonData, buttonJudge, num))  
            {  
                ChangeAllButtonsDataByModBus(buttonData, ModDataBack, num);        
              
                if(IS_RS485)  Set485DirToTransmit(COMPORT1);  
                SendButtonDataToPC(COMPORT1, buttonData, i7188Addr);      
                if(IS_RS485)  WaitTransmitOver(COMPORT1);  
                if(IS_RS485)  {DelayMs(2); Set485DirToReceive(COMPORT1);}  
                WriteButtonToNVRAM(buttonData, num, buttonNVRAMAddr);      
            }                      
                              
            strmcpy(oldModDataBack, ModDataBack, ModDataLenBack);          
                      
            return 1;  
        }  
        else  
        {  
            /*收到的字符串不匹配*/  
            return 1;  
        }  
    }  
    else  
    {  
        /*未收到字符串或CRC校验出错*/  
        return 0;  
    }  
}  
  
/*-------------------------------------------------------------------------------*/  
  
  
/*********************************************************************************/  
/*函数名称: WriteMultipleWordToModBusSlave()                              
*输入参数:  共 2 个参数;  
*输出参数:  共 1 个参数;  
*返回值:  成功与否;  
*需储存的参数: 共 1 个参数;    
*功能介绍:    
        (1) 从触摸屏中写入设定参数值;  
        (2) 指令为 01 16 HA LA HN LN HD LD ...... HC LC;其中 01 为MODBUSSLAVE的地址,  
            16 为写连续多个WORD寄存器的功能码,HA LA 为第一个寄存器的高低位地址,  
            HN LN 为寄存器数量的高低位,HC LC 为CRC校验码;  
            HD LD 为数据高低位;  
*修改日志:  
*[2005-11-28 18:43]    Ver. 1.00  
        开始编写;  
*[2006-3-1 12:20]        
        中间隔了很多时间;  
        完成初稿,未测试;                            
/*                                      */  
/*********************************************************************************/  
  
int WriteMultipleWordToModBusSlave(int comPort, float parameterData[], unsigned short num, unsigned short ModDataAddr)  
{      
    unsigned char writeCmdStr[MOD_STR_MAX_LEN];            /* adjust */  
    unsigned char ModAddr = 1;  
    unsigned char ModFunction = 16;    
    unsigned short ModDataNum;    
    unsigned short readCmdLen;  
    int isReadOK = 0;      
      
    unsigned short byteCount;  
    unsigned char totalStrBack[300] = {'\0'};  
    unsigned char ModAddrBack = 0;  
    unsigned char ModFunctionBack = 0;  
    unsigned short ModDataAddrBack;  
    unsigned short ModDataNumBack;  
      
    ModDataNum = (unsigned short)num * 2;  
    byteCount = (unsigned short)num * 4;  
    readCmdLen = 7 + byteCount;  
      
    writeCmdStr[0] = ModAddr;  
    writeCmdStr[1] = ModFunction;    
    writeCmdStr[2] = (unsigned char)(ModDataAddr >> 8 & 0x00FF);  
    writeCmdStr[3] = (unsigned char)(ModDataAddr & 0x00FF);  
    writeCmdStr[4] = (unsigned char)(ModDataNum >> 8 & 0x00FF);  
    writeCmdStr[5] = (unsigned char)(ModDataNum & 0x00FF);    
    writeCmdStr[6] = (unsigned char)(byteCount  & 0x00FF);  
    WordDataToModbusStr(writeCmdStr, parameterData, num, 7);  
    writeCmdStr[7 + byteCount] = '\0';  
      
    ClearCom(comPort);  
    SendRtuCmdToModBus(comPort, writeCmdStr, readCmdLen);  
          
    isReadOK = ResponseFromModBusRtuSlave(comPort, totalStrBack,    
        &ModAddrBack, &ModFunctionBack, &ModDataAddrBack,    
        &ModDataNumBack, MOD_TIMEOUT, MOD_WAITTIME);  
      
    if (1 == isReadOK)  
    {              
        if((ModAddr == ModAddrBack) && (ModFunction == ModFunctionBack) && (ModDataAddr == ModDataAddrBack)  
            && (ModDataNum == ModDataNumBack))    
        {              
            return 1;  
        }  
        else  
        {              
            return 0;      
        }  

⌨️ 快捷键说明

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