最近在研究博图功能指令时,发现对于边沿指令,既可以通过功能指令实现,也可手动编写程序实现。
边沿指令的机制为比对同一信号两个扫描周期内的变化,由1变为0则为下降沿指令,由0变为1则为上升沿指令。扫描周期即PLC的运行周期
对于边沿功能指令,可以创建FC型和FB型功能函数,FC型函数和FB型函数只在数据存储和接口参数上有区别,其功能实现逻辑并无差别。
上升沿
FC型
接口参数
参数 | 数据类型 | 声明 | 描述 |
---|---|---|---|
Single | Bool | Input | 触发信号 |
TempSingle | Bool | InOut | 暂存信号 |
RisingEdgeDatection | Return | Bool | 边沿检测结果 |
功能代码
REGION RisingEdgeDatection
//上升沿指令
//通过IF语句判断#Single是否产生0到1的变化
IF #Single AND NOT #TempSingle THEN
#RisingEdgeDatection := TRUE;
ELSE
#RisingEdgeDatection := FALSE;
END_IF;
//将#single信号复制给边沿存储位#TempSingle
#TempSingle := #Single;
END_REGION
图片中GlobalData".DataBool.Bool1和"GlobalData".DataBool.Bool2、GlobalData".DataBool.Bool3为创建的全局DB变量,仅作测试。
当"GlobalData".DataBool.Bool1信号由0变为1,则边沿检测结果"GlobalData".DataBool.Bool3信号为1."GlobalData".DataBool.Bool2作为"GlobalData".DataBool.Bool1的暂存指令
使用此FC型功能时,建议创建一定长度的全局DB变量,作为此接口参数的实参
FB型
对于FB型,可以直接调用功能指令,并创建背景DB,另外也可直接编写SCL语句来实现。具体方式如下:
功能指令
SCL编写
在进行项目开发时,有时候需要在某一情况进行数据初始化或者复位某信号,但直接调用功能指令又比较麻烦,此时可以通过下面的方式实现。
接口参数
参数 | 数据类型 | 声明 | 描述 |
---|---|---|---|
start | Bool | Input | 启动信号 |
P1 | Bool | Temp | 临时变量(启动变量暂存) |
Number | Static | Int | 生产数值 |
程序代码
IF #start AND NOT #P1 THEN
#Number := 0;
END_IF;
#P1 := #start;
当start信号启动时,将****数值清零
下降沿
对于下降沿,其程序结构和上升沿基本一样,唯一区别的地方为其程序代码需要稍作调整。
FC型
接口参数名称稍作调整,另外注意IF判断的条件。
REGION FailingEdgeDetection
//通过IF语句判断#Single是否产生1到0的变化
IF NOT #Single AND #TempSingle THEN
#FailingEdgeDetection := TRUE;
ELSE
#FailingEdgeDetection := FALSE;
END_IF;
//将#single信号复制给边沿存储位#TempSingle
#TempSingle := #Single;
END_REGION
FB型
直接调用时,注意调用F_TRIG,当使用SCL编写时,代码如下:
IF NOT #start AND #P1 THEN
#Number := 0;
END_IF;
#P1 := #start;
注意IF后面的条件判断。
在后续程序开发过程中,可根据实际情况,选择不同的方法,并不需要拘泥于一种,这也是程序开发的魅力。