#ifndef __FX1N__H__ #define __FX1N__H__ //====================================================================================================================== // // Please Read Me First // // 45 30 30 Read Data Register // 45 31 30 Write Data Register // General Data Register Start Address:0x4000 End Address:0x7e80 Data Total:0x3e80(16000)bytes. D0000 ~ D7999 // Special Data Register Start Address:0x0e00 End Address:0x1000 Data Total:0x0200(512) bytes. D8000 ~ D8255 // 45 30 31 Read Code // 45 31 31 Write Code // General Code Start Address:0x805c End Address:0xbedc Code Total:0x3e80(16000)bytes. // Special Code Start Address:0x8000 End Address:0x805c Code Total:0x005c(92) bytes. // 注: 1.从上述 Data Total & Code Total 所示,占用 IAP 空间大小为 16000+512+16000+92=32604 bytes. // 2.需要 IAP 最后一页,存储 PLC 类型; IAP 倒数第二页,当作缓存空间,以上两页不许被其他数据占用. // 3.0x4000单元以下的地址(即0x0000 ~ 0x4000),都用做了什么用,还有待于进一步研究, // 因以上几点,故而 总占用的 IAP 空间应为 32604 + 2 * 512 = 33628 bytes.实际上可用 IAP 大小为 31K(共 62 页,每页 512 bytes). // 故而,作如下处理: // 1.从 IAP 地址 0x8000 ~ 0xbfff 即 IAP 第一页 至 第三十一页 存储PLC程序 -- 对应PLC 的 0x8000 ~ 0xbfff 地址 -- Special Code & General Code Area // 2.从 IAP 地址 0xc000 ~ 0xc1ff 即 IAP 第三十二页 至 第三十三页 存储PLC数据寄存器 -- 对应PLC 的 0x0e00 ~ 0x1000 地址 -- Special Data Register Area // 3.从 IAP 地址 0xc200 ~ 0xf7ff 即 IAP 第三十四页 至 第六十页 存储PLC数据寄存器 -- 对应PLC 的 0x4000 ~ 0x7600 地址 -- General Data Register Area // 4.从 IAP 地址 0xf800 ~ 0xf9ff 即 IAP 第六十一页 缓存空间. // 5.从 IAP 地址 0xfa00 ~ 0xfbff 即 IAP 第六十二页 存储 PLC 类型标识, 共 PLCTypeArrayLen 个字节,当页其他剩余字节保留. // 6.其中 IAP 第三十四页 至 第六十页 存储PLC数据寄存器 ,共有 27 页 即 27 * 512 = 0x3600(13824) bytes. < Data Total:0x3e80(16000)bytes. // 故而, 大于等于 0x4000 + 0x3600 = 0x7600 地址的 2176(0x7e80-0x7600) bytes 无法保存.当读取时,返回 0; //====================================================================================================================== // Flash 空间默认分配图示: //==========================// // // // // // // // // // // // FLASH -- 32K // // // // // // // // // // // //--------------------------// // // // // // // // // // IAP -- 31K // // // // // // // //--------------------------// // // // ISP -- 1K // // // //==========================// #define CodeStartAddr 0x8000 #define DownLoadStartAddr 0x805c #define CodeEndAddr 0xbfff #define CodePageNum 31 #define SDataRegStartAddr 0x0e00 #define SDataRegEndAddr 0x0fff #define SDataRegOffset 0xb200 #define SDataRegPageNum 2 #define GDataRegStartAddr 0x4000 #define GDataRegEndAddr 0x75ff #define GDataRegRealEndAddr 0x7e7f #define GDataRegOffset 0x8200 #define GDataRegPageNum 27 #define GDataReg_D_StartAddr (GDataRegStartAddr) #define GDataReg_D_EndAddr (GDataReg_D_StartAddr+_D_num-1) #define GDataReg_T_StartAddr #define GDataReg_T_EndAddr #define GDataReg_C_StartAddr #define GDataReg_C_EndAddr // 默认当前MPC82G516A的设置为 // 1K ISP Code // 31K IAP Code // 32K Flash Code #define MCUFLASHSIZE 64*1024 // 64K #define MCUIAPFLASHSIZE 31*1024 // 31K #define MCUISPFLASHSIZE 1*1024 // 1K #define PLCIAPCodeAddr (MCUFLASHSIZE-MCUIAPFLASHSIZE-MCUISPFLASHSIZE) #define PLCSTEP 8000 // 当前[存储容量]为8K. #define PLCSoftwareVerAddr (MCUFLASHSIZE-MCUISPFLASHSIZE-512) // 即IAP倒数第一页. #define PLCTypeAddr 0x0e02 #define DownLoadEndRSTAddr (PLCSoftwareVerAddr+510) #define PLCStateAddr 0x01c0 #define PLCStateRealAddr (PLCSoftwareVerAddr+8) #define PLCStateRun 0x09 #define PLCStateStop 0x0a #define PLCMonitorPollAddr 0x1400 // 监控时.轮询 PLC 寄存器元件 及 位元件。 #define PLCS0x1400RealAddr (PLCStateRealAddr+1) #define PLCMonitorAckAddr 0x1790 // 监控时.回复 轮询的 器件内容。 #define PLCXYMonitorRealAddr (PLCS0x1400RealAddr+4) // #define uENQ 0x05 // 请求 #define uACK 0x06 // PLC 接收正确响应 #define uNACK 0x15 // PLC 接收错误响应 #define uSTX 0x02 // 报文开始 #define uETX 0x03 // 报文结束 #define uCMDFNC 0x45 // 命令: 功能 #define uCMDRead 0x30 // 命令: 读 #define uCMDWrite 0x31 // 命令: 写 #define uCMDunKnow34 0x34 // 命令: 未知 #define uCMDErasure 0x36 // 命令: 清除 #define uCMDEnforceOn 0x37 // 命令: 强制输出 ON #define uCMDEnforceOff 0x38 // 命令: 强制输出 OFF #define uCMDDownLoadEnd 0x42 // 命令: 下载结束 #define uCtrlData 0x30 // 控制: 数据寄存器 #define uCtrlCode 0x31 // 控制: 程序代码 // #define ErasureALL 0xff #define ErasureCODE 0x31 #define ErasureDataReg 0x34 #define ErasurebitReg 0x32 // #define PLC_S_Type 0x00 // Sx(特殊寄存器、状态寄存器) #define PLC_X_Type 0x04 // Xx(输入) #define PLC_Y_Type 0x05 // Yx(输出) #define PLC_T_Type 0x06 // Tx(定时器) #define PLC_M_Type 0x08 // Mx(数据存储器、辅助继电器) #define PLC_C_Type 0x0E // Cx(计数器) // FX1N 内存映象 -- 详见 "FX1N内存映像.xls" // 位值区 (位地址) #define RAM_M_bitAddr 0x0000 // Mx 辅助继电器 M0000 ~ M3071 #define RAM_Y_bitAddr 0x0C00 // Yx 输出继电器 Y000 ~ Y267(0x0CB7) #define RAM_SM_bitAddr 0x0E00 // SMx 特殊辅助继电器 M8000 ~ M8255 #define RAM_Cp_bitAddr 0x0F00 // Cx 计数器 Over Contact C000 ~ C255 #define RAM_Tp_bitAddr 0x1000 // Tx 定时器 Over Contact T000 ~ T255(0x10ff) #define RAM_X_bitAddr 0x1200 // Xx 输入继电器 X000 ~ X277 #define RAM_S_bitAddr 0x1400 // Sx 状态寄存器 S000 ~ S999 #define RAM_Cc_bitAddr 0x2700 // Cx 计数器 Enable Coil C000 ~ C255 #define RAM_Tc_bitAddr 0x2800 // Tx 定时器 Enable Coil T000 ~ T255 #define RAM_Cr_bitAddr 0x3700 // Cx 计数器 Restet C000 ~ C255 #define RAM_Tr_bitAddr 0x3800 // Tx 定时器 Restet T000 ~ T255 // 寄存器数据区(字节地址) #define RAM_C_RegAddr 0x0A00 // Cx 计数器(16bit) C000 ~ C199 #define RAM_C2_RegAddr 0x0C00 // Cx 计数器(32bit) C200 ~ C234(0x0C8B) #define RAM_SD_RegAddr 0xOE00 // SDx 特殊数据寄存器 D8000 ~ D8255 #define RAM_T_RegAddr 0x1000 // Tx 计数器(16bit) T000 ~ T255 #define RAM_D_RegAddr 0x4000 // Dx 数据寄存器 D0000 ~ D7999 #define RAM_M_Reg 0x01 // Reg 类型定义 #define RAM_Y_Reg 0x02 #define RAM_SM_Reg 0x03 #define RAM_Cp_Reg 0x04 #define RAM_Tp_Reg 0x05 #define RAM_X_Reg 0x06 #define RAM_S_Reg 0x07 #define RAM_Cc_Reg 0x08 #define RAM_Tc_Reg 0x09 #define RAM_Cr_Reg 0x0A #define RAM_Tr_Reg 0x0B #define RAM_D_Reg 0x0C #define GetuiDataH(uiData) (uiData>>8) // 取 UINT 型 高位 #define GetuiDataL(uiData) ((unsigned char )uiData) // 取 UINT 型 低位 #define MonitorRegNoMAX 50 // 一屏 最多监控 50 个 ( 寄存器 + 位元件 ) #define STATE_ON 0x01 #define STATE_OFF 0x00 extern unsigned char code SDataReg[]; extern unsigned char code CodeStart[]; extern unsigned char code PLCXYMonitorData[]; extern unsigned char RAMRegType[]; extern unsigned int RAMRegNum []; extern unsigned int hextoasc(unsigned char hexdata); extern unsigned char asctohex(unsigned char *ascdata); extern unsigned char ascto0F(unsigned char ucdata); extern void ErasurePLC(unsigned char ErasureScope); extern void WriteFlash(unsigned int WriteAddr,unsigned char *Buf,unsigned int WriteLen); extern unsigned char sumcheck(unsigned char *Startaddr,unsigned char checklen); extern unsigned char GetRdorWrLen(unsigned char *StartAddr); extern unsigned int GetRdorWrAddr(unsigned char *StartAddr); extern void FX1NComPortProcessing(void); extern void FX1NUartFNCPro(void); extern void UartResponseCMDRead(void); extern void UartResponseCMDWrite(void); extern void UartResponseCMDErasure(void); extern void UartResponseCMDEnforceOn(void); extern void UartResponseCMDEnforceOff(void); extern void UartResponseCMDunKnow34(void); extern void UartResponseCMDDownLoadEnd(void); extern void UartResponseError(void); extern void PLCReset(void); extern void PLCCodeOrder(unsigned char CodeType,unsigned char num); //extern void PLCMonitor(void); extern unsigned char UartSendASCDate(unsigned char Readdat,unsigned char sumdata); extern void UartSendASCCRC(unsigned char sumdata); extern unsigned char GetXYMSBit(unsigned char *ucdat,unsigned char num); #endif