SIC-12/App/SicSimulator/Instances/SimulatorAdsPlcService.cs

148 lines
4.6 KiB
C#

using System;
using Aitex.Core.RT.IOCore;
using MECF.Framework.Common.IOCore;
using MECF.Framework.Common.PLC;
namespace SicSimulator.Instances
{
public class SimulatorAdsPlcService : IWcfPlcService
{
//diVariable="" doVariable="" aiVariable="" aoVariable=""
public bool CheckIsConnected()
{
return true;
}
public bool Read(string variable, out object data, string type, int length, out string reason)
{
reason = string.Empty;
data = null;
if (!TryParseIoVariable(variable, out var pmSource, out var ioType, out var bufferIndex))
return true;
switch (ioType)
{
case "DI":
data = IoManager.Instance.GetDiBuffer(pmSource)[bufferIndex];
break;
case "DO":
data = IoManager.Instance.GetDoBuffer(pmSource)[bufferIndex];
break;
case "AI":
data = IoManager.Instance.GetAiBuffer(pmSource)[bufferIndex];
break;
case "AO":
data = IoManager.Instance.GetAoBuffer(pmSource)[bufferIndex];
break;
}
return true;
}
public bool WriteArrayElement(string variable, int index, object value, out string reason)
{
reason = string.Empty;
if (!TryParseIoVariable(variable, out var pmSource, out var ioType, out var bufferIndex))
return true;
switch (ioType)
{
case "DI":
break;
case "DO":
IoManager.Instance.GetDoBuffer(pmSource)[bufferIndex][index] = (bool)value;
break;
case "AI":
IoManager.Instance.GetAiBuffer(pmSource)[bufferIndex][index] = (float)value;
break;
case "AO":
IoManager.Instance.GetAoBuffer(pmSource)[bufferIndex][index] = (float)value;
break;
}
return true;
}
public bool[] ReadDi(int offset, int size, out string reason)
{
throw new System.NotImplementedException();
}
public float[] ReadAiFloat(int offset, int size, out string reason)
{
throw new System.NotImplementedException();
}
public int[] ReadAiInt(int offset, int size, out string reason)
{
throw new System.NotImplementedException();
}
public bool WriteDo(int offset, bool[] buffer, out string reason)
{
throw new System.NotImplementedException();
}
public bool WriteAoFloat(int offset, float[] buffer, out string reason)
{
throw new System.NotImplementedException();
}
public bool WriteAoInt(int offset, int[] buffer, out string reason)
{
throw new System.NotImplementedException();
}
public int Heartbeat(int counter)
{
return counter;
}
// GVL_IO.PM{n}_{DI|DO|AI|AO}_G[_N] => PM{n}.PLC, type, index (N-1, default 0)
private static bool TryParseIoVariable(string variable, out string pmSource, out string ioType, out int bufferIndex)
{
pmSource = null;
ioType = null;
bufferIndex = 0;
var dotIndex = variable.LastIndexOf('.');
if (dotIndex < 0)
return false;
var name = variable.Substring(dotIndex + 1);
var pmEnd = name.IndexOf('_');
if (pmEnd <= 2 || !name.StartsWith("PM"))
return false;
pmSource = name.Substring(0, pmEnd) + ".PLC";
var rest = name.Substring(pmEnd + 1);
if (rest.StartsWith("DI_")) ioType = "DI";
else if (rest.StartsWith("DO_")) ioType = "DO";
else if (rest.StartsWith("AI_")) ioType = "AI";
else if (rest.StartsWith("AO_")) ioType = "AO";
else return false;
const string groupMarker = "_G";
var gIndex = rest.LastIndexOf(groupMarker, StringComparison.Ordinal);
if (gIndex < 0)
return false;
var indexPart = rest.Substring(gIndex + groupMarker.Length);
if (indexPart.Length == 0)
bufferIndex = 0;
else if (indexPart.StartsWith("_") && int.TryParse(indexPart.Substring(1), out var suffixNum))
bufferIndex = suffixNum - 1;
else
return false;
return true;
}
}
}