FUNCTION_BLOCK BS_SavePower VAR_EXTERNAL END_VAR VAR_INPUT Input_Type :byte; (*1周期,2变化,0手动 *) Read_Iso :bool; (*系统读取隔离开关 *) Set_Timer :time; (*周期、变化判断周期时间设定*) Judge_Num :int; (*变化判断变量*) Mem_Addr :word; (*M区保存起始地址*) Flash_Addr :word; (*闪存区保存起始地址*) Save_Len :word; (*保存地址长度*) WriteNumRec_In :int; (*写入次数累计*) END_VAR VAR_OUTPUT Write_Flag :bool; (*系统闪存写入成功标记*) Read_Flag :bool; (*系统闪存读取成功标记*) Write_Num :int; (*写入次数累计*) END_VAR VAR BS_FlashRead : NW_FlashRead; BS_FlashWrite : NW_FlashWrite; SYS_FlashWrite :bool; SYS_FlashRead :bool; (*系统闪存读取使能开关,无需动作,自动循环读取*) Judge_Num_M :int; (*变化判断变量-中间变量*) ton1 :ton; ton1_in :bool; ini :bool; Write_Num_ini :int; (*写入次数累计初始值*) Write_Numm :int; (*写入次数累计*) END_VAR (* 时 间:20220210 版 本:1.0 作 者:潘平 名 称:断电保存数据 说 明:根据使用需求进行数据写入,可选周期,变化,手动 备 注:外部需要声明SYS_FlashWrite,用以使用手动写入模式 依赖块: NW_FlashRead NW_FlashWrite *) (*初始化将断电前数据写入累计值*) if ini=0 then Write_Num_ini:=WriteNumRec_In; ini:=1; end_if; (* 写入判断 1周期,2变化,0手动*) case Input_Type of 1: ton1_in := not ton1.q; ton1( IN :=ton1_in ,PT :=Set_Timer ); if ton1.q=1 then SYS_FlashWrite:=1 ; end_if; 2: ton1_in := not ton1.q; ton1( IN :=ton1_in ,PT :=Set_Timer ); if ton1.q=1 then if Judge_Num_M<>Judge_Num then SYS_FlashWrite:=1 ; Judge_Num_M:=Judge_Num; end_if; end_if; end_case; (* 系统闪存数据读取 *) if not SYS_FlashRead and Read_Iso=0 then Read_Flag:=0; BS_FlashRead(EN:=1,W_MEM_ADDR:=MEM_ADDR,W_FLASH_ADDR:=FLASH_ADDR,W_LEN:=SAVE_LEN | Read_Flag:= ENO); if Read_Flag=1 then (*读成功标记*) SYS_FlashRead:=1; (*读成功后停止读取*) end_if; end_if; (* 系统闪存数据写入 *) if SYS_FlashWrite then Write_Flag:=0; Write_Numm:=1+Write_Numm ; Write_Num:=Write_Numm+Write_Num_ini ; BS_FlashWrite(EN:=1,W_MEM_ADDR:=MEM_ADDR,W_FLASH_ADDR:=FLASH_ADDR,W_LEN:=SAVE_LEN | Write_flag:= ENO); SYS_FlashWrite:=0; end_if; END_FUNCTION_BLOCK