218 lines
8.4 KiB
C
218 lines
8.4 KiB
C
#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
|