每周一个编程小例子 :Bit 到 Word 转换的两种实现方案对比

引言

在工业自动化中,PLC(可编程逻辑控制器)是最常见的控制设备之一。PLC 通常用于控制复杂的机械和生产线设备,而在 PLC 编程中,常常需要将多个布尔信号(如输入端的开关、传感器输出等)合并为一个字(Word),以便于进一步的处理或传输。本文将分析和对比两种不同的 Bit 到 Word 转换程序,并探讨它们的优缺点及应用场景。

我们将以两段功能一致的程序为例,分别为“PM_BitToWord_V3”和“PM_BitsToWord_v4”。通过这两段程序的分析,我们可以深入理解它们的结构、实现方式以及在实际应用中的适用性。

1  背景介绍

在 PLC 编程中,我们经常需要处理大量的布尔变量(如传感器信号、开关状态、报警信息等),而这些布尔值的状态往往需要以字(Word)形式进行处理。Word 类型在 PLC 中通常由 16 位组成,因此,如果我们有 16 个布尔变量,常常将它们组合成一个 Word 变量。通过 Bit 到 Word 的转换,不仅可以简化变量的管理,还能提升程序的执行效率。

2  程序概述

2.1 PM_BitToWord_V3:

  • FUNCTION 'PM_BitToWord_V3' : Void
  • { S7_Optimized_Access := 'TRUE' }
  • VERSION : 0.1   
  •       VAR_INPUT      
  •             Bit00 : Bool;     
  •             Bit01 : Bool;     
  •             Bit02 : Bool;     
  •             Bit03 : Bool;     
  •             Bit04 : Bool;     
  •             Bit05 : Bool;     
  •             Bit06 : Bool;     
  •             Bit07 : Bool;     
  •             Bit08 : Bool;     
  •             Bit09 : Bool;     
  •             Bit10 : Bool;     
  •             Bit11 : Bool;     
  •             Bit12 : Bool;     
  •             Bit13 : Bool;     
  •             Bit14 : Bool;     
  •             Bit15 : Bool;   
  •       END_VAR  
  •       VAR_OUTPUT      
  •             WordQ : Word;   
  •       END_VAR  
  •       VAR_TEMP      
  •             TmpWord : Word;   
  •       END_VAR

 

  • BEGIN
  •                // 输入变量:Bit00 至 Bit15 是 16 个布尔变量,分别表示每个位的输入。
  •                // 输出变量:WordQ 是一个 WORD 类型变量,用于存储组合后的字。
  •                #TmpWord.%X0 := #Bit00;
  •                #TmpWord.%X1 := #Bit01;
  •                #TmpWord.%X2 := #Bit02;
  •                #TmpWord.%X3 := #Bit03;
  •                #TmpWord.%X4 := #Bit04;
  •                #TmpWord.%X5 := #Bit05;
  •                #TmpWord.%X6 := #Bit06;
  •                #TmpWord.%X7 := #Bit07;
  •                #TmpWord.%X8 := #Bit08;
  •                #TmpWord.%X9 := #Bit09;
  •                #TmpWord.%X10 := #Bit10;
  •                #TmpWord.%X11 := #Bit11;
  •                #TmpWord.%X12 := #Bit12;
  •                #TmpWord.%X13 := #Bit13;
  •                #TmpWord.%X14 := #Bit14;
  •                #TmpWord.%X15 := #Bit15;
  •                // 输出
  •                #WordQ := #TmpWord;
  • END_FUNCTION

该程序将 16 个单独的布尔变量(Bit00 至 Bit15)直接映射到一个 16 位的 Word 类型变量中。通过直接操作每个布尔变量并将其赋值给临时变量 TmpWord,最终将其存储到 WordQ 变量中。

2.2  PM_BitsToWord_v4:

  • FUNCTION 'PM_BitsToWord_v4' : Void
  • { S7_Optimized_Access := 'TRUE' }
  • VERSION : 0.1   
  •        VAR_INPUT      
  •               BitIn : Array[0..15] of Bool;   
  •        END_VAR    
  •        VAR_OUTPUT      
  •               WordQut : Word; 
  •         END_VAR    
  •        VAR_TEMP      
  •               I : UDInt;   
  •        END_VAR    
  •        VAR CONSTANT      
  •               One : Word := 1; 
  •         END_VAR

 

  • BEGIN
  •                  // 初始化WordOut为0
  •                 #WordQut := 0;
  •                 // 遍历BitIn数组
  •                 FOR #I := 0 TO 15 DO    
  •                         IF #BitIn[#I] THEN        
  •                             #WordQut := #WordQut OR SHL(IN := #One, N := #I);  // 将1左移I位,并与WordOut进行OR操作    
  •                         END_IF;
  •                 END_FOR;
  • END_FUNCTION

该程序通过一个布尔数组BitIn(包含 16 个布尔值)来表示 16 个位的输入。通过循环遍历数组中的每一项,并在布尔值为TRUE时,通过位移操作(左移)将 1 放置到对应的位位置,最终将结果存储到 WordQut 中。

3  对比分析

3.1  程序结构和可读性

PM_BitToWord_V3的结构非常简单,直接通过每个布尔值的单独赋值实现转换。每个布尔值(如 Bit00, Bit01 等)都被映射到TmpWord的相应位(%X0, %X1 等)。这种方式非常直观,易于理解,特别适合一些小规模的应用,或者不需要动态输入的场景。

PM_BitsToWord_v4采用了数组和循环的方式,使得程序的结构更加灵活和可扩展。通过遍历数组,可以方便地处理布尔值的输入,代码也因此更加简洁,特别适合动态输入(例如,布尔数组大小不固定的场景)。这种方式虽然需要更多的编程知识和理解,但在一些复杂的系统中,能带来更大的灵活性和扩展性。

3.2  性能对比

PM_BitToWord_V3的性能相对较好,因为它直接对每个布尔值进行处理,不需要进行额外的数组遍历或位移操作。对于 16 个固定的布尔值,这种直接赋值的方式会在 PLC 的执行环境中更加高效。

PM_BitsToWord_v4需要进行一次循环遍历,每次遍历时需要进行位移操作。这虽然增加了执行时间,但对于更复杂或动态变化的输入,这种灵活性是不可替代的。若需要频繁变动输入点数,或系统要求高灵活性的场合,PM_BitsToWord_v4可能会有更好的适应性。

3.3  扩展性和灵活性

PM_BitToWord_V3的扩展性较差,因为它只适用于 16 个固定的布尔值。如果输入的布尔值数量发生变化,或者需要支持更大的数组,程序的修改将变得非常繁琐且容易出错。

PM_BitsToWord_v4使用了数组,这使得它在扩展性方面更为优秀。如果未来需要处理更多的布尔值,只需要调整数组的大小即可。该程序也能更方便地适应不同大小的输入集,具有更高的灵活性。

3.4  格调

PM_BitsToWord_v4格调明显要高于PM_BitsToWord_v3

4  优缺点

图片

结论

在 PLC 编程中,选择合适的编程方案非常关键。PM_BitToWord_V3适合于输入数量固定且简单的场景,而PM_BitsToWord_v4则适用于输入量不固定或需要灵活调整的系统。在实际应用中,工程师应该根据系统需求、性能要求和未来的扩展性来选择合适的实现方式。

通过对这两段程序的对比分析,我们能够更加清楚地理解不同编程方法的优缺点,从而帮助我们在实际编程中做出更加合理的选择。

图片

2025年03月