|
楼主 |
发表于 2013-12-11 20:19:14
|
显示全部楼层
添加通讯,只添加写命令
void FX1NProcessing(void)
{
unsigned char i;
unsigned char WriteLen=0;
unsigned int WriteAddr=0;
if(UDRFlag) // 有数据来
{
UDRFlag=0;
if(Buffer[0]==ENQ) // 发送请求 ==== 1. 3. 5. 7. 10. 12. 14.(14开始下发数据)
{
UartSendByte(ACK);
}
else if(STXETX) // 可识别的
{
if(E11)
{
// 计算得到写入字节数:
for(i=8;i<10;i++)Buffer=ascto0F(Buffer);
Buffer[8]<<=4;
WriteLen=(Buffer[8]+Buffer[9]);
// 计算得到写入地址:
for(i=4;i<8;i++)Buffer=ascto0F(Buffer);
WriteAddr =Buffer[4]<<12;
WriteAddr+=Buffer[5]<<8;
WriteAddr+=Buffer[6]<<4;
WriteAddr+=Buffer[7];
// if(WriteAddr==0x8000)ErasurePLC(ErasureCODE); // 擦除PLC程序区
WriteFlash(WriteAddr,(unsigned char *)(Buffer+10),(unsigned char)WriteLen); // 写 flash
step=WriteLen;
UartSendByte(ACK);
}
}
UartReceiveCounter=0;
REN=1;
}
}
省去了和检验,
因为采用串口助手,写入命令02 45 31 31 30 30 30 30 30 34 30 32 30 34 30 32 31 35 03 33 33,最后两个随意
表示STX E 1 1 0 0 0 0 0 4 0 2 0 4 0 2 1 5 ETX 3 3
即在0000地址写入 LD X2
OUT Y2
主函数也更改为
#include "system.h"
unsigned char command[]={'0','3','0','4','0','4','1','5'};
void main(void)
{
SYSTEM_DISABLE_INTERRUPT();
UartInit();
TimerInit();
SYSTEM_ENABLE_INTERRUPT();
WriteFlash(IAP_ADDRESS,(unsigned char*)(command),4);
step=4;
while (1)
{
FX1NProcessing();
//更新IO端口,必须
RefreshIO();
//PLC执行去找二当家的,当老大就是好
main_PLC();
timerProc();
checkComm0Modbus();//检测modbus帧
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|