IoTClient是一个开源的物联网通讯协议库,支持多种工业协议,包括西门子(SIEMENS)PLC的通讯。本文将详细介绍如何使用IoTClient与SIEMENS PLC进行通讯。
我这里用的仿真 Advanced V5.0
首先,通过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
:通讯端口,通常为102C#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}");
}
textvar 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#数据类型 | smart200 | 1200/1500/300 |
---|---|---|
bit | V1.0 | DB1.DBX1.0 |
byte | VB1 | DB1.DBB1 |
shor ushort | VW2 | DB1.DBW2 |
int uint float | VD4 | DB1.DBD4 |
C#client.Write("DB1.DBD0", (float)3.14); // 明确指定为float类型
client.Close();
IoTClient提供了简单易用的API来与SIEMENS PLC进行通讯。通过本文的示例,您应该能够轻松实现与PLC的数据交互。在实际应用中,请确保考虑到网络状况、错误处理、性能优化等因素,以构建稳定可靠的通讯系统。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!