tag

1. Arclist 标记】
  这个标记是DedeCms最常用的一个标记,也叫自由列表标记,其中 hotart、coolart、likeart、artlist、imglist、imginfolist、specart、autolist 这些标记都是由这个标记所定义的不同属性延伸出来的别名标记。
功能说明:获取指定的文档列表
适用范围:封面模板、列表模板、文档模板
基本语法:
{dede:arclist typeid='' row='' col='' titlelen='' infolen=''
imgwidth='' imgheight='' listtype='' orderby='' keyword=''}
底层模板(InnerText)
{/dede:arclist}


属性说明:
[1] typeid='' 表示栏目ID,在列表模板和档案模板中一般不需要指定,在封面模板中允许用","分开表示多个栏目;
[2] row='' 表示返回文档列表总数;
[3] col='' 表示分多少列显示(默认为单列);
[4] titlelen='' 表示标题长度;
[5] infolen='' 表示内容简介长度;
[6] imgwidth='' 表示缩略图宽度;
[7] imgheight='' 表示缩略图高度;
[8] type='' 表示档案类型,其中空值、不使用这个属性或type='all'时为普通文档
§ type='commend'时,表示推荐文档,等同于 {dede:coolart}{/dede:coolart}
§ type='image'时,表示必须含有缩略图片的文档,等同于{dede:imglist}{/dede:imglist}、{dede:imginfolist}{/dede:imginfolist}
§ type='spec'时,表示专题,等同于标记{dede:specart}{/dede:specart}
以上属性值可以联合使用,如: type='commend image' 表示推荐的图片文档
[9] orderby='' 表示排序方式,默认值是 senddate 按发布时间排列。
§ orderby='hot' 或 orderby='click' 表示按点击数排列
§ orderby='pubdate' 按出版时间排列(即是前台允许更改的时间值)
§ orderby='sortrank' 按文章的新排序级别排序(如果你想使用置顶文章则使用这个属性)
§ orderby='id' 按文章ID排序
§ orderby='postnum' 按文章评论次数排序
§ orderby='rand' 随机获得指定条件的文档列表
[10] orderway='' 值为 desc 或 asc ,指定排序方式是降序还是顺向排序,默认为降序。
[11] keyword='' 表示含有指定关键字的文档列表,多个关键字用","分开
[12] channelid='' 表示特定的频道模型ID,内置的频道:专题(-1)、文章(1)、图集(2)、Flash(4)、软件(3)
[13] limit='起始,结束' 表示限定的记录范围,row属性必须等于"结束 - 起始",mysql的limit语句是由0起始的,如 “limit 0,5”表示的是取前五笔记录,“limit 5,5”表示由第五笔记录起,取下五笔记录,使用了本属性后,row属性将无效。
[14] att='数值' 表示自定义属性值
[15] subday='天数' 表示在多少天以内的文档,通常用于获取指定天数的热门文档、推荐文档、热门评论文档等
[16] partsort='排列位数' 表示自动获得父栏目的所有子数中排列在第几位的栏目ID,标记为 {dede:autolist}{/dede:autolist} 时,使用本属性才有效。
底层模板字段:
ID(同 id),title,iscommend,color,typeid,ismake,description(同 info),writer,shorttitle,memberid
pubdate,senddate,arcrank,click,litpic(同 picname),typedir,typename,
arcurl(同 filename),typeurl,stime(pubdate 的"0000-00-00"格式),
textlink,typelink,imglink,image
其中:
textlink = <a href='arcurl'>title</a>
typelink = <a href='typeurl'>typename</a>
imglink = <a href='arcurl'><img src='picname' border='0' width='imgwidth' height='imgheight'></a>
image = <img src='picname' border='0' width='imgwidth' height='imgheight'>
[b]字段调用方法:[field:varname/][/b]如:
{dede:arclist infolen='100'}
[field:textlink/]
<br>
[field:info/]
<br>
{/dede:arclist}
注:底层模板里的Field实现也是织梦标记的一种形式,因此支持使用PHP语法,Function扩展等功能
如: 给当天发布的内容加上 (new) 标志
[field:senddate runphp='yes']
$ntime = time();
$oneday = 3600 * 24;
if(($ntime - @me)<$oneday) @me = "<font color='red'>(new)</font>";
else @me = "";
[/field:senddate]

2. Field 标记】

功能说明:用于获取特定栏目或档桉的字段值及常用的环境变量值
适用范围:封面模板、列表模板、文档模板
(1)基本语法
[size=large]{dede:field name='字段名'/}[/size](2) 系统分配的field
板块模板:phpurl,indexurl,indexname,templeturl,memberurl,powerby,webname,specurl
列表模板:position,title,phpurl,templeturl,memberurl,powerby,indexurl,indexname,specurl,栏目表dede_arctype的所有字段
其中 position 为 “栏目一 > 栏目二” 这样形式的链接,title则为这种形式的标题
文档模板:position,phpurl,templeturl,memberurl,powerby,indexurl,indexname,specurl,id(同 ID,aid)
(3) 文档所有内容字段
档案dede_archives表 和 附加表的所有字段。


3 .【Sql 标记】

功能说明:用于从模板中用一个SQL查询获得其返回内容。
适用范围:非扩展模块所有模板。
(1)语法:{dede:sql sql=""}底层模板{/dede:sql}
(2)属性:
[1] sql 完整的SQL查询语句。
(3)底层模板:
SQL语句中查出的所有字段都可以用[field:字段名/]来调用。
Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) Dim tag10,tag11,tag12,tag13,tag14,tag15,tag16,tag17,tag18,tag19 Dim tag1,tag2,tag3,tag4,tag5,tag9,PreTemp,PreTemp2,PreTemp3,RT,PreTemp4,PreTemp5,PreTemp6 Dim tag20,tag21,tag22,tag23,tag24,tag25,tag26,tag27,tag28,tag29 Dim tag30,tag31,tag32,tag33,tag34,tag35,tag36,tag37,tag38,tag39 Set tag20 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-1功率偏移")'入口CV_編輯_DB_加熱區_CA1-1功率偏移 Set tag21 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-2功率偏移") Set tag22 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-3功率偏移") Set tag23 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-4功率偏移") Set tag24 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-5功率偏移") Set tag25 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-6功率偏移") Set tag26 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-7功率偏移") Set tag27 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-8功率偏移") Set tag28 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-9功率偏移") Set tag29 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-10功率偏移") Set tag10 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_1") Set tag11 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_2") Set tag12 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_3") Set tag13 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_4") Set tag14 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_5") Set tag15 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_6") Set tag16 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_7") Set tag17 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_8") Set tag18 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_9") Set tag19 = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_10") Set tag9 = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_STEP5上功率") Set tag30 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_1") 'rcp_HOT_PowerSet_Up_1_1 Set tag31 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_2") Set tag32 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_3") Set tag33 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_4") Set tag34 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_5") Set tag35 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_6") Set tag36 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_7") Set tag37 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_8") Set tag38 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_9") Set tag39 = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_10") Set tag1 = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_NDS_1") Set tag2 = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_AM_Z1") Set tag4 = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_SEC1") Set tag5 = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_DS_1") tag30.Read tag31.Read tag32.Read tag33.Read tag34.Read tag35.Read tag36.Read tag37.Read tag38.Read tag39.Read tag1.Read '上變 tag2.Read '手,自 tag4.Read '基本值 tag5.Read '下變 tag9.Read If tag2.Value = 1 Then PreTemp=CDbl((1-tag1.Value) * 0.67) PreTemp2=CDbl((1-tag1.Value)* 0.33) PreTemp4=CDbl((1-tag5.Value) * 0.67) PreTemp5=CDbl((1-tag5.Value)* 0.33) tag2.Value=0 tag10.Value = CDbl(tag4.Value * tag1.Value) * CDbl(tag9.Value) tag11.Value = CDbl(tag4.Value * (1-PreTemp) * CDbl(tag9.Value)) tag12.Value = CDbl(tag4.Value * (1-PreTemp2) * (CDbl(tag9.Value))) tag13.Value = CDbl(tag4.Value * CDbl(tag9.Value)) tag14.Value = CDbl(tag4.Value * CDbl(tag9.Value)) tag15.Value = CDbl(tag4.Value * (1-PreTemp5) * (CDbl(tag9.Value))) tag16.Value = CDbl(tag4.Value * (1-PreTemp4)) * (CDbl(tag9.Value)) tag17.Value = CDbl(tag4.Value * tag5.Value) * (CDbl(tag9.Value)) tag20.Value = (tag4.Value * tag1.Value) * 100 tag21.Value = (tag4.Value)* (1-PreTemp) * 100 tag22.Value = (tag4.Value)*(1-PreTemp2) * 100 tag23.Value = (tag4.Value * 100) tag24.Value = (tag4.Value * 100) tag25.Value = (tag4.Value)*(1-PreTemp5) * 100 tag26.Value = (tag4.Value * (1-PreTemp4) * 100) tag27.Value = ((tag4.Value * tag5.Value) * 100) ' tag28.Value = (tag4.Value * (1-PreTemp4) * 100) ' tag29.Value = ((tag4.Value * tag5.Value) * 100) Else tag2.Value=1 tag10.Value = CInt(tag4.Value * tag30.Value * CDbl(tag9.Value)) tag11.Value = CInt(tag4.Value * tag31.Value * CDbl(tag9.Value)) tag12.Value = CInt(tag4.Value * tag32.Value * CDbl(tag9.Value)) tag13.Value = CInt(tag4.Value * tag33.Value * CDbl(tag9.Value)) tag14.Value = CInt(tag4.Value * tag34.Value * CDbl(tag9.Value)) tag15.Value = CInt(tag4.Value * tag35.Value * CDbl(tag9.Value)) tag16.Value = CInt(tag4.Value * tag36.Value * CDbl(tag9.Value)) tag17.Value = CInt(tag4.Value * tag37.Value * CDbl(tag9.Value)) ' tag18.Value = CInt(tag4.Value * tag38.Value * CDbl(tag9.Value)) ' tag19.Value = CInt(tag4.Value * tag39.Value * CDbl(tag9.Value)) ' tag20.Value = CDbl(tag4.Value * tag30.Value ) * 100 tag21.Value = CDbl(tag4.Value * tag31.Value ) * 100 tag22.Value = CDbl(tag4.Value * tag32.Value ) * 100 tag23.Value = CDbl(tag4.Value * tag33.Value ) * 100 tag24.Value = CDbl(tag4.Value * tag34.Value ) * 100 tag25.Value = CDbl(tag4.Value * tag35.Value ) * 100 tag26.Value = CDbl(tag4.Value * tag36.Value ) * 100 tag27.Value = CDbl(tag4.Value * tag37.Value ) * 100 ' tag28.Value = CDbl(tag4.Value * tag38.Value ) * 100 ' tag29.Value = CDbl(tag4.Value * tag39.Value ) * 100 End If tag2.Write tag10.Write tag11.Write tag12.Write tag13.Write tag14.Write tag15.Write tag16.Write tag17.Write ' tag18.Write ' tag19.Write tag20.Write tag21.Write tag22.Write tag23.Write tag24.Write tag25.Write tag26.Write tag27.Write ' tag28.Write ' tag29.Write End Sub
10-11
<think>我们分析的代码是VBScript,用于西门子WinCC的脚本。这段脚本是处理鼠标左键按下事件(OnLButtonDown)的,主要功能是根据条件计算一组标签(Tags)的值并写入。 代码结构: 1. 声明变量:主要是Dim语句声明了一系列变量,这些变量用于存储标签对象和中间计算结果。 2. 使用Set语句将变量与WinCC中的标签(Tags)关联起来。这些标签代表了过程值或参数。 3. 读取一些标签的值(使用.Read方法)。 4. 根据条件(tag2.Value的值)进行不同的计算,并设置其他标签的值。 5. 最后将计算得到的值写入标签(使用.Write方法)。 具体逻辑: 条件判断依赖于tag2.Value(代表某个状态,可能是手动/自动模式): - 如果tag2.Value为1(手动模式?),则进入If块,计算一组值,并将tag2.Value设置为0(切换到自动模式?),然后计算tag10到tag17以及tag20到tag27的值。 - 否则(即tag2.Value不为1,可能是自动模式),进入Else块,将tag2.Value设置为1(切换到手动模式?),然后根据另一组标签(tag30到tag37)计算tag10到tag17以及tag20到tag27的值。 注意:在Else块中,tag18和tag19以及tag28和tag29的计算被注释掉了,所以当前不处理这些标签。 问题点: 1. 代码中使用了较多的硬编码,可读性和可维护性较差。 2. 存在一些未使用的变量(如tag3, tag6, tag7, tag8等,但声明了,不过没有使用)。 3. 计算逻辑中,If块和Else块中分别使用不同的公式,但都依赖于tag4.Value(基本值)和tag9.Value(一个系数)。 4. 在If块中,使用PreTemp, PreTemp2, PreTemp4, PreTemp5等中间变量,这些变量由tag1.Value和tag5.Value计算得到。 改进建议: 1. 使用数组和循环来减少重复代码,这样可以使代码更简洁、更易于维护。 2. 删除未使用的变量。 3. 添加注释,说明每个标签的作用和计算逻辑的含义。 但是,由于WinCC VBScript的限制,我们可能不能使用动态数组或一些高级特性,但我们可以使用数组来存储标签引用,然后通过循环来操作。 下面我们将尝试重构代码,使用数组和循环。 步骤: 1. 将需要操作的标签按照索引顺序放入数组中。 2. 根据条件分支,分别计算每个数组元素对应的值。 3. 使用循环进行读取和写入。 注意:原始代码中,If块和Else块中分别有10个标签(但实际上只操作了8个,因为tag18、tag19、tag28、tag29被注释了),但我们看到tag30到tag39有10个标签。所以我们需要确定到底要操作多少个标签。从代码看,只有8个(索引0到7)。 重构后的代码: 定义数组: - 输入标签数组:srcTags1(对应tag30到tag37,共8个) - 输出标签数组1:outTags1(对应tag10到tag17,共8个?但实际代码中tag10到tag17有8个,但tag18,tag19被注释,所以实际只用到前8个) - 输出标签数组2:outTags2(对应tag20到tag27,共8个) 另外,我们注意到在If块中,计算方式不是直接使用输入标签数组,而是根据一组公式计算。因此,我们需要在If块中根据索引位置使用不同的公式。 具体公式: 在If块中(原手动模式): 索引0: tag10 = tag4.Value * tag1.Value * tag9.Value 索引1: tag11 = tag4.Value * (1-PreTemp) * tag9.Value 索引2: tag12 = tag4.Value * (1-PreTemp2) * tag9.Value 索引3: tag13 = tag4.Value * tag9.Value 索引4: tag14 = tag4.Value * tag9.Value 索引5: tag15 = tag4.Value * (1-PreTemp5) * tag9.Value 索引6: tag16 = tag4.Value * (1-PreTemp4) * tag9.Value 索引7: tag17 = tag4.Value * tag5.Value * tag9.Value 而在Else块中(原自动模式): 每个输出标签的值计算公式为:tag4.Value * 对应输入标签数组的值 * tag9.Value 另外,输出标签数组2(outTags2)的值就是输出标签数组1(outTags1)的值乘以100(因为outTags2是百分比?),但在原代码中,If块和Else块中对outTags2的计算是独立写的,但观察发现,outTags2的值其实就是outTags1的值除以tag9.Value(如果有)再乘以100?但是注意在If块中,outTags1和outTags2是分别计算的,但公式类似,只是outTags2没有乘tag9.Value?不对,我们看: If块中: tag10.Value = CDbl(tag4.Value * tag1.Value) * CDbl(tag9.Value) tag20.Value = (tag4.Value * tag1.Value) * 100 -> 注意这里没有乘以tag9.Value 所以,tag20的值并不是tag10的值乘以100,而是少了tag9.Value因子。因此,我们不能直接通过outTags1来得到outTags2。 重新审视:tag20到tag27是“功率偏移”值,而tag10到tag17是“功率设定”值。所以它们的计算公式不同。 在If块中,tag20的计算公式与tag10不同(没有乘以tag9.Value),而在Else块中,tag20的计算公式是tag4.Value * tag30.Value * 100,同样没有tag9.Value。 因此,我们需要分别计算两组输出。 重构思路: 1. 定义需要用到的输入标签(除了数组外,还有tag1, tag4, tag5, tag9等)。 2. 定义两个输出数组:一个用于功率设定(outPowerSet),一个用于功率偏移(outPowerOffset)。 3. 定义输入数组(srcPowerWeights)用于在Else块中的权重系数(即tag30到tag37)。 由于两个分支的计算公式不同,我们需要在分支内部循环计算每个输出。 重构代码: </think>根据提供的代码,这是一个用于西门子 WinCC 系统的 VBScript 脚本,主要用于处理加热区功率设置的逻辑。我将详细分析代码并提供优化建议: ### 代码功能分析 1. **主要功能**:根据`tag2`的值(手动/自动模式)计算不同加热区的功率设定值 2. **操作模式**: - **手动模式**(`tag2.Value=1`时):根据预设算法计算功率偏移 - **自动模式**(`tag2.Value=0`时):直接使用预设的功率系数 3. **数据处理**: - 读取多个标签值作为输入参数 - 进行浮点数计算(使用`CDbl`) - 将计算结果写入输出标签 4. **标签类型**: - 控制模式切换标签(tag2) - 功率系数标签(tag4, tag9) - 偏移参数标签(tag1, tag5) - 输入权重标签(tag30-tag39) - 输出功率标签(tag10-tag19) - 功率偏移显示标签(tag20-tag29) ### 优化建议和代码重构 ```vbscript Sub OnLButtonDown(ByVal Item, ByVal Flags, ByVal x, ByVal y) ' 读取核心参数 Set tagBase = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_SEC1") ' 基本功率 Set tagMode = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_AM_Z1") ' 模式切换 Set tagFactor = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_STEP5上功率") ' 功率系数 ' 参数读取 tagBase.Read tagMode.Read tagFactor.Read ' 定义输出标签数组 Dim outTags(9), dispTags(9) For i = 0 To 9 Set outTags(i) = HMIRuntime.Tags("rcp_HOT_PowerSet_HU1_" & (i+1)) Set dispTags(i) = HMIRuntime.Tags("入口CV_編輯_DB_加熱區_CA1-" & (i+1) & "功率偏移") Next ' 模式切换逻辑 If tagMode.Value = 1 Then ' 手动模式 ' 读取偏移参数 Set tagUp = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_NDS_1") Set tagDown = HMIRuntime.Tags("rcp_HOT_PowerOfSet_UP_DS_1") tagUp.Read tagDown.Read ' 计算偏移系数 Dim coeff(7) coeff(0) = tagUp.Value coeff(1) = 1 - (1 - tagUp.Value) * 0.67 coeff(2) = 1 - (1 - tagUp.Value) * 0.33 coeff(3) = 1.0 coeff(4) = 1.0 coeff(5) = 1 - (1 - tagDown.Value) * 0.33 coeff(6) = 1 - (1 - tagDown.Value) * 0.67 coeff(7) = tagDown.Value ' 计算输出值 (前8个区域) For i = 0 To 7 outTags(i).Value = CDbl(tagBase.Value * coeff(i) * tagFactor.Value) dispTags(i).Value = tagBase.Value * coeff(i) * 100 Next tagMode.Value = 0 ' 切换到自动模式 Else ' 自动模式 ' 读取权重系数 Dim inTags(9) For i = 0 To 9 Set inTags(i) = HMIRuntime.Tags("rcp_HOT_PowerSet_Up_1_" & (i+1)) inTags(i).Read Next ' 计算输出值 (前8个区域) For i = 0 To 7 outTags(i).Value = CInt(tagBase.Value * inTags(i).Value * tagFactor.Value) dispTags(i).Value = CDbl(tagBase.Value * inTags(i).Value) * 100 Next tagMode.Value = 1 ' 切换到手动模式 End If ' 写入所有修改的标签 tagMode.Write For i = 0 To 7 outTags(i).Write dispTags(i).Write Next End Sub ``` ### 优化说明: 1. **使用循环替代重复代码**: - 通过数组循环处理10个加热区标签 - 使用动态标签名构造(`"tag_" & (i+1)`) 2. **代码结构优化**: - 分离核心参数读取和模式判断逻辑 - 使用中间变量存储计算结果 - 删除未使用的冗余变量 3. **可维护性提升**: - 明确定义系数计算数组 - 添加注释说明关键参数作用 - 统一处理标签读写操作 4. **数据处理改进**: - 显式声明变量类型(使用`CDbl`保证精度) - 规范数值转换(`CInt`处理整型输出) 5. **扩展性增强**: - 易调整加热区数量(修改循环范围即可) - 系数计算逻辑集中管理 ### 关键改进点: 1. **动态标签处理**:使用循环构造标签名代替硬编码 2. **模式切换优化**:清晰的状态机切换逻辑(1=手动→0,0=自动→1) 3. **内存管理**:减少不必要的变量声明 4. **计算精度**:确保浮点运算使用`CDbl` 5. **注释完善**:关键步骤添加说明注释 ### 性能建议: 1. 考虑将`tagFactor`移出循环(避免重复读取) 2. 对于实时性要求高的场景,可添加错误处理: ```vbscript On Error Resume Next '...标签操作... If Err.Number <> 0 Then HMIRuntime.Trace "Error: " & Err.Description End If ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值