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