编辑
2025-09-28
C#
00

目录

安装
初始化连接
读取数据
读取布尔值
读取短整型
读取整型
读取浮点型
读取字符串
写入数据
写入布尔值
写入短整型
写入整型
写入浮点型
写入字符串
批量读取
批量写入
注意事项
结语

IoTClient是一个开源的物联网通讯协议库,支持多种工业协议,包括西门子(SIEMENS)PLC的通讯。本文将详细介绍如何使用IoTClient与SIEMENS PLC进行通讯。

我这里用的仿真 Advanced V5.0

image.png

安装

首先,通过NuGet包管理器安装IoTClient:

C#
Install-Package IoTClient

或者在项目中添加包引用:

XML
<PackageReference Include="IoTClient" Version="x.x.x" />

初始化连接

使用SiemensClient类来创建与PLC的连接:

C#
client = new SiemensClient(SiemensVersion.S7_1500, "192.168.0.10", 102); client.Open(); if (client.Connected) { stsMain_lblStatus.Text = "Connected"; } else { stsMain_lblStatus.Text = "Disconnected"; }

参数说明:

  • SiemensVersion.S7_1200:PLC型号,可选S7_200、S7_300、S7_400、S7_1200、S7_1500等
  • "192.168.0.10":PLC的IP地址
  • 102:通讯端口,通常为102

读取数据

image.png

读取布尔值

C#
var result = client.ReadBoolean("DB1.0"); if (result.IsSucceed) { MessageBox.Show($"DB1.0的值为:{result.Value}"); } else { MessageBox.Show($"读取失败:{result.Err}"); }

读取短整型

C#
var result = client.ReadInt16("DB1.DBW2"); if (result.IsSucceed) { MessageBox.Show($"DB1.DBW2的值为:{result.Value}"); }

读取整型

C#
var result = client.ReadInt32("DB1.DBD4"); if (result.IsSucceed) { MessageBox.Show($"DB1.DBW4的值为:{result.Value}"); }

读取浮点型

C#
var result = client.ReadFloat("DB1.DBD8"); if (result.IsSucceed) { MessageBox.Show($"DB1.DBW8的值为:{result.Value}"); }

读取字符串

C#
var result = client.ReadString("DB1.DBW16", 10); // 读取10个字符 if (result.IsSucceed) { //西门子协议比较特殊,需要跳过前2个字节,以后讲S7协议解析数据细说 byte[] bytes = result.Value.Skip(2).ToArray(); string msg=System.Text.Encoding.Default.GetString(bytes); MessageBox.Show($"DB1.DBW16的值为:{msg}"); }

写入数据

写入布尔值

text
var result = client.Write("DB1.0", true); if (result.IsSucceed) { MessageBox.Show("写入成功"); } else { MessageBox.Show($"写入失败:{result.Err}"); }

写入短整型

C#
var result = client.Write("DB1.DBW2", (short)12345); if (result.IsSucceed) { MessageBox.Show("写入成功"); } else { MessageBox.Show($"写入失败:{result.Err}"); }

写入整型

C#
var result = client.Write("DB1.DBD4", 123456789); if (result.IsSucceed) { MessageBox.Show("写入成功"); } else { MessageBox.Show($"写入失败:{result.Err}"); }

写入浮点型

C#
var result = client.Write("DB1.DBD8", 3.14159f); if (result.IsSucceed) { MessageBox.Show("写入成功"); } else { MessageBox.Show($"写入失败:{result.Err}"); }

写入字符串

C#
var result = client.Write("DB1.DBW16", "Hello PLC"); if (result.IsSucceed) { MessageBox.Show("写入成功"); } else { MessageBox.Show($"写入失败:{result.Err}"); }

注意:如果是用这种方式写入的,对于读取时不需要Skip(2)了。

批量读取

批量读取可以提高效率:

C#
Dictionary<string, DataTypeEnum> addresses = new Dictionary<string, DataTypeEnum> { { "DB1.DBX0.0", DataTypeEnum.Bool }, { "DB1.DBW2", DataTypeEnum.Int16 }, { "DB1.DBD4", DataTypeEnum.Int32 }, { "DB1.DBD8", DataTypeEnum.Float } }; var results = client.BatchRead(addresses); foreach (var item in results.Value) { MessageBox.Show($"{item.Key}的值为:{item.Value}"); }

批量写入

同样,批量写入也可以提高效率:

C#
Dictionary<string, object> values = new Dictionary<string, object> { { "DB1.DBX0.0", true }, { "DB1.DBW2", (short)123 }, { "DB1.DBD4", 567 }, { "DB1.DBD8", 1.09922 } }; var result = client.BatchWrite(values); if (result.IsSucceed) { MessageBox.Show("批量写入成功"); } else { MessageBox.Show($"批量写入失败:{result.Err}"); }

注意事项

C#数据类型smart2001200/1500/300
bitV1.0DB1.DBX1.0
byteVB1DB1.DBB1
shor ushortVW2DB1.DBW2
int uint floatVD4DB1.DBD4
  1. 地址格式:
    • 位地址:DBx.DBXy.z,如DB1.DBX0.0
    • 字地址:DBx.DBWy,如DB1.DBW0
    • 双字地址:DBx.DBDy,如DB1.DBD0
  2. 数据类型:写入时需要明确数据类型,例如:
C#
client.Write("DB1.DBD0", (float)3.14); // 明确指定为float类型
  1. 连接管理:
    • 如果频繁读写,建议保持连接打开状态
    • 使用完毕后记得关闭连接:client.Close();
  2. 错误处理:每次操作都应检查IsSucceed属性,并适当处理错误情况
  3. 批量操作:对于需要读写多个地址的场景,优先使用BatchRead和BatchWrite方法以提高效率

结语

IoTClient提供了简单易用的API来与SIEMENS PLC进行通讯。通过本文的示例,您应该能够轻松实现与PLC的数据交互。在实际应用中,请确保考虑到网络状况、错误处理、性能优化等因素,以构建稳定可靠的通讯系统。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!