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

📄 fx1n.c

📁 PLC源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//*                                                                                          *//
//*	总结说明:                                                                                *//
//*	1.OrderSend4为 PLC 0x802e 地址开始,存储了 0x2e 个字节的数据;                             *//
//*	2.其中从 0x8048地址开始的 0x04 个字节的数据,为PLC[文件寄存器]相关代码,具体实意未知.      *//
//*                                                                                          *//
//********************************************************************************************//
unsigned char code OrderSend4[]=
{0x20,0x20,0xF4,0x09,0xFF,0x0B,0xF4,0x01,0xE7,0x03,0x64,0x0E,0xC7,0x0E,0xDC,0x0E,0xFF,0x0E,0x90,0x01,0xFE,0x03,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char code OrderSend5[]={0x02,0x31,0x30,0x30,0x30,0x03,0x43,0x34};	//	PLC存储器相关代码
unsigned char code OrderSend6[]={0x02,0x30,0x38,0x30,0x30,0x03,0x43,0x42};

//=======================================================================================================
// 函数名称: FX1NProcessing
//
// 功能描述:  解析接收缓冲区中的数据
//
// 输 入:  void
//          
// 输 出:  void
//         
// 全局变量: 待定,待整体调试完成后填写.
// 调用模块: 待定,待整体调试完成后填写.
//
// 作 者:  卢明君
// 日 期:  2009年9月15日
// 备  注:  
//-------------------------------------------------------------------------------------------------------
// 修改人:  许意义
// 日 期:	2009年9月28日
// 备  注: 
//-------------------------------------------------------------------------------------------------------
//=======================================================================================================
void FX1NProcessing(void)
{
	unsigned int  i=0;
	unsigned char tempsum=0;
	unsigned char Readdat=0;
	unsigned char ReadLen=0;
	unsigned char WriteLen=0;
	unsigned int  ReadAddr=0;
	unsigned int  WriteAddr=0;
	unsigned char usum=0;
	unsigned char sumdata=0;
	unsigned int  tempascdata=0;
	unsigned char ucdata=0;

	if(UartDataReadyFlag)				// 有数据来
	{
		UartDataReadyFlag=0;
		if(UartReceiveBuffer[0]==ENQ)	// 发送请求					==== 1. 3. 5. 7. 10. 12. 14.(14开始下发数据) 
		{
			UartSendchar(ACK);
		}
		else if((UartReceiveBuffer[0]==STX)&(UartReceiveBuffer[UartReceiveCounter-3]==ETX))	// 可识别的
		{
			//==================== 核查 sumdata ========================
			// sum校验码 从02后面一个字节(即接收的第二个字节)开始累加到03(即接收的倒数第三个字节)结束
			// 累加和的低8位,再分成高4位和低4位(即03后面的两个字节)对应的ASCII码 高位在前 低位在后   
			sumdata=asctohex((unsigned char *)(UartReceiveBuffer+UartReceiveCounter-2));
			//==========================================================
			if(sumdata==sumcheck((unsigned char *)(UartReceiveBuffer+1),(UartReceiveCounter-3)))
			{
				//--------------------------------------------------------------------------------------------------------------
				//		编写读写代码须知
				//	1.8000 以上地址与 PLC程序相关;
				//	2.4000以上地址与 PLC寄存器[数据寄存器0x4000~0x7e40,31.125K (HEX).特殊寄存器0x0e00~0x0ec0,384字节 (HEX)]相关
				//--------------------------------------------------------------------------------------------------------------
				//============================= Read Code ==============================
				if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x30)\
				&&(UartReceiveBuffer[3] ==0x31))
				//&(UartReceiveBuffer[4] >=0x38))	
				{
					//	计算得到读取地址:
					for(i=4;i<8;i++)UartReceiveBuffer[i]=ascto0F(UartReceiveBuffer[i]);
					ReadAddr =UartReceiveBuffer[4]<<12;
					ReadAddr+=UartReceiveBuffer[5]<<8;
					ReadAddr+=UartReceiveBuffer[6]<<4;
					ReadAddr+=UartReceiveBuffer[7];
					//	计算得到读取字节数:
					for(i=8;i<10;i++)UartReceiveBuffer[i]=ascto0F(UartReceiveBuffer[i]);
					ReadLen = UartReceiveBuffer[8]*16+UartReceiveBuffer[9];
					UartSendchar(STX);
					//	计算 sumdata 并发送读取字节
					sumdata=0;
					for(i=1;i<=ReadLen;i++)
					{
						if(ReadAddr==0x01c0)Readdat=0x0a;			//	此地址,目前只见过读,没有见过写.
						else
						{
							Readdat=IAPFlashReadMode(ReadAddr+i-1);	//	读FlashData
						}
						tempascdata=hextoasc(Readdat);
						ucdata=tempascdata>>8;
						sumdata = sumdata + ucdata;
						UartSendchar(ucdata);
						ucdata=tempascdata&0xff;
						sumdata = sumdata + ucdata;
						UartSendchar(ucdata);
					}
					UartSendchar(ETX);
					sumdata = sumdata + ETX;
					usum=sumdata&0x0f;
					tempsum=(usum<10)?(usum+0x30):(usum+0x41-0x0a);
					sumdata>>=4;
					usum=sumdata&0x0f;
					Readdat=(usum<10)?(usum+0x30):(usum+0x41-0x0a);
					UartSendchar(Readdat);
					UartSendchar(tempsum);	//	注意此处sum 发送顺序
				}
				//============================= Write Code ==============================
				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x31)\
				&&(UartReceiveBuffer[3] ==0x31))
				/*&&(UartReceiveBuffer[7] ==0x43))*/
				{
					//	计算得到写入字节数:
					for(i=8;i<10;i++)UartReceiveBuffer[i]=ascto0F(UartReceiveBuffer[i]);
					UartReceiveBuffer[8]<<=4;
					WriteLen=(UartReceiveBuffer[8]+UartReceiveBuffer[9]);
					//	计算得到写入地址:
					for(i=4;i<8;i++)UartReceiveBuffer[i]=ascto0F(UartReceiveBuffer[i]);
					WriteAddr =UartReceiveBuffer[4]<<12;
					WriteAddr+=UartReceiveBuffer[5]<<8;
					WriteAddr+=UartReceiveBuffer[6]<<4;
					WriteAddr+=UartReceiveBuffer[7];
					if(WriteAddr==0x8000)ErasurePLC(ErasureCODE);	//	擦除PLC程序区
					WriteFlash(WriteAddr,(unsigned char *)(UartReceiveBuffer+10),(unsigned char)WriteLen);	//	写 flash
					UartSendchar(ACK);
				}
				//PC	:02 30 30 45 30 32 30 32 03 36 43			==== 2. 6. 
				//MCU	:02 36 32 36 36 03 44 37
				else if((UartReceiveBuffer[1]==0x30)\
				&&(UartReceiveBuffer[2] ==0x30)\
				&&(UartReceiveBuffer[3] ==0x45)\
				&&(UartReceiveBuffer[4] ==0x30)\
				&&(UartReceiveBuffer[5] ==0x32)\
				&&(UartReceiveBuffer[6] ==0x30)\
				&&(UartReceiveBuffer[7] ==0x32))						//	查询PLC 类型:FX1N\FX1S
				{
					UartSendByte((unsigned char *)OrderSend1,8);
				}
				//PC	:02 45 30 30 30 31 43 30 30 31 03 44 44		==== 4. 
				//MCU	:02 30 41 03 37 34 
				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x30)\
				&&(UartReceiveBuffer[3] ==0x30)\
				&&(UartReceiveBuffer[4] ==0x30)\
				&&(UartReceiveBuffer[5] ==0x31)\
				&&(UartReceiveBuffer[6] ==0x43)\
				&&(UartReceiveBuffer[7] ==0x30)\
				&&(UartReceiveBuffer[8] ==0x30)\
				&&(UartReceiveBuffer[9] ==0x31))						//	查询PLC 当前状态:暂停\运行
				{ 
					UartSendByte((unsigned char *)OrderSend2,6);
				}
				//PC	:02 45 30 30 30 45 30 36 30 32 03 45 35		==== 11. 
				//MCU	:02 31 30 30 30 03 43 34
				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x30)\
				&&(UartReceiveBuffer[3] ==0x30)\
				&&(UartReceiveBuffer[4] ==0x30)\
				&&(UartReceiveBuffer[5] ==0x45)\
				&&(UartReceiveBuffer[6] ==0x30)\
				&&(UartReceiveBuffer[7] ==0x36)\
				&&(UartReceiveBuffer[8] ==0x30)\
				&&(UartReceiveBuffer[9] ==0x32))
				{ 
					UartSendByte((unsigned char *)OrderSend5,8);
				}
				//PC	:02 45 30 30 30 45 43 43 30 32 03 30 35	 	==== 13. 
				//MCU	:02 30 38 30 30 03 43 42
				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x30)\
				&&(UartReceiveBuffer[3] ==0x30)\
				&&(UartReceiveBuffer[4] ==0x30)\
				&&(UartReceiveBuffer[5] ==0x45)\
				&&(UartReceiveBuffer[6] ==0x43)\
				&&(UartReceiveBuffer[7] ==0x43)\
				&&(UartReceiveBuffer[8] ==0x30)\
				&&(UartReceiveBuffer[9] ==0x32))
				{
					UartSendByte((unsigned char *)OrderSend6,8);
				}

				//PC	:02 45 37 37 36 30 45 03 36 31
				//MCU	:06
				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x37)\
				&&(UartReceiveBuffer[3] ==0x37)\
				&&(UartReceiveBuffer[4] ==0x36)\
				&&(UartReceiveBuffer[5] ==0x30)\
				&&(UartReceiveBuffer[6] ==0x45))
				{
					UartSendchar(ACK);
				}
				//PC	:02 45 38 37 36 30 45 03 36 32 
				//MCU	:06
 				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x38)\
				&&(UartReceiveBuffer[3] ==0x37)\
				&&(UartReceiveBuffer[4] ==0x36)\
				&&(UartReceiveBuffer[5] ==0x30)\
				&&(UartReceiveBuffer[6] ==0x45))
				{
					UartSendchar(ACK);
				}
				//PC	:02 42 03 34 35
				//MCU	:06
				else if((UartReceiveBuffer[1]==0x42))
				{
					UartSendchar(ACK);
				}
				//PC	:02 45 36 31 03 41 46 ;02 45 36 30 03 41 45 ;02 45 36 33 03 42 31 ;02 45 36 32 03 42 30	---清除PLC存储空间[顺序]
				//MCU	:06
				else if((UartReceiveBuffer[1]==0x45)\
				&&(UartReceiveBuffer[2] ==0x36)\
				&&(UartReceiveBuffer[3] <0x34))				//	暂定,可以实现目的,但是有待于进一步讨论.
				{
					ErasurePLC(ErasureCODE);				//	擦除PLC程序
					UartSendchar(ACK);
				}
				//************* 有待于加入运行\中止相关代码 *******************
				//************* 有待于加入监控测试 相关代码 *******************
			}
			else UartSendchar(NACK);
		}
		else UartSendchar(NACK);
		UartReceiveCounter=0;
		REN=1;										//	使能接收
	}
}

⌨️ 快捷键说明

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