在WPF中,ControlTemplateDataTemplate是两种用于定义UI的模板。

  • DataTemplate:用于定义数据对象如何显示。比如在ListBoxComboBoxItemsControl等控件中,程序员会直接绑定数据——这里我们可以使用DataTemplate来定义每一项的数据如何显示。注意,DataTemplate目标是数据对象,它定义了数据如何在UI中呈现,比如一个字符串、一个自定义对象,或者一个集合的每一项。
  • ControlTemplate:用于定义控件的外观。例如,你可以为一个Button控件定义一个ControlTemplate来改变按钮的外观。注意,ControlTemplate的目标是控件本身,比如ButtonTextBox等。它定义了控件的可视化树结构。

数据模板

数据模板提供了一种至关重要的能力:即可以自由灵活地展示数据外观。在不使用数据模板的情况下,WPF默认展示对象时总是固定调用对象的.ToString()方法,我们当然还可以使用绑定路径、自定义控件等方法。但是问题是,这些方案都不够灵活。

数据模板(DataTemplate) 提供的解决方案是,为控件关连的对象自动应用相应的数据模板。

阅读剩余部分

气缸有去工作位和去原位两种动作,同时为了检测是否到位,一般会配备磁性开关或者光电检测是否到达工作位和原位。如果给出输出,超时未到位,需要触发报警。

通常在急停状态下,需要断开去工作位和去原位的动作输出;在手动模式下,可以直接输出DO信号;在自动模式下,还需要考虑一些业务逻辑,比如互锁逻辑。

功能块声明如下:

FUNCTION_BLOCK Cylinder

VAR_INPUT
    emStop_nc : BOOL;            // 急停信号常闭点
    cmdReset : BOOL;              // 复位信号
    cmdWork : BOOL;              // 去工位
    cmdHome : BOOL;              // 去原位
    AutoMode : BOOL;             // true: 自动模式; false: 手动模式
    snWorkPos : BOOL;             // 工作位传感器
    snHomePos : BOOL;             // 原位传感器
    timeoutWork : TIME;          // 工作位超时时间
    timeoutHome : TIME;          // 原位超时时间
END_VAR

VAR_OUTPUT
    doWork : BOOL;               // 气缸伸出
    doHome : BOOL;              // 气缸缩回
    errWorkTimeout : BOOL;         // 工作位置超时报警
    errHomeTimeout : BOOL;         // 原位超时报警
    workPosDone : BOOL;          // 工作位到位完成
    homePosDone : BOOL;          // 原位到位完成
END_VAR

VAR
    timerWork : TON;             // 工作位置超时定时器
    timerHome : TON;             // 原位超时定时器
    emStopActive : BOOL;         // 急停激活标志
    resetHandled : BOOL;         // 复位已处理标志
END_VAR

气缸的业务非常简单,直接把业务逻辑翻译成代码即可:

阅读剩余部分

场景:在报警状态下,安灯上红灯需要一开一关的闪烁。

闪烁

本质上,我们需要创建一个功能块Blink,在未导通的情况下通过TON定时器延迟导通,而在导通后再通过TOF定时器延迟关闭,如此往复。

FUNCTION_BLOCK Blink

VAR_INPUT
    interval: TIME;
END_VAR

VAR_IN_OUT
    light: BOOL;
END_VAR

VAR
    TON_0: TON;
    TOF_0: TOF;
END_VAR

代码如下:

阅读剩余部分

我们在 CodeSys中 建立一个OPC UA服务端,并把相关变量通过OPC UA的方式暴露出来。然后,我们会通过第三方成熟且免费的UaExpert客户端,对服务端变量进行访问;最后,我们会以编程的方式,自己写代码实现对服务端变量的监视和控制。

OPC UA 服务端建立

为了测试,让我们编写一个简单程序:

PROGRAM PLC_PRG
VAR
    prod : INT;
    a : INT;
    b: INT;
END_VAR

prod := a * b;

a := a + 1;

符号配置

首先,右击Application,依次选择Add Object/Symbol Configuration:

阅读剩余部分