Permanently read variable

如果zenon或ScadaLogic中创建变量,没有关联任何元素,使用AddIn获取数据时,默认取出来的值为0x8000000A(-2147483638)。可以通过如下方式解决:

  1. 关联变量到屏幕控件,使用该方法只能确保页面打开时,C#程序可以获取到Runtime中对应的变量值。
  2. 添加变量的Limit Values,然后一定要关联一个函数到该Limit Value中,此操作可以确保变量一直有效,从而让C#的AddIn程序获取到实时值。
  3. 终极方法,Additional settings -> Permanently read variable,通过该设置,可以确保zenon在运行过程中,变量一直能实时获取到。Active: The variable is always logged on with the driver. This means it is continually read by the driver, even if it is not needed in the project at that particular time. The driver thus always has current values and the current status of the variables and can provide these immediately if necessary. The variable is also available for other Windows applications (such as Excel, Visual Basic etc.). Windows applications with DDE client functionality can thus use the variable values. Update time: 0,5 s Activation of this option has the advantages that, for example, variable values in the Write set value function or in the Switch screen element are toggled more quickly, because the variable does not need to be queried specially before switching. A disadvantage is the higher load placed on communication with the control unit.
    日志文件夹
  4. 在程序中激活该变量,可以不设置Changed事件处理函数,只需要添加变量,然后激活就可以了。 经过测试,貌似该功能不稳定,在添加变量的时候,可能会有部分信号取不到值,不清楚原因。分析原因,应该是如果在Start事件中就激活变量的话,可能有些变量还没有初始化完成,此时激活其实是失败的。所以如果使用该方法激活变量,需要确保程序完全启动后,再激活。

     public bool Activate()
     {
         bool boolAddVariable = true;
    
         project.OnlineVariableContainerCollection.Delete(this.variableName);
         container = project.OnlineVariableContainerCollection.Create(this.variableName);
            
         boolAddVariable &= container.AddVariable(this.variablePrefix + "ID");
    
         if (!boolAddVariable)
         {
             return false;
         }
    
         //container.Changed += Variabe_Changed;
    
         if (!container.Activate())
         {
             return false;
         }
    
         return true;
     }
    	
     public bool Deactivate()
     {
         //container.Changed -= Variabe_Changed;
         container.Deactivate();
         project.OnlineVariableContainerCollection.Delete(variableName);
    
         return true;
     }
    

zenon和SCADA Logic共享变量

有两种方式可以共享zenon和SCADA Logic中的变量。第一种方法一定要记得添加Logic to SCADA RT Connection驱动。

  1. 通过变量属性External settings -> Externally visible共享。通过该属性共享变量后,在SCADA Logic中会看到该变量前面有一个红色横线标签。但是如果只是启用该属性,变量还不能共享,还需要在SCADA Logic中添加Logic to SCADA RT Connection驱动才行
    日志文件夹
    日志文件夹
    日志文件夹
    日志文件夹
  2. 通过Driver: STRATONNG - SCADA Logic共享变量。在SCADA Logic编辑器中,右击Global变量属性,选择STRATON驱动。设置完后,重新打开SCADA Logic,对应变量的Syb.属性会自动被选中。通过这种方式共享变量时,注意需要把数组的索引设置为从0开始。
    日志文件夹

变量类型映射

Zenon变量只有在启动后,才能通过AddIn获取,在ProjectServiceExtension.Start事件中获取变量时,取出来的值都是0x8000000A(-2147483638),没有任何意义。Zenon的变量类型和C#的变量类型并不是一一对应的,数字类型全部都对应着C#的double类型,对应关系如下:

  1. Zenon INT -> C# System.Double
  2. Zenon BOOL -> C# System.Double (True=1, False=0), SetValue时可以直接设置bool变量

日志文件夹

Property Inheritance

创建变量时,会自动继承变量类型的属性,如果在变量类型中修改属性则会自动继承给变量,但是如果在变量中修改属性,则会断开与变量类型的属性继承关系。变量的属性有没有直接继承变量类型的属性值,可以通过查看对应属性的右侧有没有个箭头框,如果有,则该变量属性值是通过变量类型继承来的。 日志文件夹

Value Direct To Hardware

默认使用函数设置变量值时,会额外弹出一个确认窗口,可以通过在创建函数时选中“Direct To Hardware”选项,禁用该窗口。
日志文件夹

Limit Values

变量可以设置Limit Values,Limit Value是一个触发条件,比如当设置最大值时,并不是说该值可以允许设置这个最大值,而是一旦该值达到或者超过该值时,就会触发一个动作。例如设置最大值为3,且选中Invisible,当值为3时,对应的按钮就会隐藏,只有该值小于3且不等于3时,才会显示。BOOL类型会自动创建0和1的两个Limit Value,且默认没有设置Invisible值,如果需要通过bool变量隐藏显示控件,需要手动设置一下。
日志文件夹
日志文件夹

DataType共享

在zenon中创建的数据结构会自动映射到SCADALogic中,但是如果打开过SCADALogic,此时再在zenon中调整数据结构的子元素时,是不会反馈到SCADALogic中的,这里是一个Bug,而且此时调整顺便还容易让zenon崩溃。原因可能是SCADALogic不支持调整数据结构的顺序导致的。新添加的变量,如果调整顺序到数据结构的中间,即使没有打开SCADALogic,在打开SCADALogic后,也会在SCADALogic中自动排序到最后,并不会按zenon顺序插入到中间去。如果修改变量名称,反馈到SCADALogic中,同样如果删除变量,也会反馈到SCADALogic中。此规则不区分链接变量或嵌入变量类型。

String

当使用字符串时,SCADALogic会自动按‘\0’截取字符串

系统变量 SYSDRV

可以通过添加系统变量的方式获取zenon工程的程序版本号,zenon Runtime运行时的上下文根路径等系统数据。
日志文件夹
日志文件夹

变量导入

如果变量Limit Value关联的的函数不存在,会自动删除该设置,下次再导入同一xml文件时,会出现黄色。因为导入的文件有函数,而当前变量却没有函数。

日志文件夹

#zenon和Scada变量结构不一致处理方法 - 可以通过修改变量类型的名称试一下 如果修改已经存在的zenon数据结构时,调整了结构体的元素顺序时,由于Scada Logic中结构体的元素顺序并不会自动调整,会导致zenon中的变量和Scada Logic中的结构体变量元素顺序不一致。此时可以通过再Scada Logic中右击该数据结构 -> Clear,尝试删除该数据结构,此时Scada Logic肯定会弹出不能删除该数据结构的错误提示框,但你会发现,虽然不能删除,但Scada Logic中的数据结构的元素却会自动重新按zenon中的元素顺序重新编排了。目前还没有发现该方法导致的其它异常。

日志文件夹
日志文件夹