This commit is contained in:
2021-07-08 16:16:35 +05:00
parent 066c0187f2
commit 3388cc761c
76 changed files with 2475 additions and 194 deletions

View File

@@ -115,5 +115,6 @@ namespace DataClient
}
return res.ToArray();
}
}
}

15
DataClient/FileClient.cs Normal file
View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DataClient
{
static class FileClient
{
private static string tmpDir = Path.Combine(Directory.GetCurrentDirectory(), "temp");
private static List<string> block = new List<string>();
}
}

View File

@@ -10,55 +10,100 @@ using System.Threading.Tasks;
namespace DataClient
{
/// <summary>
/// Класс для связи с СТП. Содержит все инструменты, для получения данных.
/// </summary>
/// <summary>Класс для связи с СТП. Содержит все инструменты, для получения данных.</summary>
public class STPClient
{
//Переменные
Logger log = LogManager.GetCurrentClassLogger();
string confDir = Path.Combine(Directory.GetCurrentDirectory(), "Config");
private List<server> servers = new List<server>();
private Dictionary<int,ConfAnalog[]> confAnalog = new Dictionary<int, ConfAnalog[]>();
//ЛОГИРОВАНИЕ
private Logger log = LogManager.GetCurrentClassLogger();
//КОНФИГУРАЦИЯ
private string confDir = Path.Combine(Directory.GetCurrentDirectory(), "Config");
private Dictionary<int, ConfAnalog[]> confAnalog = new Dictionary<int, ConfAnalog[]>();
private List<(int num, string name)> vdpList = new List<(int num, string name)>();
int serverDefault = -1;
//Геттеры и сеттеры
/// <summary>Чтение конфигурационнного файла и установка параметров по умолчанию.</summary>
private void Config()
{
string jsonString;
var confFile = Path.Combine(confDir, "config.json");
try
{
jsonString = File.ReadAllText(confFile);
}
catch (Exception e)
{
log.Warn(e, "Can't read config file from " + confDir + ".");
return;
}
var conf = (JObject)JsonConvert.DeserializeObject(jsonString);
if (!conf.HasValues && !conf["servers"].HasValues && conf["servers"].Type != JTokenType.Array)
{
log.Warn("Doesn't exist \"servers\" object in config file.");
return;
}
var count = -1;
foreach (var s in conf["servers"])
{
count++;
var name = (s["name"].Type == JTokenType.String) ? (string)s["name"] : "default";
var ip = (s["ip"].Type == JTokenType.String) ? (string)s["ip"] : "";
var port = (s["port"].Type == JTokenType.Integer) ? (int)s["port"] : -1;
var dir = (s["dir"].Type == JTokenType.String) ? (string)s["dir"] : "";
var res = false;
var idx = _servers.FindIndex(x => x.name == name);
if (idx == -1)
res = AddServer(name, ip, port, dir);
else
{
_servers.RemoveAt(idx);
res = AddServer(name, ip, port, dir);
}
if (!res)
log.Trace("Can't add or change server #" + count + " from conf file.");
}
//init vdp
for (var i = 0; i < 49; i++)
vdpList.Add(new(i, i == 0 ? "Общие" : "Печь " + i.ToString("D2")));
for (var i = 91; i < 95; i++)
vdpList.Add((i, "Печь " + i.ToString("D2")));
//init analog
var tmpvdp = new List<int>();
foreach (var v in vdpList) tmpvdp.Add(v.num);
confAnalog = Configuration.InitAnalogList(Path.Combine(confDir, "analog"), tmpvdp.ToArray());
}
//РАБОТА С СЕРВЕРОМ
private List<server> _servers = new List<server>();
private int _useServer = -1;
/// <summary>Номер сервера, используемого по умолчанию.</summary>
public int UseServer
{
get { return serverDefault; }
set {
serverDefault =
(servers.Count == 0) ? -1 :
{
get { return _useServer; }
set
{
_useServer =
(_servers.Count == 0) ? -1 :
(value < 0) ? 0 :
(value >= servers.Count) ? serverDefault = servers.Count - 1 :
(value >= _servers.Count) ? _useServer = _servers.Count - 1 :
value;
}
}
/// <summary>Массив серверов, инициализированных в экземпляре класса.</summary>
public server[] ListServers { get { return servers.ToArray(); } }
//Функции
/// <summary>Получение номера сервера по его названию.</summary>
/// <param name="name">Название сервера.</param>
/// <returns>Номер сервера в списке серверов.</returns>
public int GetServerIdByName(string name)
{
return servers.FindIndex(x => x.name == name);
}
/// <summary>Получение название сервера по его номеру.</summary>
/// <param name="id">Номер сервера в списке серверов.</param>
/// <returns>Название сервера.</returns>
public string GetServerNameById(int id)
{
var res = (id >= servers.Count || id < 0) ? null : servers[id].name;
return res;
}
/// <summary>Проверка параметров серевера перед их добавлением в список.</summary>
/// <param name="ip">IP адресс сервера.</param>
/// <param name="port">Порт сервера.</param>
/// <param name="dir">Путь к архиву.</param>
/// <returns>Результат выполнения функции.</returns>
/// <summary>Массив серверов, инициализированных в экземпляре класса.</summary>
public server[] ListServers
{
get { return _servers.ToArray(); }
}
/// <summary> Текущий рабочий сервер </summary>
public server? Server
{
get { return (_useServer == -1) ? null : _servers[_useServer]; }
}
/// <summary>
/// Проверка параметров сервера.
/// </summary>
/// <param name="ip">Ip адрес сервера СТП.</param>
/// <param name="port">Порт сервера СТП.</param>
/// <param name="dir">Путь к архивным данным.</param>
/// <returns>Результат проверки.</returns>
private bool CheckDataServer(string ip, int port, string dir)
{
if (!IPAddress.TryParse(ip, out _))
@@ -96,136 +141,41 @@ namespace DataClient
log.Warn("Server not added: Incorrect name server.");
return false;
}
if (servers.FindIndex(x => x.name == name) != -1)
if (_servers.FindIndex(x => x.name == name) != -1)
{
log.Warn("Server not added: Server with this name exist.");
return false;
}
servers.Add(new server(name, ip, port, dir));
UseServer = 0;
_servers.Add(new server(name, ip, port, dir));
_useServer = 0;
log.Trace("Server (name=" + name + ";ip=" + ip + ";port=" + port + ";dir=" + dir + ") added.");
return true;
}
/// <summary>Изменение сервера в списке серверов по его номеру.</summary>
/// <param name="id">Номер сервера в списке серверов.</param>
/// <param name="name">Название сервера.</param>
/// <param name="ip">IP адресс сервера.</param>
/// <param name="port">Порт сервера.</param>
/// <param name="dir">Путь к архиву.</param>
/// <returns>Результат выполнения функции.</returns>
public bool ChangeServerById(int id, string name, string ip, int port, string dir)
{
if (servers.Count == 0 || id >= servers.Count || id < 0)
{
log.Warn("Server not changed: Id incorrect.");
return false;
}
if (!CheckDataServer(ip, port, dir))
{
log.Warn("Server not changed: Data incorrect.");
return false;
}
var tmpId = servers.FindIndex(x => x.name == name);
if (string.IsNullOrEmpty(name) || (tmpId != -1 && tmpId != id))
{
log.Warn("Server not changed: Name incorrect.");
return false;
}
var tmp = new server(name, ip, port, dir);
log.Trace("Server id=" + id + " changed: name=" + name + ";ip=" + ip + ";port=" + port.ToString() + ";dir=" + dir + ";.");
servers[id] = tmp;
return true;
}
/// <summary>Изменение сервера в списке серверов по его названию.</summary>
/// <param name="name">Название сервера.</param>
/// <param name="ip">IP адресс сервера.</param>
/// <param name="port">Порт сервера.</param>
/// <param name="dir">Путь к архиву.</param>
/// <returns>Результат выполнения функции.</returns>
public bool ChangeServerByName(string name, string ip, int port, string dir)
{
var id = servers.FindIndex(x => x.name == name);
if (id == -1)
{
log.Warn("Server not changed: Name incorrect or server not exist.");
return false;
}
return ChangeServerById(id, name, ip, port, dir);
}
/// <summary>Удаление сервера из списка серверов по его номеру.</summary>
/// <param name="id">Номер сервера в списке серверов.</param>
/// <returns>Результат выполнения функции.</returns>
public bool RemoveServerById(int id)
{
if (servers.Count == 0 || id >= servers.Count || id < 0)
public bool RemoveServer(int id)
{
if (_servers.Count == 0 || id >= _servers.Count || id < 0)
{
log.Warn("Server not removed: Id incorrect or list server are empty.");
return false;
}
log.Trace("Server id=" + id.ToString() + ";name=" + servers[id].name + ";ip=" + servers[id].ip + ";port=" + servers[id].port.ToString() + ";dir=" + servers[id].dir + "; removed.");
servers.RemoveAt(id);
log.Trace("Server id=" + id.ToString() + ";name=" + _servers[id].name + ";ip=" + _servers[id].ip + ";port=" + _servers[id].port.ToString() + ";dir=" + _servers[id].dir + "; removed.");
_servers.RemoveAt(id);
UseServer = 0;
return true;
}
/// <summary>Удаление сервера из списка серверов по его названию.</summary>
/// <param name="name">Название сервера.</param>
/// <returns>Результат выполнения функции.</returns>
public bool RemoveServerByName(string name)
{
var id = servers.FindIndex(x => x.name == name);
if (id == -1)
{
log.Warn("Server not removed: Name incorrect or server not exist.");
return false;
}
return RemoveServerById(id);
}
/// <summary>Чтение конфигурационнного файла и установка параметров по умолчанию.</summary>
private void Config()
{
string jsonString;
var confFile = Path.Combine(confDir, "config.json");
try
{
jsonString = File.ReadAllText(confFile);
}
catch (Exception e)
{
log.Warn(e, "Can't read config file from " + confDir + ".");
return;
}
var conf = (JObject)JsonConvert.DeserializeObject(jsonString);
if (!conf.HasValues && !conf["servers"].HasValues && conf["servers"].Type != JTokenType.Array)
{
log.Warn("Doesn't exist \"servers\" object in config file.");
return;
}
var count = -1;
foreach (var s in conf["servers"])
{
count++;
var name = (s["name"].Type == JTokenType.String) ? (string)s["name"] : "default";
var ip = (s["ip"].Type == JTokenType.String) ? (string)s["ip"] : "";
var port = (s["port"].Type == JTokenType.Integer) ? (int)s["port"] : -1;
var dir = (s["dir"].Type == JTokenType.String) ? (string)s["dir"] : "";
var res = false;
if (GetServerIdByName(name) == -1)
res = AddServer(name, ip, port, dir);
else
res = ChangeServerByName(name, ip, port, dir);
if (!res)
log.Trace("Can't add or change server #" + count + " from conf file.");
}
//init vdp
for (var i = 0; i < 49; i++)
vdpList.Add(new (i, i == 0 ? "Общие" : "Печь " + i.ToString("D2")));
for (var i = 91; i < 95; i++)
vdpList.Add((i, "Печь " + i.ToString("D2")));
//init analog
var tmpvdp = new List<int>();
foreach (var v in vdpList) tmpvdp.Add(v.num);
confAnalog = Configuration.InitAnalogList(Path.Combine(confDir, "analog"), tmpvdp.ToArray());
}
//#################
//Переменные
//Геттеры и сеттеры
//Функции
/// <summary>Создание экземпляра класса.</summary>
public STPClient()
{
@@ -241,41 +191,16 @@ namespace DataClient
Config();
}
public TechCycle[] GetTechCycles(int vdp, DateTime tS, DateTime tE)
public TechCycle[] GetTechCyclesList(int vdp, DateTime tS, DateTime tE)
{
//Use File with ID = 3
var res = new List<TechCycle>();
return res.ToArray();
}
public Analog[] GetAnalogs(int vdp, DateTime tS, DateTime tE)
public (ConfAnalog conf, Analog[] list)[] GetAnalogsList(int vdp, DateTime tS, DateTime tE, int[] idA = null)
{
var res = new List<Analog>();
var net = new NETClient(servers[serverDefault].ip, servers[serverDefault].port);
if (!net.Connect()) return Array.Empty<Analog>();
var s1 = new List<Task<byte[]>>();
for (var d = new DateTime(tS.Year, tS.Month, tS.Day); d.Year <= tE.Year && d.Month <= tE.Month && d.Day <= tE.Day; d = d.AddDays(1))
{
var t = new Task<byte[]>(() => net.Full_Download(d, vdp, 01));
t.Start();
s1.Add(t);
}
var s2 = new List<Task<Analog[]>>();
while(s1.Count > 0)
{
for(var i = 0; i < s1.Count; i++)
if (s1[i].IsCompleted)
{
var t = new Task<Analog[]>( () => {
if (!s1[i].IsCompletedSuccessfully)
return new Analog[0];
return s1[i].Result
});
}
}
return res.ToArray();
return Array.Empty<(ConfAnalog conf, Analog[] list)>();
}

View File

@@ -8,6 +8,5 @@ namespace DataClient
{
static class StructConverter
{
Analog[]
}
}

View File

@@ -4,15 +4,365 @@
"add": [
{
"id": 0,
"name": "Test",
"short_name": "Test",
"measure": "kg",
"mul": 1,
"min": -100,
"max": 100,
"zero": 0,
"logarithm": false,
"byteId": [ 1, 12, 3 ]
"name": "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"sname": "I <20>",
"measure": "<EFBFBD><EFBFBD>",
"mul": 0.1,
"byteId": [ 0, 1 ]
},
{
"id": 1,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"sname": "U <20>",
"measure": "<22>",
"mul": 0.1,
"byteId": [ 2, 3 ]
},
{
"id": 2,
"name": "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "I <20><>",
"measure": "<22>",
"mul": 0.1,
"byteId": [4,5]
},
{
"id": 3,
"name": "U <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "U <20><>",
"measure": "<22>",
"mul": 0.1,
"byteId": [6,7]
},
{
"id": 4,
"name": "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "I <20><><EFBFBD>",
"measure": "<22>",
"mul": 0.1,
"byteId": [8,9]
},
{
"id": 5,
"name": "U <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "U <20><><EFBFBD>",
"measure": "<22>",
"mul": 0.1,
"byteId": [10,11]
},
{
"id": 6,
"name": "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "I <20><>",
"measure": "<22><>",
"mul": 0.1,
"byteId": [12,13]
},
{
"id": 7,
"name": "t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>",
"sname": "t <20><>.<2E><><EFBFBD>",
"measure": "<22><>.<2E>",
"byteId": [14,15]
},
{
"id": 8,
"name": "t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "t <20><>.<2E><>",
"measure": "<22><>.<2E>",
"byteId": [16,17]
},
{
"id": 9,
"name": "t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "t <20><><EFBFBD>-<2D><><EFBFBD>",
"measure": "<22><>.<2E>",
"byteId": [18,19]
},
{
"id": 10,
"name": "t <20><><EFBFBD><EFBFBD><EFBFBD>",
"sname": "t <20><>",
"measure": "<22><>.<2E>",
"byteId": [20,21]
},
{
"id": 11,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0.1",
"sname": "S <20><>",
"measure": "<22><>",
"mul": 0.1,
"byteId": [22,23]
},
{
"id": 12,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "S <20><>",
"measure": "<22><>",
"byteId": [24,25]
},
{
"id": 13,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"measure": "<22><><EFBFBD>.<2E><>.<2E><>",
"mul": -1,
"byteId": [26,27]
},
{
"id": 14,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "R <20><>-<2D><>",
"measure": "<22>",
"mul": 0.1,
"byteId": [28,29]
},
{
"id": 15,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "R <20><>-<2D><><EFBFBD>",
"measure": "<22>",
"mul": 0.1,
"byteId": [30,31]
},
{
"id": 16,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
"sname": "Q <20>.<2E><>",
"measure": "<22>^3/<2F>",
"byteId": [ 32, 33 ]
},
{
"id": 17,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><><EFBFBD>.<2E><><EFBFBD>.",
"mul": 0.01,
"byteId": [34,35]
},
{
"id": 18,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>",
"sname": "<22><><EFBFBD>.<2E><><EFBFBD>.",
"mul": 0.1,
"byteId": [36,37]
},
{
"id": 19,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "Q<>. <20><>.",
"measure": "<22>^3/<2F>",
"mul": 0.01,
"byteId": [38,39]
},
{
"id": 20,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>",
"sname": "Q<>. <20><>.",
"measure": "<22>^3/<2F>",
"mul": 0.01,
"byteId": [40,41]
},
{
"id": 21,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.+1,5",
"sname": "P <20>.<2E><>",
"measure": "<22><><EFBFBD>/<2F><>^2",
"mul": 0.01,
"byteId": [42,43]
},
{
"id": 22,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "Q<>. <20><><EFBFBD>.",
"measure": "<22>^3/<2F>",
"mul": 0.01,
"byteId": [44,45]
},
{
"id": 23,
"name": "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>)",
"sname": "I <20>.<2E><><EFBFBD> <20><><EFBFBD>",
"measure": "<22><>",
"mul": 0.1,
"byteId": [58,59]
},
{
"id": 25,
"name": "<22><><EFBFBD>-<2D><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><><EFBFBD>-<2D><><EFBFBD>",
"measure": "<22>",
"mul": 0.1,
"byteId": [62,63]
},
{
"id": 26,
"name": "<22><><EFBFBD>-<2D><><EFBFBD>. <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><><EFBFBD>-<2D><><EFBFBD><EFBFBD>",
"measure": "<22>",
"mul": 0.1,
"byteId": [64,65]
},
{
"id": 27,
"name": "t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "t <20><>.",
"measure": "<22><>.<2E>",
"byteId": [66,67]
},
{
"id": 28,
"name": "t <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "t <20><><EFBFBD>.",
"measure": "<22><>.<2E>",
"byteId": [68,69]
},
{
"id": 29,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "Q<>. <20><><EFBFBD>.",
"measure": "<22>^3/<2F>",
"mul": 0.01,
"byteId": [70,71]
},
{
"id": 30,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><><EFBFBD>. <20><><EFBFBD>.",
"measure": "<22>",
"mul": 0.1,
"byteId": [72,73]
},
{
"id": 31,
"name": "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.)",
"sname": "I <20>.<2E><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>.",
"measure": "<22><>",
"mul": 0.1,
"byteId": [74,75]
},
{
"id": 33,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1200",
"sname": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-1200",
"measure": "<22><>.<2E><>.<2E><>",
"mul": 0.1,
"byteId": [78,79]
},
{
"id": 34,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-18,75",
"sname": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-18,25",
"measure": "<22><>.<2E><>.<2E><>",
"mul": 0.001,
"byteId": [80,81]
},
{
"id": 35,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "P <20>.<2E><><EFBFBD><EFBFBD>.",
"measure": "<22><><EFBFBD>/<2F><>^2",
"mul": 0.1,
"byteId": [82,83]
},
{
"id": 36,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "P <20>.<2E><><EFBFBD><EFBFBD>.",
"measure": "<22><><EFBFBD>/<2F><>^2",
"byteId": [84,85]
},
{
"id": 37,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD>)",
"sname": "<22><><EFBFBD>.I, <20><><EFBFBD>",
"measure": "<22><>",
"mul": 0.1,
"byteId": [86,87]
},
{
"id": 38,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><><EFBFBD>.<2E><>.<2E><><EFBFBD>.<2E><>",
"measure": "<22>",
"mul": 0.01,
"byteId": [88,89]
},
{
"id": 39,
"name": "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ARPW",
"sname": "I <20><>. ARPW",
"measure": "<22>",
"mul": 0.01,
"byteId": [90,91]
},
{
"id": 40,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>",
"measure": "<22><><EFBFBD>",
"mul": 0.1,
"byteId": []
},
{
"id": 41,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><> 1 <20><><EFBFBD>.",
"sname": "U <20><>. 1<><31><EFBFBD>, <20>",
"measure": "<22>",
"mul": 0.1,
"byteId": [92,93]
},
{
"id": 42,
"name": "<22><><EFBFBD>: <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1",
"sname": "I <20><><EFBFBD>1 <20><><EFBFBD>",
"measure": "<22>",
"byteId": [94,95]
},
{
"id": 43,
"name": "<22><><EFBFBD>: <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2",
"sname": "I <20><><EFBFBD>2 <20><><EFBFBD>",
"measure": "<22>",
"byteId": [96,97]
},
{
"id": 44,
"name": "<22><><EFBFBD>: <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3",
"sname": "I <20><><EFBFBD>3 <20><><EFBFBD>",
"measure": "<22>",
"byteId": [98,99]
},
{
"id": 45,
"name": "<22><><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"sname": "<22><><EFBFBD><EFBFBD>. <20><><EFBFBD>",
"measure": "<22><>",
"mul": 0.1,
"byteId": [100,101]
},
{
"id": 46,
"name": "<22><><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>p",
"mul": 0.01,
"byteId": [102,103]
},
{
"id": 47,
"name": "<22><><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>i",
"mul": 0.01,
"byteId": [104,105]
},
{
"id": 49,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",
"byteId": [106,107]
},
{
"id": 50,
"name": "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> U <20><><EFBFBD>",
"measure": "<22>",
"mul": 0.1,
"byteId": [108,109]
}
]
}

View File

@@ -1 +1 @@
a35e80ad0f3cac2804cec2e84481a2b816e18b57
87bece5d0c6996144f4c9f6e3331fc77f0523159