📄 plc_comm.c
字号:
********************************************************************************/
void PLC_Comm_Send(uint16 data_s_add,uint8 count)
{uint32 PLC_Send_S_Add,PLC_Send_E_Add;
uint8 PLC_Send_temp,PLC_Send_Sum;
if(data_s_add>=0x5b90&&data_s_add<=0x5b90){PLC_Comm_Batch();} //批量数据读
if(data_s_add>=0x8000&&data_s_add<0xBEDC) //读程序区
{PLC_Send_S_Add=(PLC_PROG_START_ADD+data_s_add)-0x8000;}
else{PLC_Send_S_Add=PLC_R_START_ADD+data_s_add;} //读RAM区开始地址
PLC_Send_E_Add=PLC_Send_S_Add+count;
if((PLC_Send_E_Add>=PLC_R_START_ADD&&PLC_Send_E_Add<=PLC_R_END_ADD)|| //测试地址是否超出
(PLC_Send_E_Add>=PLC_PROG_START_ADD&&PLC_Send_E_Add<=PLC_PROG_END_ADD))
{PLC_UART_T_CNT=0;
PLC_UART_T_BUFFER[0]=0x02;
PLC_UART_T_CNT++;
PLC_Send_Sum=0x03;
for(;PLC_Send_E_Add>PLC_Send_S_Add;PLC_Send_S_Add++)
{PLC_Send_temp=asc[PLC_RAM8(PLC_Send_S_Add)/0x10];
PLC_UART_T_BUFFER[PLC_UART_T_CNT]=PLC_Send_temp;
PLC_UART_T_CNT++;
PLC_Send_Sum+=PLC_Send_temp;
PLC_Send_temp=asc[PLC_RAM8(PLC_Send_S_Add)&0x0f];
PLC_UART_T_BUFFER[PLC_UART_T_CNT]=PLC_Send_temp;
PLC_UART_T_CNT++;
PLC_Send_Sum+=PLC_Send_temp;}
PLC_UART_T_BUFFER[PLC_UART_T_CNT]=0x03;
PLC_UART_T_CNT++;
PLC_UART_T_BUFFER[PLC_UART_T_CNT]=asc[PLC_Send_Sum/0x10];
PLC_UART_T_CNT++;
PLC_UART_T_BUFFER[PLC_UART_T_CNT]=asc[PLC_Send_Sum%0x10];
PLC_UART_T_CNT++;
UART_COUNT=PLC_UART_T_CNT;UART_COUNT2=0;
}
else{PLC_UART_SEND(0x15);}
}
/*******************************************************************************
函数名称:PLC_UART_CMD()
函数功能:串口数据处理
入口参数:
出口参数:
********************************************************************************/
void PLC_UART_CMD(void)
{uint8 PLC_Uart_Sum;
if (PLC_UART_RECEIVE_CNT)
{if(PLC_UART_BUFFER[0]==0x05)
{PLC_UART_RECEIVE_CNT=0;
PLC_UART_SEND(0x06);}
else if(PLC_UART_BUFFER[0]==0x02)
{if(PLC_UART_BUFFER[PLC_UART_RECEIVE_CNT-3]==0x03)
{ PLC_Uart_Sum=check(PLC_UART_BUFFER);
if(PLC_Uart_Sum/0x10==hex[PLC_UART_BUFFER[PLC_UART_RECEIVE_CNT-2]]&&\
PLC_Uart_Sum%0x10==hex[PLC_UART_BUFFER[PLC_UART_RECEIVE_CNT-1]])//和校验
{PLC_UART_RECEIVE_CNT=0;
PLC_UART_HANDLE(); //处理串口数据
PLC_UART_RECEIVE_CNT=0;
} //正确处理数据
else {PLC_UART_RECEIVE_CNT=0;
PLC_UART_SEND(0x15); //错误返回错误码(NCK)
PLC_UART_RECEIVE_CNT=0; //置错误标志
}
}
}
else{PLC_UART_RECEIVE_CNT=0;
PLC_UART_SEND(0x15);}
}
}
/*******************************************************************************
函数名称: PLC_UART_HANDLE(void)
函数功能: 处理串口数据
入口参数:
出口参数:
********************************************************************************/
uint8 PLC_PROG_W_BIT=0;
void PLC_UART_HANDLE(void)
{uint32 PLC_Uart_Add,PLC_Uart_Add_temp;
uint16 PLC_Uart_S_Add;
uint8 PLC_Uart_Temp,PLC_Uart_Count;
if(PLC_UART_BUFFER[1]==0X30) //0读数据
{PLC_Uart_S_Add=PLC_Buf4AsciiHex(2);
PLC_Uart_Count=PLC_Buf2AsciiHex(6);
PLC_Comm_Send(PLC_Uart_S_Add,PLC_Uart_Count);
}/********************************END读数据********************************************/
else if(PLC_UART_BUFFER[1]==0X31) //1写数据
{PLC_Uart_Add=PLC_R_START_ADD+PLC_Buf4AsciiHex(2); //开始地址
PLC_Uart_Add_temp=PLC_Uart_Add+PLC_Buf2AsciiHex(6);
PLC_Uart_Temp=8;
for(;PLC_Uart_Add_temp>PLC_Uart_Add;PLC_Uart_Add++)
{PLC_RAM8(PLC_Uart_Add)=PLC_Buf2AsciiHex(PLC_Uart_Temp);
PLC_Uart_Temp+=2;}
PLC_UART_SEND(0x06);
}/********************************END写数据********************************************/
else if(PLC_UART_BUFFER[1]==0X37) //7强制ON
{PLC_Uart_S_Add=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[2]]<<4)+hex[PLC_UART_BUFFER[3]];
PLC_BIT_ON(PLC_Uart_S_Add);
PLC_UART_SEND(0x06);
}/********************************END强制ON********************************************/
else if(PLC_UART_BUFFER[1]==0X38) //8强制OFF
{PLC_Uart_S_Add=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)\
+(hex[PLC_UART_BUFFER[2]]<<4)+hex[PLC_UART_BUFFER[3]];
PLC_BIT_OFF(PLC_Uart_S_Add);
PLC_UART_SEND(0x06);
}/********************************END强制OFF********************************************/
else if(PLC_UART_BUFFER[1]==0X45) //强制FNC
{if(PLC_UART_BUFFER[2]==0x30)
{if(PLC_UART_BUFFER[3]==0x30)//E00读配置
{PLC_Uart_S_Add=PLC_Comm_Byte_ADD((hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]]);
PLC_Uart_Count=(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
PLC_Comm_Send(PLC_Uart_S_Add,PLC_Uart_Count);
}/*********************END读配置*************************/
else if(PLC_UART_BUFFER[3]==0x31)//E01读程序
{PLC_Uart_S_Add=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]];
PLC_Uart_Count=(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
PLC_Comm_Send(PLC_Uart_S_Add,PLC_Uart_Count);
}/*********************END读程序*************************/
else{PLC_UART_SEND(0x15);} //通信出错
}
else if(PLC_UART_BUFFER[2]==0x31)
{if(PLC_UART_BUFFER[3]==0x30)//E10写配置
{PLC_Uart_Add_temp=(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]]; //开始地址
PLC_Uart_Add=PLC_R_START_ADD+PLC_Comm_Byte_ADD(PLC_Uart_Add_temp);
PLC_Uart_Add_temp=PLC_Uart_Add+(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
PLC_Uart_Temp=10;
for(;PLC_Uart_Add_temp>PLC_Uart_Add;PLC_Uart_Add++)
{PLC_RAM8(PLC_Uart_Add)=(hex[PLC_UART_BUFFER[PLC_Uart_Temp]]<<4)+hex[PLC_UART_BUFFER[PLC_Uart_Temp+1]];
PLC_Uart_Temp+=2;}
PLC_UART_SEND(0x06);
}/*********************END写配置*************************/
else if(PLC_UART_BUFFER[3]==0x31)//E11写程序
{PLC_Uart_Add=PLC_PROG_B_START_ADD+(hex[PLC_UART_BUFFER[4]]<<12)+(hex[PLC_UART_BUFFER[5]]<<8)+(hex[PLC_UART_BUFFER[6]]<<4)+hex[PLC_UART_BUFFER[7]]-0X805C;
PLC_Uart_Add_temp=PLC_Uart_Add+(hex[PLC_UART_BUFFER[8]]<<4)+hex[PLC_UART_BUFFER[9]];
PLC_Uart_Temp=10;
if(PLC_Uart_Add==PLC_PROG_B_START_ADD){PLC_Iap_data_rst();PLC_PROG_W_BIT=1;}
for(;PLC_Uart_Add_temp>PLC_Uart_Add;PLC_Uart_Add++)
{PLC_RAM8(PLC_Uart_Add)=(hex[PLC_UART_BUFFER[PLC_Uart_Temp]]<<4)+hex[PLC_UART_BUFFER[PLC_Uart_Temp+1]];
PLC_Uart_Temp+=2;}
PLC_UART_SEND(0x06);
}/*********************END写程序*************************/
else{PLC_UART_SEND(0x15);}//通信出错
}
else if(PLC_UART_BUFFER[2]==0x37)//E7强制ON
{PLC_Uart_S_Add=PLC_Comm_Bit_ADD((hex[PLC_UART_BUFFER[5]]*0x1000)\
+(hex[PLC_UART_BUFFER[6]]*0x100)\
+(hex[PLC_UART_BUFFER[3]]*0x10)\
+hex[PLC_UART_BUFFER[4]]);
PLC_BIT_ON(PLC_Uart_S_Add);
PLC_UART_SEND(0x06);
}
else if(PLC_UART_BUFFER[2]==0x38)//E8强制OFF
{PLC_Uart_S_Add=PLC_Comm_Bit_ADD((hex[PLC_UART_BUFFER[5]]*0x1000)\
+(hex[PLC_UART_BUFFER[6]]*0x100)\
+(hex[PLC_UART_BUFFER[3]]*0x10)\
+hex[PLC_UART_BUFFER[4]]);
PLC_BIT_OFF(PLC_Uart_S_Add);
PLC_UART_SEND(0x06);
}
else{PLC_UART_SEND(0x15);} //通信出错
}/********************************END强制FNC********************************************/
else if(PLC_UART_BUFFER[1]==0x42) //程序下载完成
{if(PLC_PROG_W_BIT==1){Plc_Program_iap();PLC_PROG_W_BIT=0;PLC_RUN_BIT=0;D8065=0;} //写入程序
PLC_UART_SEND(0x06);}
else if(PLC_UART_BUFFER[1]==0x34)
{PLC_UART_SEND(0x06);}
else{PLC_UART_SEND(0x15);}//通信出错
}
/*******************************************************************************
函数名称:PLC_CommCmd
函数功能:通信命令重定义及执行
入口参数:Cmd命令
出口参数:映射的实际地址(BIT地址)
********************************************************************************/
void PLC_CommCmd(uint8 Cmd,uint16 Add)
{;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -