simotion读写CF卡,保存/读取变量
simotion读写CF卡功能
1
使用西门子的Simotion运动控制器时,有时需要用到 读/写 CF卡的功能。主要来自以下几个方面的需求。
1)用户数据量较大,可保持(retain)存储区的容量不够(D435-2 为 384K),需要将数据写入CF卡。
2)在极其罕见的情况下,例如在启动过程中出现断电,可保持(retain)存储区的数据可能丢失。用户希望在CF卡中对数据进行备份
2
为了方便实现以上需求,在标准库的基础上,编写了两个FB块。
FB_VariablesStorageHandling
保存和读取单个unit中的变量的FB_SaveRestoreMultiUnit
保存和读取多个unit中的变量
上述两个FB块中使用了系统函数_exportUnitDataSet
和_importUnitDataSet
什么是unit?
unit是simotion中的一个编程单元。
一个unit中可以通过var_global定义多组全局变量。一个unit中,也可以定义和实现多个程序、FB、FB。
3
保存后的文件,路径在CF卡的 /USER/SIMOTION/USER_DIR/UPP/UNITDS
4
FB_VariablesStorageHandling的接口描述
name | type | data type | function |
---|---|---|---|
boEnable | in | bool | 激活程序 |
in_boResetError | in | bool | 复位故障和内部变量 |
in_String_UnitName | in | string | unit名称 |
in_KindofData | in | EnumDeviceKindOfData | 数据类型 |
in_out_boSavetoCFCard | in_out | bool | 命令,保存数据到CF卡 |
in_out_boReadFromCFCard | in_out | bool | 命令,从CF卡读取数据 |
out_boSaveOK | out | bool | 保存完成 |
out_boReadOK | out | bool | 读取完成 |
out_boSaveFail | out | bool | 保存失败 |
out_boReadFail | out | bool | 读取失败 |
out_boUnitNotExist | out | bool | unit不存在 |
枚举类型EnumDeviceKindOfData
- NO_RETAIN_GLOBAL unit中的非可保持变量
- _RETAIN unit中的可保持变量
- ALL_GLOBAL unit中的所有全局变量
FB_SaveRestoreMultiUnit的接口描述
name | type | data type | function |
---|---|---|---|
In_unitName xx | in | string | unit名称 |
In_saveDat | in | bool | 命令,保存数据到CF卡 |
In_readData | in | bool | 命令,从CF卡读取数据 |
In_reset | in | bool | 复位程序内部状态和故障 |
save_OK | in_out | bool | 保存完成 |
save_Fail | in_out | bool | 保存失败 |
read_OK | in_out | bool | 读取完成 |
read_Fail | in_out | bool | 读取失败 |
5
如果你需要使用此程序,可以使用以下代码
INTERFACE
FUNCTION_BLOCK FB_VariablesStorageHandling;
FUNCTION_BLOCK FB_SaveRestoreMultiUnit;
END_INTERFACE
IMPLEMENTATION
FUNCTION_BLOCK FB_VariablesStorageHandling
//--------------------------------------------------------------------------
// Siemens SFAE / Beijing, China
//--------------------------------------------------------------------------
//functionality: 1)Write an unit data to CF card, memory -> CF card
// 2)Read unit data from CF card, CF card -> memory
//assignment: background
//dependence: none
//--------------------------------------------------------------------------
//change log table:
//version date expert in charge changes applied
//01.00.00 2016 xxxx Created
//==========================================================================
VAR_INPUT
boEnable :BOOL;
in_boResetError :BOOL;
in_String_UnitName :STRING;
in_KindofData :EnumDeviceKindOfData;
END_VAR
VAR_IN_OUT
in_out_boSavetoCFCard :BOOL;
in_out_boReadFromCFCard :BOOL;
END_VAR
VAR_OUTPUT
boBusy : BOOL;
boError : BOOL;
ErrorID : UINT;
out_boSaveOK : BOOL;
out_boReadOK : BOOL;
out_boSaveFail : BOOL;
out_boReadFail : BOOL;
out_boUnitNotExist : BOOL;
END_VAR
VAR
i16SaveReadStep : INT;
old_boSavetoCFCard : BOOL;
old_boReadFromCFCard : BOOL;
myRetStructRetUnitDataSetCommand :StructRetUnitDataSetCommand;
myRetEnumDeviceUnitDataSetCommand :EnumDeviceUnitDataSetCommand;
END_VAR
IF boEnable=TRUE THEN
boBusy := TRUE;
//Error Reset
IF in_boResetError THEN
out_boSaveOK := FALSE;
out_boReadOK := FALSE;
out_boSaveFail := FALSE;
out_boReadFail := FALSE;
boError:=FALSE;
ErrorID:=0;
in_out_boSavetoCFCard := FALSE;
in_out_boReadFromCFCard := FALSE;
i16SaveReadStep := 0;
END_IF;
//save to CF Card
IF in_out_boSavetoCFCard=TRUE
AND old_boSavetoCFCard<>in_out_boSavetoCFCard THEN
i16SaveReadStep := 10;
out_boSaveOK := FALSE;
out_boSaveFail := FALSE;
END_IF;
old_boSavetoCFCard := in_out_boSavetoCFCard;
//Read From CF Card
IF in_out_boReadFromCFCard=TRUE
AND old_boReadFromCFCard<>in_out_boReadFromCFCard THEN
i16SaveReadStep := 100;
out_boReadOK := FALSE;
out_boReadFail := FALSE;
out_boUnitNotExist := FALSE;
END_IF;
old_boReadFromCFCard := in_out_boReadFromCFCard;
CASE i16SaveReadStep OF
10://Save Unite Dataset to CF card
myRetStructRetUnitDataSetCommand := _exportUnitDataSet(
unitName := in_String_UnitName
,id :=1
,storageType :=PERMANENT_STORAGE
// ,path := ''
,overwrite := TRUE
,nextCommand := IMMEDIATELY
,dataScope := _INTERFACE
,kindOfData := in_KindofData
);
i16SaveReadStep:=20;
20://wait for save finish
myRetEnumDeviceUnitDataSetCommand :=
_getStateOfUnitDataSetCommand(handle :=myRetStructRetUnitDataSetCommand.handle);
IF myRetEnumDeviceUnitDataSetCommand<>done AND myRetEnumDeviceUnitDataSetCommand<>active THEN
i16SaveReadStep:=190;//Error
out_boSaveFail := TRUE;
ELSIF myRetEnumDeviceUnitDataSetCommand=done THEN
out_boSaveOK := TRUE;
i16SaveReadStep:=200;
END_IF;
100://Check Unit Dataset exist or not
myRetStructRetUnitDataSetCommand := _checkExistingUnitDataSet(
unitName :=in_String_UnitName
,id :=1
,storageType :=PERMANENT_STORAGE
// ,path := ''
,nextCommand := IMMEDIATELY
);
i16SaveReadStep:=110;
110://wait for check finish
myRetEnumDeviceUnitDataSetCommand :=
_getStateOfUnitDataSetCommand(handle :=myRetStructRetUnitDataSetCommand.handle);
IF myRetEnumDeviceUnitDataSetCommand<>done AND myRetEnumDeviceUnitDataSetCommand<>active THEN
out_boUnitNotExist := TRUE;
i16SaveReadStep:=190;//Error
out_boReadFail := TRUE;
ELSIF myRetEnumDeviceUnitDataSetCommand=done THEN
i16SaveReadStep:=120;
END_IF;
120://Read Unit Dataset from CF card
myRetStructRetUnitDataSetCommand := _importUnitDataSet( //_loadUnitDataSet(
unitName :=in_String_UnitName
,id :=1
,storageType :=PERMANENT_STORAGE
// ,path := ''
,nextCommand := IMMEDIATELY
,dataScope := _INTERFACE
,kindOfData := in_KindofData
);
i16SaveReadStep:=130;
130://Read finish
myRetEnumDeviceUnitDataSetCommand :=
_getStateOfUnitDataSetCommand(handle :=myRetStructRetUnitDataSetCommand.handle);
IF myRetEnumDeviceUnitDataSetCommand<>done AND myRetEnumDeviceUnitDataSetCommand<>active THEN
i16SaveReadStep:=190;
out_boReadFail := TRUE;
ELSIF myRetEnumDeviceUnitDataSetCommand=done THEN
out_boReadOK := TRUE;
i16SaveReadStep:=200;
END_IF;
190://Save or Read Error
boError := TRUE;
200://Check Finish
in_out_boSavetoCFCard := FALSE;
in_out_boReadFromCFCard := FALSE;
END_CASE;
ELSE
boBusy :=FALSE;
END_IF;
END_FUNCTION_BLOCK
FUNCTION_BLOCK FB_SaveRestoreMultiUnit
//--------------------------------------------------------------------------
// Siemens SFAE / Beijing, China
//--------------------------------------------------------------------------
//functionality: 1)Write several unit data to CF card, memory -> CF card
// 2)Read several unit data from CF card, CF card -> memory
//assignment: background
//dependence: "FB_VariablesStorageHandling"
//--------------------------------------------------------------------------
//change log table:
//version date expert in charge changes applied
//01.00.00 17-11-2017 Zhenglei Created
//
//==========================================================================
VAR_INPUT
In_unitName1 :STRING := 'empty';
In_unitName2 :STRING := 'empty';
In_unitName3 :STRING := 'empty';
In_unitName4 :STRING := 'empty';
In_unitName5 :STRING := 'empty';
In_unitName6 :STRING := 'empty';
In_unitName7 :STRING := 'empty';
In_unitName8 :STRING := 'empty';
In_saveData :BOOL;
In_readData :BOOL;
In_reset : BOOL;
END_VAR
VAR_IN_OUT
save_OK :BOOL;
save_Fail :BOOL;
read_OK :BOOL;
read_Fail :BOOL;
END_VAR
VAR
unitName : ARRAY[1..8] OF STRING;
bo_saving,bo_reading : BOOL;
rtrig_save,rtrig_read : R_TRIG;
bo_SavetoCFCard : ARRAY[1..8] OF BOOL;
bo_ReadFromCFCard : ARRAY[1..8] OF BOOL;
SavetoCFCard_OK : ARRAY[1..8] OF BOOL;
ReadFromCFCard_OK : ARRAY[1..8] OF BOOL;
SavetoCFCard_Fail : ARRAY[1..8] OF BOOL;
ReadFromCFCard_Fail : ARRAY[1..8] OF BOOL;
UnitNotExist : ARRAY[1..8] OF BOOL;
i,J,K : INT;
inst_FB_VariablesStorage :ARRAY[1..8] OF FB_VariablesStorageHandling;
END_VAR
unitName[1]:= In_unitName1; unitName[2]:= In_unitName2;
unitName[3]:= In_unitName3; unitName[4]:= In_unitName4;
unitName[5]:= In_unitName5; unitName[6]:= In_unitName6;
unitName[7]:= In_unitName7; unitName[8]:= In_unitName8;
rtrig_save(In_saveData);
rtrig_read(In_readData);
IF rtrig_save.q AND unitName[1] <> 'empty' THEN
bo_saving:= TRUE; J:=1;
END_IF;
IF rtrig_read.q AND NOT bo_saving THEN
bo_reading := TRUE; K:=1;
END_IF;
//cyclic operation
FOR i:= 1 TO 8 DO
inst_FB_VariablesStorage[i](
boEnable := TRUE
,in_boResetError := in_reset
,in_String_UnitName := unitName[i]
,in_KindofData := _RETAIN
,in_out_boSavetoCFCard := bo_SavetoCFCard[i]
,in_out_boReadFromCFCard := bo_ReadFromCFCard[i]
,out_boSaveOK => SavetoCFCard_OK[i]
,out_boReadOK => ReadFromCFCard_OK[i]
,out_boSaveFail => SavetoCFCard_Fail[i]
,out_boReadFail => ReadFromCFCard_Fail[i]
,out_boUnitNotExist => UnitNotExist[i]
);
IF rtrig_save.q OR rtrig_read.q THEN
//reset commands
bo_SavetoCFCard[i] := FALSE;
bo_ReadFromCFCard[i] := FALSE;
//reset status
SavetoCFCard_OK[i] := FALSE;
ReadFromCFCard_OK[i] := FALSE;
SavetoCFCard_Fail[i] := FALSE;
ReadFromCFCard_Fail[i] := FALSE;
UnitNotExist[i] := FALSE;
END_IF;
END_FOR;
//write several unit data to CF card
IF bo_saving THEN
bo_SavetoCFCard[J] := TRUE;
IF J < 8 AND J > 0 THEN//not last "unit"
IF SavetoCFCard_OK[J] AND unitName[J + 1] <> 'empty' THEN
J := J + 1;//next "unit"
ELSIF SavetoCFCard_OK[J] AND unitName[J + 1] = 'empty' THEN
//finish
Save_OK := TRUE;save_Fail:= FALSE;
bo_saving := FALSE;
END_IF;
IF SavetoCFCard_Fail[J] OR UnitNotExist[J] THEN
//error
Save_OK := FALSE; save_Fail:= TRUE;
bo_saving := FALSE;
END_IF;
ELSIF J = 8 THEN //last "unit"
IF SavetoCFCard_OK[J] THEN
//finish
Save_OK := TRUE;save_Fail:= FALSE;
bo_saving := FALSE;
END_IF;
IF SavetoCFCard_Fail[J] OR UnitNotExist[J] THEN
//error
Save_OK := FALSE; save_Fail:= TRUE;
bo_saving := FALSE;
END_IF;
END_IF;
END_IF;
//read data from CF card to Memory
IF bo_reading THEN
bo_ReadFromCFCard[K] := TRUE;
IF J < 8 AND J > 0 THEN//not last "unit"
IF ReadFromCFCard_OK[K] AND unitName[K + 1] <> 'empty' THEN
K := K + 1;//next "unit"
ELSIF ReadFromCFCard_OK[K] AND unitName[K + 1] = 'empty' THEN
//finish
read_OK := TRUE;read_Fail:= FALSE;
bo_reading := FALSE;
END_IF;
IF ReadFromCFCard_Fail[K] THEN
//error
read_OK := FALSE; read_Fail:= TRUE;
bo_reading := FALSE;
END_IF;
ELSIF J = 8 THEN //last "unit"
IF ReadFromCFCard_OK[K] THEN
//finish
read_OK := TRUE;read_Fail:= FALSE;
bo_reading := FALSE;
END_IF;
IF ReadFromCFCard_Fail[K] THEN
//error
read_OK := FALSE; read_Fail:= TRUE;
bo_reading := FALSE;
END_IF;
END_IF;
END_IF;
END_FUNCTION_BLOCK
END_IMPLEMENTATION
simotion读写CF卡,保存/读取变量的更多相关文章
- CF卡技术详解——笔记
知识太全面了,摘抄摘不完,还是粘过来加上注释和笔记吧. 重点以及断句用加粗,注释用红括号. 一.CF卡技术及规格 一.CF卡技术及规格 1.CF卡简史 随着数码产品的高速普及,近年来闪存卡也进入了高速 ...
- Simotion CF卡 固件下载地址及制作方法
SIMOTION D - Firmware (Kernel) 固件下载地址 支持中心ID:31045047 https://support.industry.siemens.com/cs/docume ...
- android学习笔记47——读写SD卡上的文件
读写SD卡上的文件 通过Context的openFileInput.openFileOutput来打开文件输入流.输出流时,程序打开的都是应用程序的数据文件夹里的文件,其存储的文件大小可能都比较有限- ...
- norflash移植及uboot 保存环境变量实验
一.实验环境 实验板:TQ2440开发板 SDRAM:64M norflash:EN29LV160AB(2M) nandflash:(256M) 二.移植 本文不详谈从smdk2410移植到TQ244 ...
- 工业CF卡与商业CF卡对比
工业CF卡:1.SLC FLASH芯片 .每个区块读写次数为10万次 2.可分区 识别为本地磁盘 3.平均写入技术.ECC自动校验技术 4.完全模拟硬盘引导系统开机,支持长期稳定工作 商业CF卡:1. ...
- CF卡是什么
CF卡(Compact Flash)最初是一种用于便携式电子设备的数据存储设备.作为一种存储设备,它革命性的使用了闪存,于1994年首次由SanDisk公司生产并制定了相关规范.当前,它的物理格式已经 ...
- H3C查看CF卡内的文件
查看CF卡内的文件 <H3C>dir //查看文件及目录文件 Directory of cf:/ -------------查看的是CF卡的内容 0 ...
- Matlab的简单数据保存读取
1.使用load进行文件读取 例如读入文件名为'filename.txt'中的数据,那么可以使用以下代码: load('filename.txt') 注意:filename.txt中的数据应符合矩阵形 ...
- postman使用之四:切换环境和设置读取变量
postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...
随机推荐
- POJ2686 Traveling by Stagecoach(状压DP)
题意: 有一个旅行家计划乘马车旅行.他所在的国家里共有m个城市,在城市之间有若干道路相连.从某个城市沿着某条道路到相邻的城市需要乘坐马车.而乘坐马车需要使用车票,每用一张车票只可以通过一条道路.每张车 ...
- 对bootstrap模态框的小尝试
bootstrap中有一个“模态框”插件,我理解的意思就是一个具有全局遮罩的弹窗提示,官方解释是:模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗 ...
- HIVE分析函数
ROWS BETWEEN含义,也叫做WINDOW子句: PRECEDING:往前 FOLLOWING:往后 CURRENT ROW:当前行 UNBOUNDED:起点,UNBOUNDED PRECEDI ...
- LBS开发
功能:用户发送自动的位置,返回周围的厕所信息 思路:根据用户的经纬度信息,调用百度地图的api,查询周围的厕所位置并且返回! 步骤:进入百度地图官网注册账号,选择web api接入 我们先看开发者文档 ...
- java——最大堆 MaxHeap
使用数组来实现最大堆 堆是平衡二叉树 import Date_pacage.Array; public class MaxHeap<E extends Comparable <E>& ...
- java——抽象类、接口、二者区别
抽象类: 抽象方法:不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰: abstract void method(); 抽象类:当一个类中包含了抽象方法时,该类必须使用abs ...
- Markdown emoji
由于网页解析原因,部分符号无法正常显示 People emoji code emoji code :bowtie: :bowtie:
- Win2003 控制面板 打不开
windown 2003 控制面板打不开 在运行框中输入regedit,进入注册表中的 HKEY_LOCAL_MACHINE/SYSTEM\Current ControlSet\Control\NLS ...
- Barty's Computer 字典树
https://nanti.jisuanke.com/t/17122 Barty have a computer, it can do these two things. Add a new stri ...
- [转]理解js中的原型链,prototype与__proto__的关系
本文转自:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script typ ...