news 2026/7/9 15:10:47

C#与PLC的数据类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#与PLC的数据类型

C#与PLC的数据类型

  • 1. PLC与二进制
  • 2. PLC数据类型
    • 2.1 PLC与C#主要数据类型
    • 2.2 PLC与C#的其他数据类型
  • 3. PLC寻址

1. PLC与二进制

地球上的CPU和RAM在硬件层面仅计算和存储二进制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个Byte(8 Bits)的内存空间,但实际只用1个Bit位(最右边的低位)booltrue / false
Byte1字节8位无严格对齐要求,但通常按字节或字边界访问以提高效率,比如:VB102无符号整数:0 ~ 255;有符号整数:-128 ~ 127存储简单数据,如设备状态编码byte无符号整数:0 ~ 255(PLC程序的编码规则可以将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[]buffer=newbyte[maxLength];byte[]textBytes=Encoding.ASCII.GetBytes(text);intcopyLength=Math.Min(textBytes.Length,maxLength);// 一次性复制数据Buffer.BlockCopy(textBytes,0,buffer,0,copyLength);// 高效清零剩余部分if(copyLength<maxLength){Array.Clear(buffer,copyLength,maxLength-copyLength);}returnbuffer;}

或者使用以下方法

publicclassPLCStringManager{// 方法1:使用结束符publicstaticbyte[]ToCString(stringtext,inttotalLength){byte[]buffer=newbyte[totalLength];byte[]data=Encoding.ASCII.GetBytes(text);// 复制数据intcopyLength=Math.Min(data.Length,totalLength-1);Array.Copy(data,buffer,copyLength);// 添加结束符buffer[copyLength]=0;returnbuffer;}// 方法2:长度寄存器+数据publicvoidWriteStringWithLength(stringtext,intdataAddress,intlengthAddress){byte[]data=Encoding.ASCII.GetBytes(text);// 1. 先写长度(单独的WORD/DINT)plc.Write(lengthAddress,data.Length);// 2. 再写数据byte[]buffer=newbyte[data.Length];Array.Copy(data,buffer,data.Length);plc.WriteBytes(dataAddress,buffer);}// 方法3:定长数组+空格填充publicstaticbyte[]ToFixedLengthString(stringtext,intlength){byte[]buffer=newbyte[length];byte[]data=Encoding.ASCII.GetBytes(text.PadRight(length,' '));Array.Copy(data,buffer,Math.Min(data.Length,length));returnbuffer;}}

3. PLC寻址

PLC地址只是告诉CPU:“去内存的哪个位置拿多少位Bit数据”,至于这些位应该被解释成什么(整数、浮点数、字符),CPU完全不知道也不关心。
比如,声明一个变量V100(V100 ~ V104没有被占用),先写入一个REAL值,再复位V100 ~ V104为0,然后写入Word值再读取Word值,最后也能正确读取之前写入的Word值。所以,PLC寻址跟数据类型没有半毛钱关系。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 10:05:37

Kotaemon政府公开数据接入实践:政务问答系统构建

Kotaemon政府公开数据接入实践&#xff1a;政务问答系统构建 在政务服务日益数字化的今天&#xff0c;一个常见的现实是&#xff1a;政策文件越来越完善&#xff0c;公开渠道越来越多&#xff0c;但普通市民要弄清楚“自己能不能办、需要哪些材料、流程怎么走”&#xff0c;依然…

作者头像 李华
网站建设 2026/7/10 7:16:38

电商网站如何利用Cloudflare防御DDoS攻击实战案例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个电商网站安全防护演示应用&#xff0c;模拟DDoS攻击场景并展示Cloudflare的防护效果。要求&#xff1a;1. 搭建简易电商网站前端 2. 集成Cloudflare防护服务 3. 创建攻击模…

作者头像 李华
网站建设 2026/7/10 1:53:37

传统调试VS AI修复:SSL连接问题处理效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个效率对比工具&#xff0c;模拟两种SSL问题解决流程&#xff1a;1.传统手动排查流程 2.AI辅助自动修复流程。要求记录每个步骤耗时&#xff0c;生成对比图表。包含常见SSL错…

作者头像 李华
网站建设 2026/7/9 12:46:57

Figma到Unity导入工具:5个步骤彻底告别UI设计重建噩梦

Figma到Unity导入工具&#xff1a;5个步骤彻底告别UI设计重建噩梦 【免费下载链接】FigmaToUnityImporter The project that imports nodes from Figma into unity. 项目地址: https://gitcode.com/gh_mirrors/fi/FigmaToUnityImporter 还在为Figma设计稿到Unity实现之间…

作者头像 李华
网站建设 2026/7/10 10:10:45

大模型技术如何应用在多自由度机械臂与灵巧手的控制应用

大模型&#xff08;Large Models&#xff09;&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;和多模态大模型&#xff08;Multimodal Large Models, MMLMs&#xff09;&#xff0c;近年来在机器人控制领域展现出巨大潜力。将大模型技术应用于多自由度机械臂与灵巧…

作者头像 李华