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