每周一个编程小例子 :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月