线下实训
HOME
线下实训
正文内容
plc函数编程入门 倍福PLC学习:编写函数块及简单调试
发布时间 : 2024-11-24
作者 : 小编
访问数量 : 23
扫码分享至微信

倍福PLC学习:编写函数块及简单调试

今天这篇文章我们来编写一个简单的电机控制函数块,并将其下载到倍福CX5020控制器进行测试,以熟悉TwinCAT3环境下基本的编程步骤。

打开TwinCAT3(TC3),按照上一篇文章《倍福PLC学习:扫描EtherCAT I/O子站并测试模块》介绍的内容新建工程项目并扫描EtherCAT子站,项目名称为“motorControl”。

在左侧项目树的“PLC”节点下右键单击,选择“Add new item(添加新内容)”,添加新的PLC项目,命名为“CPU1”,如下图所示:

添加完成后,“CPU1 Project”中会有POUs、GVLs、DUTs等文件夹。其中,POU是程序组织单元,GVL是全局变量列表,UDT是用户自定义变量。我们计划编写一个电机控制的函数块,因此在“POUs”文件夹右键单击,在弹出的对话框中选择“添加(Add)”→“POUs”,如下图所示:

在弹出的“添加POU”对话框中,选择功能块(Function Block),命名为motorControl,编程语言选择ST语言,如下图所示:

在函数块motorControl中声明变量,其中:

VAR_INPUT是输入变量,包含电机启动 、停止信号;VAR_OUTPUT是输出变量,包含输出信号(线圈);VAR_STAT是静态变量,包含沿信号检测变量;

如下图所示(注意变量不区分大小写):

编写代码如下图所示:

为了分配参数,我们新建全局变量列表:GVL1,并添加变量如下图所示:

接下来要在主函数(MAIN)中调用电机控制函数块。首先在变量列表中声明motorControl的实例,命名为“motorControl1”,编写控制代码如下图所示:

单击工具栏“Build”→“Build CPU1”编译PLC程序。

单击工具栏“PLC”→“Download”下载PLC程序。

单击工具栏“PLC”→“Login”登录到在线状态,或者工具栏的快捷按钮,如下图所示:

如果PLC处于未运行状态,单击“Start(启动)”使其运行。本例程为了给出电机启动信号,我们将全局变量“startBtn1”的“Prepared Value”设置为“TRUE”,并单击工具栏“Write Values”按钮将该值写入到PLC中,如下图所示:

此时可以看到主程序MAIN中电机输出信号为TRUE,如下图所示:

如果想让函数输出对应到实际的输出模块,在“CPU 1 instance”→“PLCTask Outputs”→“GVL1.coilKM”,将其对应到“Linked to”指定的输出模块即可。

好了,关于倍福PLC编写函数块及简单调试就先介绍到这里。

新手西门子PLC编程技巧,就是简单快速好用

本文通过例程的方式总结一些常用的西门子PLC编程技巧,从简单到复杂,从梯形图到SCL,希望对大家有所帮助。

(一)PLC系统常闭点

PLC程序的绝对常闭点,可以作为逻辑支路断开、调试或检修的屏蔽开关,尽量使用比较独立的存储位。

(二)PLC系统常开点

PLC程序的绝对常开点,可以作为逻辑支路接通、调试或检修的接通开关,尽量使用比较独立的存储位。

(三)PLC系统上电脉冲

PLC程序的系统上电脉冲,可以作为系统初始化脉冲来复位、清零和设置系统重要参数,尽量使用比较独立的存储位。

(四)一键触发启停功能

用一个按钮实现启动和停止功能,可以作为操作按钮不够时的一个补救措施。

(五)模拟量输入标定功能

将整数的模拟量标定为实数的工程量,相当于博途中自带的SCALE_X ,但该子程序结合高低量程限制后,标定和调试都更加方便。

(1)子程序调用

(2)子程序变量声明

(3)SCL代码

IF (#Emin < #Emax) AND (#Dmin < #Dmax) THEN

IF #Raw < #Dmin THEN

#RawTemp := #Dmin;

END_IF;

IF #Raw > #Dmax THEN

#RawTemp := #Dmax;

END_IF;

IF (#Raw >= #Dmin) AND (#Raw <= #Dmax) THEN

#RawTemp := #Raw;

END_IF;

#OutReal := (INT_TO_REAL(#RawTemp - #Dmin) / INT_TO_REAL(#Dmax - #Dmin)) * (#Emax - #Emin) + #Emin;

#OutPercentage := (#OutReal / (#Emax - #Emin)) * 100.0;

ELSE

#OutReal := 0.0;

#OutPercentage := 0.0;

END_IF;

(六)模拟量输出标定功能

将实数的工程量标定为整数的数字量,相当于博途中自带的NORM_X ,但该子程序结合高低量程限制后,标定和调试都更加方便。

(1)子程序调用

(2)子程序变量声明

(3)SCL代码

IF (#Dmin < #Dmax) AND (#Emin < #Emax) THEN

IF #Raw < #Emin THEN

#RawTemp := #Emin;

END_IF;

IF #Raw > #Emax THEN

#RawTemp := #Emax;

END_IF;

IF (#Raw >= #Emin) AND (#Raw <= #Emax) THEN

#RawTemp := #Raw;

END_IF;

#OutInteger := REAL_TO_INT(((#RawTemp - #Emin) / (#Emax - #Emin)) * INT_TO_REAL(#Dmax - #Dmin) + INT_TO_REAL(#Dmin));

#OutPercentage := ((((#RawTemp - #Emin) / (#Emax - #Emin)) * INT_TO_REAL(#Dmax - #Dmin) + INT_TO_REAL(#Dmin)) / INT_TO_REAL((#Dmax - #Dmin))) * 100.0;

ELSE

#OutInteger := 0;

#OutPercentage := 0.0;

END_IF;

RETURN;

(七)冒泡法排序功能

通过冒泡法升序或降序模式排序数组。

(1)子程序调用

(2)子程序变量声明

(3)模式为1(升序)的运行结果如下图所示:

(4)模式为0(降序)的运行结果如下图所示:

(5)SCL代码

IF #Enable THEN

//获取数组上限

#L := LOWER_BOUND(ARR := #Array, DIM := 1);

//获取数组下限

#H := UPPER_BOUND(ARR := #Array, DIM := 1);

//冒泡法排序

FOR #i := #L TO #H-1 DO

FOR #j := #L TO #H-1-#i DO

IF #Mode THEN

//升序

IF #Array[#j] > #Array[#j + 1] THEN

#temp1 := #Array[#j];

#Array[#j] := #Array[#j + 1];

#Array[#j + 1] := #temp1;

END_IF;

ELSE

//降序

IF #Array[#j] < #Array[#j + 1] THEN

#temp1 := #Array[#j];

#Array[#j] := #Array[#j + 1];

#Array[#j + 1] := #temp1;

END_IF;

END_IF;

END_FOR;

END_FOR;

END_IF;

(八)斜坡函数功能

输出值按照指定斜率(单位/秒)跟随设定值,可以用来防止数值突变,这个功能可以在博途中添加扩展库函数(LGF)后直接调用Ramp函数。

(1)子程序调用

(2)子程序变量声明

(3)SCL代码

#rv1:= RD_SYS_T(#ActualTime);

IF #InitFB = true THEN

#LastTime := #ActualTime;

#AuxOut := #SetPoint;

#Out := #AuxOut;

END_IF;

#DeltaTime_T:= T_DIFF(IN1:=#ActualTime, IN2:=#LastTime);

#DeltaTime_DI:= TIME_TO_DINT(#DeltaTime_T);

#DeltaTime:= DINT_TO_REAL(#DeltaTime_DI);

#DeltaTime := #DeltaTime / 1000.0;

#LastTime := #ActualTime;

IF #SetPoint < #AuxOut THEN

#Out := #AuxOut;

#auxR := #AuxOut - (#Rate * #DeltaTime);

#Out := #AuxOut;

#AuxOut := MAX(IN1 := #auxR, IN2 := #SetPoint);

#Out := #AuxOut;

RETURN;

ELSE

IF #SetPoint > #AuxOut THEN

#Out := #AuxOut;

#auxR := (#Rate * #DeltaTime) + #AuxOut;

#Out := #AuxOut;

#AuxOut := MIN(IN1 := #auxR, IN2 := #SetPoint);

#Out := #AuxOut;

END_IF;

END_IF;

RETURN;

例程说明

以上例程均在博途V15.1环境下测试通过,大家有什么好的编程技巧,欢迎留言!

相关问答

西门子plc运算指令?

西门子PLC的运算指令包括算术运算指令,逻辑运算指令,比较运算指令,移位指令和其他特殊函数指令。这些指令用于在PLC程序中对数据进行操作,满足自动化控制系统...

plc函数和函数块有什么区别?

R_TRIG指令与P_TRIG指令都是用于检测流入它们的CLK端的能流的上升沿,并用Q端直接输出检测结果。其区别在于R_TRIG是函数块,用它的背景数据块DB3保存上一次扫描...

plc函数和功能块区别?

PLC都有FC与FB,FC称为功能或函数,FB称为功能块或函数块。FC与FB的共同点是都相当于子程序,可以被其它程序调用,也可以调用其它子程序,如果控制功能相同,都...

plc中断函数怎么用?

plc中断函数分为两大类:一个是用户程序中断以及外部信号编程金钟的中断。一个是系统自身的中断,像硬件故障、通讯链接不畅、程序死循环等引起的中断。中断一...

零基础怎么学PLC编程?

1.学习基础知识:在学习PLC编程之前,需要先学习PLC硬件的基本结构、原理和常见的编程语言,例如LadderDiagram(梯形图)、FunctionBlockDiagram(函数块图......

step7与plc485通讯步骤?

要实现step7与plc485通讯,首先需要在step7软件中配置485通讯模块的参数,包括通讯速率、数据位、奇偶校验等。然后,在Step7中编写PLC程序,使用通讯函数块来读...

信捷plc函数FUNC1D0mO哪里错了?

FUNCD0mO有错误可能是以下原因导致:a.函数拼写有错误;b.输入、输出参数未在程序中定义或者定义错误;c.输出参数的参数传递方式选择错误;你可...FUNCD0...

plc函数块内怎样自锁?

在PLC函数块内实现自锁,可以通过引入一个内部变量来实现。首先,定义一个布尔型变量,作为自锁的标志位。当函数块被触发时,检查自锁标志位的状态,如果为真,...

怎么学习plc编程?

PLC编程学习需要掌握基本的电气知识和自动化控制原理,建议先学习PLC的硬件组成和工作原理,然后学习PLC编程语言,如LadderDiagram、FunctionBlockDiagram等...

怎样编写plc上升沿触发功能?

在PLC编程中,可以使用以下几种方式来编写上升沿触发功能:1.使用辅助继电器(AUX):创建一个辅助继电器,并将其置于一个XIO(非接点)位指令之前。然后,在需...在...

 克里特岛橄榄油  illmatic 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2024  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部