Namespace fix + resource decoding

This commit is contained in:
Samuele E. Locatelli
2020-07-02 18:24:28 +02:00
parent 2cc6c278db
commit f595f6e579
28 changed files with 558 additions and 562 deletions
-17
View File
@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MHT_Siemens
{
public static class Constants
{
#region memorie configurate staticamente
public const string RESOURCE_DIRECTORY = @"IOB.WIN.FileExp.Config.";
public const string CONFIG_PATH = RESOURCE_DIRECTORY + @"setup.json";
#endregion
}
}
-531
View File
@@ -1,531 +0,0 @@
using Newtonsoft.Json;
using NLog;
using S7.Net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Windows.Forms;
namespace MHT_Siemens
{
public partial class IOB_Exporter : Form
{
#region oggetti di base
/// <summary>
/// configurazione principale proxy
/// </summary>
protected dataProxy currDataProxy;
/// <summary>
/// Oggetto PLC da ri-utilizzare...
/// </summary>
protected Plc currPLC;
/// <summary>
/// parametri di connessione
/// </summary>
protected connParam parametri;
/// <summary>
/// oggetto logging
/// </summary>
public static Logger lg;
/// <summary>
/// oggetto uiTimer x gestione refresh UI
/// </summary>
protected Timer uiTimer = new Timer();
/// <summary>
/// oggetto uiTimer x sampling file testuale
/// </summary>
protected Timer sampleTimer = new Timer();
/// <summary>
/// oggetto uiTimer x verifiche
/// </summary>
protected Timer checkTimer = new Timer();
/// <summary>
/// Contatore per decidere quando loggare la lettura del file
/// </summary>
protected int loaderLogCounter = 30;
/// <summary>
/// file delle conf attivo
/// </summary>
protected string setupFile = "setup.json";
/// <summary>
/// Ultimi valori registrati da file
/// </summary>
protected Dictionary<string, string> prevValues;
/// <summary>
/// valori correntemente letti dal file
/// </summary>
protected Dictionary<string, string> currValues;
#endregion
#region inizializazione
public IOB_Exporter()
{
InitializeComponent();
myInit();
}
private void myInit()
{
lg = LogManager.GetCurrentClassLogger();
tsslApp.Text = $"{utils.CRS("appName")}";
fixVisibility();
prevValues = new Dictionary<string, string>();
currValues = new Dictionary<string, string>();
loadMemConf();
loadPlc();
startUiTimer();
startSampleTimer();
startCheckTimer();
}
private void fixVisibility()
{
bool showParams = false;
#if DEBUG
showParams = true;
#endif
lblPlcIp.Visible = showParams;
lblPlcCpu.Visible = showParams;
lblPlcRack.Visible = showParams;
lblPlcSlot.Visible = showParams;
txtIP.Visible = showParams;
txtCpuType.Visible = showParams;
txtRack.Visible = showParams;
txtSlot.Visible = showParams;
}
private void startUiTimer()
{
uiTimer.Interval = 20;
uiTimer.Tick += UiTimer_Tick;
uiTimer.Start();
}
private void startSampleTimer()
{
int sampleTimerMs = utils.CRI("sampleTimerMs");
sampleTimerMs = sampleTimerMs < 100 ? 100 : sampleTimerMs;
sampleTimer.Interval = sampleTimerMs;
sampleTimer.Tick += SampleTimer_Tick;
sampleTimer.Start();
}
private void startCheckTimer()
{
// ogni 5 minuti watchdog
checkTimer.Interval = sampleTimer.Interval * 60;
checkTimer.Tick += CheckTimer_Tick;
checkTimer.Start();
}
/// <summary>
/// init PLC
/// </summary>
private void loadPlc()
{
lgInfo("Refreshing connection...");
parametri = currDataProxy.confPLC;
// ora tento avvio PLC... SE PING OK...
if (testPing() == IPStatus.Success)
{
try
{
lgInfo($"PLC parameters: CPU {parametri.tipoCpu} | IP: {parametri.ipAdrr} | R/S: {parametri.rack}/{parametri.slot}");
currPLC = new Plc(parametri.tipoCpu, parametri.ipAdrr, parametri.rack, parametri.slot);
currPLC.Open();
if (currPLC.IsConnected)
{
lgInfo("PLC Connected!");
}
else
{
lgInfo("Connection error!");
}
}
catch (Exception exc)
{
lgError(exc, "Errore in INIT PLC");
}
}
}
/// <summary>
/// Init conf memoria
/// </summary>
protected void loadMemConf()
{
lgInfo("Starting loadMemConf");
if (File.Exists(setupFile))
{
lgInfo("Setup File found!");
try
{
StreamReader reader = new StreamReader(setupFile);
string jsonData = reader.ReadToEnd();
if (!string.IsNullOrEmpty(jsonData))
{
currDataProxy = JsonConvert.DeserializeObject<dataProxy>(jsonData);
lgInfo("Completed data deserialization");
}
reader.Close();
}
catch
{
currDataProxy = null;
}
}
// se non esistesse creo un nuovo file default
if (currDataProxy == null)
{
lgInfo($"File NOT found: {setupFile} - creating new");
dataConf newParam = new dataConf()
{
Column = "Valore assoluto",
Index = 8,
MemConf = "DB701.DBD142",
DataType = "real"
};
Dictionary<string, dataConf> paramList = new Dictionary<string, dataConf>();
paramList.Add(newParam.MemConf, newParam);
// creo nuovo obj...
currDataProxy = new dataProxy()
{
csvFilePath = @"c:\zz\prova1.csv",
csvFileEnableWrite = true,
csvSeparator = ';',
confPLC = new connParam()
{
ipAdrr = "192.168.0.102",
tipoCpu = CpuType.S71500,
rack = 0,
slot = 1
},
parametersList = paramList
};
// salvo!
string json = JsonConvert.SerializeObject(currDataProxy);
//write string to file
File.WriteAllText(setupFile, json);
lgInfo($"Setup File saved: {setupFile}");
}
// adesso valorizzo tutti i parametri
txtCsvPath.Text = currDataProxy.csvFilePath;
txtIP.Text = currDataProxy.confPLC.ipAdrr;
txtCpuType.Text = $"{currDataProxy.confPLC.tipoCpu}";
txtRack.Text = $"{currDataProxy.confPLC.rack}";
txtSlot.Text = $"{currDataProxy.confPLC.slot}";
}
#endregion
#region metodi ricorrenti
private void UiTimer_Tick(object sender, EventArgs e)
{
toolStripProgressBar1.ProgressBar.Value++;
if (toolStripProgressBar1.ProgressBar.Value >= toolStripProgressBar1.ProgressBar.Maximum)
{
toolStripProgressBar1.ProgressBar.Value = 0;
}
}
private void CheckTimer_Tick(object sender, EventArgs e)
{
// loggo!
lgInfo("Program Alive control...");
//verifico PLC
if (currPLC.IsConnected)
{
lgInfo("PLC Connected!");
}
else
{
lgInfo("Connection error!");
}
// loggo che COMUNQUE forzo scrittura su PLC!
lgInfo("Forced PLC write");
// invio a PLC
saveToPLC();
}
private void SampleTimer_Tick(object sender, EventArgs e)
{
// rileggo il file
reloadFromFile();
// verifico valore confrontando con i precedenti...
if (dataChanged())
{
// loggo!
lgInfo("Data Change on File");
// invio a PLC
saveToPLC();
}
}
#endregion
#region helper methods
/// <summary>
/// salva i dati sul PLC
/// </summary>
private void saveToPLC()
{
// invio TUTTI i dati al PLC secondo configurazione...
if (testCncConn())
{
// decodifico memoria...
memAddress memoria = null;
double valore = -999;
foreach (var item in currValues)
{
memoria = new memAddress(item.Key);
double.TryParse(item.Value, out valore);
// hard coded REAL!!!
byte[] DB_Byte = new byte[4];
S7.Net.Types.Double.ToByteArray(valore).CopyTo(DB_Byte, 0);
currPLC.WriteBytes(DataType.DataBlock, memoria.DbNum, memoria.indiceMem, DB_Byte);
// loggo invio al PLC!
lgInfo($"Value sent to PLC: {item.Key} | {valore}");
}
}
}
/// <summary>
/// Effettua comparazioen dati vecchi/nuovi
/// </summary>
/// <returns></returns>
private bool dataChanged()
{
bool answ = false;
// se i 2 vettori sono diversi
if (currValues.Count != prevValues.Count)
{
resetPrevVal();
return true;
}
// verifico ogni singolo valore...
foreach (var item in currValues)
{
// cerco...
if (prevValues.ContainsKey(item.Key))
{
// verifico se diversi --> trovato cambio!
answ = currValues[item.Key] != prevValues[item.Key];
}
else
{
answ = true;
}
// se ho cambiamenti --> esco!
if (answ)
{
// salvo ed esco subito
resetPrevVal();
return true;
}
}
return answ;
}
/// <summary>
/// Refresh oggetto valori precedenti
/// </summary>
private void resetPrevVal()
{
// salvo ed esco subito
prevValues = new Dictionary<string, string>();
foreach (var item in currValues)
{
prevValues.Add(item.Key, item.Value);
}
}
/// <summary>
/// Effettua rilettura da file
/// </summary>
protected void reloadFromFile()
{
if (File.Exists(currDataProxy.csvFilePath))
{
// leggo...
using (StreamReader sr = new StreamReader(currDataProxy.csvFilePath))
{
string currentLine;
//se ha header salto la prima riga...
if (currDataProxy.csvFileEnableWrite)
{
if ((currentLine = sr.ReadLine()) == null)
{
// vuoto: loggo ed esco!
lgError("Errore intestazione vuota!");
return;
}
}
// ora leggo la riga successiva... SE !=null
if ((currentLine = sr.ReadLine()) != null)
{
// splitto riga e cerco valore...
var valori = currentLine.Split(currDataProxy.csvSeparator);
// cerco parametri!
try
{
foreach (var item in currDataProxy.parametersList)
{
// cerco!
if (valori.Count() >= item.Value.Index)
{
upsertValue(item.Key, valori[item.Value.Index]);
}
}
}
catch (Exception exc)
{
lgError($"Eccezione i decodifica riga misura: {Environment.NewLine}{exc}");
}
loaderLogCounter--;
if (loaderLogCounter < 0)
{
// loggo che ho letto file e che contiene una certa riga...
lgInfo($"Verifica periodica riga file, contenuto:{Environment.NewLine}{currentLine}");
loaderLogCounter = 30;
}
}
else
{
// vuoto: loggo ed esco!
lgError("Errore riga vuota!");
return;
}
loaderLogCounter--;
if (loaderLogCounter < 0)
{
// loggo che ho letto file e che contiene una certa riga...
lgInfo("Check periodico file presente OK");
loaderLogCounter = 30;
}
}
}
else
{
lgError($"Errore! file non trovato: {currDataProxy.csvFilePath}");
}
}
protected void upsertValue(string key, string value)
{
// cerco se ci sia... aggiorno!
if (currValues.ContainsKey(key))
{
currValues[key] = value;
}
// altrimenti aggiungo
else
{
currValues.Add(key, value);
}
}
/// <summary>
/// test ping all'indirizzo impostato nei parametri
/// </summary>
/// <returns></returns>
private IPStatus testPing()
{
IPStatus answ = IPStatus.Unknown; ;
IPAddress address;
PingReply reply;
Ping pingSender = new Ping();
address = IPAddress.Loopback;
IPAddress.TryParse(parametri.ipAdrr, out address);
reply = pingSender.Send(address, 100);
answ = reply.Status;
return answ;
}
/// <summary>
/// Test connessione CNC
/// </summary>
/// <returns></returns>
private bool testCncConn()
{
bool answ = false;
IPStatus pingStatus = testPing();
// se passa il ping faccio il resto...
if (pingStatus != IPStatus.Success)
{
lgError("Errore ping");
}
else
{
if (!currPLC.IsConnected)
{
currPLC.Open();
}
if (!currPLC.IsConnected)
{
lgError("Errore connessione");
}
else
{
answ = true;
}
}
return answ;
}
private void appenRTLog(string contenuto)
{
// se troppe righe trimmo...
string fullLog = limitLine2show($"{contenuto}{Environment.NewLine}{txtLog.Text}");
// update
txtLog.Text = fullLog;
}
/// <summary>
/// Effettua un trim della stringa al numero max di linee da mostrare a video
/// </summary>
/// <param name="newString"></param>
/// <returns></returns>
public string limitLine2show(string newString)
{
if (!string.IsNullOrEmpty(newString))
{
// se num righe superiore a limite trimmo...
if (newString.Split('\n').Length > 50)
{
//int idx = newString.LastIndexOf('\r');
int idx = newString.LastIndexOf(Environment.NewLine);
newString = newString.Substring(0, idx);
}
}
return newString;
}
protected void lgInfo(string contenuto)
{
lg.Info(contenuto);
appenRTLog(contenuto);
}
protected void lgError(string contenuto)
{
lg.Error(contenuto);
appenRTLog(contenuto);
}
protected void lgError(Exception exc, string contenuto)
{
lg.Error(exc, contenuto);
appenRTLog(contenuto);
}
#endregion
}
}
+1 -1
View File
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30002.166
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB.WIN.FileExp", "IOB-WIN-FILE-EXP\IOB.WIN.FileExp.csproj", "{958CB938-3860-49D3-8B16-15ED0E9FE2FB}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IOB.WIN.FileExp", "IOB.WIN.FileExp\IOB.WIN.FileExp.csproj", "{958CB938-3860-49D3-8B16-15ED0E9FE2FB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -1,4 +1,4 @@
namespace MHT_Siemens
namespace IOB.WIN.FileExp
{
partial class IOB_Exporter
{
+545
View File
@@ -0,0 +1,545 @@
using Newtonsoft.Json;
using NLog;
using S7.Net;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Reflection;
using System.Windows.Forms;
namespace IOB.WIN.FileExp
{
public partial class IOB_Exporter : Form
{
#region oggetti di base
/// <summary>
/// configurazione principale proxy
/// </summary>
protected dataProxy currDataProxy;
/// <summary>
/// Oggetto PLC da ri-utilizzare...
/// </summary>
protected Plc currPLC;
/// <summary>
/// parametri di connessione
/// </summary>
protected connParam parametri;
/// <summary>
/// oggetto logging
/// </summary>
public static Logger lg;
/// <summary>
/// oggetto uiTimer x gestione refresh UI
/// </summary>
protected Timer uiTimer = new Timer();
/// <summary>
/// oggetto uiTimer x sampling file testuale
/// </summary>
protected Timer sampleTimer = new Timer();
/// <summary>
/// oggetto uiTimer x verifiche
/// </summary>
protected Timer checkTimer = new Timer();
/// <summary>
/// Contatore per decidere quando loggare la lettura del file
/// </summary>
protected int loaderLogCounter = 30;
/// <summary>
/// Directory base delle risorse (virtuale)
/// </summary>
protected const string RESOURCE_DIRECTORY = @"IOB.WIN.FileExp.Config.";
/// <summary>
/// file delle conf attivo
/// </summary>
protected const string setupFile = RESOURCE_DIRECTORY + @"setup.json";
/// <summary>
/// Ultimi valori registrati da file
/// </summary>
protected Dictionary<string, string> prevValues;
/// <summary>
/// valori correntemente letti dal file
/// </summary>
protected Dictionary<string, string> currValues;
#endregion
#region inizializazione
public IOB_Exporter()
{
InitializeComponent();
myInit();
}
private void myInit()
{
lg = LogManager.GetCurrentClassLogger();
tsslApp.Text = $"{utils.CRS("appName")}";
fixVisibility();
prevValues = new Dictionary<string, string>();
currValues = new Dictionary<string, string>();
loadMemConf();
#if false
loadPlc();
startUiTimer();
startSampleTimer();
startCheckTimer();
#endif
}
private void fixVisibility()
{
bool showParams = false;
#if DEBUG
showParams = true;
#endif
lblPlcIp.Visible = showParams;
lblPlcCpu.Visible = showParams;
lblPlcRack.Visible = showParams;
lblPlcSlot.Visible = showParams;
txtIP.Visible = showParams;
txtCpuType.Visible = showParams;
txtRack.Visible = showParams;
txtSlot.Visible = showParams;
}
private void startUiTimer()
{
uiTimer.Interval = 20;
uiTimer.Tick += UiTimer_Tick;
uiTimer.Start();
}
private void startSampleTimer()
{
int sampleTimerMs = utils.CRI("sampleTimerMs");
sampleTimerMs = sampleTimerMs < 100 ? 100 : sampleTimerMs;
sampleTimer.Interval = sampleTimerMs;
sampleTimer.Tick += SampleTimer_Tick;
sampleTimer.Start();
}
private void startCheckTimer()
{
// ogni 5 minuti watchdog
checkTimer.Interval = sampleTimer.Interval * 60;
checkTimer.Tick += CheckTimer_Tick;
checkTimer.Start();
}
/// <summary>
/// init PLC
/// </summary>
private void loadPlc()
{
lgInfo("Refreshing connection...");
parametri = currDataProxy.confPLC;
// ora tento avvio PLC... SE PING OK...
if (testPing() == IPStatus.Success)
{
try
{
lgInfo($"PLC parameters: CPU {parametri.tipoCpu} | IP: {parametri.ipAdrr} | R/S: {parametri.rack}/{parametri.slot}");
currPLC = new Plc(parametri.tipoCpu, parametri.ipAdrr, parametri.rack, parametri.slot);
currPLC.Open();
if (currPLC.IsConnected)
{
lgInfo("PLC Connected!");
}
else
{
lgInfo("Connection error!");
}
}
catch (Exception exc)
{
lgError(exc, "Errore in INIT PLC");
}
}
}
/// <summary>
/// Init conf memoria
/// </summary>
protected void loadMemConf()
{
lgInfo("Starting loadMemConf");
// recupero conf da resources
Assembly myAssembly = Assembly.GetExecutingAssembly();
//var resName = myAssembly.GetManifestResourceNames();
//var resInfo = myAssembly.GetManifestResourceInfo(setupFile);
using (Stream confStream = myAssembly.GetManifestResourceStream(setupFile))
{
using (StreamReader fileReader = new StreamReader(confStream))
{
string jsonData = fileReader.ReadToEnd();
if (!string.IsNullOrEmpty(jsonData))
{
lgInfo("Setup File found!");
try
{
currDataProxy = JsonConvert.DeserializeObject<dataProxy>(jsonData);
// verifica num max variabili (MAX 8...)
if (currDataProxy.parametersList.Count > 8)
{
lgInfo("Invalid config, reduce params list");
while (currDataProxy.parametersList.Count > 8)
{
currDataProxy.parametersList.Remove(currDataProxy.parametersList.LastOrDefault().Key);
}
}
lgInfo("Completed data deserialization");
}
catch
{
currDataProxy = null;
}
}
}
}
if (currDataProxy == null)
{
lgInfo($"File NOT found: {setupFile} - creating new");
dataConf newParam = new dataConf()
{
Column = "Valore assoluto",
Index = 8,
MemConf = "DB701.DBD142",
DataType = "real"
};
Dictionary<string, dataConf> paramList = new Dictionary<string, dataConf>();
paramList.Add(newParam.MemConf, newParam);
// creo nuovo obj...
currDataProxy = new dataProxy()
{
TriggerMemConf = "DB700.DBB0",
confPLC = new connParam()
{
ipAdrr = "192.168.0.102",
tipoCpu = CpuType.S71500,
rack = 0,
slot = 1
},
parametersList = paramList
};
}
// adesso valorizzo tutti i parametri
txtCsvPath.Text = utils.CRS("csvFilePath");
txtIP.Text = currDataProxy.confPLC.ipAdrr;
txtCpuType.Text = $"{currDataProxy.confPLC.tipoCpu}";
txtRack.Text = $"{currDataProxy.confPLC.rack}";
txtSlot.Text = $"{currDataProxy.confPLC.slot}";
}
#endregion
#region metodi ricorrenti
private void UiTimer_Tick(object sender, EventArgs e)
{
toolStripProgressBar1.ProgressBar.Value++;
if (toolStripProgressBar1.ProgressBar.Value >= toolStripProgressBar1.ProgressBar.Maximum)
{
toolStripProgressBar1.ProgressBar.Value = 0;
}
}
private void CheckTimer_Tick(object sender, EventArgs e)
{
// loggo!
lgInfo("Program Alive control...");
//verifico PLC
if (currPLC.IsConnected)
{
lgInfo("PLC Connected!");
}
else
{
lgInfo("Connection error!");
}
// loggo che COMUNQUE forzo scrittura su PLC!
lgInfo("Forced PLC write");
// invio a PLC
saveToPLC();
}
private void SampleTimer_Tick(object sender, EventArgs e)
{
// rileggo il file
reloadFromFile();
// verifico valore confrontando con i precedenti...
if (dataChanged())
{
// loggo!
lgInfo("Data Change on File");
// invio a PLC
saveToPLC();
}
}
#endregion
#region helper methods
/// <summary>
/// salva i dati sul PLC
/// </summary>
private void saveToPLC()
{
// invio TUTTI i dati al PLC secondo configurazione...
if (testCncConn())
{
// decodifico memoria...
memAddress memoria = null;
double valore = -999;
foreach (var item in currValues)
{
memoria = new memAddress(item.Key);
double.TryParse(item.Value, out valore);
// hard coded REAL!!!
byte[] DB_Byte = new byte[4];
S7.Net.Types.Double.ToByteArray(valore).CopyTo(DB_Byte, 0);
currPLC.WriteBytes(DataType.DataBlock, memoria.DbNum, memoria.indiceMem, DB_Byte);
// loggo invio al PLC!
lgInfo($"Value sent to PLC: {item.Key} | {valore}");
}
}
}
/// <summary>
/// Effettua comparazioen dati vecchi/nuovi
/// </summary>
/// <returns></returns>
private bool dataChanged()
{
bool answ = false;
// se i 2 vettori sono diversi
if (currValues.Count != prevValues.Count)
{
resetPrevVal();
return true;
}
// verifico ogni singolo valore...
foreach (var item in currValues)
{
// cerco...
if (prevValues.ContainsKey(item.Key))
{
// verifico se diversi --> trovato cambio!
answ = currValues[item.Key] != prevValues[item.Key];
}
else
{
answ = true;
}
// se ho cambiamenti --> esco!
if (answ)
{
// salvo ed esco subito
resetPrevVal();
return true;
}
}
return answ;
}
/// <summary>
/// Refresh oggetto valori precedenti
/// </summary>
private void resetPrevVal()
{
// salvo ed esco subito
prevValues = new Dictionary<string, string>();
foreach (var item in currValues)
{
prevValues.Add(item.Key, item.Value);
}
}
/// <summary>
/// Effettua rilettura da file
/// </summary>
protected void reloadFromFile()
{
#if false
if (File.Exists(currDataProxy.csvFilePath))
{
// leggo...
using (StreamReader sr = new StreamReader(currDataProxy.csvFilePath))
{
string currentLine;
//se ha header salto la prima riga...
if (currDataProxy.csvFileEnableWrite)
{
if ((currentLine = sr.ReadLine()) == null)
{
// vuoto: loggo ed esco!
lgError("Errore intestazione vuota!");
return;
}
}
// ora leggo la riga successiva... SE !=null
if ((currentLine = sr.ReadLine()) != null)
{
// splitto riga e cerco valore...
var valori = currentLine.Split(currDataProxy.csvSeparator);
// cerco parametri!
try
{
foreach (var item in currDataProxy.parametersList)
{
// cerco!
if (valori.Count() >= item.Value.Index)
{
upsertValue(item.Key, valori[item.Value.Index]);
}
}
}
catch (Exception exc)
{
lgError($"Eccezione i decodifica riga misura: {Environment.NewLine}{exc}");
}
loaderLogCounter--;
if (loaderLogCounter < 0)
{
// loggo che ho letto file e che contiene una certa riga...
lgInfo($"Verifica periodica riga file, contenuto:{Environment.NewLine}{currentLine}");
loaderLogCounter = 30;
}
}
else
{
// vuoto: loggo ed esco!
lgError("Errore riga vuota!");
return;
}
loaderLogCounter--;
if (loaderLogCounter < 0)
{
// loggo che ho letto file e che contiene una certa riga...
lgInfo("Check periodico file presente OK");
loaderLogCounter = 30;
}
}
}
else
{
lgError($"Errore! file non trovato: {currDataProxy.csvFilePath}");
}
#endif
}
protected void upsertValue(string key, string value)
{
// cerco se ci sia... aggiorno!
if (currValues.ContainsKey(key))
{
currValues[key] = value;
}
// altrimenti aggiungo
else
{
currValues.Add(key, value);
}
}
/// <summary>
/// test ping all'indirizzo impostato nei parametri
/// </summary>
/// <returns></returns>
private IPStatus testPing()
{
IPStatus answ = IPStatus.Unknown; ;
IPAddress address;
PingReply reply;
Ping pingSender = new Ping();
address = IPAddress.Loopback;
IPAddress.TryParse(parametri.ipAdrr, out address);
reply = pingSender.Send(address, 100);
answ = reply.Status;
return answ;
}
/// <summary>
/// Test connessione CNC
/// </summary>
/// <returns></returns>
private bool testCncConn()
{
bool answ = false;
IPStatus pingStatus = testPing();
// se passa il ping faccio il resto...
if (pingStatus != IPStatus.Success)
{
lgError("Errore ping");
}
else
{
if (!currPLC.IsConnected)
{
currPLC.Open();
}
if (!currPLC.IsConnected)
{
lgError("Errore connessione");
}
else
{
answ = true;
}
}
return answ;
}
private void appenRTLog(string contenuto)
{
// se troppe righe trimmo...
string fullLog = limitLine2show($"{contenuto}{Environment.NewLine}{txtLog.Text}");
// update
txtLog.Text = fullLog;
}
/// <summary>
/// Effettua un trim della stringa al numero max di linee da mostrare a video
/// </summary>
/// <param name="newString"></param>
/// <returns></returns>
public string limitLine2show(string newString)
{
if (!string.IsNullOrEmpty(newString))
{
// se num righe superiore a limite trimmo...
if (newString.Split('\n').Length > 50)
{
//int idx = newString.LastIndexOf('\r');
int idx = newString.LastIndexOf(Environment.NewLine);
newString = newString.Substring(0, idx);
}
}
return newString;
}
protected void lgInfo(string contenuto)
{
lg.Info(contenuto);
appenRTLog(contenuto);
}
protected void lgError(string contenuto)
{
lg.Error(contenuto);
appenRTLog(contenuto);
}
protected void lgError(Exception exc, string contenuto)
{
lg.Error(exc, contenuto);
appenRTLog(contenuto);
}
#endregion
}
}
@@ -6,8 +6,8 @@
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{958CB938-3860-49D3-8B16-15ED0E9FE2FB}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>MHT_Siemens</RootNamespace>
<AssemblyName>MHT-Siemens</AssemblyName>
<RootNamespace>IOB.WIN.FileExp</RootNamespace>
<AssemblyName>IOB.WIN.FileExp</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
@@ -65,7 +65,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="connParam.cs" />
<Compile Include="Constants.cs" />
<Compile Include="dataProxy.cs" />
<Compile Include="memAddress.cs" />
<Compile Include="IOB-Exporter.cs">
@@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MHT_Siemens
namespace IOB.WIN.FileExp
{
static class Program
{
@@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace MHT_Siemens.Properties {
namespace IOB.WIN.FileExp.Properties {
using System;
@@ -39,7 +39,7 @@ namespace MHT_Siemens.Properties {
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MHT_Siemens.Properties.Resources", typeof(Resources).Assembly);
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IOB.WIN.FileExp.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
@@ -8,11 +8,11 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace MHT_Siemens.Properties {
namespace IOB.WIN.FileExp.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.6.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

Before

Width:  |  Height:  |  Size: 273 KiB

After

Width:  |  Height:  |  Size: 273 KiB

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Before

Width:  |  Height:  |  Size: 273 KiB

After

Width:  |  Height:  |  Size: 273 KiB

@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MHT_Siemens
namespace IOB.WIN.FileExp
{
public class connParam
{
@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MHT_Siemens
namespace IOB.WIN.FileExp
{
/// <summary>
/// classe costruzione dataproxy
@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MHT_Siemens
namespace IOB.WIN.FileExp
{
public class memAddress
{
@@ -8,7 +8,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MHT_Siemens
namespace IOB.WIN.FileExp
{
public class utils
{