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

📄 fx1n.lst

📁 PLC源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 161   2                      for(i=0;i<MCUIAPFLASHSIZE;i+=512)                       //      全部擦除        初始PLC程序为空
 162   2                      {
 163   3                              IAPFlashErasureMode(PLCIAPCODEAddr+i);
 164   3                      }
 165   2              }
 166   1              else if(allorcode==ErasureCODE)
 167   1              {
 168   2                      IAPFlashErasureMode(PLCTempAddr);                       //      擦除IAP缓存备份空间
 169   2                      for(i=0;i<0x5c;i++)                                                     //      备份PLC 0x8000~0x805c 地址的数据
 170   2                      {
 171   3                              ucdata=IAPFlashReadMode(i+0x8000);
 172   3                              IAPFlashProgremMode(i+PLCTempAddr,ucdata);
 173   3                      }
 174   2                      for(i=PLCIAPCODEAddr;i<PLCTempAddr;i+=512)      //      擦除PLC程序空间
 175   2                      {
 176   3                              IAPFlashErasureMode(i);
 177   3                      }
 178   2                      for(i=0;i<0x5c;i++)                                                     //      还原PLC 0x8000~0x805c 地址的数据
C51 COMPILER V8.16   FX1N                                                                  10/10/2009 14:43:37 PAGE 4   

 179   2                      {
 180   3                              ucdata=IAPFlashReadMode(i+PLCTempAddr);
 181   3                              IAPFlashProgremMode(i+0x8000,ucdata);
 182   3                      }
 183   2              }
 184   1      }
 185          //=======================================================================================================
 186          // 函数名称: sumcheck
 187          //
 188          // 功能描述: 和校验
 189          //
 190          // 输 入:   unsigned char *Startaddr,unsigned char checklen
 191          //          
 192          // 输 出:   unsigned char
 193          //         
 194          // 全局变量: 
 195          // 调用模块: 无
 196          //
 197          // 作 者:   卢明君
 198          // 日 期:   2009年9月15日
 199          // 备  注: 
 200          //-------------------------------------------------------------------------------------------------------
 201          // 修改人:
 202          // 日 期:
 203          // 备  注: 
 204          //-------------------------------------------------------------------------------------------------------
 205          //=======================================================================================================
 206          unsigned char sumcheck(unsigned char *Startaddr,unsigned char checklen)
 207          {
 208   1              unsigned int i;
 209   1              unsigned char sumdata=0;
 210   1              for(i=0;i<checklen;i++)
 211   1              {
 212   2                      sumdata+=Startaddr[i];
 213   2              }
 214   1              return sumdata;
 215   1      }
 216          //========================================================================================================
             -==============
 217          //      IAP 空间分配如下:(31K)          ----ASCII转HEX后存储. 
 218          //              1.IAP起始页 0x8000      ~       0xbfff                          存储PLC程序 -- 对应PLC 的0x8000~0xbfff 地址共8000步程序空间
 219          //              2.IAP最后一页0 地址                                                     存储    PLC类型标识核实标志     共 1 个字节
 220          //              3.IAP最后一页1  ~       PLCTypeArrayLenMAX              存储    PLC类型标识                     共 PLCTypeArrayLen 个字节 PLCTypeArrayLen
 221          //              4.IAP倒数第二页                                                         缓存空间        不许被其他数据占用!
 222          //              5.其他                                                                          保留
 223          //========================================================================================================
             -==============
 224          unsigned char code OrderSend1[]={0x02,0x36,0x32,0x36,0x36,0x03,0x44,0x37};      //      '6266'PLC型号 FX1N;'C256'PLC
             -型号 FX1S.
 225          unsigned char code OrderSend2[]={0x02,0x30,0x41,0x03,0x37,0x34};                        //      '0A'PLC 暂停;'09'PLC 运行
 226          //********************************************************************************************//
 227          //*                                                                                          *//
 228          //*     总结说明:                                                                                *//
 229          //*     1.OrderSend3为 PLC 0x8000 地址开始,存储了 0x2e 个字节的数据;                             *//
 230          //*     2.其中从 0x8008地址开始的 0x08 个字节的数据,为PLC存储器相关代码,具体实意未知.            *//
 231          //*                                                                                          *//
 232          //********************************************************************************************//
 233          unsigned char code OrderSend3[]=
 234          {0x08,0x00,0xDE,0xCB,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
             -0x20,0x20
 235          ,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
             -0x20,0x20};
C51 COMPILER V8.16   FX1N                                                                  10/10/2009 14:43:37 PAGE 5   

 236          //********************************************************************************************//
 237          //*                                                                                          *//
 238          //*     总结说明:                                                                                *//
 239          //*     1.OrderSend4为 PLC 0x802e 地址开始,存储了 0x2e 个字节的数据;                             *//
 240          //*     2.其中从 0x8048地址开始的 0x04 个字节的数据,为PLC[文件寄存器]相关代码,具体实意未知.      *//
 241          //*                                                                                          *//
 242          //********************************************************************************************//
 243          unsigned char code OrderSend4[]=
 244          {0x20,0x20,0xF4,0x09,0xFF,0x0B,0xF4,0x01,0xE7,0x03,0x64,0x0E,0xC7,0x0E,0xDC,0x0E,0xFF,0x0E,0x90,0x01,0xFE,
             -0x03,0x00
 245          ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
             -0x00,0x00};
 246          unsigned char code OrderSend5[]={0x02,0x31,0x30,0x30,0x30,0x03,0x43,0x34};      //      PLC存储器相关代码
 247          unsigned char code OrderSend6[]={0x02,0x30,0x38,0x30,0x30,0x03,0x43,0x42};
 248          
 249          //=======================================================================================================
 250          // 函数名称: FX1NProcessing
 251          //
 252          // 功能描述:  解析接收缓冲区中的数据
 253          //
 254          // 输 入:  void
 255          //          
 256          // 输 出:  void
 257          //         
 258          // 全局变量: 待定,待整体调试完成后填写.
 259          // 调用模块: 待定,待整体调试完成后填写.
 260          //
 261          // 作 者:  卢明君
 262          // 日 期:  2009年9月15日
 263          // 备  注:  
 264          //-------------------------------------------------------------------------------------------------------
 265          // 修改人:  许意义
 266          // 日 期:      2009年9月28日
 267          // 备  注: 
 268          //-------------------------------------------------------------------------------------------------------
 269          //=======================================================================================================
 270          void FX1NProcessing(void)
 271          {
 272   1              unsigned int  i=0;
 273   1              unsigned char tempsum=0;
 274   1              unsigned char Readdat=0;
 275   1              unsigned char ReadLen=0;
 276   1              unsigned char WriteLen=0;
 277   1              unsigned int  ReadAddr=0;
 278   1              unsigned int  WriteAddr=0;
 279   1              unsigned char usum=0;
 280   1              unsigned char sumdata=0;
 281   1              unsigned int  tempascdata=0;
 282   1              unsigned char ucdata=0;
 283   1      
 284   1              if(UartDataReadyFlag)                           // 有数据来
 285   1              {
 286   2                      UartDataReadyFlag=0;
 287   2                      if(UartReceiveBuffer[0]==ENQ)   // 发送请求                                     ==== 1. 3. 5. 7. 10. 12. 14.(14开始下发数据) 
 288   2                      {
 289   3                              UartSendchar(ACK);
 290   3                      }
 291   2                      else if((UartReceiveBuffer[0]==STX)&(UartReceiveBuffer[UartReceiveCounter-3]==ETX))     // 可识别的
 292   2                      {
 293   3                              //==================== 核查 sumdata ========================
 294   3                              // sum校验码 从02后面一个字节(即接收的第二个字节)开始累加到03(即接收的倒数第三个字节)结束
 295   3                              // 累加和的低8位,再分成高4位和低4位(即03后面的两个字节)对应的ASCII码 高位在前 低位在后   
C51 COMPILER V8.16   FX1N                                                                  10/10/2009 14:43:37 PAGE 6   

 296   3                              sumdata=asctohex((unsigned char *)(UartReceiveBuffer+UartReceiveCounter-2));
 297   3                              //==========================================================
 298   3                              if(sumdata==sumcheck((unsigned char *)(UartReceiveBuffer+1),(UartReceiveCounter-3)))
 299   3                              {
 300   4                                      //----------------------------------------------------------------------------------------------------
             -----------
 301   4                                      //              编写读写代码须知
 302   4                                      //      1.8000 以上地址与 PLC程序相关;
 303   4                                      //      2.4000以上地址与 PLC寄存器[数据寄存器0x4000~0x7e40,31.125K (HEX).特殊寄存器0x0e00~0x0ec0,384字节 (H
             -EX)]相关
 304   4                                      //----------------------------------------------------------------------------------------------------
             -----------
 305   4                                      //============================= Read Code ==============================
 306   4                                      if((UartReceiveBuffer[1]==0x45)\
 307   4                                      &&(UartReceiveBuffer[2] ==0x30)\
 308   4                                      &&(UartReceiveBuffer[3] ==0x31))
 309   4                                      //&(UartReceiveBuffer[4] >=0x38))       
 310   4                                      {
 311   5                                              //      计算得到读取地址:
 312   5                                              for(i=4;i<8;i++)UartReceiveBuffer[i]=ascto0F(UartReceiveBuffer[i]);
 313   5                                              ReadAddr =UartReceiveBuffer[4]<<12;
 314   5                                              ReadAddr+=UartReceiveBuffer[5]<<8;
 315   5                                              ReadAddr+=UartReceiveBuffer[6]<<4;
 316   5                                              ReadAddr+=UartReceiveBuffer[7];
 317   5                                              //      计算得到读取字节数:
 318   5                                              for(i=8;i<10;i++)UartReceiveBuffer[i]=ascto0F(UartReceiveBuffer[i]);

⌨️ 快捷键说明

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