📄 slave.c
字号:
}
}
}
}
FlagWsSend[n-1] = 1; //用来标识发送的数据采集命令后,返回的数据已经被处理,可以发送下一个外设的数据采集命令了。
}
/***********************************************************************************************************
功能:Process7053RecvData,打包7053的外设数据。
描述:当外设为7053,且FlagProcessRecvData==1时,调用该函数来打包外设7053的数据,并且保存在相应的存储器中。
参数:wsaddress---外设编号
返回:无
************************************************************************************************************/
void Process7053RecvData(uchar wsaddress)
{
uchar j,len; //j通道值
uchar Temp1,Temp2,Temp3,Temp4,Output;
uint Temp; //7053的暂存变量
uint Max,Min,TempL;
uint length;
uint address1; //原来的外设的最大最小等信息的存储地址
uint address2; //从机的数据存储地址 ;
uint address3; //报警值存储地址
xdata uchar TempBuff[WsChannelParaLen];
xdata uchar TiJiaoDataBuff[7];
Temp1=RecvDataBuff[0]; //保存15-12位数据
Temp2=RecvDataBuff[1]; //保存11-8位数据
Temp3=RecvDataBuff[2]; //保存7-4位数据
Temp4=RecvDataBuff[3]; //保存3-0位数据
if((Temp1 >= 0x30) && (Temp1 <= 0x39)) //如果0=<Temp1=<9
{
Temp1 = Temp1 - 0x30;
}
else if(((Temp1 >= 0x40) && (Temp1 <= 0x46))) //如果A=<Temp1=<F
{
Temp1 = Temp1 - 0x40 + 9;
}
if((Temp2 >= 0x30) && (Temp2 <= 0x39)) //如果0=<Temp2=<9
{
Temp2 = Temp2 - 0x30;
}
else if(((Temp2 >= 0x40) && (Temp2 <= 0x46))) //如果A=<Temp2=<F
{
Temp2 = Temp2 - 0x40 + 9;
}
if((Temp3 >= 0x30) && (Temp3 <= 0x39)) //如果0=<Temp3=<9
{
Temp3 = Temp3 - 0x30;
}
else if(((Temp3 >= 0x40) && (Temp3 <= 0x46))) //如果A=<Temp3=<F
{
Temp3 = Temp3 - 0x40 + 9;
}
if((Temp4 >= 0x30) && (Temp4 <= 0x39)) //如果0=<Temp4=<9
{
Temp4 = Temp4 - 0x30;
}
else if(((Temp4 >= 0x40) && (Temp4 <= 0x46))) //如果A=<Temp4=<F
{
Temp4 = Temp4 - 0x40 + 9;
}
TempL = Temp4 + Temp3 * 0x10 + Temp2 * 0x100 + Temp1 * 0x1000; //求出16个通道的数值,用16位数表示
for( j=Channel1;j<=Channel16;j++)
{
Temp=(TempL&0x0001); //先处理低通道,判断时候为0.
if( Temp == 0) //若为0
{
Temp = 0x00; //表示外设开关关闭
}
else //若不为0
{
Temp = 0xFF; //表示外设开关关闭悬空
}
address1=Ws1channel1 +(wsaddress-1)* 0x100+ j * 0x10; //计算通道j的参数保存地址
MyReadBytes(address1,TempBuff,WsChannelParaLen);
//取出通道j的参数 最大整数,最大小数,最小整数,最小小数,超高报警高,超高报警低,超低报警高,超低报警低,使能,超高报警动作号,超低报警动作号。
if(1/*TempBuff[8]*/) //使能位为1,提交数据包
{
TiJiaoDataBuff[0]=StartFlag; //包开始标识
TiJiaoDataBuff[1]=CmdSendSlave; //包标识
TiJiaoDataBuff[2]=SlaveCode; //从机编号
TiJiaoDataBuff[3]=wsaddress; //外设编号
TiJiaoDataBuff[4]=j; //通道编号
TiJiaoDataBuff[5]=Temp; //通道数据
TiJiaoDataBuff[6]=Temp; //通道数据
length=GetMyDataBytes(MyDataLenAdd); //取出当前已保存的数据长度,用来计算下一次的保存地址。
if((length + 7) > DataLen7053)
{
address2 = MyDataStart;
MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave); //以数据包的形式存储到存储器。
MyWriteOneByte(MyDataLenAdd,(DataLen7053%256)); //设置新的数据长度。
MyWriteOneByte(MyDataLenAdd+1,(DataLen7053/256)); //设置新的数据长度。
}
else
{
address2 = MyDataStart + length; //计算保存的地址。
MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave); //以数据包的形式存储到存储器。
SetMyDataBytes(MyDataLenAdd,LenCmdSendSlave); //设置新的数据长度。
}
Max=TempBuff[0]; //是否报警
Min=TempBuff[2];
if(TempBuff[3] == 0x01) //如果该通道常开
{
if(Temp == 0x00) //如果该通道常开,而通道返回数据闭合了则发出超低报警!
{
Output = TempBuff[10];
if(Output != 0xFF)
{
len=MyReadOneByte(WsAlarmLen);
address3=WsAlarm + len ;
MyWriteOneByte(address3,Output);
MyWriteOneByte(WsAlarmLen,len+1);
}
}
}
else if(TempBuff[3] == 0x00) //如果该通道常闭
{
if(Temp == 0xFF) //如果该通道常闭,而通道返回数据断开了则发出超高报警!
{
Output = TempBuff[9];
if(Output != 0xFF)
{
len=MyReadOneByte(WsAlarmLen);
address3=WsAlarm + len;
MyWriteOneByte(address3,Output);
MyWriteOneByte(WsAlarmLen,len+1);
}
}
}
TempL = (TempL>>1); //右移一位
}
}
FlagWsSend[n-1] = 1; //用来标识发送的数据采集命令后,返回的数据已经被处理,可以发送下一个外设的数据采集命令了。
}
/***********************************************************************************************************
功能:CopyToComRam,把自带RAM里面的数据拷贝到公共RAM区域里面.
描述:实现把自己自带RAM里面的数据通过缓冲区CopyBuff[COPYLEN]拷贝到公共RAM区域里面,如果长度不超过缓冲区长度就
一次拷贝过去,假如长度超过缓冲区长度就分几次拷贝过去。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度
返回:无
************************************************************************************************************/
void CopyToComRam(uint address1,uint address2,uint length)
{
xdata uchar CopyBuff[COPYLEN]; //缓冲区数组。
uchar i,len1,len2;
len1=(uchar)(length / COPYLEN); //拷贝的次数。
len2=(uchar)(length % COPYLEN); //拷贝的余数。
if(length>0) //验证length的有效性。
{
if(length>COPYLEN) //length大于缓冲区的长度。
{
for(i=0;i<len1;i++)
{
MyReadBytes(address1,CopyBuff,COPYLEN);
ComWriteBytes(address2,CopyBuff,COPYLEN);
address1 += COPYLEN;
address2 += COPYLEN;
}
MyReadBytes(address1,CopyBuff,len2);
ComWriteBytes(address2,CopyBuff,len2);
}
else //length小于缓冲区的长度。
{
MyReadBytes(address1,CopyBuff,length);
ComWriteBytes(address2,CopyBuff,length);
}
}
}
/***********************************************************************************************************
功能:CopyToMyRam,从公共RAM里拷贝相应的数据到自己的RAM。
描述:实现从公共RAM里通过数组CopyBuff[COPYLEN]拷贝数据到自己的RAM,如果长度不超过缓冲区长度就一次拷贝过去,假
如长度超过缓冲区长度就分几次拷贝过去。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度
返回:无
************************************************************************************************************/
void CopyToMyRam(uint address1,uint address2,uint length)
{
xdata uchar CopyBuff[COPYLEN]; //缓冲区数组。
uchar i,len1,len2;
len1=(uchar)(length / COPYLEN); //拷贝的次数。
len2=(uchar)(length % COPYLEN); //拷贝的余数。
if(length>0) //验证length的有效性。
{
if(length>COPYLEN) //length大于缓冲区的长度
{
for(i=0;i<len1;i++)
{
ComReadBytes(address1,CopyBuff,COPYLEN);
MyWriteBytes(address2,CopyBuff,COPYLEN);
address1 += COPYLEN ;
address2 += COPYLEN ;
}
ComReadBytes(address1,CopyBuff,len2);
MyWriteBytes(address2,CopyBuff,len2);
}
else //length小于缓冲区的长度。
{
ComReadBytes(address1,CopyBuff,length);
MyWriteBytes(address2,CopyBuff,length);
}
}
}
/***********************************************************************************************************
功能:CopyAllToComRam(),把所有需要拷贝到公共RAM的从机数据拷贝的公共RAM中去。
描述:实现把所有需要拷贝到公共RAM的从机数据拷贝的公共RAM中去。
参数:无
返回:无
************************************************************************************************************/
void CopyAllToComRam()
{
uint length = 0;
uchar len = 0;
/********************************************从机外设数据******************************************/
if(SlaveCode == SlaveCode1)
{
/********************************************从机外设数据******************************************/
length=GetMyDataBytes(MyDataLenAdd); //再取出从机1数据的长度。
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearComRam(ComSlaveLenAdd1); //先清除公共RAM数据区从机1数据的长度。
CopyToComRam(MyDataLenAdd,ComSlaveLenAdd1,2); //再把长度写入公共RAM区从机1的长度地址中。
CopyToComRam(MyDataStart,ComSlaveDataStart1,length); //再把从机的数据拷贝到公共RAM中去。
}
ClearMyRam(MyDataLenAdd); //写完后,原来的计数值清零,重新存储.
/********************************************从机外设数据******************************************/
/********************************************从机报警数据******************************************/
len = MyReadOneByte(WsAlarmLen); //取出从机1报警动作号长度.
CopyToComRam(WsAlarm,ComAlarmStart1,len); //拷贝从机的报警动作号到公共RAM中.
ComWriteOneByte(ComAlarmLenAdd1,len); //从机报警动作号长度写入公共RAM中.
MyWriteOneByte(WsAlarmLen,0x00); //清除从机1报警动作号长度.
/********************************************从机报警数据******************************************/
}
if(SlaveCode == SlaveCode2)
{
/********************************************从机外设数据******************************************/
length=GetMyDataBytes(MyDataLenAdd); //再取出从机1数据的长度。
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearComRam(ComSlaveLenAdd2); //先清除公共RAM数据区从机1数据的长度。
CopyToComRam(MyDataLenAdd,ComSlaveLenAdd2,2); //再把长度写入公共RAM区从机1的长度地址中。
CopyToComRam(MyDataStart,ComSlaveDataStart2,length); //再把从机的数据拷贝到公共RAM中去。
}
ClearMyRam(MyDataLenAdd); //写完后,原来的计数值清零,重新存储.
/********************************************从机外设数据******************************************/
/********************************************从机报警数据******************************************/
len = MyReadOneByte(WsAlarmLen); //取出从机1报警动作号长度.
CopyToComRam(WsAlarm,ComAlarmStart2,len); //拷贝从机的报警动作号到公共RAM中.
ComWriteOneByte(ComAlarmLenAdd2,len); //从机报警动作号长度写入公共RAM中.
MyWriteOneByte(WsAlarmLen,0x00); //清除从机1报警动作号长度.
/********************************************从机报警数据******************************************/
}
if(SlaveCode == SlaveCode3)
{
/********************************************从机外设数据******************************************/
length=GetMyDataBytes(MyDataLenAdd); //再取出从机1数据的长度。
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearComRam(ComSlaveLenAdd3); //先清除公共RAM数据区从机1数据的长度。
CopyToComRam(MyDataLenAdd,ComSlaveLenAdd3,2); //再把长度写入公共RAM区从机1的长度地址中。
CopyToComRam(MyDataStart,ComSlaveDataStart3,length); //再把从机的数据拷贝到公共RAM中去。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -