📄 fx1n.c
字号:
//* *//
//* 总结说明: *//
//* 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 + -