zenon WPF Element
存储位置
- 启动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
文件夹中。