📄 modbus c源码.txt
字号:
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 + -