diff --git a/Firmware/FX3U_V8.0/users/PLC_Com.c b/Firmware/FX3U_V8.0/users/PLC_Com.c index d6c2029dce0d8e40cf719422661737f1e6bca54a..bca9a0c65897af01acff4ac7b77cdb1ec2bc76a3 100644 --- a/Firmware/FX3U_V8.0/users/PLC_Com.c +++ b/Firmware/FX3U_V8.0/users/PLC_Com.c @@ -1,73 +1,73 @@ /********************************************************/ -// CPU需要:STM32F103--RAM内存不小于64K Flash内存不小于128K -// 本代码已在STM32F103RDT6、VET6测试通过 +// CPU闇瑕侊細STM32F103--RAM鍐呭瓨涓嶅皬浜64K Flash鍐呭瓨涓嶅皬浜128K +// 鏈唬鐮佸凡鍦⊿TM32F103RDT6銆乂ET6娴嬭瘯閫氳繃 /******************************************************** -PLC相关的特殊寄存器 -专用辅助继电器 描述 -M8126 全局标志 -M8127 通讯请求握手信号 -M8128 出错标志 -M8129 通讯请求切换 +PLC鐩稿叧鐨勭壒娈婂瘎瀛樺櫒 +涓撶敤杈呭姪缁х數鍣 鎻忚堪 +M8126 鍏ㄥ眬鏍囧織 +M8127 閫氳璇锋眰鎻℃墜淇″彿 +M8128 鍑洪敊鏍囧織 +M8129 閫氳璇锋眰鍒囨崲 -专用数据寄存器 描述 -D8000 = 200; 扫描时间 -D8001 = 0X5EF6; 型号版本 FX2N(C) -D8101 = 0X5EF6; 型号版本 FX2N(C) -D8002 = 8; 内存容量 -D8102 = 8; 内存容量 -D8003 = 0x0010; 存储类型: PLC内置存储 -D8006 CPU电池电压 -D8010 = 10; 扫描当前值 -D8011 = 20; 扫描最小时间(0.1MS) -D8012 = 140; 扫描最长时间(0.1MS) -D6030 D6031 D6032 D6033 是模拟量输入 -D8080 D8081 是模拟输出 - - - -D8120 = 0X4096 通讯格式 -D8121 从站号(最多16个) -D8127 交换数据的首地址 -D8128 交换数据量 -D8129 网络通讯超时时间确认值 -D8000 看门狗 -D8019 对应星期 -D8018 对应年份 -D8017 对应月份 -D8016 对应日期 -D8015 对应小时 -D8014 对应分钟 -D8013 对应秒 -通讯格式详解(D8120) +涓撶敤鏁版嵁瀵勫瓨鍣 鎻忚堪 +D8000 = 200; 鎵弿鏃堕棿 +D8001 = 0X5EF6; 鍨嬪彿鐗堟湰 FX2N(C) +D8101 = 0X5EF6; 鍨嬪彿鐗堟湰 FX2N(C) +D8002 = 8; 鍐呭瓨瀹归噺 +D8102 = 8; 鍐呭瓨瀹归噺 +D8003 = 0x0010; 瀛樺偍绫诲瀷: PLC鍐呯疆瀛樺偍 +D8006 CPU鐢垫睜鐢靛帇 +D8010 = 10; 鎵弿褰撳墠鍊 +D8011 = 20; 鎵弿鏈灏忔椂闂(0.1MS) +D8012 = 140; 鎵弿鏈闀挎椂闂(0.1MS) +D6030 D6031 D6032 D6033 鏄ā鎷熼噺杈撳叆 +D8080 D8081 鏄ā鎷熻緭鍑 + + + +D8120 = 0X4096 閫氳鏍煎紡 +D8121 浠庣珯鍙凤紙鏈澶16涓級 +D8127 浜ゆ崲鏁版嵁鐨勯鍦板潃 +D8128 浜ゆ崲鏁版嵁閲 +D8129 缃戠粶閫氳瓒呮椂鏃堕棿纭鍊 +D8000 鐪嬮棬鐙 +D8019 瀵瑰簲鏄熸湡 +D8018 瀵瑰簲骞翠唤 +D8017 瀵瑰簲鏈堜唤 +D8016 瀵瑰簲鏃ユ湡 +D8015 瀵瑰簲灏忔椂 +D8014 瀵瑰簲鍒嗛挓 +D8013 瀵瑰簲绉 +閫氳鏍煎紡璇﹁В锛圖8120锛 ---------------------------------------------------------------------- -位号 | 含 义 | 描述 +浣嶅彿 | 鍚 涔 | 鎻忚堪 -----------+-------------+-------------------------------------------- -b0 | 数据长度 | 0: 7位 1: 8位 +b0 | 鏁版嵁闀垮害 | 0锛 7浣 1锛 8浣 -----------+-------------+-------------------------------------------- -b2b1 | 校验方式 | 00:不用 01:奇校验 11:偶校验 +b2b1 | 鏍¢獙鏂瑰紡 | 00锛氫笉鐢 01锛氬鏍¢獙 11锛氬伓鏍¢獙 -----------+-------------+-------------------------------------------- -b3 | 停止位 | 0: 1位 1: 2位 +b3 | 鍋滄浣 | 0锛 1浣 1锛 2浣 -----------+-------------+-------------------------------------------- - | | 0001:300 0111:4800 -b7b6b5b4 | 波特率 | 0100:600 1000:9600 - | | 0101:1200 1001:19200 - | | 0110:2400 + | | 0001锛300 0111锛4800 +b7b6b5b4 | 娉㈢壒鐜 | 0100锛600 1000锛9600 + | | 0101锛1200 1001锛19200 + | | 0110锛2400 -----------+-------------+-------------------------------------------- -b8 | | 0:不用 注:无协议通讯专用 +b8 | | 0锛氫笉鐢 娉細鏃犲崗璁氳涓撶敤 -----------+-------------+-------------------------------------------- -b9 | | 0:不用 同上 +b9 | | 0锛氫笉鐢 鍚屼笂 -----------+-------------+-------------------------------------------- -b12b11b10 | 通讯接口 | 000:RS485(RS422)接口 - | | 010: (RS232)接口 +b12b11b10 | 閫氳鎺ュ彛 | 000锛歊S485锛圧S422锛夋帴鍙 + | | 010锛 锛圧S232锛夋帴鍙 -----------+-------------+-------------------------------------------- -b13 | 求和检查 | 0:不加求和码 1:自动加上求和码 +b13 | 姹傚拰妫鏌 | 0锛氫笉鍔犳眰鍜岀爜 1锛氳嚜鍔ㄥ姞涓婃眰鍜岀爜 -----------+-------------+------------------------------------------- -b14 | 协议 | 0:无协议通讯 1:专用通讯协议 +b14 | 鍗忚 | 0锛氭棤鍗忚閫氳 1锛氫笓鐢ㄩ氳鍗忚 -----------+-------------+-------------------------------------------- -b15 | 协议格式 | 0:格式1 1:格式4 +b15 | 鍗忚鏍煎紡 | 0锛氭牸寮1 1锛氭牸寮4 ---------------------------------------------------------------------- -举例:D8120 = 0X4096 通讯波特率是19200 +涓句緥锛欴8120 = 0X4096 閫氳娉㈢壒鐜囨槸19200 *********************************************************************************/ #include "stm32f10x.h" @@ -79,25 +79,25 @@ b15 | 协 #include "bsp_timer.h" const u8 plc_programCodeBuf[34000] __at (PLC_RAM_ADDR)={ -//FLASH起始地址为PLC信息**************************最前的0X02表示PLC为16K的程序步,密码区域和差数区域**************** +//FLASH璧峰鍦板潃涓篜LC淇℃伅**************************鏈鍓嶇殑0X02琛ㄧずPLC涓16K鐨勭▼搴忔,瀵嗙爜鍖哄煙鍜屽樊鏁板尯鍩**************** 0x10,0x00,0xD8,0xBA,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 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,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0X0F,0X00,//结束指令 +0X0F,0X00,//缁撴潫鎸囦护 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,}; -//D8000 = 200; 扫描时间 -//D8001 = 0X5EF6; 型号版本 FX2N(C) -//D8101 = 0X5EF6; 型号版本 FX2N(C) -//D8002 = 8; 内存容量 8K -//D8102 = 8; 内存容量 8000步 -//D8003 = 0x0010; 存储类型: PLC内置存储 -//D8006 CPU电池电压 -//D8010 = 10; 扫描当前值 -//D8011 = 20; 扫描最小时间(0.1MS) -//D8012 = 140; 扫描最长时间(0.1MS) +//D8000 = 200; 鎵弿鏃堕棿 +//D8001 = 0X5EF6; 鍨嬪彿鐗堟湰 FX2N(C) +//D8101 = 0X5EF6; 鍨嬪彿鐗堟湰 FX2N(C) +//D8002 = 8; 鍐呭瓨瀹归噺 8K +//D8102 = 8; 鍐呭瓨瀹归噺 8000姝 +//D8003 = 0x0010; 瀛樺偍绫诲瀷: PLC鍐呯疆瀛樺偍 +//D8006 CPU鐢垫睜鐢靛帇 +//D8010 = 10; 鎵弿褰撳墠鍊 +//D8011 = 20; 鎵弿鏈灏忔椂闂(0.1MS) +//D8012 = 140; 鎵弿鏈闀挎椂闂(0.1MS) const u16 special_d[256]={ 0X00C8,0X5EA8,0X0008,0X0010,8066,32,27,0x0003,10,0, @@ -125,23 +125,23 @@ const char hex[]={ u16 prog_write_buffer[2050]; -static u8 Flag_Uart_Send=1; //发送标志位 -u16 rx_count,tx_count; //数据计算 +static u8 Flag_Uart_Send=1; //鍙戦佹爣蹇椾綅 +u16 rx_count,tx_count; //鏁版嵁璁$畻 -char tx_data[PROGRAM_BUF_SIZE]; //发送缓存 -char rx_data[PROGRAM_BUF_SIZE]; //接收缓存 +char tx_data[PROGRAM_BUF_SIZE]; //鍙戦佺紦瀛 +char rx_data[PROGRAM_BUF_SIZE]; //鎺ユ敹缂撳瓨 -u16 prog_address,data_address; //计算数据操作起始地址缓存 +u16 prog_address,data_address; //璁$畻鏁版嵁鎿嶄綔璧峰鍦板潃缂撳瓨 -u16 plc_16BitBuf[PLC_16BIT_BUF_SIZE] __at (RAM_ADDR); //PLC_RAM运行数据 +u16 plc_16BitBuf[PLC_16BIT_BUF_SIZE] __at (RAM_ADDR); //PLC_RAM杩愯鏁版嵁 // 0x200066B0~0x2000D200 // 26KB -// 70424修改 +// 70424淇敼 u8 step_status[1000]; -u8 step_address[2000]; //写步状态为0上升延与下降沿使用共2K字节1600bit +u8 step_address[2000]; //鍐欐鐘舵佷负0涓婂崌寤朵笌涓嬮檷娌夸娇鐢ㄥ叡2K瀛楄妭1600bit u8 data_size,block_contol[2]; extern u8 edit_prog; @@ -151,7 +151,7 @@ u8 Send_out; u8 Write_Pro_flag = 0; -void data_init(void)//D8000~D8126初始化 +void data_init(void)//D8000~D8126鍒濆鍖 { u16 temp; u16 temp_address; @@ -160,19 +160,19 @@ void data_init(void)//D8000~D8126 for(temp=0;temp<126;temp++) // { // temp_address=0x0C00; - plc_16BitBuf[temp_address+temp]=special_d[temp]; //传入系统FLASH备份的用户数据 + plc_16BitBuf[temp_address+temp]=special_d[temp]; //浼犲叆绯荤粺FLASH澶囦唤鐨勭敤鎴锋暟鎹 } // // D8000 - plc_16BitBuf[0x2000] =plc_programCodeBuf[prog_address] *256; // 取字节高位 - plc_16BitBuf[0x2000] |=plc_programCodeBuf[prog_address+1]; // 取字节低位 + plc_16BitBuf[0x2000] =plc_programCodeBuf[prog_address] *256; // 鍙栧瓧鑺傞珮浣 + plc_16BitBuf[0x2000] |=plc_programCodeBuf[prog_address+1]; // 鍙栧瓧鑺備綆浣 - PLC_RW_RAM_8BIT(0x01E0) =0x09; // 令M8000 M8003置ON + PLC_RW_RAM_8BIT(0x01E0) =0x09; // 浠8000 M8003缃甇N - block_contol[0]=200; // 防止写参数时程序丢失 + block_contol[0]=200; // 闃叉鍐欏弬鏁版椂绋嬪簭涓㈠け block_contol[1]=200; #if DEBUG - #warning "MC和MCR指令--data_init"; + #warning "MC鍜孧CR鎸囦护--data_init"; // MC.MC_SFR = 0; // MC.MC_Flg = 0; // MC.PLC_MC_BIT = 0; @@ -180,106 +180,106 @@ void data_init(void)//D8000~D8126 } -void write_block(u16 number) // 写入FLASH +void write_block(u16 number) // 鍐欏叆FLASH { u16 temp,wait_write,appoint_address; - if(number<17) // 写入参数的块必需10块 + if(number<17) // 鍐欏叆鍙傛暟鐨勫潡蹇呴渶10鍧 { - FLASH_Unlock(); // flash关闭保护 - FLASH_ErasePage(PLC_RAM_ADDR+number*0x800); // 擦除一块数据占用2K - for(temp=0;temp<1024;temp++) // 操作为16bit,只需要1024次程序操作完毕 + FLASH_Unlock(); // flash鍏抽棴淇濇姢 + FLASH_ErasePage(PLC_RAM_ADDR+number*0x800); // 鎿﹂櫎涓鍧楁暟鎹崰鐢2K + for(temp=0;temp<1024;temp++) // 鎿嶄綔涓16bit,鍙渶瑕1024娆$▼搴忔搷浣滃畬姣 { - appoint_address =PLC_RAM_ADDR + number*0x800 + temp*2; // 起始地址加上块地址再加上块的小地址,等于目标位置 - wait_write =prog_write_buffer[temp*2] + prog_write_buffer[temp*2+1]*0X100; // 写入16bit至flash - FLASH_ProgramHalfWord(appoint_address,wait_write); // 等待程序写入结束 + appoint_address =PLC_RAM_ADDR + number*0x800 + temp*2; // 璧峰鍦板潃鍔犱笂鍧楀湴鍧鍐嶅姞涓婂潡鐨勫皬鍦板潃,绛変簬鐩爣浣嶇疆 + wait_write =prog_write_buffer[temp*2] + prog_write_buffer[temp*2+1]*0X100; // 鍐欏叆16bit鑷砯lash + FLASH_ProgramHalfWord(appoint_address,wait_write); // 绛夊緟绋嬪簭鍐欏叆缁撴潫 } - FLASH_Lock(); // 结束程序写入开启flash保护 + FLASH_Lock(); // 缁撴潫绋嬪簭鍐欏叆寮鍚痜lash淇濇姢 } } -void backup_block(u16 number) // 程序块备份,目的在写程序之前进前面程序备份 +void backup_block(u16 number) // 绋嬪簭鍧楀浠,鐩殑鍦ㄥ啓绋嬪簭涔嬪墠杩涘墠闈㈢▼搴忓浠 { u16 temp,appoint_address; if(number<17) { for(temp=0;temp<2048;temp++) { - appoint_address =number*0x800 + temp; // 起始地址加上块地址再加上块的小地址 - prog_write_buffer[temp] =plc_programCodeBuf[appoint_address]; // 将程序备份出来 + appoint_address =number*0x800 + temp; // 璧峰鍦板潃鍔犱笂鍧楀湴鍧鍐嶅姞涓婂潡鐨勫皬鍦板潃 + prog_write_buffer[temp] =plc_programCodeBuf[appoint_address]; // 灏嗙▼搴忓浠藉嚭鏉 } } } //======================================================================================================= -// 函数名称: ErasurePLC -// 功能描述:PLC擦除FLASH空间 -// 输 入: mode 模式 -// 输 出: void -// 全局变量: +// 鍑芥暟鍚嶇О: ErasurePLC +// 鍔熻兘鎻忚堪锛歅LC鎿﹂櫎FLASH绌洪棿 +// 杈撱鍏: mode 妯″紡 +// 杈撱鍑: void +// 鍏ㄥ眬鍙橀噺: //------------------------------------------------------------------------------------------------------- -// 修改人: -// 日 期: -// 备 注: +// 淇敼浜: +// 鏃ャ鏈: +// 澶 娉: //------------------------------------------------------------------------------------------------------- //======================================================================================================= void ErasurePLC(u8 mode) { u16 temp=0,Erasure_plc_16BitBuf; - /*******************************************PLC存储内存清理 ************************************************/ + /*******************************************PLC瀛樺偍鍐呭瓨娓呯悊 ************************************************/ if(mode==1) { backup_block(0); - prog_write_buffer[92]=0x0f; //赋值 - prog_write_buffer[93]=0x00; //赋值 - for(temp=94;temp<2048;temp++) //从0x5E + prog_write_buffer[92]=0x0f; //璧嬪 + prog_write_buffer[93]=0x00; //璧嬪 + for(temp=94;temp<2048;temp++) //浠0x5E { prog_write_buffer[temp]=0xffff; // } - FLASH_Unlock(); //flash关闭保护 + FLASH_Unlock(); //flash鍏抽棴淇濇姢 FLASH_ErasePage(PLC_RAM_ADDR+0x800); - write_block(0); //备份第一块flash - for(temp=1;temp<10;temp++) //擦除10块 - FLASH_ErasePage(PLC_RAM_ADDR+temp*0x800); //擦除flash - FLASH_Lock(); //结束程序写入开启flash保护 + write_block(0); //澶囦唤绗竴鍧梖lash + for(temp=1;temp<10;temp++) //鎿﹂櫎10鍧 + FLASH_ErasePage(PLC_RAM_ADDR+temp*0x800); //鎿﹂櫎flash + FLASH_Lock(); //缁撴潫绋嬪簭鍐欏叆寮鍚痜lash淇濇姢 } -/*******************************************PLC清理数据元件位*********************************************/ +/*******************************************PLC娓呯悊鏁版嵁鍏冧欢浣*********************************************/ if(mode==2) { - for(Erasure_plc_16BitBuf=0x4000;Erasure_plc_16BitBuf<0x7E7E;Erasure_plc_16BitBuf+=2) // 清除D0000-D7999 + for(Erasure_plc_16BitBuf=0x4000;Erasure_plc_16BitBuf<0x7E7E;Erasure_plc_16BitBuf+=2) // 娓呴櫎D0000-D7999 plc_16BitBuf[Erasure_plc_16BitBuf]=0x00; } -/*******************************************PLC清理位元件**************************************************/ +/*******************************************PLC娓呯悊浣嶅厓浠**************************************************/ if(mode==3) { - for(Erasure_plc_16BitBuf=0x0000;Erasure_plc_16BitBuf<0x00BE;Erasure_plc_16BitBuf+=2) // 清除M0000-M3071 + for(Erasure_plc_16BitBuf=0x0000;Erasure_plc_16BitBuf<0x00BE;Erasure_plc_16BitBuf+=2) // 娓呴櫎M0000-M3071 plc_16BitBuf[Erasure_plc_16BitBuf]=0x00; } - tx_data[1]=0x06,tx_count=1,Send_out=5; // 清除完毕报告上位机 + tx_data[1]=0x06,tx_count=1,Send_out=5; // 娓呴櫎瀹屾瘯鎶ュ憡涓婁綅鏈 } /******************************************************************************* -函数功能:计算校验和 -备注: 20优化 +鍑芥暟鍔熻兘锛氳绠楁牎楠屽拰 +澶囨敞锛 20浼樺寲 *******************************************************************************/ -u8 CheckSum(char * pBuf)//计算接收区和校验 +u8 CheckSum(char * pBuf)//璁$畻鎺ユ敹鍖哄拰鏍¢獙 { u16 i; u8 sum; - sum=0; // 请除和记算器 - pBuf +=3; // 计算和从第三位开始 - for(i=3;i<(rx_count-1);i++) // 计算和 + sum=0; // 璇烽櫎鍜岃绠楀櫒 + pBuf +=3; // 璁$畻鍜屼粠绗笁浣嶅紑濮 + for(i=3;i<(rx_count-1);i++) // 璁$畻鍜 { - sum += *pBuf; // 开始相加 - pBuf++; // 指针加一 + sum += *pBuf; // 寮濮嬬浉鍔 + pBuf++; // 鎸囬拡鍔犱竴 } - return sum; // 数据正常 + return sum; // 鏁版嵁姝e父 } /******************************************************************************* -函数名称:void switch_read_data(void) -函数功能:转换ASCII码为HEX码,占用数据发送寄存器 -出口参数:无 +鍑芥暟鍚嶇О锛歷oid switch_read_data(void) +鍑芥暟鍔熻兘锛氳浆鎹SCII鐮佷负HEX鐮侊紝鍗犵敤鏁版嵁鍙戦佸瘎瀛樺櫒 +鍑哄彛鍙傛暟锛氭棤 ********************************************************************************/ void switch_read_data(void) { @@ -292,18 +292,20 @@ void switch_read_data(void) } } -void setup_HL(void) //高低位交换再转换 ,小端转换 +// 璁$畻绋嬪簭鎿嶄綔璧峰鍦板潃 +void setup_HL(void) //楂樹綆浣嶄氦鎹㈠啀杞崲 锛屽皬绔浆鎹 { u8 temp; - temp=tx_data[3]; //地址高位送入16位数据区 - prog_address=temp*0x100+tx_data[2]; //计算程序操作起始地址 + temp=tx_data[3]; //鍦板潃楂樹綅閫佸叆16浣嶆暟鎹尯 + prog_address=temp*0x100+tx_data[2]; //璁$畻绋嬪簭鎿嶄綔璧峰鍦板潃 } -void setup_LH(void) //正常地址转换 +// 璁$畻鏁版嵁鎿嶄綔璧峰鍦板潃 +void setup_LH(void) //姝e父鍦板潃杞崲 { u8 temp; - temp=tx_data[3]; //地址高位送入16位数据区 - data_address=temp*0x100+tx_data[4]; //计算数据操作起始地址 + temp=tx_data[3]; //鍦板潃楂樹綅閫佸叆16浣嶆暟鎹尯 + data_address=temp*0x100+tx_data[4]; //璁$畻鏁版嵁鎿嶄綔璧峰鍦板潃 } typedef union @@ -312,23 +314,23 @@ typedef union char data1[2]; } usart_data; -// 1122注释,//读取PLC型号,指令“30” +// 1122娉ㄩ噴锛//璇诲彇PLC鍨嬪彿锛屾寚浠も30鈥 void read_plc_tyte(u8 addr) { u16 temp; u8 temp_sum; usart_data plc_type; - plc_type.data=special_d[addr]; //PLC型号 - tx_data[1]=0x02; //报文开始 02 + plc_type.data=special_d[addr]; //PLC鍨嬪彿 + tx_data[1]=0x02; //鎶ユ枃寮濮 02 temp_sum=0; for(temp=0;temp=0x0180&&comm_add<=0x0196) // Y000-Y267 // return comm_add-0x00E0; -// else if(comm_add>=0x0200&&comm_add<=0x021F) // T00-T255 OVER触点 +// else if(comm_add>=0x0200&&comm_add<=0x021F) // T00-T255 OVER瑙︾偣 // return comm_add-0x0140; -// else if(comm_add>=0x0500&&comm_add<=0x051F) // T00-T255 Enable 线圈 +// else if(comm_add>=0x0500&&comm_add<=0x051F) // T00-T255 Enable 绾垮湀 // return comm_add-0x0240; -// else if(comm_add>=0x01E0&&comm_add<=0x01FF) // C00-C255 OVER触点 +// else if(comm_add>=0x01E0&&comm_add<=0x01FF) // C00-C255 OVER瑙︾偣 // return comm_add-0x0020; // else if(comm_add<=0x00BF) // M0000-M1535 // return comm_add+0x0100; @@ -385,41 +387,41 @@ u16 PLC_Comm_Byte(u16 comm_add) // return comm_add+0x0440; // else if(comm_add>=0x01C0&&comm_add<=0x01DF) // M8000-M8255 // return comm_add+0x0020; - else // 无效地址 + else // 鏃犳晥鍦板潃 return comm_add; } /******************************************************************************* -函数名称:PLC_Com_BIT -函数功能:通信位地址重定义及执行 -入口参数:Cmd命令 -出口参数:映射的实际地址(BIT地址) +鍑芥暟鍚嶇О锛歅LC_Com_BIT +鍑芥暟鍔熻兘锛氶氫俊浣嶅湴鍧閲嶅畾涔夊強鎵ц +鍏ュ彛鍙傛暟锛欳md鍛戒护 +鍑哄彛鍙傛暟锛氭槧灏勭殑瀹為檯鍦板潃(BIT鍦板潃) ********************************************************************************/ u16 PLC_Com_BIT(u16 addr) { /* FX3U */ - if((addr>=0x4000)&&(addr<=0x45FF)) // M0000-M1535 * - return (addr-0X3800); - else if((addr>=0x4600)&&(addr<=0x5DFF)) // M1536-M7679 * - return (addr-0x1E00); - else if((addr>=0x5E00)&&(addr<=0x5EFF)) // Y00-Y377 * - return (addr-0x5900); - else if((addr>=0x6000)&&(addr<=0x61FF)) // M8000-M8255 * - return (addr-0X5100); - else if((addr>=0x6500)&&(addr<=0x65FF)) // X00-X377 * - return (addr-0x6100); - else if((addr>=0x6700)&&(addr<=0x6AFF)) // S00-S1023 * - return (addr-0x6700); - else if((addr>=0x6B00)&&(addr<=0x76FF)) // S1024-S4095 * - return (addr-0X5700); - else if((addr>=0x9800)&&(addr<=0x99FF)) // T00-T255 Enable 线圈 * - return (addr-0X7200); - else if((addr>=0x9700)&&(addr<=0x97FF)) // C00-C255 Enable 线圈 * - return (addr-0X7200); - else if((addr>=0x6300)&&(addr<=0x64FF)) // T00-T255 OVER 触点 * - return (addr-0X5D00); - else if((addr>=0x6200)&&(addr<=0x62FF)) // C00-C255 OVER 触点 * - return (addr-0X5400); + if((addr>=0x4000)&&(addr<=0x45FF)) // M0000-M1535 * + return (addr-0X3800); + else if((addr>=0x4600)&&(addr<=0x5DFF)) // M1536-M7679 * + return (addr-0x1E00); + else if((addr>=0x5E00)&&(addr<=0x5EFF)) // Y00-Y377 * + return (addr-0x5900); + else if((addr>=0x6000)&&(addr<=0x61FF)) // M8000-M8255 * + return (addr-0X5100); + else if((addr>=0x6500)&&(addr<=0x65FF)) // X00-X377 * + return (addr-0x6100); + else if((addr>=0x6700)&&(addr<=0x6AFF)) // S00-S1023 * + return (addr-0x6700); + else if((addr>=0x6B00)&&(addr<=0x76FF)) // S1024-S4095 * + return (addr-0X5700); + else if((addr>=0x9800)&&(addr<=0x99FF)) // T00-T255 Enable 绾垮湀 * + return (addr-0X7200); + else if((addr>=0x9700)&&(addr<=0x97FF)) // C00-C255 Enable 绾垮湀 * + return (addr-0X7200); + else if((addr>=0x6300)&&(addr<=0x64FF)) // T00-T255 OVER 瑙︾偣 * + return (addr-0X5D00); + else if((addr>=0x6200)&&(addr<=0x62FF)) // C00-C255 OVER 瑙︾偣 * + return (addr-0X5400); // /*FX2N*/ // if((addr<=0x05FF)) @@ -433,42 +435,42 @@ u16 PLC_Com_BIT(u16 addr) // else if((addr>=0x1400)&&(addr<=0x17E7)) // return (addr-0X1400); //S00-S999 // else if((addr>=0x2800)&&(addr<=0x28FF)) -// return (addr-0X1200); //T00-T255 Enable 线圈 +// return (addr-0X1200); //T00-T255 Enable 绾垮湀 // else if((addr>=0x1000)&&(addr<=0x10FF)) -// return (addr-0X0A00); //T00-T255 OVER 触点 +// return (addr-0X0A00); //T00-T255 OVER 瑙︾偣 // else if((addr>=0x0E00)&&(addr<=0x0EFF)) // return (addr+0X0100); //M8000-M8255 // else if((addr>=0x0F00)&&(addr<=0x0FFF)) -// return (addr-0X0100); //C00-C255 OVER触点 +// return (addr-0X0100); //C00-C255 OVER瑙︾偣 else return addr; } //======================================================================================================= -// 函数名称: void READ_data(void) -// 功能描述: 读数据 X,Y,M,S,T,C,D -// 输 入: void -// 输 出: void -// 全局变量: +// 鍑芥暟鍚嶇О: void READ_data(void) +// 鍔熻兘鎻忚堪锛 璇绘暟鎹 X,Y,M,S,T,C,D +// 杈撱鍏: void +// 杈撱鍑: void +// 鍏ㄥ眬鍙橀噺: //------------------------------------------------------------------------------------------------------- -// 修改人: -// 日 期: -// 备 注: PLC_Comm_Byte获取FX0N编程口通讯访问时的内部软元件地址,S X Y T M C M8, 【? T C16 C32 D8 D D1000 】 +// 淇敼浜: +// 鏃ャ鏈: +// 澶 娉: PLC_Comm_Byte鑾峰彇FX0N缂栫▼鍙i氳璁块棶鏃剁殑鍐呴儴杞厓浠跺湴鍧锛孲 X Y T M C M8锛 銆愶紵 T C16 C32 D8 D D1000 銆 //======================================================================================================= -void read_other_data(void) //指令“30” +void read_other_data(void) //鎸囦护鈥30鈥 { u16 i; u8 temp_sum; - tx_data[1]=0x02; //报文开始 + tx_data[1]=0x02; //鎶ユ枃寮濮 temp_sum=0; for(i=0;i=0x600)&&(temp_bit<=0x66E)) //主要是C200-C255以后的地址是32位的 + plc_16BitBuf[0x0BC8+temp1]=plc_16BitBuf[temp_bit];temp1++;//灏嗛渶瑕佺殑鏁版嵁浼犲埌缂撳瓨 + if((temp_bit>=0x600)&&(temp_bit<=0x66E)) //涓昏鏄疌200-C255浠ュ悗鐨勫湴鍧鏄32浣嶇殑 { - plc_16BitBuf[0x1790/2+temp1]=plc_16BitBuf[temp_bit+1]; //将需要的数据传到缓存 + plc_16BitBuf[0x1790/2+temp1]=plc_16BitBuf[temp_bit+1]; //灏嗛渶瑕佺殑鏁版嵁浼犲埌缂撳瓨 temp1++; } } - monitor2=PLC_RAM8(0x20002402); //读出需要监控位数量 + monitor2=PLC_RAM8(0x20002402); //璇诲嚭闇瑕佺洃鎺т綅鏁伴噺 temp1=temp1+16; // - for(monitor1=0;monitor1(0xFD5C-0x8000)) - find_ok=1; //在有效的范围内没有找到END指令 + find_ok=1; //鍦ㄦ湁鏁堢殑鑼冨洿鍐呮病鏈夋壘鍒癊ND鎸囦护 }while(find_ok>3); return addr+0X8000; } -static void find_data_address(void) //查找上位机需要的指令地址 +static void find_data_address(void) //鏌ユ壘涓婁綅鏈洪渶瑕佺殑鎸囦护鍦板潃 { u8 temp_sum,data_H,data_L; - data_L=tx_data[5]; //需要查找数据的内容低位 - data_H=tx_data[6]; //需要查找数据的内容高位 - data_address=find_data(data_address,data_H*0X100+data_L); //读FLASH - tx_data[1]=0x02; //报文开始 + data_L=tx_data[5]; //闇瑕佹煡鎵炬暟鎹殑鍐呭浣庝綅 + data_H=tx_data[6]; //闇瑕佹煡鎵炬暟鎹殑鍐呭楂樹綅 + data_address=find_data(data_address,data_H*0X100+data_L); //璇籉LASH + tx_data[1]=0x02; //鎶ユ枃寮濮 temp_sum=0; tx_data[2]=0x31; temp_sum+=tx_data[2]; @@ -735,74 +737,74 @@ void mov_flash(u16 addr,u8 mov_addr) u16 start_addr,end_addr,backup_addr,temp,temp1,temp2,mov_byte,addr_mov; static u8 offset; offset=mov_addr; - end_addr=find_data(addr+0x8000,0x000f)+mov_addr-0x8000; //找出END指令所在位置,再加上移动量,等于最到END所在位置 + end_addr=find_data(addr+0x8000,0x000f)+mov_addr-0x8000; //鎵惧嚭END鎸囦护鎵鍦ㄤ綅缃紝鍐嶅姞涓婄Щ鍔ㄩ噺锛岀瓑浜庢渶鍒癊ND鎵鍦ㄤ綅缃 start_addr=end_addr; addr_mov=addr; - if(addr>0x5B) //当前移动是否大于0步 + if(addr>0x5B) //褰撳墠绉诲姩鏄惁澶т簬0姝 { - addr_mov-=0X5C; //减去参数地址 + addr_mov-=0X5C; //鍑忓幓鍙傛暟鍦板潃 end_addr-=0x5C; - addr_mov/=2; //一步占用两个字节 除2为指到起始字节 + addr_mov/=2; //涓姝ュ崰鐢ㄤ袱涓瓧鑺傘闄2涓烘寚鍒拌捣濮嬪瓧鑺 end_addr/=2; - addr_mov/=8; //指令向每一步的壮态地址 + addr_mov/=8; //鎸囦护鍚戞瘡涓姝ョ殑澹佸湴鍧 end_addr/=8; offset/=2; mov_byte=offset/8; offset%=8; - while(!(end_addr==addr_mov)) //END address and curennt addr 是否相等 ,不相等需要循环 + while(!(end_addr==addr_mov)) //END address and curennt addr 鏄惁鐩哥瓑 ,涓嶇浉绛夐渶瑕佸惊鐜 { - temp=step_address[end_addr]*0x100+step_address[end_addr-1]; //调出前16位的壮态值,为后面需要移动 - temp<<=offset; //向后移动偏移的地址余数 - step_address[end_addr+mov_byte]=temp/0x100; //附值到目标地址 - end_addr--; //地址向前移8步 + temp=step_address[end_addr]*0x100+step_address[end_addr-1]; //璋冨嚭鍓16浣嶇殑澹佸硷紝涓哄悗闈㈤渶瑕佺Щ鍔 + temp<<=offset; //鍚戝悗绉诲姩鍋忕Щ鐨勫湴鍧浣欐暟 + step_address[end_addr+mov_byte]=temp/0x100; //闄勫煎埌鐩爣鍦板潃 + end_addr--; //鍦板潃鍚戝墠绉8姝 } - temp=step_address[end_addr]*0x100+step_address[end_addr-1]; //调出前16位的壮态值,为后面需要移动 - temp<<=offset; //向后移动偏移的地址余数 - step_address[end_addr+mov_byte]=temp/0x100; //附值到目标地址 + temp=step_address[end_addr]*0x100+step_address[end_addr-1]; //璋冨嚭鍓16浣嶇殑澹佸硷紝涓哄悗闈㈤渶瑕佺Щ鍔 + temp<<=offset; //鍚戝悗绉诲姩鍋忕Щ鐨勫湴鍧浣欐暟 + step_address[end_addr+mov_byte]=temp/0x100; //闄勫煎埌鐩爣鍦板潃 } end_addr=start_addr; temp=start_addr; do{ - if((end_addr/0x800)==(addr/0x800)) //目标移动位置与实际移动位置到了一个块吗 - start_addr=addr%0x800; //如果已到了一个块那么起始地址为目标位置开模 + if((end_addr/0x800)==(addr/0x800)) //鐩爣绉诲姩浣嶇疆涓庡疄闄呯Щ鍔ㄤ綅缃埌浜嗕竴涓潡鍚 + start_addr=addr%0x800; //濡傛灉宸插埌浜嗕竴涓潡閭d箞璧峰鍦板潃涓虹洰鏍囦綅缃紑妯 else - start_addr=0; //没到则从0开始移动 - if((temp/0x800)==(end_addr/0x800)) //END所在的地址,跟正在移动的地址是在一个块吗,如果在一个块,则需要进行结束度度处理 + start_addr=0; //娌″埌鍒欎粠0寮濮嬬Щ鍔 + if((temp/0x800)==(end_addr/0x800)) //END鎵鍦ㄧ殑鍦板潃锛岃窡姝e湪绉诲姩鐨勫湴鍧鏄湪涓涓潡鍚楋紝濡傛灉鍦ㄤ竴涓潡锛屽垯闇瑕佽繘琛岀粨鏉熷害搴﹀鐞 temp1=end_addr%0x800+1; else - temp1=2048; //如果没有在一个块直接到一个块的结束位置2048 + temp1=2048; //濡傛灉娌℃湁鍦ㄤ竴涓潡鐩存帴鍒颁竴涓潡鐨勭粨鏉熶綅缃2048 backup_block(end_addr/0x800); for(temp2=start_addr;temp2addr+mov_addr); } -void all_flash_unlock(void) //FLASH全部解锁 +void all_flash_unlock(void) //FLASH鍏ㄩ儴瑙i攣 { block_contol[1]=200; block_contol[0]=200; tx_data[1]=0x06,tx_count=1; } -void all_flash_lock(void) //FLASH全部加锁 +void all_flash_lock(void) //FLASH鍏ㄩ儴鍔犻攣 { - write_block(block_contol[1]); //加锁之前把需要写的数据写到FLASH + write_block(block_contol[1]); //鍔犻攣涔嬪墠鎶婇渶瑕佸啓鐨勬暟鎹啓鍒癋LASH block_contol[1]=200; block_contol[0]=200; FLASH_Lock(); tx_data[1]=0x06,tx_count=1; } -void PC_OPTION_PROG(void) //扩展功能 "E" 代码 +void PC_OPTION_PROG(void) //鎵╁睍鍔熻兘 "E" 浠g爜 { u16 temp; - if((rx_count==11)&&((rx_data[4]==0x37)||(rx_data[4]==0x38)))//是否为强制功能 + if((rx_count==11)&&((rx_data[4]==0x37)||(rx_data[4]==0x38)))//鏄惁涓哄己鍒跺姛鑳 { prog_address=hex[rx_data[5]]*0x10+hex[rx_data[6]]+hex[rx_data[7]]*0x1000+hex[rx_data[8]]*0x100; if(rx_data[4]==0x37) @@ -812,60 +814,60 @@ void PC_OPTION_PROG(void) // } else { - setup_LH(); //调用算出地址函数 + setup_LH(); //璋冪敤绠楀嚭鍦板潃鍑芥暟 temp=tx_data[2]; switch(temp) { - case 0x00: PC_READ_Parameter(); break; //读配置 E00 - case 0x10: //写配置 E10 + case 0x00: PC_READ_Parameter(); break; //璇婚厤缃 E00 + case 0x10: //鍐欓厤缃 E10 { - // 传人记,20180524,新增gxwork2直接设置时钟,应该需要特殊处理? - // E10 0E1A[d8013] 0E24[d8018] 0010[分] 0011[时] 0018[日] 0005[月] 00 E207[年] 04[星期] 00 + // 浼犱汉璁帮紝20180524锛屾柊澧瀏xwork2鐩存帴璁剧疆鏃堕挓锛屽簲璇ラ渶瑕佺壒娈婂鐞嗭紵 + // E10 0E1A[d8013] 0E24[d8018] 0010[鍒哴 0011[鏃禲 0018[鏃 0005[鏈圿 00 E207[骞碷 04[鏄熸湡] 00 PC_WRITE_Parameter(); break; } - case 0x01: // 读程序 E01 + case 0x01: // 璇荤▼搴 E01 { PC_READ_PORG(); break; } - case 0x11: PC_WRITE_PORG(); break; //写程序 E11 - case 0x77: all_flash_unlock(); break; //使用E指令进行写程序写请求77 - case 0x87: all_flash_lock(); break; //使用E指令进行写程序结束请求87 - case 0x41: find_data_address(); break; //查找END指令地址 - case 0x61: all_flash_unlock(); break; //PLC存储内存清理 应为下发了多次 我在这FLASH全部解锁 - case 0x60: ErasurePLC(1); break; //PLC存储内存清理 - case 0x63: ErasurePLC(2); break; //PLC清理数据元件位 - case 0x62: ErasurePLC(3); break; //PLC清理位元件 - default: tx_data[1]=0x15,tx_count=1; break; //遇到不支持的命令 + case 0x11: PC_WRITE_PORG(); break; //鍐欑▼搴 E11 + case 0x77: all_flash_unlock(); break; //浣跨敤E鎸囦护杩涜鍐欑▼搴忓啓璇锋眰77 + case 0x87: all_flash_lock(); break; //浣跨敤E鎸囦护杩涜鍐欑▼搴忕粨鏉熻姹87 + case 0x41: find_data_address(); break; //鏌ユ壘END鎸囦护鍦板潃 + case 0x61: all_flash_unlock(); break; //PLC瀛樺偍鍐呭瓨娓呯悊 搴斾负涓嬪彂浜嗗娆 鎴戝湪杩橣LASH鍏ㄩ儴瑙i攣 + case 0x60: ErasurePLC(1); break; //PLC瀛樺偍鍐呭瓨娓呯悊 + case 0x63: ErasurePLC(2); break; //PLC娓呯悊鏁版嵁鍏冧欢浣 + case 0x62: ErasurePLC(3); break; //PLC娓呯悊浣嶅厓浠 + default: tx_data[1]=0x15,tx_count=1; break; //閬囧埌涓嶆敮鎸佺殑鍛戒护 } } } -void READ_plc_programCodeBuf() //读16位数据包括只读 +void READ_plc_programCodeBuf() //璇16浣嶆暟鎹寘鎷彧璇 { u8 temp_sum; - tx_data[1]=0x02; //报文开始 + tx_data[1]=0x02; //鎶ユ枃寮濮 temp_sum=0; - tx_data[2]=Ascll[plc_programCodeBuf[0]/0x10]; //取字节高位 - tx_data[3]=Ascll[plc_programCodeBuf[0]%0x10]; //取字节低位 - tx_data[4]=Ascll[plc_programCodeBuf[1]/0x10]; //取字节高位 - tx_data[5]=Ascll[plc_programCodeBuf[1]%0x10]; //取字节低位 + tx_data[2]=Ascll[plc_programCodeBuf[0]/0x10]; //鍙栧瓧鑺傞珮浣 + tx_data[3]=Ascll[plc_programCodeBuf[0]%0x10]; //鍙栧瓧鑺備綆浣 + tx_data[4]=Ascll[plc_programCodeBuf[1]/0x10]; //鍙栧瓧鑺傞珮浣 + tx_data[5]=Ascll[plc_programCodeBuf[1]%0x10]; //鍙栧瓧鑺備綆浣 temp_sum+=tx_data[2]+tx_data[3]+tx_data[4]+tx_data[5]; - tx_data[6]=0x03; // 结束 + tx_data[6]=0x03; // 缁撴潫 temp_sum+=0x03; tx_data[7]=Ascll[temp_sum/0x10]; tx_data[8]=Ascll[temp_sum%0x10]; tx_count=8; } -void PLC_1BIT_State() //读取 PLC工作状态 启动 +void PLC_1BIT_State() //璇诲彇 PLC宸ヤ綔鐘舵 鍚姩 { u8 temp_sum; tx_data[1]=0x02; temp_sum=0; - if(PLC_BIT_TEST(PLC_Com_BIT(tx_data[5]*0X100+tx_data[4]))) //读取位寄存器地址 + if(PLC_BIT_TEST(PLC_Com_BIT(tx_data[5]*0X100+tx_data[4]))) //璇诲彇浣嶅瘎瀛樺櫒鍦板潃 tx_data[2]=0x31; else tx_data[2]=0x30; @@ -877,27 +879,27 @@ void PLC_1BIT_State() // tx_count=5; } -void PLC_Download(void) //查看寄存器 状态 +void PLC_Download(void) //鏌ョ湅瀵勫瓨鍣 鐘舵 { u16 temp; - temp=tx_data[3]; //计算数据操作起始地址 + temp=tx_data[3]; //璁$畻鏁版嵁鎿嶄綔璧峰鍦板潃 switch(temp) { - case 0x11: READ_plc_programCodeBuf(); break; //读容量 - case 0x10: PLC_1BIT_State(); break; //读取PLC运行状态 - default: tx_data[1]=0x15,tx_count=1;break; //遇到不支持的命令 + case 0x11: READ_plc_programCodeBuf(); break; //璇诲閲 + case 0x10: PLC_1BIT_State(); break; //璇诲彇PLC杩愯鐘舵 + default: tx_data[1]=0x15,tx_count=1;break; //閬囧埌涓嶆敮鎸佺殑鍛戒护 } } -void PLC_Upload(void) //查看程序梯形图结束地址 +void PLC_Upload(void) //鏌ョ湅绋嬪簭姊舰鍥剧粨鏉熷湴鍧 { u16 *PLC_Addr,temp; u8 temp_sum,data_H,data_L; temp=0X805A; // PLC_Addr=((u16*)(0x800605A)); do{PLC_Addr++;temp+=2;} - while(!(*PLC_Addr==0x000f)); //如果END 就0X000F - tx_data[1]=0x02; //报文开始 + while(!(*PLC_Addr==0x000f)); //濡傛灉END 灏0X000F + tx_data[1]=0x02; //鎶ユ枃寮濮 temp_sum=0; tx_data[2]=0x31; temp_sum+=tx_data[2]; @@ -918,20 +920,20 @@ void PLC_Upload(void) // tx_count=9; } -void PLC_E_Expand(void) //扩展功能 "F" 上传程序和下载程序调用 +void PLC_E_Expand(void) //鎵╁睍鍔熻兘 "F" 涓婁紶绋嬪簭鍜屼笅杞界▼搴忚皟鐢 { u16 temp; - temp=rx_data[4]; //计算数据操作起始地址 - setup_LH(); //调用算出地址函数 + temp=rx_data[4]; //璁$畻鏁版嵁鎿嶄綔璧峰鍦板潃 + setup_LH(); //璋冪敤绠楀嚭鍦板潃鍑芥暟 switch(temp) { - case 0X35: PLC_Download(); break; //下载 程序时调用 - case 0X38: PLC_Upload(); break; //查找END指令地址 - default: tx_data[1]=0x06,tx_count=1; break; //遇到不支持的命令 + case 0X35: PLC_Download(); break; //涓嬭浇 绋嬪簭鏃惰皟鐢 + case 0X38: PLC_Upload(); break; //鏌ユ壘END鎸囦护鍦板潃 + default: tx_data[1]=0x06,tx_count=1; break; //閬囧埌涓嶆敮鎸佺殑鍛戒护 } } -void find_end(void) //查找程序中是否存在END指令, +void find_end(void) //鏌ユ壘绋嬪簭涓槸鍚﹀瓨鍦‥ND鎸囦护锛 { if(rx_count==13) tx_data[1]=0x06,tx_count=1; @@ -942,109 +944,109 @@ void find_end(void) // void Process_switch(void) { u8 temp; - switch_read_data(); //把第三位开始的ASCII码转换成HEX ,地址为数据发送区 + switch_read_data(); //鎶婄涓変綅寮濮嬬殑ASCII鐮佽浆鎹㈡垚HEX 锛屽湴鍧涓烘暟鎹彂閫佸尯 temp=rx_data[3]; switch(temp) { - case 0x30: data_size=tx_data[4],PC_READ_byte(); break; //代入请求据数长度位“tx_data[4]” 读数据 - case 0x31: data_size=tx_data[4];PC_WRITE_byte(); break; //代入请求据数长度位“tx_data[4]” 写数据 - case 0x34: find_end(); break; //查找指令,如查找到有数据则返回6 - case 0x37: setup_HL(),PC_FORCE_ON(); break; //PLC 启动 远程 “0x37” - case 0x38: setup_HL(),PC_FORCE_OFF(); break; //PLC 停止 远程 “0x38” - case 0x42: all_flash_lock(); break; //写参数结束命令 - case 0x46: PLC_E_Expand(); break; //通讯F功能指令 - case 0x45: data_size=tx_data[5],PC_OPTION_PROG();break; //通讯E功能指令 + case 0x30: data_size=tx_data[4],PC_READ_byte(); break; //浠e叆璇锋眰鎹暟闀垮害浣嶁渢x_data[4]鈥 璇绘暟鎹 + case 0x31: data_size=tx_data[4];PC_WRITE_byte(); break; //浠e叆璇锋眰鎹暟闀垮害浣嶁渢x_data[4]鈥 鍐欐暟鎹 + case 0x34: find_end(); break; //鏌ユ壘鎸囦护锛屽鏌ユ壘鍒版湁鏁版嵁鍒欒繑鍥6 + case 0x37: setup_HL(),PC_FORCE_ON(); break; //PLC 鍚姩 杩滅▼ 鈥0x37鈥 + case 0x38: setup_HL(),PC_FORCE_OFF(); break; //PLC 鍋滄 杩滅▼ 鈥0x38鈥 + case 0x42: all_flash_lock(); break; //鍐欏弬鏁扮粨鏉熷懡浠 + case 0x46: PLC_E_Expand(); break; //閫氳F鍔熻兘鎸囦护 + case 0x45: data_size=tx_data[5],PC_OPTION_PROG();break; //閫氳E鍔熻兘鎸囦护 default: break; } if((tx_count==0)&&(rx_count==0)) //return error code for 0x15 tx_data[1]=0x15,tx_count=1; - rx_count=0;Send_out=1; //报告上位机 + rx_count=0;Send_out=1; //鎶ュ憡涓婁綅鏈 } void usart(u32 DEFAULT_BAUD) { - USART_InitTypeDef USART_InitStructure; //串口配置寄存器 - USART_InitStructure.USART_BaudRate = DEFAULT_BAUD; //设置波特率 - USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据位 - USART_InitStructure.USART_StopBits = USART_StopBits_1; //一位停止位 - USART_InitStructure.USART_Parity = USART_Parity_Even; //校验位 + USART_InitTypeDef USART_InitStructure; //涓插彛閰嶇疆瀵勫瓨鍣 + USART_InitStructure.USART_BaudRate = DEFAULT_BAUD; //璁剧疆娉㈢壒鐜 + USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8浣嶆暟鎹綅 + USART_InitStructure.USART_StopBits = USART_StopBits_1; //涓浣嶅仠姝綅 + USART_InitStructure.USART_Parity = USART_Parity_Even; //鏍¢獙浣 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; - USART_Init(USART1,&USART_InitStructure); //初始化串口 + USART_Init(USART1,&USART_InitStructure); //鍒濆鍖栦覆鍙 } -//---------------------串口功能配置--------------------- +//---------------------涓插彛鍔熻兘閰嶇疆--------------------- void USART1_Configuration(void) { - DMA_InitTypeDef DMA_InitStructure; //DMA初始化结构体 - GPIO_InitTypeDef GPIO_InitStructure; //串口引脚配置寄存器 - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); //打开串口对应的外设时钟 - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //启动DMA时钟 - DMA_DeInit(DMA1_Channel4); //DMA1通道4配置 - DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);//外设地址 - DMA_InitStructure.DMA_MemoryBaseAddr = (u32)tx_data+1; //内存地址 - DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //dma传输方向单向 - DMA_InitStructure.DMA_BufferSize = PROGRAM_BUF_SIZE; //设置DMA在传输时缓冲区的长度 - DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的外设递增模式,一个外设 - DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式 - DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据字长 - DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//内存数据字长 - DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //设置DMA的传输模式 - DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA的优先级别 - DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //设置DMA的2个memory中的变量互相访问 + DMA_InitTypeDef DMA_InitStructure; //DMA鍒濆鍖栫粨鏋勪綋 + GPIO_InitTypeDef GPIO_InitStructure; //涓插彛寮曡剼閰嶇疆瀵勫瓨鍣 + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); //鎵撳紑涓插彛瀵瑰簲鐨勫璁炬椂閽 + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //鍚姩DMA鏃堕挓 + DMA_DeInit(DMA1_Channel4); //DMA1閫氶亾4閰嶇疆 + DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART1->DR);//澶栬鍦板潃 + DMA_InitStructure.DMA_MemoryBaseAddr = (u32)tx_data+1; //鍐呭瓨鍦板潃 + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //dma浼犺緭鏂瑰悜鍗曞悜 + DMA_InitStructure.DMA_BufferSize = PROGRAM_BUF_SIZE; //璁剧疆DMA鍦ㄤ紶杈撴椂缂撳啿鍖虹殑闀垮害 + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//璁剧疆DMA鐨勫璁鹃掑妯″紡锛屼竴涓璁 + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //璁剧疆DMA鐨勫唴瀛橀掑妯″紡 + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//澶栬鏁版嵁瀛楅暱 + DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//鍐呭瓨鏁版嵁瀛楅暱 + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //璁剧疆DMA鐨勪紶杈撴ā寮 + DMA_InitStructure.DMA_Priority = DMA_Priority_High; //璁剧疆DMA鐨勪紭鍏堢骇鍒 + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //璁剧疆DMA鐨2涓猰emory涓殑鍙橀噺浜掔浉璁块棶 DMA_Init(DMA1_Channel4,&DMA_InitStructure); DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); - usart(115200); //初始化参数 - //TXE发送中断,TC传输完成中断,RXNE接收中断,PE奇偶错误中断,可以是多个 + usart(115200); //鍒濆鍖栧弬鏁 + //TXE鍙戦佷腑鏂,TC浼犺緭瀹屾垚涓柇,RXNE鎺ユ敹涓柇,PE濂囧伓閿欒涓柇,鍙互鏄涓 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); - USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//采用DMA方式发送 - USART_Cmd(USART1, ENABLE); //启动串口 + USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//閲囩敤DMA鏂瑰紡鍙戦 + USART_Cmd(USART1, ENABLE); //鍚姩涓插彛 - //*********************串口1的管脚初始化 **************************************** - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //管脚9 - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //选择GPIO响应速度 - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 - GPIO_Init(GPIOA, &GPIO_InitStructure); //TX初始化 + //*********************涓插彛1鐨勭鑴氬垵濮嬪寲 **************************************** + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //绠¤剼9 + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //閫夋嫨GPIO鍝嶅簲閫熷害 + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //澶嶇敤鎺ㄦ尳杈撳嚭 + GPIO_Init(GPIOA, &GPIO_InitStructure); //TX鍒濆鍖 - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //管脚10 - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 - GPIO_Init(GPIOA, &GPIO_InitStructure); //RX初始化 + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //绠¤剼10 + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //娴┖杈撳叆 + GPIO_Init(GPIOA, &GPIO_InitStructure); //RX鍒濆鍖 } -void DMA1_Channel4_IRQHandler(void) //串口1DMA方式发送中断 +void DMA1_Channel4_IRQHandler(void) //涓插彛1DMA鏂瑰紡鍙戦佷腑鏂 { - DMA1->IFCR |= DMA1_FLAG_TC4; //清除标志位 - DMA1_Channel4->CCR &= 0xFFFE; //关闭DMA - Flag_Uart_Send = 1; //允许再次发送 + DMA1->IFCR |= DMA1_FLAG_TC4; //娓呴櫎鏍囧織浣 + DMA1_Channel4->CCR &= 0xFFFE; //鍏抽棴DMA + Flag_Uart_Send = 1; //鍏佽鍐嶆鍙戦 } -void TX_Process(void) // 发送串口数据 +void TX_Process(void) // 鍙戦佷覆鍙f暟鎹 { if(Flag_Uart_Send) { Send_out=Flag_Uart_Send = 0; - DMA1_Channel4->CNDTR = tx_count;// 设置传输数据长度 - DMA1_Channel4->CCR |= 0x0001; // 打开DMA + DMA1_Channel4->CNDTR = tx_count;// 璁剧疆浼犺緭鏁版嵁闀垮害 + DMA1_Channel4->CCR |= 0x0001; // 鎵撳紑DMA } } -void RX_Process(void) //接收串口数据 +void RX_Process(void) //鎺ユ敹涓插彛鏁版嵁 { static u8 sum,f=4; rx_data[0]=0x7f&USART1->DR; - if(rx_data[0]==0X05) //上位机提出通讯请求 + if(rx_data[0]==0X05) //涓婁綅鏈烘彁鍑洪氳璇锋眰 { rx_count=0; tx_data[1]=0x06; tx_count=1; - TX_Process(); //报告上位机并且返回0X06应答 + TX_Process(); //鎶ュ憡涓婁綅鏈哄苟涓旇繑鍥0X06搴旂瓟 - gCommLedFlashFlg =2; // 闪烁 + gCommLedFlashFlg =2; // 闂儊 } - else if(rx_data[0]==0X02) //报文开始 + else if(rx_data[0]==0X02) //鎶ユ枃寮濮 { rx_count=0x01; } @@ -1053,48 +1055,48 @@ void RX_Process(void) // if(f==4) { usart(115200); - rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//报告上位机并且返回0X06应答 + rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//鎶ュ憡涓婁綅鏈哄苟涓旇繑鍥0X06搴旂瓟 f=3; } else if(f==3) { usart(57600); - rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//报告上位机并且返回0X06应答 + rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//鎶ュ憡涓婁綅鏈哄苟涓旇繑鍥0X06搴旂瓟 f=2; } else if(f==2) { usart(38400); - rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//报告上位机并且返回0X06应答 + rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//鎶ュ憡涓婁綅鏈哄苟涓旇繑鍥0X06搴旂瓟 f=1; } else if(f==1) { usart(19200); - rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//报告上位机并且返回0X06应答 + rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//鎶ュ憡涓婁綅鏈哄苟涓旇繑鍥0X06搴旂瓟 f=0; } else if(f==0) { usart(9600); - rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//报告上位机并且返回0X06应答 + rx_count=0,tx_data[1]=0x06,tx_count=1,TX_Process();//鎶ュ憡涓婁綅鏈哄苟涓旇繑鍥0X06搴旂瓟 f=4; } } - if(rx_count>0) //确认报文开始 + if(rx_count>0) //纭鎶ユ枃寮濮 { rx_count++; rx_data[rx_count]=rx_data[0]; - if(rx_count > PROGRAM_BUF_SIZE) //读取数据误差大于610 + if(rx_count > PROGRAM_BUF_SIZE) //璇诲彇鏁版嵁璇樊澶т簬610 { tx_count=0; rx_count=0; } - if((rx_count>3)&&(rx_data[rx_count-2]==0x03)) //数据是否传送结束 + if((rx_count>3)&&(rx_data[rx_count-2]==0x03)) //鏁版嵁鏄惁浼犻佺粨鏉 { sum = CheckSum(rx_data); - if((rx_data[rx_count-1] == Ascll[sum/0x10])&&(rx_data[rx_count] == Ascll[sum%0x10]))// 计算数据和状态 数据是否正常 + if((rx_data[rx_count-1] == Ascll[sum/0x10])&&(rx_data[rx_count] == Ascll[sum%0x10]))// 璁$畻鏁版嵁鍜岀姸鎬 鏁版嵁鏄惁姝e父 { Process_switch(); } @@ -1102,33 +1104,33 @@ void RX_Process(void) // { tx_data[1]=0x15; tx_count=1; - TX_Process(); //报告上位机并且回答数据异常返值0X15 + TX_Process(); //鎶ュ憡涓婁綅鏈哄苟涓斿洖绛旀暟鎹紓甯歌繑鍊0X15 } - gCommLedFlashFlg =2; // 闪烁 + gCommLedFlashFlg =2; // 闂儊 } } } -void USART1_IRQHandler(void) //中断调用 +void USART1_IRQHandler(void) //涓柇璋冪敤 { - if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET) //接收中断 + if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET) //鎺ユ敹涓柇 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); RX_Process(); } - //溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题 + //婧㈠嚭-濡傛灉鍙戠敓婧㈠嚭闇瑕佸厛璇籗R,鍐嶈DR瀵勫瓨鍣ㄥ垯鍙竻闄や笉鏂叆涓柇鐨勯棶棰 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET) { - USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR其实就是清除标志 - USART_ReceiveData(USART1); //读DR + USART_ClearFlag(USART1,USART_FLAG_ORE); //璇籗R鍏跺疄灏辨槸娓呴櫎鏍囧織 + USART_ReceiveData(USART1); //璇籇R } if(USART_GetITStatus(USART1, USART_IT_TXE)==SET) { USART_ClearITPendingBit(USART1,USART_IT_TXE); USART_ITConfig(USART1,USART_IT_TXE,DISABLE); } - if(USART_GetITStatus(USART1, USART_IT_TC)==SET) //发送中断 + if(USART_GetITStatus(USART1, USART_IT_TC)==SET) //鍙戦佷腑鏂 { USART_ClearITPendingBit(USART1,USART_IT_TC); }