|
16 | 16 | using System;
|
17 | 17 | using System.Collections.Generic;
|
18 | 18 | using System.Linq;
|
| 19 | +using System.Text; |
19 | 20 |
|
20 | 21 | namespace S7CommPlusDriver
|
21 | 22 | {
|
@@ -187,7 +188,7 @@ public int BrowseAllBlocks(out List<BlockInfo> exploreData)
|
187 | 188 | };
|
188 | 189 |
|
189 | 190 | var lang = ((ValueUInt)ob.Attributes[Ids.Block_BlockLanguage]).GetValue();
|
190 |
| - data.lang = (ProgrammingLanguage) lang; |
| 191 | + data.lang = (ProgrammingLanguage)lang; |
191 | 192 | exploreData.Add(data);
|
192 | 193 | break;
|
193 | 194 | }
|
@@ -418,8 +419,8 @@ public int GetBlockXml(uint relid, out string blockName, out ProgrammingLanguage
|
418 | 419 | }
|
419 | 420 | }
|
420 | 421 | return 0;
|
421 |
| - } |
422 |
| - |
| 422 | + } |
| 423 | + |
423 | 424 | public int RunExploreRequest(uint relid, uint[] attributes, out List<PObject> objects, byte exploreChildsRecursive = 1, byte exploreParents = 0)
|
424 | 425 | {
|
425 | 426 | int res;
|
@@ -460,6 +461,99 @@ public int RunExploreRequest(uint relid, uint[] attributes, out List<PObject> ob
|
460 | 461 | objects = exploreRes.Objects;
|
461 | 462 |
|
462 | 463 | return 0;
|
463 |
| - } |
| 464 | + } |
| 465 | + |
| 466 | + public int RunGetVarSubstreamedRequest(uint objectId, ushort address, out PValue value) |
| 467 | + { |
| 468 | + int res; |
| 469 | + value = null; |
| 470 | + |
| 471 | + var getVarSubstreamedReq = new GetVarSubstreamedRequest(ProtocolVersion.V2); |
| 472 | + getVarSubstreamedReq.InObjectId = objectId; |
| 473 | + getVarSubstreamedReq.SessionId = m_SessionId; |
| 474 | + getVarSubstreamedReq.Address = address; |
| 475 | + res = SendS7plusFunctionObject(getVarSubstreamedReq); |
| 476 | + if (res != 0) |
| 477 | + { |
| 478 | + return res; |
| 479 | + } |
| 480 | + m_LastError = 0; |
| 481 | + WaitForNewS7plusReceived(m_ReadTimeout); |
| 482 | + if (m_LastError != 0) |
| 483 | + { |
| 484 | + return m_LastError; |
| 485 | + } |
| 486 | + |
| 487 | + |
| 488 | + var getVarSubstreamedRes = GetVarSubstreamedResponse.DeserializeFromPdu(m_ReceivedPDU); |
| 489 | + if (getVarSubstreamedRes == null) |
| 490 | + { |
| 491 | + return S7Consts.errIsoInvalidPDU8; |
| 492 | + } |
| 493 | + |
| 494 | + value = getVarSubstreamedRes.Value; |
| 495 | + |
| 496 | + return 0; |
| 497 | + } |
| 498 | + |
| 499 | + public class CpuInfo |
| 500 | + { |
| 501 | + public string PlcName { get; set; } |
| 502 | + public string ProjectName { get; set; } |
| 503 | + |
| 504 | + public Version VersionTia { get; set; } |
| 505 | + public Version Version2 { get; set; } |
| 506 | + public string CpuMlfb { get; set; } |
| 507 | + public string CpuSerial { get; set; } |
| 508 | + public Version CpuFirmware { get; set; } |
| 509 | + } |
| 510 | + |
| 511 | + public int GetCpuInfos(out CpuInfo cpuInfo) |
| 512 | + { |
| 513 | + cpuInfo = null; |
| 514 | + |
| 515 | + var res = this.RunGetVarSubstreamedRequest(Ids.NativeObjects_theASRoot_Rid, 2459, out var pValueVersions); |
| 516 | + if (res != 0) |
| 517 | + return res; |
| 518 | + var arrVersions = ((ValueUSIntArray)pValueVersions).GetValue(); |
| 519 | + var version1 = new Version(arrVersions[0], arrVersions[1], arrVersions[2], arrVersions[3]); |
| 520 | + var version2 = new Version(arrVersions[4], arrVersions[5], arrVersions[6], arrVersions[7]); |
| 521 | + |
| 522 | + res = this.RunGetVarSubstreamedRequest(Ids.NativeObjects_theCPUCommon_Rid, 233, out var pValuePlcName); |
| 523 | + if (res != 0) |
| 524 | + return res; |
| 525 | + var cpuName = ((ValueWString)pValuePlcName).GetValue(); |
| 526 | + |
| 527 | + res = this.RunGetVarSubstreamedRequest(Ids.NativeObjects_theCPUProxy_Rid, 3753, out var pValueMlfbSerial); |
| 528 | + if (res != 0) |
| 529 | + return res; |
| 530 | + var data = ((ValueBlob)pValueMlfbSerial).GetValue(); |
| 531 | + var mlfb = Encoding.ASCII.GetString(data[8..27]); |
| 532 | + //space |
| 533 | + var serial = Encoding.ASCII.GetString(data[28..44]); |
| 534 | + //nulbyte |
| 535 | + var hardware = data[46]; |
| 536 | + var firmware = new Version(data[47], data[48], data[49], data[50]); |
| 537 | + //data maybe conatins more: |
| 538 | + //rack (1byte), slot (1byte), |
| 539 | + |
| 540 | + res = this.RunGetVarSubstreamedRequest(Ids.ReleaseMngmtRoot_Rid, 8342, out var pValueVersionsAndName); |
| 541 | + if (res != 0) |
| 542 | + return res; |
| 543 | + var versionsAndName = ((ValueWStringArray)pValueVersionsAndName).GetValue(); |
| 544 | + |
| 545 | + cpuInfo = new CpuInfo() |
| 546 | + { |
| 547 | + PlcName = cpuName, |
| 548 | + ProjectName = versionsAndName[2], |
| 549 | + VersionTia = version1, |
| 550 | + Version2 = version2, |
| 551 | + CpuMlfb = mlfb, |
| 552 | + CpuSerial = serial, |
| 553 | + CpuFirmware = firmware |
| 554 | + }; |
| 555 | + |
| 556 | + return 0; |
| 557 | + } |
464 | 558 | }
|
465 | 559 | }
|
0 commit comments