Skip to content

Commit dc25c41

Browse files
committed
1、SiemensClient 批量数据写
2、MQTT操作demo 3、手动更新
1 parent a997a90 commit dc25c41

31 files changed

+2013
-221
lines changed

IoTClient.Tests/PLCTests/SiemensClient_Tests.cs

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public SiemensClient_Tests()
1515
{
1616
var ip = IPAddress.Parse("SiemensClientIp".GetConfig());
1717
var port = int.Parse("SiemensClientPort".GetConfig());
18-
client = new SiemensClient(SiemensVersion.S7_200Smart, new IPEndPoint(ip, port));
18+
client = new SiemensClient(SiemensVersion.S7_1500, new IPEndPoint(ip, port));
1919
}
2020

2121
[Fact]
@@ -109,9 +109,9 @@ public void test()
109109
//TODO 最多只能批量读取 19个?
110110
Dictionary<string, DataTypeEnum> addresses = new Dictionary<string, DataTypeEnum>();
111111

112-
addresses.Add("V1000", DataTypeEnum.Float);
113-
addresses.Add("I0.0", DataTypeEnum.Bool);
114-
addresses.Add("V4109", DataTypeEnum.Byte);
112+
//addresses.Add("V1000", DataTypeEnum.Float);
113+
//addresses.Add("I0.0", DataTypeEnum.Bool);
114+
//addresses.Add("V4109", DataTypeEnum.Byte);
115115
//addresses.Add("V1004", DataTypeEnum.Float);
116116

117117
//addresses.Add("V1000", DataTypeEnum.Float);
@@ -137,7 +137,50 @@ public void test()
137137
//addresses.Add("V1254", DataTypeEnum.Float);
138138
//addresses.Add("V1258", DataTypeEnum.Float);
139139

140-
var obj = client.Read(addresses);
140+
141+
//addresses.Add("V1012", DataTypeEnum.Float);
142+
//addresses.Add("V1076 ", DataTypeEnum.UInt32);
143+
//addresses.Add("V5056 ", DataTypeEnum.Float);
144+
//addresses.Add("V5232 ", DataTypeEnum.Float);
145+
146+
//addresses.Add("I0.0 ", DataTypeEnum.Bool);
147+
//addresses.Add("I0.1 ", DataTypeEnum.Bool);
148+
//addresses.Add("I0.2 ", DataTypeEnum.Bool);
149+
//addresses.Add("I0.3 ", DataTypeEnum.Bool);
150+
//addresses.Add("I0.4 ", DataTypeEnum.Bool);
151+
//addresses.Add("I0.5 ", DataTypeEnum.Bool);
152+
//addresses.Add("I0.6 ", DataTypeEnum.Bool);
153+
//addresses.Add("I0.7 ", DataTypeEnum.Bool);
154+
155+
//addresses.Add("I1.0 ", DataTypeEnum.Bool);
156+
//addresses.Add("I1.1 ", DataTypeEnum.Bool);
157+
//addresses.Add("I1.2 ", DataTypeEnum.Bool);
158+
//addresses.Add("I1.3 ", DataTypeEnum.Bool);
159+
//addresses.Add("I1.4 ", DataTypeEnum.Bool);
160+
//addresses.Add("I1.5 ", DataTypeEnum.Bool);
161+
//addresses.Add("I1.6 ", DataTypeEnum.Bool);
162+
//addresses.Add("I1.7 ", DataTypeEnum.Bool);
163+
164+
165+
//client.Write("DB4.0", (float)6);
166+
//client.Write("DB4.12", (float)9);
167+
//client.Write("DB1.410.0", false);
168+
//client.Write("DB1.410.0", true);
169+
170+
var result = client.BatchRead(addresses);
171+
172+
Dictionary<string, object> newAddresses = new Dictionary<string, object>();
173+
newAddresses.Add("DB4.24", (float)1);
174+
newAddresses.Add("DB4.0", (float)2);
175+
newAddresses.Add("DB1.434.0", true);
176+
newAddresses.Add("DB1.482.0", true);
177+
newAddresses.Add("DB4.12", (float)3);
178+
newAddresses.Add("DB1.410.0", true);
179+
var result1 = client.BatchWrite(newAddresses);
180+
181+
var r3 = client.Write("DB1.482.0", false);
182+
var result2 = client.Write("DB1.434.0", false);
183+
client.Write("DB1.434.0", true);
141184
}
142185

143186
private void test2(string address, ushort readNumber)

IoTClient.Tests/TempTest/temp.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ public class temp
1212
[Fact]
1313
public void test()
1414
{
15+
16+
var oo = BitConverter.ToSingle(DataConvert.StringToByteArray("20 FF C0 00 00").Reverse().ToArray(),0);
17+
1518
var str = "0300 00 1D";
1619
//var b = str.Split(" ").Select(t => Convert.ToByte(t, 16)).ToArray();
1720

IoTClient.Tool/Controls/BACnetControl.Designer.cs

Lines changed: 43 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

IoTClient.Tool/Controls/BACnetControl.cs

Lines changed: 62 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ private void Scan()
7777
{
7878
//获取子节点个数
7979
var deviceCount = GetDeviceArrayIndexCount(device) + 1;
80-
//TODO 50 可设置 配置
81-
ScanPointsBatch(device, 50, deviceCount);
80+
//TODO 20 可设置 配置
81+
ScanPointsBatch(device, 20, deviceCount);
8282
}
83-
Log("开始扫描属性");
8483
foreach (var device in devicesList)
8584
{
85+
Log($"开始扫描属性,Address:{device.Address.ToString()} DeviceId:{device.DeviceId}");
8686
ScanSubProperties(device);
8787
}
8888
Log("扫描完成");
@@ -144,7 +144,7 @@ public void ScanPointsBatch(BacNode device, uint deviceCount, uint count)
144144
}
145145
catch (Exception exp)
146146
{
147-
Log("Err:" + exp.Message);
147+
Log("Err:" + exp.Message);
148148
}
149149
}
150150

@@ -163,7 +163,7 @@ public uint GetDeviceArrayIndexCount(BacNode device)
163163
}
164164
catch (Exception ex)
165165
{
166-
Log("Err:" + ex.Message);
166+
Log("Err:" + ex.Message);
167167
}
168168
return 0;
169169
}
@@ -178,7 +178,7 @@ private BacnetValue ReadScalarValue(BacnetAddress adr, BacnetObjectId oid,
178178
}
179179
catch (Exception ex)
180180
{
181-
Log("Err:" + ex.Message);
181+
Log("Err:" + ex.Message);
182182
}
183183
return new BacnetValue();
184184
}
@@ -189,73 +189,71 @@ private BacnetValue ReadScalarValue(BacnetAddress adr, BacnetObjectId oid,
189189
/// <param name="device"></param>
190190
private void ScanSubProperties(BacNode device)
191191
{
192-
var adr = device.Address;
193-
if (adr == null) return;
194-
if (device.Properties == null) return;
192+
try
193+
{
194+
var adr = device.Address;
195+
if (adr == null) return;
196+
if (device.Properties == null) return;
195197

196-
List<BacnetPropertyReference> rList = new List<BacnetPropertyReference>();
197-
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_DESCRIPTION, uint.MaxValue));
198-
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_REQUIRED, uint.MaxValue));
199-
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_OBJECT_NAME, uint.MaxValue));
200-
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_PRESENT_VALUE, uint.MaxValue));
201-
List<BacnetReadAccessSpecification> properties = new List<BacnetReadAccessSpecification>();
198+
List<BacnetPropertyReference> rList = new List<BacnetPropertyReference>();
199+
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_DESCRIPTION, uint.MaxValue));
200+
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_REQUIRED, uint.MaxValue));
201+
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_OBJECT_NAME, uint.MaxValue));
202+
rList.Add(new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_PRESENT_VALUE, uint.MaxValue));
202203

203-
for (int i = 0; i < device.Properties.Count; i++)
204-
{
205-
var subNode = device.Properties[i];
206-
try
204+
List<BacnetReadAccessResult> lstAccessRst = new List<BacnetReadAccessResult>();
205+
var batchNumber = (int)numericUpDown1.Value;
206+
var batchCount = Math.Ceiling((float)device.Properties.Count / batchNumber);
207+
for (int i = 0; i < batchCount; i++)
207208
{
208-
properties.Add(new BacnetReadAccessSpecification(subNode.ObjectId, rList));
209+
IList<BacnetReadAccessSpecification> properties = device.Properties.Skip(i * batchNumber).Take(batchNumber)
210+
.Select(t => new BacnetReadAccessSpecification(t.ObjectId, rList)).ToList();
211+
//批量读取
212+
lstAccessRst.AddRange(Bacnet_client.ReadPropertyMultipleRequest(adr, properties));
213+
}
209214

210-
//批量读取,9条一组
211-
if ((i != 0 && i % 9 == 0) || i == device.Properties.Count - 1)
215+
if (lstAccessRst?.Any() ?? false)
216+
{
217+
foreach (var aRst in lstAccessRst)
212218
{
213-
IList<BacnetReadAccessResult> lstAccessRst = Bacnet_client.ReadPropertyMultipleRequest(adr, properties);
214-
if (lstAccessRst?.Any() ?? false)
219+
if (aRst.values == null) continue;
220+
var subNode = device.Properties
221+
.Where(t => t.ObjectId.Instance == aRst.objectIdentifier.Instance && t.ObjectId.Type == aRst.objectIdentifier.Type)
222+
.FirstOrDefault();
223+
foreach (var bPValue in aRst.values)
215224
{
216-
foreach (var aRst in lstAccessRst)
225+
if (bPValue.value == null || bPValue.value.Count == 0) continue;
226+
var pid = (BacnetPropertyIds)(bPValue.property.propertyIdentifier);
227+
var bValue = bPValue.value.First();
228+
var strBValue = "" + bValue.Value;
229+
//Log(pid + " , " + strBValue + " , " + bValue.Tag);
230+
switch (pid)
217231
{
218-
if (aRst.values == null) continue;
219-
subNode = device.Properties
220-
.Where(t => t.ObjectId.Instance == aRst.objectIdentifier.Instance && t.ObjectId.Type == aRst.objectIdentifier.Type)
221-
.FirstOrDefault();
222-
foreach (var bPValue in aRst.values)
223-
{
224-
if (bPValue.value == null || bPValue.value.Count == 0) continue;
225-
var pid = (BacnetPropertyIds)(bPValue.property.propertyIdentifier);
226-
var bValue = bPValue.value.First();
227-
var strBValue = "" + bValue.Value;
228-
//Log(pid + " , " + strBValue + " , " + bValue.Tag);
229-
switch (pid)
232+
case BacnetPropertyIds.PROP_DESCRIPTION://描述
230233
{
231-
case BacnetPropertyIds.PROP_DESCRIPTION://描述
232-
{
233-
subNode.PROP_DESCRIPTION = bValue.ToString()?.Trim();
234-
}
235-
break;
236-
case BacnetPropertyIds.PROP_OBJECT_NAME://点名
237-
{
238-
subNode.PROP_OBJECT_NAME = bValue.ToString()?.Trim();
239-
}
240-
break;
241-
case BacnetPropertyIds.PROP_PRESENT_VALUE://值
242-
{
243-
subNode.PROP_PRESENT_VALUE = bValue.Value;
244-
subNode.DataType = bValue.Value.GetType();
245-
}
246-
break;
234+
subNode.PROP_DESCRIPTION = bValue.ToString()?.Trim();
247235
}
248-
}
249-
ShwoText(string.Format("地址:{0}\t 点名:{1}\t 值:{2}\t 类型:{3}\t 描述:{4} ", $"{subNode.ObjectId.Instance}_{(int)subNode.ObjectId.Type}", subNode.PROP_OBJECT_NAME, subNode.PROP_PRESENT_VALUE, subNode.PROP_PRESENT_VALUE.GetType().ToString().Split('.')[1], subNode.PROP_DESCRIPTION));
236+
break;
237+
case BacnetPropertyIds.PROP_OBJECT_NAME://点名
238+
{
239+
subNode.PROP_OBJECT_NAME = bValue.ToString()?.Trim();
240+
}
241+
break;
242+
case BacnetPropertyIds.PROP_PRESENT_VALUE://值
243+
{
244+
subNode.PROP_PRESENT_VALUE = bValue.Value;
245+
subNode.DataType = bValue.Value.GetType();
246+
}
247+
break;
250248
}
251249
}
252-
properties.Clear();
250+
ShwoText(string.Format("地址:{0}\t 点名:{1}\t 值:{2}\t 类型:{3}\t 描述:{4} ", $"{subNode.ObjectId.Instance}_{(int)subNode.ObjectId.Type}", subNode.PROP_OBJECT_NAME, subNode.PROP_PRESENT_VALUE, subNode.PROP_PRESENT_VALUE.GetType().ToString().Split('.')[1], subNode.PROP_DESCRIPTION));
253251
}
254252
}
255-
catch (Exception exp)
256-
{
257-
Log("Error: " + exp.Message);
258-
}
253+
}
254+
catch (Exception ex)
255+
{
256+
Log("【Err】:" + ex.Message);
259257
}
260258
}
261259

@@ -277,8 +275,8 @@ private void ShwoText(string str)
277275

278276
private async void Read_ClickAsync(object sender, EventArgs e)
279277
{
280-
var address = txt_address.Text?.Trim();
281-
var addressPart = address.Split('_');
278+
var address = txt_address.Text?.Trim();
279+
var addressPart = address.Split('_');
282280
BacProperty rpop = null;
283281
BacNode bacnet = null;
284282

@@ -320,14 +318,14 @@ private async void Read_ClickAsync(object sender, EventArgs e)
320318
}
321319
catch
322320
{
323-
Log("Err:读取失败.");
321+
Log("Err:读取失败.");
324322
}
325323
}
326324
else
327325
{
328326
retry++;
329327
if (retry < 4) goto tag_retry;
330-
Log($"Err:读取失败[{retry - 1}]");
328+
Log($"Err:读取失败[{retry - 1}]");
331329
}
332330
}
333331

0 commit comments

Comments
 (0)