长沙网站建设外贸,企业 怎么建交互网站,wordpress评论不显示头像,网络广告推广网站C#与PLC的数据类型1. PLC与二进制2. PLC数据类型2.1 PLC与C#主要数据类型2.2 PLC与C#的其他数据类型3. PLC寻址1. PLC与二进制 地球上的CPU和RAM在硬件层面仅计算和存储二进制0和1#xff08;量子计算硬件除外#xff09;#xff0c;PLC内部本质上也只存储、计算二进制0和1量子计算硬件除外PLC内部本质上也只存储、计算二进制0和1上层应用系统会通过系统内默认的编码规则比如ASCII或者UTF8将信息编码后最终得到Bit二进制数据写入PLC逻辑控制器以实现工业设备的自动化同时从PLC寻址读取数据后解码Bit二进制数据以监视工业自动化设备的状态。2. PLC数据类型2.1 PLC与C#主要数据类型PLC数据类型Byte长度Bit长度对齐要求数值范围地址说明C#数据类型数值范围Bool1字节1位无严格对齐要求但通常按字节或字边界访问以提高效率比如VB101.00 或 1Byte是内存的最小寻址单元会强制分配1个Byte8 Bits的内存空间但实际只用1个Bit位最右边的低位booltrue / falseByte1字节8位无严格对齐要求但通常按字节或字边界访问以提高效率比如VB102无符号整数0 ~ 255有符号整数-128 ~ 127存储简单数据如设备状态编码byte无符号整数0 ~ 255PLC程序的编码规则可以将Bit数据解析为负数而C#是强类型语言不允许byte为负数Word2字节16位起始地址必须是偶数能被2整除比如VW106无符号整数0 ~ 65535存储中等规模数据处理无符号整数运算ushort与PLC一致DWord4字节32位起始地址必须是偶数能被4整除比如VD110无符号整数0 ~ 4294967295存储大规模数据进行复杂计算uint与PLC一致Int2字节16位起始地址必须是偶数能被2整除比如VW114有符号整数-32768 ~ 32767处理有符号整数运算short与PLC一致DINT4字节32位起始地址必须是偶数能被4整除比如VD118有符号整数-2147483648 ~ 2147483647处理大范围有符号整数运算精度与性能平衡int与PLC一致Real4字节32位起始地址必须是偶数能被4整除比如VD122浮点数范围广泛精度最高为6位有效数字表示带有小数部分的数值进行高精度计算float与PLC一致2.2 PLC与C#的其他数据类型C#除了上述数据类型之外还有其他的数据类型比如long、double、decimal、string等常见数据类型那么这些数据类型如何在PLC里面读写呢通用的做法就是在C#控制数据最大的长度注意string是可变的在每次写入前先将Encoding得到的Bit数据里面的高位补0再把输入写入PLC地址即可。publicbyte[]PrepareStringDataOptimized(stringtext,intmaxLength){byte[]buffernewbyte[maxLength];byte[]textBytesEncoding.ASCII.GetBytes(text);intcopyLengthMath.Min(textBytes.Length,maxLength);// 一次性复制数据Buffer.BlockCopy(textBytes,0,buffer,0,copyLength);// 高效清零剩余部分if(copyLengthmaxLength){Array.Clear(buffer,copyLength,maxLength-copyLength);}returnbuffer;}或者使用以下方法publicclassPLCStringManager{// 方法1使用结束符publicstaticbyte[]ToCString(stringtext,inttotalLength){byte[]buffernewbyte[totalLength];byte[]dataEncoding.ASCII.GetBytes(text);// 复制数据intcopyLengthMath.Min(data.Length,totalLength-1);Array.Copy(data,buffer,copyLength);// 添加结束符buffer[copyLength]0;returnbuffer;}// 方法2长度寄存器数据publicvoidWriteStringWithLength(stringtext,intdataAddress,intlengthAddress){byte[]dataEncoding.ASCII.GetBytes(text);// 1. 先写长度单独的WORD/DINTplc.Write(lengthAddress,data.Length);// 2. 再写数据byte[]buffernewbyte[data.Length];Array.Copy(data,buffer,data.Length);plc.WriteBytes(dataAddress,buffer);}// 方法3定长数组空格填充publicstaticbyte[]ToFixedLengthString(stringtext,intlength){byte[]buffernewbyte[length];byte[]dataEncoding.ASCII.GetBytes(text.PadRight(length, ));Array.Copy(data,buffer,Math.Min(data.Length,length));returnbuffer;}}3. PLC寻址PLC地址只是告诉CPU“去内存的哪个位置拿多少位Bit数据”至于这些位应该被解释成什么整数、浮点数、字符CPU完全不知道也不关心。比如声明一个变量V100V100 ~ V104没有被占用先写入一个REAL值再复位V100 ~ V104为0然后写入Word值再读取Word值最后也能正确读取之前写入的Word值。所以PLC寻址跟数据类型没有半毛钱关系。