西门子PLC常用底层逻辑块分享_温度模拟量读取


前言

本文分享一个自己编写的温度模拟量读取逻辑块。


一、功能概述

  1. 模拟量输入转换,并设置超量程(0-27648)报警:当输入值<0或>27648时,输出值为0或27648,同时报警;
  2. 设置采样频率:正常情况下,每个扫描周期计算一次,加上采样周期后在每个设定时间内计算一次;
  3. 具有滤波功能,可设置滤波次数(最大20);
  4. 可设置低低报警、低报警、高报警、高高报警数值;
  5. 当CPU启动时的第一个扫描周期,或按下“初始化按钮”后,将模拟量参数设置为默认值,其他情况下可在上位机界面修改。

二、温度模拟量读取程序编写

1.创建自定义数据类型

在这里插入图片描述

2.创建FB功能块“温度模拟量只读”

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

3.编写程序

代码如下:
1.转换时间,把浮点数转换为时间

#Time := DINT_TO_TIME(REAL_TO_DINT(#HMI.CY_CYCLE * 1000.0) - 10); //DINT 1000转成TIME表示1S,若CY_CYCLE=1,则实际时间为1s
                                                                  //“-10”是为了将1S分割成990ms低电平和10ms高电平
#LL_Time := DINT_TO_TIME(REAL_TO_DINT(#LL_T_Set * 1000.0));
#L_Time := DINT_TO_TIME(REAL_TO_DINT(#L_T_Set * 1000.0));
#H_Time := DINT_TO_TIME(REAL_TO_DINT(#H_T_Set * 1000.0));
#HH_Time := DINT_TO_TIME(REAL_TO_DINT(#HH_T_Set * 1000.0));

2.采样周期

#T[0](IN := NOT #T[1].Q, //T0延时990ms后接通,然后TI开始延时10ms,10ms后T1接通,T0断掉,T1断掉,T0重新开始延时990ms,循环往复
    PT := #Time);
#T[1](IN := #T[0].Q,
      PT := T#10ms);
#P0(CLK := #T[0].Q); //检测T0上升沿信号,触发模拟量转换计算,以此来实现每1s计算一次,即采样周期为1s

3.超量程报警

#AI := #AI_IN; //AI_IN是输入变量,无法赋值,故先将输入AI_IN暂存到AI里,之后用AI参与运算
IF #AI < #IN_MIN THEN
    #AI := #IN_MIN;
    #Over_Alarm_L := 1;
ELSE
    #Over_Alarm_L := 0;
END_IF;

IF #AI > #IN_MAX THEN
    #AI := #IN_MAX;
    #Over_Alarm_H := 1;
ELSE
    #Over_Alarm_H := 0;
END_IF;

IF #Over_Alarm_L OR #Over_Alarm_H THEN
    #HMI.Over_Alarm := 1;
END_IF;

IF NOT #Over_Alarm_L AND NOT #Over_Alarm_H THEN
    #HMI.Over_Alarm := 0;
END_IF;

4.计算输出值

#OUT_TC := ((INT_TO_REAL(#AI) - #IN_MIN) / (#IN_MAX - #IN_MIN)) * (#HMI.OUT_MAX - #HMI.OUT_MIN) + #HMI.OUT_MIN; //计算没有经过滤波的热电偶输出值
#OUT_RTD := INT_TO_REAL(#AI) / 10.0; //计算没有经过滤波的热电阻输出值

IF #HMI.Mode THEN //模式选择及输出
    #OUT := #OUT_RTD; 
ELSE
    #OUT := #OUT_TC;
END_IF;

IF #P0.Q THEN
    FOR #N := #HMI.Filt_Times TO 1 BY -1 DO //从最后一个值开始,依次将数组中的后一个值倒序赋给前一个值
        #Filts[#N] := #Filts[#N - 1];
    END_FOR;
    #Filts[0] := #OUT; //将输出值赋给数组中的第一个值
    
    #SUM := 0;
    FOR #N := 0 TO #HMI.Filt_Times - 1 DO //计算滤波数组的和
        #SUM := #SUM + #Filts[#N];
    END_FOR;
    #Filt_OUT := #SUM / #HMI.Filt_Times; //计算平均值
END_IF;

#AI_OUT := #Filt_OUT;
#HMI.AI_OUT := #Filt_OUT;

5.报警

//低低报
#T[2](IN := #AI_OUT <= #HMI.LL_Set AND NOT #HMI.LL_Act AND #HMI.LL_Set <> 0.0,
      PT := #LL_Time); 
IF #T[2].Q THEN
    #HMI.LL_Alarm := 1;
    #LL_Alarm := 1;
    IF NOT #HMI.LL_Lock THEN
        #HMI.LL_Latch := 1;
    END_IF;
ELSE
    #HMI.LL_Alarm := 0;
    #LL_Alarm := 0;
END_IF;

//低报
#T[3](IN := #AI_OUT < #HMI.L_Set AND #AI_OUT > #HMI.LL_Set AND NOT #HMI.L_Act AND #HMI.L_Set <> 0.0,
      PT := #L_Time);
IF #T[3].Q THEN
    #HMI.L_Alarm := 1;
    #L_Alarm := 1;
    IF NOT #HMI.L_Lock THEN
        #HMI.L_Latch := 1;
    END_IF;
ELSE
    #HMI.L_Alarm := 0;
    #L_Alarm := 0;
END_IF;

//高报
#T[4](IN := #AI_OUT < #HMI.HH_Set AND #AI_OUT > #HMI.H_Set AND NOT #HMI.H_Act AND #HMI.H_Set <> 0.0,
      PT := #L_Time);
IF #T[4].Q THEN
    #HMI.H_Alarm := 1;
    #H_Alarm := 1;
    IF NOT #HMI.H_Lock THEN
        #HMI.H_Latch := 1;
    END_IF;
ELSE
    #HMI.H_Alarm := 0;
    #H_Alarm := 0;
END_IF;

//高高报
#T[5](IN := #AI_OUT >= #HMI.HH_Set AND NOT #HMI.HH_Act AND #HMI.HH_Set <> 0.0,
      PT := #L_Time);
IF #T[5].Q THEN
    #HMI.HH_Alarm := 1;
    #HH_Alarm := 1;
    IF NOT #HMI.HH_Lock THEN
        #HMI.HH_Latch := 1;
    END_IF;
ELSE
    #HMI.HH_Alarm := 0;
    #HH_Alarm := 0;
END_IF;

6.复位

IF #HMI.HMI_Rst THEN
    #HMI.LL_Latch := 0;
    #HMI.L_Latch := 0;
    #HMI.H_Latch := 0;
    #HMI.HH_Latch := 0;
END_IF;

IF NOT "AlwaysFALSE" THEN
    #HMI.HMI_Rst := 0;
END_IF;

三、模拟量参数设置程序编写

1.创建FB功能块“模拟量参数设定”

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

2.编写程序

1.在FB功能块“模拟量参数设定”中,调用FB功能块“温度模拟量只读”。
在这里插入图片描述
2.其它代码如下:

IF #FirstScan OR #模拟量参数设定初始化 THEN
    #HMI.OUT_MAX := #OUT_MAX;
    #HMI.OUT_MIN := #OUT_MIN;
    #HMI.LL_Set := #LL_Set;
    #HMI.L_Set := #L_Set;
    #HMI.H_Set := #H_Set;
    #HMI.HH_Set := #HH_Set;
    #HMI.CY_CYCLE := #CY_CYCLE;
    #HMI.Filt_Times := #Filt_Times;
    #HMI.Mode := #Mode;
END_IF;
<think>嗯,用户问的是Linux逻辑块,我需要先确定他们指的是什么。可能是指逻辑块设备,或者是存储中的逻辑块概念?首先,回忆一下Linux中的块设备。块设备是按固定大小的块进行数据存取的设备,比如硬盘、SSD这些。逻辑块设备可能是由物理块设备通过某种抽象层呈现出来的,比如LVM(逻辑卷管理)中的逻辑卷。 那逻辑块的大小通常是多大呢?传统的可能是512字节,但现在很多用4K的。需要提到逻辑块与物理块的区别,物理块是硬件实际的块大小,而逻辑块是操作系统或软件层抽象出来的。LVM中的逻辑卷就是典型的例子,它们可以跨越多个物理磁盘,提供更大的存储池。 另外,用户可能想知道逻辑块在文件系统中的作用。文件系统将数据组织成逻辑块来管理,比如ext4的块大小可以是1K、2K、4K等。这时候可能需要解释逻辑块在读写操作中的应用,比如每次读取一个块,提高效率。 还有,逻辑块地址(LBA)的概念,用来替代旧的CHS寻址方式,LBA是线性的地址空间,每个逻辑块有唯一的编号。这可能也是用户想了解的。 需要检查是否有其他相关的概念,比如RAID中的块划分,或者逻辑卷的条带化,这些都可能涉及到逻辑块的使用。确保回答覆盖逻辑块的定义、作用、常见应用场景,比如LVM、文件系统、LBA等。 另外,用户可能对如何查看逻辑块信息感兴趣,可以提到一些命令,比如lsblk、fdisk、blockdev等,展示块设备的信息,包括块大小。例如,使用blockdev --getbsz /dev/sda可以获取块大小。 注意用户可能存在的混淆点,比如逻辑卷和物理卷的区别,逻辑块与扇区的关系。需要明确逻辑块是操作系统层面的抽象,而扇区是硬件层面的单位。通常一个逻辑块对应多个扇区,比如4K逻辑块对应8个512字节的扇区。 最后,确保回答结构清晰,分点解释,让用户能够逐步理解逻辑块的概念、作用、应用场景和相关命令。避免使用过于专业的术语,用通俗的中文解释,必要时举例说明。</think>### Linux逻辑块详解 --- #### 1. **逻辑块的定义** 在Linux系统中,**逻辑块**(Logical Block)是操作系统对存储设备(如硬盘、SSD)进行数据读写的最小单位。它是操作系统抽象出的存储单元,与物理硬件的**扇区**(Sector)相对应,但逻辑块大小通常为扇区大小的整数倍。 - **物理扇区**:硬件层面的最小单元,传统机械硬盘通常为512字节,现代设备可能为4K(4096字节)。 - **逻辑块**:操作系统层面的抽象单元,可通过配置调整(如4K、8K等)。 --- #### 2. **逻辑块的作用** - **统一管理**:屏蔽不同硬件扇区大小的差异,提供一致的访问接口。 - **性能优化**:通过合并多个扇区为更大的逻辑块,减少I/O操作次数。 - **文件系统基础**:文件系统(如ext4、XFS)以逻辑块为单位管理磁盘空间(如分配、读写)。 --- #### 3. **逻辑块地址(LBA)** - **LBA(Logical Block Addressing)**:一种线性寻址方式,为每个逻辑块分配唯一编号,取代传统的柱面-磁头-扇区(CHS)寻址。 - **优势**:简化地址计算,支持大容量存储设备。 --- #### 4. **逻辑块与文件系统** 文件系统将逻辑块进一步组织为更高级结构: - **块组(Block Group)**:ext4文件系统将逻辑块划分为多个块组,每个组包含元数据和数据块。 - **块大小**:格式化时可指定(如1K、4K)。例如: ```bash mkfs.ext4 -b 4096 /dev/sda1 # 指定逻辑块大小为4K ``` --- #### 5. **逻辑块设备(Logical Block Device)** 通过软件抽象层实现的虚拟块设备,例如: - **LVM逻辑卷**:将多个物理卷(PV)组合成逻辑卷(LV),动态调整大小。 - **RAID**:通过条带化(Striping)或镜像(Mirroring)管理多个磁盘的逻辑块。 --- #### 6. **查看逻辑块信息** - **查看块设备信息**: ```bash lsblk # 列出所有块设备 ``` - **获取逻辑块大小**: ```bash blockdev --getbsz /dev/sda # 输出逻辑块大小(字节) ``` - **查看文件系统块大小**: ```bash dumpe2fs /dev/sda1 | grep "Block size" ``` --- #### 7. **逻辑块与性能** - **对齐问题**:若逻辑块与物理扇区未对齐(如4K逻辑块使用512B扇区),可能导致性能下降。 - **最佳实践**:分区时确保逻辑块与物理扇区对齐。工具如`parted`支持自动对齐: ```bash parted -a optimal /dev/sda ``` --- #### 8. **典型应用场景** - **数据库优化**:根据负载调整逻辑块大小(如OLTP场景使用更小块以减少浪费)。 - **虚拟化**:虚拟机镜像文件(如qcow2)通过逻辑块映射提升性能。 - **容器存储**:联合文件系统(OverlayFS)基于逻辑块管理分层存储。 --- ### 总结 Linux逻辑块是连接物理存储与文件系统的关键抽象层,通过合理配置逻辑块大小和对齐策略,可以显著提升存储性能与可靠性。理解逻辑块的工作机制,有助于优化系统设计(如数据库、虚拟化)和故障排查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值