Files
barsik/ExternalMonitoringUnit.cs

83 lines
2.3 KiB
C#

using NLog;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Text.Json;
using System.Threading;
namespace Barsik
{
class ExternalMonitoringUnit : BaseMonitoringUnit
{
public ExternalMonitoringUnit(JsonElement config, RegistersContainer registers) : base(config, registers)
{
}
public override void GenerateItemsConfig(string name, StringBuilder config)
{
config.Append(string.Format("Number {0}_{1} \"{0} {1}\"", name, unitName));
config.Append(" {channel=\"");
config.AppendFormat("modbus:data:{0}:{1}:", name, unitName);
config.AppendFormat("{1}:number", name, unitName);
config.Append("\"}\n");
}
public override void GenerateThingsConfig(StringBuilder config)
{
config.Append("\tBridge poller ");
config.Append(unitName);
config.AppendFormat("[start = {0}, length = 2, type = \"holding\", refresh = 500] {{\n", baseAddress);
config.Append("\t\tThing data ");
config.Append(unitName);
config.AppendFormat("[readStart = \"{0}\", readValueType = \"float32\"]\n", baseAddress);
config.Append("\t}\n");
}
public override void Run()
{
string program = config.GetProperty("Program").GetString();
string args = config.GetProperty("Arguments").GetString();
var logger = LogManager.GetCurrentClassLogger();
while (true)
{
ProcessStartInfo procStartInfo = new ProcessStartInfo(program);
procStartInfo.Arguments = args;
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
using (Process proc = new Process())
{
proc.StartInfo = procStartInfo;
proc.Start();
while (!proc.HasExited)
{
Thread.Sleep(100);
}
string result = proc.StandardOutput.ReadToEnd();
result = result.Trim();
float resultFloat;
if (float.TryParse(result, out resultFloat))
{
if (float.IsNaN(resultFloat) || float.IsInfinity(resultFloat))
{
logger.Error("Nan or Inf received from " + program + " with args " + args);
}
else
{
registers.SetFloat(baseAddress, resultFloat);
}
}
else
{
logger.Error("Non-float result from process " + program + " with args " + args);
logger.Error("Result:");
logger.Error(result);
}
}
Thread.Sleep(2000);
}
}
}
}