📄 plc_comm.c
字号:
;/****************************************Copyright (C)**************************************************
;** Email:luheding@126.com
;** QQ:614090042
;** 如有意见或不明可联系,但要注明来意.否则不回
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: PLC_Comm.c
;**版 本: V2.1
;**创 建 人: LuHeDing
;**最后修改日期: 2010年05月08日
;**描 述: PLC通信命令解释程序
;**
;********************************************************************************************************/
#include "..\Drive\PLC_PUBLIC.H"
extern void Plc_Program_iap(void);
/*******************************************************************************
函数功能:计算校验和
*******************************************************************************/
uint8 check(char *MyD_str )
{ char sum=3;
MyD_str++;
while(*MyD_str!=0x03)
{sum+=*MyD_str;
MyD_str++;}
return (sum);
}
/*******************************************************************************
函数名称:PLC_Comm_Bit_ADD
函数功能:
入口参数:
出口参数:
********************************************************************************/
uint16 PLC_Comm_Bit_ADD(uint16 comm_add)
{uint8 h_add;
h_add=comm_add/0x100;
comm_add=comm_add&0xFF;
switch (h_add)
{case 0x14: {comm_add+=0x0000;}break;
case 0x15: {comm_add+=0x0100;}break;
case 0x16: {comm_add+=0x0200;}break;
case 0x17: {comm_add+=0x0300;}break;
case 0x12: {comm_add+=0x0400;}break;
case 0x0C: {comm_add+=0x0500;}break;
case 0x10: {comm_add+=0x0600;}break;
case 0x28: {comm_add+=0x1600;}break;
case 0x00: {comm_add+=0x0800;}break;
case 0x01: {comm_add+=0x0900;}break;
case 0x02: {comm_add+=0x0A00;}break;
case 0x03: {comm_add+=0x0B00;}break;
case 0x04: {comm_add+=0x0C00;}break;
case 0x05: {comm_add+=0x0D00;}break;
case 0x0F: {comm_add+=0x0E00;}break;
case 0x27: {comm_add+=0x1E00;}break;
case 0x0E: {comm_add+=0x0F00;}break;
default: {comm_add =0x1000;}break;
}
return comm_add;
}
/*******************************************************************************
函数名称:PLC_2AsciiHex(串口通信专用)
函数功能:将2个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码
出口参数:转换好的Hex码(第一个Ascii码在高4位,第二个Ascii码在低4位)
********************************************************************************/
uint8 PLC_2AsciiHex(char Ascii1,char Ascii2)
{return ((hex[Ascii1]*0x10)+hex[Ascii2]);
}
/*******************************************************************************
函数名称:PLC_4AsciiHex(串口通信专用)
函数功能:将4个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码
出口参数:转换好的Hex码
********************************************************************************/
uint16 PLC_4AsciiHex(char Ascii1,char Ascii2,char Ascii3,char Ascii4)
{return ((hex[Ascii1]*0x1000)+(hex[Ascii2]*0x100)+(hex[Ascii3]*0x10)+hex[Ascii4]);
}
/*******************************************************************************
函数名称:PLC_BufAsciiHex(串口通信专用)
函数功能:将4个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码
出口参数:转换好的Hex码
********************************************************************************/
uint8 PLC_Buf2AsciiHex(uint8 S_Add)
{return((hex[PLC_UART_BUFFER[S_Add]]*0x10)+hex[PLC_UART_BUFFER[S_Add+1]]);}
/*******************************************************************************
函数名称:PLC_BufAsciiHex(串口通信专用)
函数功能:将4个Ascii转成Hex
入口参数:Ascii1第一个Ascii码,Ascii2第二个Ascii码
出口参数:转换好的Hex码
********************************************************************************/
uint16 PLC_Buf4AsciiHex(uint8 S_Add)
{return((hex[PLC_UART_BUFFER[S_Add]]*0x1000)+(hex[PLC_UART_BUFFER[S_Add+1]]*0x100)+(hex[PLC_UART_BUFFER[S_Add+2]]*0x10)+hex[PLC_UART_BUFFER[S_Add+3]]);}
/*******************************************************************************
函数名称:PLC_Comm_Bit_ADD
函数功能:通信命令E7,E8的地址重映射
入口参数:通信地址(BIT地址)
出口参数:映射的实际地址(BIT地址)
********************************************************************************/
void PLC_Iap_data_rst(void)
{uint32 i;
for(i=PLC_PROG_B_START_ADD;i<(PLC_PROG_B_START_ADD+16000);i++)
{PLC_RAM8(i)=0xff;}
}
/*******************************************************************************
函数名称:PLC_Comm_Byte_ADD
函数功能:
入口参数:
出口参数:
********************************************************************************/
uint16 PLC_Comm_Byte_ADD(uint16 comm_add)
{if (comm_add>=0x4000&&comm_add<=0x7E7F){comm_add-=0x3000;}
else if(comm_add>=0x0E00&&comm_add<=0x0FFF){comm_add-=0x0000;}
else if(comm_add>=0x1000&&comm_add<=0x11FF){comm_add-=0x0800;}
else if(comm_add>=0x0A00&&comm_add<=0x0B8F){comm_add-=0x0000;}
else if(comm_add>=0x0C00&&comm_add<=0x0CDF){comm_add-=0x0000;}
else if(comm_add>=0x1400&&comm_add<=0x16FF){comm_add+=0x4900;}
else if(comm_add>=0x1790&&comm_add<=0x18FF){comm_add+=0x4400;}
else if(comm_add>=0x0280&&comm_add<=0x02FC){comm_add-=0x0280;}
else if(comm_add>=0x0240&&comm_add<=0x024F){comm_add-=0x01C0;}
else if(comm_add>=0x0180&&comm_add<=0x018F){comm_add-=0x00E0;}
else if(comm_add>=0x0200&&comm_add<=0x021F){comm_add-=0x0140;}
else if(comm_add>=0x0500&&comm_add<=0x051F){comm_add-=0x0240;}
else if( comm_add<=0x00BF){comm_add+=0x0100;}
else if(comm_add>=0x01E0&&comm_add<=0x01FF){comm_add-=0x0020;}
else if(comm_add>=0x04E0&&comm_add<=0x04FF){comm_add-=0x0120;}
else if(comm_add>=0x01C0&&comm_add<=0x01DF){comm_add+=0x0020;}
else{comm_add=0x0200;}//无效地址
return comm_add;
}
/*******************************************************************************
函数名称:PLC_Comm_Batch()
函数功能:
入口参数:
出口参数:
********************************************************************************/
void PLC_Comm_Batch(void)
{uint32 PLC_Ins_S_Add,PLC_Ins_S_Add2,PLC_Ins_E_Add;
uint16 PLC_Ins_Count,PLC_Ins_Temp_Add;
PLC_Ins_S_Add=PLC_Ins1400_S_Add+4;
PLC_Ins_E_Add=PLC_Ins_S_Add+(PLC_RAM8(PLC_Ins1400_S_Add)*2);//取寄存器个数
PLC_Ins_S_Add2=PLC_Ins1790_S_Add;
for(;PLC_Ins_E_Add>PLC_Ins_S_Add;PLC_Ins_S_Add+=2) //寄存器值(16位访问)
{PLC_Ins_Temp_Add=PLC_Comm_Byte_ADD(PLC_RAM16(PLC_Ins_S_Add));
PLC_RAM16(PLC_Ins_S_Add2)=PLC_RAM16(PLC_R_START_ADD+PLC_Ins_Temp_Add);
PLC_Ins_S_Add2+=2;
if(PLC_Ins_Temp_Add>=0x0C00&&PLC_Ins_Temp_Add<0x0CDF) //测试是否C200-C255
{PLC_RAM16(PLC_Ins_S_Add2)=PLC_RAM16(PLC_R_START_ADD+PLC_Ins_Temp_Add+2);
PLC_Ins_S_Add2+=2;}
}
PLC_Ins_E_Add=PLC_Ins_S_Add+(PLC_RAM8(PLC_Ins1400_S_Add+2)*2);//取位个数
PLC_Ins_Count=0;
for(;PLC_Ins_E_Add>PLC_Ins_S_Add;PLC_Ins_S_Add+=2) //位值(位访问)
{if(PLC_BIT_TEST(PLC_Comm_Bit_ADD(PLC_RAM16(PLC_Ins_S_Add))))
{PLC_RAM8(PLC_Ins_S_Add2+(PLC_Ins_Count/8))|=PLC_BIT_OR[PLC_Ins_Count%8];}
else{PLC_RAM8(PLC_Ins_S_Add2+(PLC_Ins_Count/8))&=PLC_BIT_AND[PLC_Ins_Count%8];}
PLC_Ins_Count++;}
}
/*******************************************************************************
函数名称:PLC_Comm_Send()
函数功能:将指定地址中的数据向串口送出
入口参数:data_s_add 发送数据开始地址(地址只能是寄存器区,不能是程序区)
Send_count 发送个数
出口参数:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -