PLC的数据类型
📊 PLC 常用数据类型及字节数
为了让你有更清晰的认识,我把常用数据类型和它们与 C# 的对应关系整理成表格。这些是 IEC 61131-3 标准中定义的类型,也是大多数主流 PLC(如西门子、罗克韦尔、倍福)支持的。
| 数据类型 | 英文全称 | 字节数 | 取值范围 / 说明 | 对应 C# 类型 |
|---|---|---|---|---|
| BOOL | Boolean | 1 位 (Bit) | TRUE / FALSE | bool |
| BYTE | Byte | 1 | 0 ~ 255 | byte |
| WORD | Word | 2 | 0 ~ 65535 | ushort |
| DWORD | Double Word | 4 | 0 ~ 4,294,967,295 | uint |
| LWORD | Long Word | 8 | 0 ~ 2^64-1 | ulong |
| SINT | Short Integer | 1 | -128 ~ 127 | sbyte |
| USINT | Unsigned Short Integer | 1 | 0 ~ 255 | byte |
| INT | Integer | 2 | -32,768 ~ 32,767 | short |
| UINT | Unsigned Integer | 2 | 0 ~ 65,535 | ushort |
| DINT | Double Integer | 4 | -2,147,483,648 ~ 2,147,483,647 | int |
| UDINT | Unsigned Double Integer | 4 | 0 ~ 4,294,967,295 | uint |
| LINT | Long Integer | 8 | -2^63 ~ 2^63-1 | long |
| ULINT | Unsigned Long Integer | 8 | 0 ~ 2^64-1 | ulong |
| REAL | Real | 4 | 32位浮点数 (约 ±1.18e-38 ~ ±3.4e38) | float |
| LREAL | Long Real | 8 | 64位浮点数 (约 ±2.23e-308 ~ ±1.79e308) | double |
| WSTRING | Wide String | 2 * 字符数 | Unicode 字符串 | string (UTF-16) |
| TIME | Time | 4 | 持续时间 (单位:毫秒) | TimeSpan (需手动转换) |
| DATE | Date | 4 | 日期 (自 1970-01-01 起的天数) | DateTime (需手动转换) |
| DT | Date and Time | 8 | 日期和时间 | DateTime (需手动转换) |
🔄 为什么需要类型转换?
这背后有几个核心原因,在你编写通讯代码时至关重要:
- 内存大小和位宽不同:这是最根本的原因。例如,PLC 的
DINT是 32 位,而 C# 的int也是 32 位,这种可以安全映射。但 PLC 的INT是 16 位,如果你在 C# 中用一个 32 位的int去接它,虽然能接住,但如果直接操作数组或指针,不进行正确的字节序转换就可能出错。 - 字节序(Endianness)问题:这是工控领域最容易踩的坑之一。通常 Intel 架构的 PC 是小端(Little-Endian),而很多 PLC(特别是西门子)是大端(Big-Endian)。这意味着,你从 PLC 读取的 4 个字节
[01, 02, 03, 04],在 C# 中解析为int时,可能是0x01020304(大端)或0x04030201(小端),取决于你的处理方式。如果不进行转换,数值会完全错误。 - PLC 内存的“位”访问特性:PLC 允许按位访问(
BOOL),而 C# 通常按字节访问。当你需要从 PLC 的WORD中提取某一个BOOL位时,就需要通过位运算来转换。 - 字符串编码差异:早期 PLC 常用
STRING(ASCII),而现在常用WSTRING(Unicode)。C# 的string是 UTF-16,和 PLC 的WSTRING通常能直接对应,但和STRING则需要进行编码转换。
💻 实战中的转换策略
- 使用
BitConverter类:对于数值类型,最常用的是BitConverter.ToInt32()/ToSingle()以及BitConverter.GetBytes()。 - 手动字节顺序转换:如果遇到大端/小端问题,需要在使用
BitConverter之前,先对字节数组调用Array.Reverse()。 - 使用高级库:在像 S7.NET Plus、Sharp7 等成熟的 PLC 通讯库中,它们封装了这些转换逻辑,提供类似
ReadInt()、ReadFloat()的方法,直接返回正确的 C# 类型,让你无需关心底层细节。
💎 总结
PLC 和 C# 交互时,数据类型转换是不可避免的日常工作。理解这些基础类型的大小和它们的对应关系,是写出健壮通讯代码的第一步。在你的上位机开发中,如果要对 PLC 进行读写,掌握这些转换是必须的技能。

浙公网安备 33010602011771号