📄 fx1n.c
字号:
#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 + -