📄 slave.c
字号:
}
ClearMyRam(MyDataLenAdd); //写完后,原来的计数值清零,重新存储.
/********************************************从机外设数据******************************************/
/********************************************从机报警数据******************************************/
len = MyReadOneByte(WsAlarmLen); //取出从机1报警动作号长度.
CopyToComRam(WsAlarm,ComAlarmStart3,len); //拷贝从机的报警动作号到公共RAM中.
ComWriteOneByte(ComAlarmLenAdd3,len); //从机报警动作号长度写入公共RAM中.
MyWriteOneByte(WsAlarmLen,0x00); //清除从机1报警动作号长度.
/********************************************从机报警数据******************************************/
}
if(SlaveCode == SlaveCode4)
{
/********************************************从机外设数据******************************************/
length=GetMyDataBytes(MyDataLenAdd); //再取出从机1数据的长度。
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearComRam(ComSlaveLenAdd4); //先清除公共RAM数据区从机1数据的长度。
CopyToComRam(MyDataLenAdd,ComSlaveLenAdd4,2); //再把长度写入公共RAM区从机1的长度地址中。
CopyToComRam(MyDataStart,ComSlaveDataStart4,length); //再把从机的数据拷贝到公共RAM中去。
}
ClearMyRam(MyDataLenAdd); //写完后,原来的计数值清零,重新存储.
/********************************************从机外设数据******************************************/
/********************************************从机报警数据******************************************/
len = MyReadOneByte(WsAlarmLen); //取出从机1报警动作号长度.
CopyToComRam(WsAlarm,ComAlarmStart4,len); //拷贝从机的报警动作号到公共RAM中.
ComWriteOneByte(ComAlarmLenAdd4,len); //从机报警动作号长度写入公共RAM中.
MyWriteOneByte(WsAlarmLen,0x00); //清除从机1报警动作号长度.
/********************************************从机报警数据******************************************/
}
if(SlaveCode == SlaveCode5)
{
/********************************************从机外设数据******************************************/
length=GetMyDataBytes(MyDataLenAdd); //再取出从机1数据的长度。
if((length > 0) && (length <= MaxSlaveDataLen))
{
ClearComRam(ComSlaveLenAdd5); //先清除公共RAM数据区从机1数据的长度。
CopyToComRam(MyDataLenAdd,ComSlaveLenAdd5,2); //再把长度写入公共RAM区从机1的长度地址中。
CopyToComRam(MyDataStart,ComSlaveDataStart5,length); //再把从机的数据拷贝到公共RAM中去。
}
ClearMyRam(MyDataLenAdd); //写完后,原来的计数值清零,重新存储.
/********************************************从机外设数据******************************************/
/********************************************从机报警数据******************************************/
len = MyReadOneByte(WsAlarmLen); //取出从机1报警动作号长度.
CopyToComRam(WsAlarm,ComAlarmStart5,len); //拷贝从机的报警动作号到公共RAM中.
ComWriteOneByte(ComAlarmLenAdd5,len); //从机报警动作号长度写入公共RAM中.
MyWriteOneByte(WsAlarmLen,0x00); //清除从机1报警动作号长度.
/********************************************从机报警数据******************************************/
}
}
/***********************************************************************************************************
功能:CopyAllToMyRam(),把公共RAM中所有相应的数据拷贝到再带RAM中去。
描述:实现把公共RAM中所有相应的数据拷贝到再带RAM中去,主要是拷贝服务器发来的存储在公共RAM中的命令。
参数:无
返回:无
************************************************************************************************************/
void CopyAllToMyRam()
{
uint length = 0;
length = GetComDataBytes(ComLenOrder); //再取出公共RAM中命令的长度。
if((length > 0) && (length <= MaxOrderLen))
{
ClearMyRam(MyOrderLen); //先清楚自带RAM中的长度。
CopyToMyRam(ComLenOrder,MyOrderLen,2); //再把公共RAM的长度写入再带RAM的长度中去。
CopyToMyRam(ComOrderStart,MyOrderStart,length); //从公共RAM拷贝命令到自带RAM中去。
FlagProcessOrderStart = 1; //置位拷贝标志位。
}
}
/***********************************************************************************************************
功能:SetSampleRate,设置采集外设数据的速率。
描述:设置采集外设数据的速率。
参数:无
返回:无
************************************************************************************************************/
void SetSampleRate(uint rate)
{
Sample = rate/SampleBase;
}
/***********************************************************************************************************
功能:SendOrder,发送外设采集数据命令。
描述:实现根据外设类型的不同发送不同的外设数据采集命令。
参数:无
返回:无
************************************************************************************************************/
void SendOrder(uchar n)
{
if(WsType == WsType1)
{
Send7017Order(n);
}
else if(WsType == WsType2)
{
Send7053Order(n);
}
}
/***********************************************************************************************************
功能:SendAllOrder,发送所有外设的数据采集命令。
描述:实现不同外设数目的数据采集命令,在同一个从机外设类型是一样的。按从机1-从机2-从机3-从机4-从机5-从机1的顺
序发送,假如外设个数小于5个,按同样的顺序处理。每一个外设命令的发送都要满足一定的条件:1.前面的外设数据
已返回,通过FlagWsSend[]数组来判断;2.假如前面的外设没有返回,而且时间超过了WaitLen个周期,则自动发送下
一个外设的数据采集命令。n-表示当前正在采集数据的外设编号。
参数:无
返回:无
************************************************************************************************************/
void SendAllOrder()
{
if(n==WsNumber) //当到了一轮的最后一个外设的时候。
{
if(FlagWsSend[n-1]) //如果前一个外设的数据已返回。
{
n=1; //则下一个采集的是1号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[n-1] = 0; //复位前一个从机的数据返回标志。
TimesNum = 0;
}
else
{
if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
{
n=1; //则下一个采集的是1号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[n-1] = 0; //复位前一个从机的数据返回标志。
TimesNum = 0;
}
}
}
if(n==1 && n<WsNumber) //当到了第1个外设的时候,而且外设的数目大于1.
{
if(FlagWsSend[0]) //如果1号外设的数据已返回。
{
n=2; //则下一个采集的是2号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[0] = 0; //复位1号外设的数据返回标志。
TimesNum = 0;
}
else
{
if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
{
n=2; //则下一个采集的是2号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[0] = 0; //复位1号外设的数据返回标志。
TimesNum = 0;
}
}
}
if(n==2 && n<WsNumber) //当到了第2个外设的时候,而且外设的数目大于2。
{
if(FlagWsSend[1]) //如果2号外设的数据已返回。
{
n=3; //则下一个采集的是3号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[1] = 0; //复位2号外设的数据返回标志。
TimesNum = 0;
}
else
{
if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
{
n=3; //如果2号外设的数据已返回。
SendOrder(n); //发送数据采集命令。
FlagWsSend[1] = 0; //复位2号外设的数据返回标志。
TimesNum = 0;
}
}
}
if(n==3 && n<WsNumber) //当到了第3个外设的时候,而且外设的数目大于3。
{
if(FlagWsSend[2]) //如果3号外设的数据已返回。
{
n=4; //则下一个采集的是4号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[2] = 0; //复位3号外设的数据返回标志。
TimesNum = 0;
}
else
{
if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
{
n=4; //则下一个采集的是4号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[2] = 0; //复位3号外设的数据返回标志。
TimesNum = 0;
}
}
}
if(n==4 && n<WsNumber) //当到了第4个外设的时候,而且外设的数目大于4。
{
if(FlagWsSend[3]) //如果4号外设的数据已返回。
{
n=5; //则下一个采集的是5号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[3] = 0; //复位4号外设的数据返回标志。
TimesNum = 0;
}
else
{
if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
{
n=5; //则下一个采集的是5号从机。
SendOrder(n); //发送数据采集命令。
FlagWsSend[3] = 0; //复位4号外设的数据返回标志。
TimesNum = 0;
}
}
}
}
/***********************************************************************************************************
功能:main
描述:
参数:无
返回:无
************************************************************************************************************/
void main()
{
xdata uchar DefaultConfig[SlaveParaLen];
uint i = 0;
n = 1;
InitSerialCom(); //串口初始化。
Time0Initial(); //定时器0初始化。
SCONF |= 0x02; //使用xdata的使能控制.
P20 = 1;
DefaultConfig[0] = 0x02; //波特率。
DefaultConfig[1] = 0x02; //外设的类型,WsType1(0x01)表示外设是7017,WsType2(0x02)表示外设是7053
DefaultConfig[2] = 0x02; //从机的外设个数
DefaultConfig[3] = 0x10; //读取外设数据的时间间隔
DefaultConfig[4] = 0x00; //读取外设数据的时间间隔
/****************************************从机默认初始化参数*****************************************/
MyWriteBytes(MySlaveParaStart,DefaultConfig,SlaveParaLen);
MyReadBytes(MySlaveParaStart,DefaultConfig,SlaveParaLen); //读取默认从机配置信息到配置数组。
BodeRate = DefaultConfig[0]; //从机与外设通讯的波特率
WsType = DefaultConfig[1]; //外设的类型,WsType1(0x01)表示外设是7017,WsType2(0x02)表示外设是7053
WsNumber = DefaultConfig[2]; //从机的外设个数
ReadDataRate = DefaultConfig[3] * 0x100 + DefaultConfig[4]; //读取外设数据的时间间隔
SetBodeRate(BodeRate);//设置波特率。
SetSampleRate(ReadDataRate);//设置采集数据的频率。
/****************************************从机默认初始化参数*****************************************/
/****************************************从机自带RAM初始化*****************************************/
ClearMyRam(MyDataLenAdd);
ClearMyRam(MyOrderLen);
MyWriteOneByte(WsAlarmLen,0x00);
/****************************************从机自带RAM初始化*****************************************/
if(WsType == WsType1) //如果外设是7017,则RecvDataSize==56。
{
RecvDataSize = LenRecvWsType1;
}
else if(WsType == WsType2) //如果外设是7053,则RecvDataSize==4。
{
RecvDataSize = LenRecvWsType2;
}
for(i=0;i<RecvDataSize;i++)
{
RecvDataBuff[i]=0; //初始化外设数据接收数组。
}
while(1)
{
if(FlagProcessRecvData) //如果外设数据已接收在数组中。
{
if(WsType == WsType1)
{
Process7017RecvData(n); //处理外设n7017的数据。
}
else if(WsType == WsType2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -