You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

94 lines
2.5 KiB

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