存储位置

  • 启动zenon Runtime时\FILES\zenon\custom\additional和\FILES\zenon\custom\wpfcache的CDWPF文件中的dll会被复制到\FILES\zenon\custom\wpfcache. 但是只有文件版本高于\wpfache中的dll才会复制。如果版本号低于当前版本,测试发现,并不会更新。
  • 所以在调试时,只需要更新\wpfache中的dll即可。
  • 但是在部署整个项目时,需要确保\additional文件夹或CDWPF文件的版本号是否正确。
  • 如果只更新\additional文件夹或CDWPF文件,且文件版本号没有变,那么需要手动删除\wpfcache文件夹,才会重新复制新的dll。
  • Editer项目中dll存储在SQL文件夹中C:\ProgramData\ABB\SQL2012\PROJECT-GUID\FILES\zenon\custom\wpfcache。所以根据此推算,假如WPF addin只在zenon editor的项目中更新,此时只会更新SQL文件夹中dll,如果使用该项目文件生成runtime文件,只会把dll复制到Runtime的\FILES\zenon\custom\additional,如果此时Runtime的\FILES\zenon\custom\wpfcache中有同名同版本号的WPF dll,那么Runtime在运行时,是不会替换该dll的。
  • 异常:有时候还是出现修改了dll文件版本号,dll不会生效的问题,需要把C:\ProgramData\ABB\SQL2012\166e715b-e6a8-400a-86b0-6c7af6c69a0a\FILES\zenon\custom\wpfcache和zenon工程下的两个dll都删掉,让zenon重新生成一个新的。另外C:\Users\CNMIZHU7\Source\repos\Zenon\PMOP\RT\FILES\zenon\custom\additional下也有这儿文件,但是,可能在zenon中删掉,就没有了。

XAML file

<UserControl xmlns:WpfControlLibrary2="clr-namespace:WpfControlLibrary2;assembly=WpfControlLibrary2"  
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"              
            >
    <Grid Name="GridbyMichael">
            <WpfControlLibrary2:UserControl1 Name="ControlbyMichael" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    </Grid>
</UserControl>

Replace dll

Replace in SQL directory

C:\ProgramData\ABB\SQL2012\166e715b-e6a8-400a-86b0-6c7af6c69a0a\FILES\zenon\custom\wpfcache ![日志文件夹](/assets/pickmaster/SQL2012wpfcache.png) 

Replace in zenon Editor

increase the file version of the DLL.
日志文件夹 日志文件夹

WPF控件依赖属性

Zenon的变量作为绑定源可以直接绑定到WPF控件对象的绑定目标属性上,为什么要强调绑定目标属性,因为绑定目标属性一定是依赖项属性

WPF控件绑定到依赖属性,Zenon变量同样绑定到依赖属性

public static readonly DependencyProperty AuthorDependencyProperty = DependencyProperty.Register("Author", typeof(string), typeof(UserControl1));

public string Author
{
    get
    {
        return (string)GetValue(AuthorDependencyProperty);
    }
    set
    {
        SetValue(AuthorDependencyProperty, value);
    }
}

public UserControl1()
{
    InitializeComponent();
    this.DataContext = this;
    this.textBox_Author.SetBinding(TextBox.TextProperty, "Author");
}

Zenon变量绑定到依赖属性,依赖属性和WPF控件使用事件相互触发修改变量

public static readonly DependencyProperty ValueADependencyProperty =DependencyProperty.Register("ValueA", typeof(double),typeof(UserControl1), new FrameworkPropertyMetadata(0.0, new PropertyChangedCallback(OnValueADependencyPropertyChanged)));
  
public double ValueA
{
    get
    {
        return (double)GetValue(ValueADependencyProperty);
    }
    set
    {
        SetValue(ValueADependencyProperty, value);
    }
}

private static void OnValueADependencyPropertyChanged(DependencyObject source,DependencyPropertyChangedEventArgs e)
{
    UserControl1 control = source as UserControl1;
    if (control != null)
    {
        try
        {
            control.textBoxA.Text = control.ValueA.ToString();
        }
        catch (Exception)
        { }
    }            
}

private void textBoxA_TextChanged(object sender, TextChangedEventArgs e)
{
    try
    {
        ValueA = Convert.ToDouble(textBoxA.Text);
    }
    catch (Exception)
    { }
}

依赖属性数据类型问题

建议依赖属性的数据类型为基本类型,且和zenon关联的数据类型一致,如果不一致,经过测试发现,zenon的值可以自动传到WPF中,但是WPF的值不会传到zenon中。比如WPF中的依赖属性数据类型为int的变量Count, zenon的数据类型为string的变量名为strTest01,那么当Count变化时,不会传输到strTest01中;但是反过来,strTest01倒是可能会传到int中。

多个依赖属性绑定执行顺序导致异常问题

当有多个依赖属性绑定到zenon变量时,如果使用依赖属性的PropertyChangedCallback回调函数时,一定要谨记绑定变量的顺序问题,特别时当一个变量变化触发回调函数后,有需要读取另一个变量的值时,有可能另一个变量的值还没有赋值过来。

Zenon变量直接绑定到控件属性

如果不想自定义依赖项属性,那么可以通过定义绑定目标控件对象的Name属性(该控件的所有父控件必须全部定义Name属性),开放出对应WPF控件的绑定目标属性。
日志文件夹

直接访问Zenond变量

zenOn.Project zenonProject = null;

public UserControl1()
{
    InitializeComponent();

    try
    {
        zenonProject = ((zenOn.Application)Marshal.GetActiveObject("zenOn.Application")).Projects().Item("PROJECTMODBUS");
    }
    catch (Exception)
    {
    }

}

private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
    try
    {
        if (zenonProject != null)
        {
            Marshal.ReleaseComObject(zenonProject);
            zenonProject = null;
        }
    }
    catch (Exception)
    {
    }

}

private void buttonVariableLink_Click(object sender, RoutedEventArgs e)
{
    if (zenonProject != null)
    {
        MessageBox.Show(zenonProject.Name);
    }

}

wpfcache

任何添加到Project -> Files -> Others目录下的dll在编译时,都会复制到RT\FILES\zenon\custom\wpfcache文件夹中。