📄 modbus c源码.txt
字号:
}
else
{
/*未收到字符串或CRC校验出错*/
return 0;
}
}
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*函数名称: WriteMultipleBitToModBusSlave()
*输入参数: 共 2 个参数;
*输出参数: 共 1 个参数;
*返回值: 成功与否;
*需储存的参数: 共 1 个参数;
*功能介绍:
(1) 从触摸屏中写入BIT;
(2) 指令为 01 15 HA LA HN LN HD LD ...... HC LC;其中 01 为MODBUSSLAVE的地址,
16 为读连续多个WORD寄存器的功能码,HA LA 为第一个BIT的高低位地址,
HN LN 为BIT数量的高低位,HC LC 为CRC校验码;
HD LD 为数据高低位;
*修改日志:
*[2006-3-1 12:58] Ver. 1.00
开始编写;
*[2006-3-1 13:29]
完成;
/* */
/*********************************************************************************/
int WriteMultipleBitToModBusSlave(int comPort, int DOData[], unsigned short num, unsigned short ModDataAddr)
{
unsigned char writeCmdStr[100];
unsigned char ModAddr = 1;
unsigned char ModFunction = 15;
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;
if(num % 8)
byteCount = (unsigned short)(num / 8 + 1);
else byteCount = (unsigned short)(num / 8);
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);
BitDataToModbusStr(writeCmdStr, DOData, 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;
}
}
else
{
/*未收到字符串或CRC校验出错*/
return 0;
}
}
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*函数名称: WriteSingleBitToModBusSlave()
*输入参数: 共 2 个参数;
*输出参数: 共 1 个参数;
*返回值: 成功与否;
*需储存的参数: 共 1 个参数;
*功能介绍:
(1) 从触摸屏中写入BIT;
(2) 指令为 01 05 HA LA HD LD ...... HC LC;其中 01 为MODBUSSLAVE的地址,
05 为写单个BIT功能码,HA LA 为第一个BIT的高低位地址,
HN LN 为BIT数量的高低位,HC LC 为CRC校验码;
HD LD 为数据高低位;
*修改日志:
*[2006-3-7 14:06] Ver. 1.00
开始编写;
*[2006-3-7 14:40]
完成;
*[2006-3-9 12:44]
去掉了等待接收反馈的功能;
/* */
/*********************************************************************************/
int WriteSingleBitToModBusSlave(int comPort, int DOData[], unsigned short num, unsigned short ModDataAddr)
{
unsigned char writeCmdStr[15];
unsigned char ModAddr = 1;
unsigned char ModFunction = 5;
unsigned short ModDataState;
unsigned short readCmdLen = 6;
/* int isReadOK = 0;
unsigned short byteCount;
unsigned char totalStrBack[100];
unsigned char ModAddrBack = 0;
unsigned char ModFunctionBack = 0;
unsigned short ModDataAddrBack;
unsigned short ModDataStateBack;
*/
ModDataState = DOData[num];
writeCmdStr[0] = ModAddr;
writeCmdStr[1] = ModFunction;
writeCmdStr[2] = (unsigned char)(ModDataAddr >> 8 & 0x00FF);
writeCmdStr[3] = (unsigned char)(ModDataAddr & 0x00FF);
if(ModDataState) writeCmdStr[4] = (unsigned char)(0x00FF);
else writeCmdStr[4] = (unsigned char)(0x0000);
writeCmdStr[5] = (unsigned char)(0x0000);
writeCmdStr[6] = '\0';
/* ClearCom(comPort); */
SendRtuCmdToModBus(comPort, writeCmdStr, readCmdLen);
return 1;
/*
isReadOK = ResponseSingleBitFromModBus(comPort, totalStrBack,
&ModAddrBack, &ModFunctionBack, &ModDataAddrBack,
&ModDataStateBack, MOD_TIMEOUT, MOD_WAITTIME);
if (1 == isReadOK)
{
Print("\tB %u %u %u %u %u %u %u %u", ModAddr, ModAddrBack, ModFunction, ModFunctionBack, ModDataAddr, ModDataAddrBack, ModDataState, ModDataStateBack);
if((ModAddr == ModAddrBack) && (ModFunction == ModFunctionBack) && (ModDataAddr == ModDataAddrBack)
&& (ModDataState == ModDataStateBack))
{
Print("\tretur sB1 \t");
return 1;
}
else
{
Print("\tretur sB0 \t");
return 0;
}
}
else
{
/*未收到字符串或CRC校验出错* /
return 0;
}
*/
}
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*函数名称: WriteBitByBitToModBusSlave()
*输入参数: 共 个参数;
*输出参数: 共 个参数;
*返回值: 成功与否;
*需储存的参数: 共 个参数;
*功能介绍:
(1) 一个一个地将BIT写如触摸屏中;
(2) 可能很耗时;
*修改日志:
*[2006-3-7 14:40] Ver. 1.00
开始编写;
*[2006-3-7 14:51]
完成;
/* */
/*********************************************************************************/
int WriteBitByBitToModBusSlave(int comPort, int DOData[], int dataOld[], unsigned short num, unsigned short ModDataAddr)
{
int i;
for(i = 0; i < num; i ++)
{
if(DOData[i] != dataOld[i])
{
DelayMs(1);
WriteSingleBitToModBusSlave(comPort, DOData, i, ModDataAddr + i);
}
}
return 1;
}
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*函数名称: WriteAllBitByBitToModBusSlave()
*输入参数: 共 个参数;
*输出参数: 共 个参数;
*返回值: 成功与否;
*需储存的参数: 共 个参数;
*功能介绍:
(1) 一个一个地将BIT写如触摸屏中;
(2) 可能很耗时;
*修改日志:
*[2006-3-9 12:52] Ver. 1.00
开始编写;
*[2006-3-9 12:52]
完成;
/* */
/*********************************************************************************/
int WriteAllBitByBitToModBusSlave(int comPort, int DOData[], unsigned short num, unsigned short ModDataAddr)
{
int i;
for(i = 0; i < num; i ++)
{
DelayMs(1);
WriteSingleBitToModBusSlave(comPort, DOData, i, ModDataAddr + i);
}
return 1;
}
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*函数名称: ListenToTouch()
*输入参数: 共 个参数;
*输出参数: 共 个参数;
*返回值: 无;
*需储存的参数: 共 个参数;
*功能介绍:
(1)监控Touch触摸屏;
(2) init的工作给 WriteMultipleWordToModBusSlave 是否成功。
(3) 必须要DelayMs(50)才能使一下个response正确。
*修改日志:
*[2006-3-1 17:19] Ver. 1.00
开始编写;
*[2006-3-1 17:33]
完成;
*[2006-3-9 14:10]
测试通过;
/* */
/*********************************************************************************/
void ListenToTouch(int comPort, int buttonData[], float parameterData[], int DOData[], float AIData[])
{
int kind = 1; /* adjust */
unsigned short parameterNum = PARAMETER_DATA_NUM;
unsigned short parameterAddr = PARAMETER_MODBUS_ADDR_1; /* adjust */
unsigned short buttonNum = BUTTON_DATA_NUM;
unsigned short buttonAddr = BUTTON_MODBUS_ADDR_1; /* adjust */
unsigned short DONum = DIGITAL_OUT_DATA_NUM;
unsigned short DOAddr = DO_MODBUS_ADDR_1; /* adjust */
unsigned short AINum = ANALOG_IN_DATA_NUM;
unsigned short AIAddr = AI_MODBUS_ADDR_1; /* adjust */
int buttonNVRAMAddr = BUTTON_ADDR_1; /* adjust */
int parameterEEPROMAddr = EEPROM_BLOCK; /* adjust */
static unsigned char oldModWordBack[MOD_STR_MAX_LEN] = {'\0'}; /* 以前的str */
static unsigned char oldModBitBack[MOD_STR_MAX_LEN] = {'\0'};
static int responseFromTouch_init = 0; /*首次初始化*/
/* static int responseFromTouch_P = 0;
static int responseFromTouch_Btn = 0;
static int oldButtonData[30] = {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0};
static int oldDOData[30] = {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0};
*/
int response; /*test*/
/* Print("\n\n"); */
if(0 == responseFromTouch_init) /* 第一次写入Touch_Btn失败重新写 */
{
/* responseFromTouch_Btn = WriteMultipleBitToModBusSlave(comPort, buttonData, buttonNum, buttonAddr);
*/ response = WriteAllBitByBitToModBusSlave(comPort, buttonData, buttonNum, buttonAddr);
/* bitmcpy(oldButtonData, buttonData, buttonNum); */
}
else
{
/* 读取按钮值 */
response = ReadBitFromModBusSlave(kind, comPort, buttonData, buttonNum, buttonAddr, buttonNVRAMAddr, oldModBitBack);
}
DelayMs(50);
/* Print(" rb%d", response); */
if(0 == responseFromTouch_init) /* 第一次写入Touch_P失败重新写 */
{
responseFromTouch_init = WriteMultipleWordToModBusSlave(comPort, parameterData, parameterNum, parameterAddr);
response = responseFromTouch_init;
/* responseFromTouch_P = 1; /*test*/
}
else
{
/* 读取设定参数 */
response = ReadWordFromModBusSlave(kind, comPort, parameterData, parameterNum, parameterAddr, parameterEEPROMAddr, oldModWordBack);
}
/* Print(" p%d", responseFromTouch_P);
Print(" rp%d", response); */
DelayMs(2);
/* 写入开关量 */
/* response = WriteMultipleBitToModBusSlave(comPort, DOData, DONum, DOAddr);
*/
response = WriteAllBitByBitToModBusSlave(comPort, DOData, DONum, DOAddr);
/* bitmcpy(oldDOData, DOData, DONum); */
/* Print(" d%d", response); */
DelayMs(40);
/* 写入采样值 */
response = WriteMultipleWordToModBusSlave(comPort, AIData, AINum, AIAddr);
/* Print(" a%d", response); */
if(response);
}
/*-------------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -