电话响起,一天工作开始。C:我300PLC内共享DB块内存的参数不能保持,CPU下电后再上电,所有保存的参数都变成零了?E:请问您共享DB块的初始值是零吗?C:我没改过,都是默认的。E:那您有没有使能“NonRetain”属性?C:我没改过,都是默认的,那些对勾我都没打。E:(心理活动,应该是程序的问题,可能是程序有地方启动时给这里写零。)那您这个问题可能是程序有地方给这里写零造成的,您检查过程序吗?C:检查过,没发现问题。程序是两年前做的,一直都没问题的,就是昨天检修后突然不行了。E:(心理活动,检修后行的话,有可能是MMC卡取下来后CPU上电了。)那您CPU的存储卡您取下来过吗?C:取下来过,然后将另外一个MMC卡插入这个CPU内下载程序了。下载后又把原先的卡插进来了,启动后就发现原来调试的几个参数没有了。E:这是正常的,如果CPU在取下存储卡后单独上电,然后下电,然后再插存储卡,DB块通过MMC卡保持的数据会丢失的。C:那如果我调试好的参数需要保持住应该怎么办?E:您可以考虑初始值,将您调试好的数据放入DB块的初始值;或者您可以考虑更改离线的实际值。这样数据就不会丢,随程序保存。C:那我试下电话二次响起C:我DB块的初始值不起作用,现在数值还全是0。E:那您是在声明视图修改完初始值,然后保存下载的吧?C:是的。我下载完后直接监视,实际值都是0。E:那您需要对DB块执行初始化,初始化之后,所有的初始值变成离线的实际值。然后再下载,然后程序在线的实际值就是您设定的初始值了。C:DB数值这么多事儿,听起来有点纠结。那怎么进行初始化操作呢?E:将DB块切换到数据视图,然后在编辑菜单下选择初始化数据块项,然后点保存,然后下载。C:新数值已经起作用了,非常感谢!Case结束。DB块数值涉及的内容有:初始值、离线项目的实际值、在线项目的实际值、带@的实际值,部分客户由于不清楚之间的关系或者不熟悉其作用,造成调试过程中很多问题。跟大家分享下我对这些问题的见解。关于共享数据块:共享数据块不能分配给逻辑块。它包含设备或机器所需的值,并且可以在程序中的任何位置直接调用。初始值:如果不希望软件使用所输入数据类型的默认值,那么可以在此输入初始值。当首次保存块时,如果没有明确定义变量的实际值,那么,初始值将作为当前值使用(需要注意的是DB块的第一个字节已经被STEP7定义为INT型变量DB_VAR,且其离线实际值为0,所以造成很多客户困惑在声明视图建立很多INT变量,下载后在线监视第一个值为0其他的都和初始值一致见图1、图2、图3。解决该问题,只需要将DB初始化后下载)。初始值通过离线实际值作用于CPU,初始值并不直接作用于CPU。图1:在声明视图内定义变量图2:在数据视图内查看变量图3:监视DB块的在线值离线实际值:打开数据块时的变量值,或上一次修改、保存过的变量值。在线实际值:打开数据块时的当前值。需要注意仅当前值才可以下载给CPU。关于背景数据块:背景数据块是直接分配给逻辑块的数据块,如功能块。背景数据块包含存储在变量声明表中的功能块的数据。对于不是全局共享的数据块,不能改变声明视图。初始值:背景数据块的初始值,不能在DB快的声明视图内设定,只能在定UDT或者FB的输入参数(IN)、输出参数(OUT)、输入/输出参数(IN_OUT)、静态数据(STAT)时定义。图4:UDT内定义背景块的初始值图5:FB内定义背景块的初始值离线实际值:打开数据块时的变量值,或上一次修改、保存过的变量值。在给FB或者UDT指定背景数据块时,如果没有在数据试图内分配离线实际值,则FB或者UDT的初始值保存为背景数据块的离线实际值。在线实际值:保存下载背景块时的离线实际值,并在下载时将该值作为DB块的当前值,即:带@的实际值。监视背景块时,可以修改在线实际值,然后通过参数分配按钮,可以在不下载背景块的情况下修改DB块的当前值(该按钮仅FB的背景块和DB块类型为UDT时有,DB块作为共享数据块,变量类型为UDT时没有该功能)。图6:FB背景块的分配参数按钮带@的实际值:FB背景数据块的当前值,参与PLC运算,不能更改,只能通过修改实际值更改。如果需要将带@的实际值恢复为FB或者UDT定义的初始值,可以在线监视时执行编辑菜单下的初始化数据块功能(该按钮仅FB的背景块和DB块类型为UDT时有,DB块作为共享数据块,变量类型为UDT时没有该功能)。DB块并不“纠结”,不清楚或者不熟悉各个值之间关系才会感觉混乱。正所谓“工欲善其事,必先利其器”,编程调试前只要履清楚各个值之间的关系,必能编程调试时得心应手,事半功倍。