⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fx1n.c

📁 PLC源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "system.h"

//=======================================================================================================
// 函数名称: hextoasc
//
// 功能描述:  HEX 转 ASCII
//
// 输 入:  unsigned char hexdata
//          
// 输 出:  unsigned int
//         
// 全局变量:  
// 调用模块: 无
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
unsigned int hextoasc(unsigned char hexdata)
{
	unsigned char ucdata=0;
	unsigned int  backdata=0;
	unsigned int  tempdata=0;
	ucdata     = hexdata & 0x0f;
	backdata   = (ucdata<10)?(ucdata+0x30):(ucdata+0x41-0x0a);
	hexdata  >>= 4;
	ucdata     = hexdata & 0x0f;
	tempdata   = (ucdata<10)?(ucdata+0x30):(ucdata+0x41-0x0a);
	tempdata <<= 8;
	backdata  |= tempdata;
	return backdata;
}
//=======================================================================================================
// 函数名称: asctohex
//
// 功能描述:  ASCII 转 HEX
//
// 输 入:  unsigned char *ascdata
//          
// 输 出:  unsigned char
//         
// 全局变量:  
// 调用模块: 无
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  输入unsigned char *ascdata,函数内,使用到的为*ascdata和*(ascdata+1).
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
unsigned char asctohex(unsigned char *ascdata)
{
	unsigned char backdata=0;
	unsigned char tempdata=0;
	if(*ascdata<0x3a)
		backdata = *ascdata-0x30;
	else if(*ascdata>0x40)	
		backdata = *ascdata-0x41+0x0a;
	if(*(ascdata+1)<0x3a)
		tempdata = *(ascdata+1)-0x30;
	else if(*(ascdata+1)>0x40)	
		tempdata = *(ascdata+1)-0x41+0x0a;
	backdata <<= 4;
	backdata  |= tempdata;
	return backdata;
}
//=======================================================================================================
// 函数名称: ascto0F
//
// 功能描述:  将ASCII 转换成0~F
//
// 输 入:  unsigned char ucdata
//          
// 输 出:  unsigned char
//         
// 全局变量:  
// 调用模块: 无
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  ascto0F.F旁边的是数字0
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
unsigned char ascto0F(unsigned char ucdata)
{
	if(ucdata<0x3a)ucdata=ucdata-0x30;
	else if(ucdata>0x40)ucdata=ucdata-0x41+0x0a;
	else while(1);		//	错误处理
	return ucdata;
}
//=======================================================================================================
// 函数名称: WriteFlash
//
// 功能描述:  HEX 转 ASCII
//
// 输 入:  unsigned int WriteAddr,unsigned char *Buf,unsigned int WriteLen
//          
// 输 出:  void
//         
// 全局变量:  
// 调用模块: IAPFlashProgremMode
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  WriteAddr为写地址;*Buf为待写存储区的指针;WriteLen为写的长度大小.
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void WriteFlash(unsigned int WriteAddr,unsigned char *Buf,unsigned int WriteLen)
{
	unsigned int i;
	unsigned char wrdata=0;
	for(i=0;i<WriteLen*2;i+=2)	//	由原来的每页写512字节,改为每页写256个字节.存储地址不连续; 由原来存储ASCII码格式,改为存储HEX格式.
	{
		wrdata=asctohex((unsigned char *)(Buf+i));
		IAPFlashProgremMode(WriteAddr++,wrdata);
	}
}
//=======================================================================================================
// 函数名称: ErasurePLC
//
// 功能描述:  PLC擦除IAP空间
//
// 输 入:  unsigned char allorcode
//          
// 输 出:  void
//         
// 全局变量:  
// 调用模块: IAPFlashErasureMode ; IAPFlashProgremMode ; IAPFlashReadMode ; 
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void ErasurePLC(unsigned char allorcode)
{
	unsigned int i;
	unsigned char ucdata=0;
	if(allorcode==ErasureALL)
	{
		for(i=0;i<MCUIAPFLASHSIZE;i+=512)			//	全部擦除	初始PLC程序为空
		{
			IAPFlashErasureMode(PLCIAPCODEAddr+i);
		}
	}
	else if(allorcode==ErasureCODE)
	{
		IAPFlashErasureMode(PLCTempAddr);			//	擦除IAP缓存备份空间
		for(i=0;i<0x5c;i++)							//	备份PLC 0x8000~0x805c 地址的数据
		{
			ucdata=IAPFlashReadMode(i+0x8000);
			IAPFlashProgremMode(i+PLCTempAddr,ucdata);
		}
		for(i=PLCIAPCODEAddr;i<PLCTempAddr;i+=512)	//	擦除PLC程序空间
		{
			IAPFlashErasureMode(i);
		}
		for(i=0;i<0x5c;i++)							//	还原PLC 0x8000~0x805c 地址的数据
		{
			ucdata=IAPFlashReadMode(i+PLCTempAddr);
			IAPFlashProgremMode(i+0x8000,ucdata);
		}
	}
}
//=======================================================================================================
// 函数名称: sumcheck
//
// 功能描述: 和校验
//
// 输 入:   unsigned char *Startaddr,unsigned char checklen
//          
// 输 出:   unsigned char
//         
// 全局变量: 
// 调用模块: 无
//
// 作 者:   卢明君
// 日 期:   2009年9月15日
// 备  注: 
//-------------------------------------------------------------------------------------------------------
// 修改人:
// 日 期:
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
unsigned char sumcheck(unsigned char *Startaddr,unsigned char checklen)
{
	unsigned int i;
	unsigned char sumdata=0;
	for(i=0;i<checklen;i++)
	{
		sumdata+=Startaddr[i];
	}
	return sumdata;
}
//======================================================================================================================
//	IAP 空间分配如下:(31K)		----ASCII转HEX后存储. 
//		1.IAP起始页 0x8000	~	0xbfff				存储PLC程序 -- 对应PLC 的0x8000~0xbfff 地址共8000步程序空间
//		2.IAP最后一页0 地址							存储	PLC类型标识核实标志	共 1 个字节
//		3.IAP最后一页1	~	PLCTypeArrayLenMAX		存储	PLC类型标识			共 PLCTypeArrayLen 个字节 PLCTypeArrayLen
//		4.IAP倒数第二页								缓存空间	不许被其他数据占用!
//		5.其他										保留
//======================================================================================================================
unsigned char code OrderSend1[]={0x02,0x36,0x32,0x36,0x36,0x03,0x44,0x37};	//	'6266'PLC型号 FX1N;'C256'PLC型号 FX1S.
unsigned char code OrderSend2[]={0x02,0x30,0x41,0x03,0x37,0x34};			//	'0A'PLC 暂停;'09'PLC 运行
//********************************************************************************************//
//*                                                                                          *//
//*	总结说明:                                                                                *//
//*	1.OrderSend3为 PLC 0x8000 地址开始,存储了 0x2e 个字节的数据;                             *//
//*	2.其中从 0x8008地址开始的 0x08 个字节的数据,为PLC存储器相关代码,具体实意未知.            *//
//*                                                                                          *//
//********************************************************************************************//
unsigned char code OrderSend3[]=
{0x08,0x00,0xDE,0xCB,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
//********************************************************************************************//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -