|
工控场景中运算符的使用集中在 ** 算术运算(量程换算)、位运算(寄存器位状态解析)、比较运算(阈值判断)** 三大类,以下是重点讲解: 1. 算术运算符(工控量程转换核心) 工控中常用与模拟量采集换算(如温度、压力、电流信号转换),核心运算符:+、-、*、/、%(取模,用于循环采集计数) 实战场景:模拟量转物理量 工控中模拟量输入(AI)通常为 16 位整数(0~32767 对应 4~20mA 或 0~10V),需通过算术运算转换为实际物理量(如温度 - 50~150℃): using System;namespace IndustrialControl{ class AnalogConvert { static void Main() { // 1. 工控采集:从PLC/传感器读取的16位模拟量数值(示例:寄存器读取值) int aiValue = 16384; // 对应4~20mA的中间值,或0~32767的中间值 // 2. 量程参数(工控标准配置) int aiMin = 0; // 模拟量最小值(16位无符号下限) int aiMax = 32767; // 模拟量最大值(16位无符号上限) double phyMin = -50; // 物理量最小值(温度下限:-50℃) double phyMax = 150; // 物理量最大值(温度上限:150℃) // 3. 算术运算核心公式:线性换算(工控通用量程转换公式) double physicalValue = ((double)aiValue - aiMin) / (aiMax - aiMin) * (phyMax - phyMin) + phyMin; Console.WriteLine($"模拟量值:{aiValue} → 实际温度:{physicalValue:F2}℃"); // 输出:模拟量值:16384 → 实际温度:50.00℃(精准对应中间值) } }} 2. 位运算符(工控状态解析核心) 工控中寄存器位状态判断(如 PLC 的 M 寄存器、传感器的状态位、设备故障码)均依赖位运算,核心运算符及工控用途如下: 位运算符 | 符号 | 工控核心用途 | | 按位与 | & | 判断某一位是否为 1(如:故障位是否触发、设备是否运行) | | 按位或 | ` | ` | 置位某一位(如:控制设备启动、使能某功能) | 按位异或 | ^ | 翻转某一位状态(如:切换设备运行模式、复位临时状态) | | 按位取反 | ~ | 批量翻转位状态(较少用,多用于寄存器掩码配置) | | 左移 | << | 寄存器地址偏移、数值放大(对应工控字节对齐) | | 右移 | >> | 寄存器数据解析、数值缩小(对应高位 / 低位拆分) | |
实战场景 1:判断设备故障位(按位与 &) 工控中常用 1 个字节(8 位)或 2 个字节(16 位)存储设备状态,每一位对应一个状态(如:Bit0 = 电源故障、Bit1 = 运行故障、Bit2 = 通讯故障): using System;namespace IndustrialControl{ class BitOperationStatus { static void Main() { // 1. 从PLC读取的状态寄存器值(1字节=8位,示例:0x05 → 二进制 0000 0101) byte statusReg = 0x05; // 对应Bit0=1(电源故障)、Bit2=1(通讯故障) // 2. 定义状态掩码(每一位对应一个故障,掩码为2^n,n为位索引) byte powerFaultMask = 0x01; // Bit0:电源故障(二进制 0000 0001) byte runFaultMask = 0x02; // Bit1:运行故障(二进制 0000 0010) byte commFaultMask = 0x04; // Bit2:通讯故障(二进制 0000 0100) // 3. 按位与 & 判断状态:结果非0则该位为1(故障触发) bool isPowerFault = (statusReg & powerFaultMask) != 0; bool isRunFault = (statusReg & runFaultMask) != 0; bool isCommFault = (statusReg & commFaultMask) != 0; // 输出结果 Console.WriteLine($"电源故障:{isPowerFault}(触发/未触发)"); Console.WriteLine($"运行故障:{isRunFault}(触发/未触发)"); Console.WriteLine($"通讯故障:{isCommFault}(触发/未触发)"); // 输出:电源故障:True;运行故障:False;通讯故障:True } }} 实战场景 2:置位设备控制位(按位或 |) 工控中通过控制寄存器控制设备动作,需置位指定位(如:Bit0 = 启动设备、Bit1 = 停止设备,置位即设为 1): using System;namespace IndustrialControl{ class BitOperationControl { static void Main() { // 1. 初始控制寄存器值(0x00 → 所有控制位为0,设备待机) byte controlReg = 0x00; // 2. 控制位掩码 byte startMask = 0x01; // Bit0:启动设备 byte resetMask = 0x02; // Bit1:复位设备 // 3. 按位或 | 置位控制位:不影响其他位,仅将指定位置1 controlReg |= startMask; // 置位Bit0,启动设备(controlReg变为 0x01) controlReg |= resetMask; // 置位Bit1,复位设备(controlReg变为 0x03) Console.WriteLine($"控制寄存器值:0x{controlReg:X2}"); // 输出:0x03(二进制 0000 0011,Bit0和Bit1均为1,启动+复位同时生效) } }} 3. 比较运算符(工控阈值判断核心) 工控中用于数值超限判断(如温度过高 / 过低、压力超限、电流异常),核心运算符:>、<、>=、<=、==、!= 实战场景:温度超限报警 using System;namespace IndustrialControl{ class CompareOperatorAlarm { static void Main() { // 1. 采集的实时温度(来自模拟量转换) double realTemp = 155.5; // 2. 工控阈值配置(上限:150℃,下限:-50℃) double tempUpperLimit = 150.0; double tempLowerLimit = -50.0; // 3. 比较运算判断超限 bool isOverTemp = realTemp > tempUpperLimit; bool isUnderTemp = realTemp < tempLowerLimit; if (isOverTemp) { Console.WriteLine($"报警:温度超限!当前温度{realTemp}℃ > 上限{tempUpperLimit}℃"); } else if (isUnderTemp) { Console.WriteLine($"报警:温度过低!当前温度{realTemp}℃ < 下限{tempLowerLimit}℃"); } else { Console.WriteLine($"温度正常:{realTemp}℃"); } // 输出:报警:温度超限!当前温度155.5℃ > 上限150℃ } }} 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |