首页 > 其他分享 >西门子PLC常用底层逻辑块分享_单/双输出电机

西门子PLC常用底层逻辑块分享_单/双输出电机

时间:2024-03-14 11:34:05浏览次数:14  
标签:DO Pause END .# 西门子 PLC HMI EmgManual 底层

文章目录


前言

本文分享一个自己编写的电机控制逻辑块。


一、功能概述

  1. 手动状态、自动状态、机旁状态、强制状态、检修状态自由切换;
  2. 具有启动超时报警功能;
  3. 手动状态下,按启动按钮启动,按停止按钮停止;
  4. 自动状态下,根据程序联锁要求自动启停;
  5. 强制状态下,跳过允许启动条件,直接启动;
  6. 检修状态下,自动停止,且按下启动按钮不允许启动。

二、单输出电机程序编写

1.创建自定义数据类型

在这里插入图片描述

2.创建FB功能块“单输出电机”

建立如下引脚变量:
在这里插入图片描述

3.编写程序

代码如下:
1.赋值

#HMI.Ready_DI := #Ready_DI;
#HMI.Locally_DI := #Locally_DI;
#HMI.Running_DI := #Running_DI;
#Start_DO := #HMI.Start_DO;

2.时间转换、启动超时判断、故障复位

#HMI.Fault_All := #Fault OR #HMI.Time_Out; //故障赋值
#HMI.Lcl_DO := #Locally_DI AND #HMI.HMI_Lcl; //有就地信号,且按下机旁允许按钮,才会显示机旁允许状态

#Start_Time := DINT_TO_TIME(REAL_TO_DINT(#HMI.Start_T_Set * 1000.0)); //输入1表示1S

#RUN_IEC(IN := #HMI.#Start_DO AND NOT #HMI.HMI_Stop AND NOT #HMI.#Running_DI AND NOT #HMI.Fault_All,
         PT := #Start_Time); //启动延时

IF #RUN_IEC.Q THEN
    #HMI.Time_Out := 1;
    #HMI.#Start_DO := 0;
END_IF; //启动超时输出

IF #HMI.HMI_Rst THEN
    #HMI.Fault_All := 0;
    #HMI.Time_Out := 0; //复位启动超时输出
END_IF;

3.检测信号上升沿

#P_HMI_Lcl(CLK := #HMI.HMI_Lcl);
#P_HMI_EmgManual(CLK := #HMI.HMI_EmgManual);
#P_HMI_Pause(CLK := #HMI.HMI_Pause);

4.手动状态显示

IF #HMI.#HMI_Manual = 1 AND NOT #HMI.#HMI_Auto AND NOT #HMI.#HMI_EmgManual AND NOT #HMI.#HMI_Pause AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 1;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 0;
END_IF;
//默认手动状态
IF NOT #HMI.#Auto_DO AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO AND NOT #HMI.#EmgManual_DO THEN
    #HMI.#Manual_DO := 1;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 0;
END_IF;

5.自动状态显示

IF #HMI.#HMI_Auto = 1 AND NOT #HMI.#HMI_Manual AND NOT #HMI.#HMI_EmgManual AND NOT #HMI.#HMI_Pause AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 0;
    #HMI.#Auto_DO := 1;
    #HMI.#EmgManual_DO := 0;
END_IF;

6.强制状态显示

IF #HMI.#HMI_EmgManual = 1 AND NOT #HMI.#HMI_Manual AND NOT #HMI.#HMI_Auto AND NOT #HMI.#HMI_Pause AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 0;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 1;
    #HMI.#HMI_Pause := 0;
END_IF;
IF #HMI.#HMI_EmgManual = 0 THEN
    #HMI.#EmgManual_DO := 0;
END_IF;

7.休止状态显示

IF #HMI.#HMI_Pause = 1 AND NOT #HMI.#HMI_Manual AND NOT #HMI.#HMI_Auto AND NOT #HMI.#HMI_EmgManual AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 0;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 0;
    #HMI.#Pause_DO := 1;
    #HMI.#HMI_EmgManual := 0;
END_IF;
IF #HMI.#HMI_Pause = 0 THEN
    #HMI.#Pause_DO := 0;
END_IF;

8.手动状态下电机启动、停止

IF #Ready_DI AND #HMI.#HMI_Start AND #HMI.#Manual_DO AND NOT #HMI.#HMI_Stop AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 1;
END_IF;
IF #Ready_DI AND #HMI.#HMI_Stop AND #HMI.#Manual_DO AND NOT #HMI.#HMI_Start AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
END_IF;

9.自动状态下电机启动、停止

IF #Ready_DI AND #Auto_Start AND #HMI.#Auto_DO AND NOT #HMI.#HMI_Stop AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 1;
END_IF;
IF #Ready_DI AND #Auto_Stop AND #HMI.#Auto_DO AND NOT #HMI.#HMI_Start AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
END_IF;

10.强制状态下电机启动、停止

IF #HMI.#EmgManual_DO AND #HMI.#HMI_Start AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 1;
END_IF;
IF #HMI.#EmgManual_DO AND #HMI.#HMI_Stop AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
END_IF;

11.休止状态下电机停止

IF #HMI.#Pause_DO THEN
    #HMI.#Start_DO := 0;
END_IF;

12.按钮互锁

IF #HMI.#HMI_Lcl AND #P_HMI_EmgManual.Q THEN
    #HMI.#HMI_EmgManual := 0;
END_IF;
IF #HMI.#HMI_Lcl AND #P_HMI_Pause.Q THEN
    #HMI.#HMI_Pause := 0;
END_IF;

IF #HMI.#HMI_EmgManual AND #P_HMI_Lcl.Q THEN
    #HMI.#HMI_Lcl := 0;
END_IF;
IF #HMI.#HMI_EmgManual AND #P_HMI_Pause.Q THEN
    #HMI.#HMI_Pause := 0;
END_IF;

IF #HMI.#HMI_Pause AND #P_HMI_Lcl.Q THEN
    #HMI.#HMI_Lcl := 0;
END_IF;
IF #HMI.#HMI_Pause AND #P_HMI_EmgManual.Q THEN
    #HMI.#HMI_EmgManual := 0;
END_IF;

13.按钮自复位

IF NOT "AlwaysFALSE" THEN
    #HMI.#HMI_Start := 0;
    #HMI.#HMI_Stop := 0;
    #HMI.#HMI_Manual := 0;
    #HMI.#HMI_Auto := 0;
    #HMI.#HMI_Rst := 0;
END_IF;

三、双输出电机程序编写

1.创建自定义数据类型

同单输出电机。

2.创建FB功能块“双输出电机”

建立如下引脚变量:
在这里插入图片描述

3.编写程序

代码如下:
1.赋值

#HMI.Ready_DI := #Ready_DI;
#HMI.Locally_DI := #Locally_DI;
#HMI.Running_DI := #Running_DI;
#Start_DO := #HMI.Start_DO;
#Stop_DO := #HMI.Stop_DO;

2.时间转换、启动超时判断、故障复位

#HMI.#Fault_All := #Fault OR #HMI.#Time_Out; //故障赋值
#HMI.#Lcl_DO := #Locally_DI AND #HMI.#HMI_Lcl; //有就地信号,且按下机旁允许按钮,才会显示机旁允许状态

#Start_Time := DINT_TO_TIME(REAL_TO_DINT(#HMI.#Start_T_Set * 1000.0)); //输入1表示1S

#RUN_IEC(IN := #HMI.#Start_DO AND NOT #HMI.#HMI_Stop AND NOT #HMI.#Running_DI AND NOT #HMI.#Fault_All,
         PT := #Start_Time); //启动延时

IF #RUN_IEC.Q THEN
    #HMI.#Time_Out := 1;
    #HMI.#Start_DO := 0;
END_IF; //启动超时输出

IF #HMI.#HMI_Rst THEN
    #HMI.#Fault_All := 0;
    #HMI.#Time_Out := 0; //复位启动超时输出
END_IF;

3.检测信号上升沿

#P_HMI_Lcl(CLK := #HMI.HMI_Lcl);
#P_HMI_EmgManual(CLK := #HMI.HMI_EmgManual);
#P_HMI_Pause(CLK := #HMI.HMI_Pause);

4.手动状态显示

IF #HMI.#HMI_Manual = 1 AND NOT #HMI.#HMI_Auto AND NOT #HMI.#HMI_EmgManual AND NOT #HMI.#HMI_Pause AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 1;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 0;
END_IF;
//默认手动状态
IF NOT #HMI.#Auto_DO AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO AND NOT #HMI.#EmgManual_DO THEN
    #HMI.#Manual_DO := 1;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 0;
END_IF;

5.自动状态显示

IF #HMI.#HMI_Auto = 1 AND NOT #HMI.#HMI_Manual AND NOT #HMI.#HMI_EmgManual AND NOT #HMI.#HMI_Pause AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 0;
    #HMI.#Auto_DO := 1;
    #HMI.#EmgManual_DO := 0;
END_IF;

6.强制状态显示

IF #HMI.#HMI_EmgManual = 1 AND NOT #HMI.#HMI_Manual AND NOT #HMI.#HMI_Auto AND NOT #HMI.#HMI_Pause AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 0;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 1;
    #HMI.#HMI_Pause := 0;
END_IF;
IF #HMI.#HMI_EmgManual = 0 THEN
    #HMI.#EmgManual_DO := 0;
END_IF;

7.休止状态显示

IF #HMI.#HMI_Pause = 1 AND NOT #HMI.#HMI_Manual AND NOT #HMI.#HMI_Auto AND NOT #HMI.#HMI_EmgManual AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Manual_DO := 0;
    #HMI.#Auto_DO := 0;
    #HMI.#EmgManual_DO := 0;
    #HMI.#Pause_DO := 1;
    #HMI.#HMI_EmgManual := 0;
END_IF;
IF #HMI.#HMI_Pause = 0 THEN
    #HMI.#Pause_DO := 0;
END_IF;

8.手动状态下电机启动、停止

IF #Ready_DI AND #HMI.#HMI_Start AND #HMI.#Manual_DO AND NOT #HMI.#HMI_Stop AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 1;
    #HMI.#Stop_DO := 0;
END_IF;
IF #Ready_DI AND #HMI.#HMI_Stop AND #HMI.#Manual_DO AND NOT #HMI.#HMI_Start AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
    #HMI.#Stop_DO := 1;
END_IF;

9.自动状态下电机启动、停止

IF #Ready_DI AND #Auto_Start AND #HMI.#Auto_DO AND NOT #HMI.#HMI_Stop AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 1;
    #HMI.#Stop_DO := 0;
END_IF;
IF #Ready_DI AND #Auto_Stop AND #HMI.#Auto_DO AND NOT #HMI.#HMI_Start AND NOT #HMI.#Fault_All AND NOT #HMI.#Time_Out AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
    #HMI.#Stop_DO := 1;
END_IF;

10.强制状态下电机启动、停止

IF #HMI.#EmgManual_DO AND #HMI.#HMI_Start AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 1;
    #HMI.#Stop_DO := 0;
END_IF;
IF #HMI.#EmgManual_DO AND #HMI.#HMI_Stop AND NOT #HMI.#Pause_DO AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
    #HMI.#Stop_DO := 1;
END_IF;

11.休止状态下电机停止

IF #HMI.#Pause_DO AND NOT #HMI.#HMI_Lcl AND NOT #HMI.#Lcl_DO THEN
    #HMI.#Start_DO := 0;
    #HMI.#Stop_DO := 1;
END_IF;

12.按钮互锁

IF #HMI.#HMI_Lcl AND #P_HMI_EmgManual.Q THEN
    #HMI.#HMI_EmgManual := 0;
END_IF;
IF #HMI.#HMI_Lcl AND #P_HMI_Pause.Q THEN
    #HMI.#HMI_Pause := 0;
END_IF;

IF #HMI.#HMI_EmgManual AND #P_HMI_Lcl.Q THEN
    #HMI.#HMI_Lcl := 0;
END_IF;
IF #HMI.#HMI_EmgManual AND #P_HMI_Pause.Q THEN
    #HMI.#HMI_Pause := 0;
END_IF;

IF #HMI.#HMI_Pause AND #P_HMI_Lcl.Q THEN
    #HMI.#HMI_Lcl := 0;
END_IF;
IF #HMI.#HMI_Pause AND #P_HMI_EmgManual.Q THEN
    #HMI.#HMI_EmgManual := 0;
END_IF;

13.按钮自复位

IF NOT "AlwaysFALSE" THEN
    #HMI.#HMI_Start := 0;
    #HMI.#HMI_Stop := 0;
    #HMI.#HMI_Manual := 0;
    #HMI.#HMI_Auto := 0;
    #HMI.#HMI_Rst := 0;
END_IF;

标签:DO,Pause,END,.#,西门子,PLC,HMI,EmgManual,底层
From: https://blog.csdn.net/laohei026/article/details/136697934

相关文章

  • ArrayList和LinkedList底层原理的区别和使用场景
    (1)ArrayList底层是动态数组,查询快、增删慢。存储空间是连续的,可以根据寻址方式直接找到对应的元素位置,所以查询时间复杂度是o(1)。扩容:ArrayList支持动态扩容,在每次新增元素的时候会判断容量是否溢出,如果溢出则会进行扩容操作。当size=elementData.length时,表示数据数量已经超过......
  • JVM原理(GC,内存),JAVA底层
    1.JVM内存模型线程独占:栈,本地方法栈,程序计数器线程共享:堆,方法区2.什么是栈又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法出口等信息.调用方法时执行入栈,方法返回式执行出栈.3.什么是本地方法栈与栈类似,......
  • PLC数采网关在实际应用中的效能-天拓四方
    在工业自动化领域中,PLC扮演着至关重要的角色,它负责控制和监测生产线的各个环节。然而,随着工业4.0的推进和智能制造的快速发展,单纯依靠PLC进行现场控制已无法满足企业对数据集中管理、远程监控和智能分析的需求。因此,PLC数采网关应运而生,成为连接现场设备与云端平台的关键桥梁。......
  • ThreadLocal底层原理
    ThreadLocal是Java中的一个线程局部变量工具类,它允许每个线程都有自己独立的变量副本,而不会相互干扰。ThreadLocal的底层原理涉及到ThreadLocalMap和Thread类。在ThreadLocal内部,使用一个ThreadLocalMap对象来存储每个线程对应的变量值。当调用set()方法设置......
  • 什么是PLC设备数据采集?
    在当今工业4.0和智能制造的大背景下,数据的价值日益凸显。特别是对于PLC(可编程逻辑控制器)这类核心工业设备,数据采集显得尤为重要。那么,究竟什么是PLC设备数据采集?它又有何价值呢?今天,就让我们通过介绍HiWooBox,一款卓越的PLC设备数据采集工具,来为您揭开这层面纱。一、PLC设备......
  • 什么是PLC远程控制模块?
    随着工业自动化的不断发展,可编程逻辑控制器(PLC)已成为现代工业设备中不可或缺的核心组件。然而,传统的PLC管理方式往往受限于现场操作和维护,难以满足日益复杂的工业需求。在这一背景下,PLC远程控制模块应运而生,为工业设备的远程管理带来了革命性的变革。今天,我们就来深入探讨一......
  • CANopen转Profinet网关连接西门子PLC与变流器通讯
    CANopen转Profinet网关连接西门子PLC与变流器通讯CANopen转Profinet网关(XD-COPNm20)在智能领域,变流器的应用非常广泛,变流器一般会采用CANopen协议。现场采用台达的变流器(支持CANopen协议)作为CANopen从站,S7-1500系列PLC做主站,通过CANopen转Profinet网关(XD-COPNm20)连接变流器与PLC。......
  • 西门子S7.NET通信库【读】操作详解
    在使用西门子PLC进行工业自动化控制的过程中,经常需要与PLC进行数据交换。S7.NET是一款广泛应用于.NET平台的西门子PLC通信库,它为开发者提供了一系列的API函数,以便在C#、VB.NET等.NET语言中轻松实现与西门子PLC的数据交互。本文将详细介绍如何使用S7.NET通信库执行读操作。1......
  • 深入理解 ELK 中 Logstash 的底层原理 + 填坑指南
    深入理解ELK中Logstash的底层原理+填坑指南<imgsrc="https://pic4.zhimg.com/v2-3afecd9bcad8087524ef7db1f8f51abf_b.jpg"data-rawwidth="722"data-caption=""data-size="normal"data-rawheight="500"class="origi......
  • 笔记(七):事务底层与高可用原理
    日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。尤为重要的是二进制日志(binlog)和事务日志(包括redolog和undolog)。MySQL在事务实现机制上采用的是WAL(Wri......