Files
Mapo-IOB-WIN/IOB-WIN/IobOmron.cs
T
Samuele E. Locatelli 1ce5288e69 Altro test OUTPUT
2019-10-30 19:49:39 +01:00

857 lines
26 KiB
C#

using IOB_UT;
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
namespace IOB_WIN
{
public class IobOmron : IobGeneric
{
#if false
/// <summary>
/// Enum segnali status macchina (ByteStatus) come flag
/// </summary>
[Flags]
public enum bitStatus
{
NONE = 0,
POWER_ON = 1 << 0,
AUTO = 1 << 1,
RUN = 1 << 2,
ERROR = 1 << 3,
ALARM = 1 << 4,
EMERG_OK = 1 << 5,
DOOR_CLOSED = 1 << 6,
READY_LOAD = 1 << 7
}
/// <summary>
/// Enum segnali macchina ulteriori (ByteSignals)
/// </summary>
[Flags]
public enum bitSignals
{
NONE = 0,
TRANSF_AUTO = 1 << 0,
PUNZ_AUTO = 1 << 1,
BARR_TAV_RIPR = 1 << 2,
ARIA_OK = 1 << 3,
CONS_TRANS_OK = 1 << 4,
TAV_A = 1 << 5,
TAV_B = 1 << 6,
RICH_ACCESSO = 1 << 7
}
#endif
/// <summary>
/// LookUpTable di decodifica da CNC a segnali tipo bitmap MAPO
/// </summary>
Dictionary<string, string> signLUT = new Dictionary<string, string>();
/// <summary>
/// Oggetto MAIN x connessione OMRON
/// </summary>
protected OmronFinsTCP.Net.EtherNetPLC OMRON_ref;
/// <summary>
/// Array delle risposte dal controllo OMRON
/// </summary>
protected System.Collections.ArrayList resDataArray;
/// <summary>
/// Variabile STATUS corrente (8bit INT)
/// </summary>
protected string cStatus;
/// <summary>
/// Variabile SIGNALS corrente (8bit INT)
/// </summary>
protected string cSignals;
/// <summary>
/// Num pezzi prelevati
/// </summary>
protected int numPzPrel;
/// <summary>
/// Ultimo TC registrato da robot
/// </summary>
protected decimal lastRecTC;
/// <summary>
/// estende l'init della classe base...
/// </summary>
/// <param name="caller"></param>
/// <param name="adpConf"></param>
public IobOmron(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
// gestione invio ritardato contapezzi
pzCountDelay = utils.CRI("pzCountDelay");
lastPzCountSend = DateTime.Now;
lastWarnODL = DateTime.Now;
#if false
OMRON_ref = new OmronFinsTCP.Net.EtherNetPLC();
OMRON_ref.Link("192.168.250.1", 9600, 500);
short[] response;
short[] response2;
short bit1;
short bit2;
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 20, 2, out response);
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 22, 2, out response2);
// legge delle coppie di valori INT, vanno trasformati in HEX e POI accodati, dove il primo è x 1 e il secondo x 10000 (in pratica va in testa)
// esempio 12540 --> diviso in 1 | 2540 --> in HEX diventa 1 | 9472, ma il 9472 va su byte[0] e 1 su byte[1]
// spostamento memorie: canale 65, 65.0 (era 50.15) x reset fineciclo; 65.1, era 53.10 scrittura pesatura
OMRON_ref.ReadWord(OmronFinsTCP.Net.PlcMemory.CIO, 0, out bit1);
OMRON_ref.ReadWord(OmronFinsTCP.Net.PlcMemory.CIO, 4, out bit2);
short[] valoriWord = new short[10];
for (int i = 0; i < 10; i++)
{
valoriWord[i] = (short)i;
}
OMRON_ref.WriteWords(OmronFinsTCP.Net.PlcMemory.WR, 0, 10, valoriWord);
#endif
#if false
// init connessione
setConnection();
#endif
// test completo funzionalità OMRON, da TOGLIERE in prod...
#if DEBUG
omronFullTest();
#endif
}
/// <summary>
/// Test completo funzioni OMRON
/// </summary>
private void omronFullTest()
{
// faccio un try-catch di test vari...
short[] response;
short[] response2;
short bit1;
short bit2;
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 20, 2, out response);
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 22, 2, out response2);
// legge delle coppie di valori INT, vanno trasformati in HEX e POI accodati, dove il primo è x 1 e il secondo x 10000 (in pratica va in testa)
// esempio 12540 --> diviso in 1 | 2540 --> in HEX diventa 1 | 9472, ma il 9472 va su byte[0] e 1 su byte[1]
// spostamento memorie: canale 65, 65.0 (era 50.15) x reset fineciclo; 65.1, era 53.10 scrittura pesatura
OMRON_ref.ReadWord(OmronFinsTCP.Net.PlcMemory.CIO, 0, out bit1);
OMRON_ref.ReadWord(OmronFinsTCP.Net.PlcMemory.CIO, 4, out bit2);
short[] valoriWord = new short[10];
for (int i = 0; i < 10; i++)
{
valoriWord[i] = (short)i;
}
OMRON_ref.WriteWords(OmronFinsTCP.Net.PlcMemory.WR, 0, 10, valoriWord);
}
/// <summary>
/// Processo i task richiesti e li elimino dalla coda 1:1
/// </summary>
/// <param name="task2exe"></param>
public override Dictionary<string, string> executeTasks(Dictionary<string, string> task2exe)
{
// Verificare il protocollo: dovrebbe togliere SOLO i task eseguiti...
Dictionary<string, string> taskDone = new Dictionary<string, string>();
bool taskOk = false;
string taskVal = "";
#if false
// cerco task specifici: se ho startSetup --> imposto bit DBB701.DBB0.4
foreach (var item in task2exe)
{
taskOk = false;
taskVal = "";
// converto richiesta in enum...
taskType tName = taskType.nihil;
Enum.TryParse(item.Key, out tName);
// controllo sulla KEY
switch (tName)
{
case taskType.nihil:
case taskType.fixStopSetup:
case taskType.setArt:
case taskType.setComm:
case taskType.setProg:
case taskType.sendWatchDogMes2Plc:
taskVal = $"taskReq: {tName} | key: {item.Key} | val: {item.Value} | SKIPPED | NO EXEC";
break;
case taskType.forceResetPzCount:
// reset contapezzi inizio setup
taskOk = resetContapezziCNC();
taskVal = taskOk ? "FORCE RESET PZ COUNT" : "FORCE RESET DISABLED | NO EXEC";
break;
case taskType.forceSetPzCount:
// reset contapezzi inizio setup
int newPzCount = 0;
int.TryParse(item.Value, out newPzCount);
if (newPzCount >= 0)
{
taskOk = setContapezziCNC(newPzCount);
taskVal = taskOk ? $"FORCE SET PZ COUNT TO {newPzCount}" : $"FORCE SET PZ COUNT TO {newPzCount} | NO EXEC";
}
else
{
taskVal = $"ERROR IN FORCE SET PZ COUNT TO {newPzCount}";
}
break;
case taskType.startSetup:
// reset contapezzi inizio setup
taskOk = resetContapezziCNC();
taskVal = taskOk ? "RESET: SETUP START" : "PZ RESET DISABLED | NO EXEC";
break;
case taskType.stopSetup:
// reset contapezzi fine setup // reset contapezzi fine setup SE ESPLICITAMENTE IMPOSTATO
if (cIobConf.optPar.Count > 0 && getOptPar("ENABLE_PZ_RESET_stopSetup") == "TRUE")
{
resetContapezziCNC();
}
taskVal = taskOk ? "RESET: SETUP END" : "PZ RESET DISABLED | NO EXEC";
break;
default:
taskVal = "SKIPPED | NO EXEC";
break;
}
taskDone.Add(item.Key, taskVal);
}
#endif
return taskDone;
}
/// <summary>
/// Effettua reset del contapezzi
/// </summary>
/// <returns></returns>
public override bool resetContapezziCNC()
{
bool answ = false;
#if false
// ...SE abilitato da conf IOB
if (cIobConf.optPar.Count > 0 && getOptPar("ENABLE_PZ_RESET") == "TRUE")
{
// scrivo valore 0 x il contapezzi
try
{
pzCounter = 0;
}
catch (Exception exc)
{
lgError(exc, "Errore in RESET contapezzi OMRON");
connectionOk = false;
}
answ = true;
}
else
{
lgError("Impossibile effettuare RESET contapezzi OMRON, mancanza parametro OPT:ENABLE_PZ_RESET");
}
#endif
return answ;
}
/// <summary>
/// Effettua IMPOSTAZIONE FORZATA del contapezzi
/// </summary>
/// <returns></returns>
public override bool setContapezziCNC(int newPzCount)
{
bool answ = false;
#if false
// ...SE abilitato da conf IOB
if (cIobConf.optPar.Count > 0 && getOptPar("ENABLE_PZ_RESET") == "TRUE")
{
// scrivo valore 0 x il contapezzi
try
{
pzCounter = newPzCount;
}
catch (Exception exc)
{
lgError(exc, "Errore in SET contapezzi OMRON");
connectionOk = false;
}
answ = true;
}
else
{
lgError("Impossibile effettuare SET contapezzi OMRON, mancanza parametro OPT:ENABLE_PZ_RESET");
}
#endif
return answ;
}
/// <summary>
/// Imposto connessione
/// </summary>
protected virtual void setConnection()
{
// Creo oggetto connessione NC
parentForm.commPlcActive = true;
lgInfo("Start init Adapter OMRON all'IP {0} | --> IOB {1}", cIobConf.cncIpAddr, cIobConf.codIOB);
// inizializzo correttamente aree memoria secondo CONF - iniFileName
IniFile fIni = new IniFile(cIobConf.iniFileName);
// fix enable prgName
enablePrgName = fIni.ReadBoolean("CNC", "GETPRGNAME", false);
// SE è necessario refresh...
if (needRefresh)
{
lgInfo("Refreshing connection...");
// ora tento avvio PLC... SE PING OK...
if (testPing == IPStatus.Success)
{
try
{
short esitoLink = doConnect();
lgInfo($"End init Adapter OMRON, esitoLink: {esitoLink}");
if (utils.CRB("verbose"))
{
lgInfo("OMRON CONNESSIONE AVVENUTA");
}
}
catch (Exception exc)
{
lgError(exc, "Errore in INIT OMRON Commu");
}
needRefresh = false;
}
parentForm.commPlcActive = false;
// gestione pzCounter
#if false
if (utils.CRB("enableContapezzi"))
{
lgInfo("OMRON: inizio gestione contapezzi");
try
{
// verifico quale modalità sia richiesta: STD (6711) oppure BIT (Custom, con indicazione area)
if (cIobConf.optPar.Count > 0 && getOptPar("PZCOUNT_MODE") != "")
{
if (getOptPar("PZCOUNT_MODE").StartsWith("STD"))
{
pzCntReload(true);
// refresh associazione Macchina - IOB
sendM2IOB();
// per adesso imposto lettura fanuc == contapezzi (poi farà vera lettura...)
lastCountCNC = contapezzi;
}
else
{
contapezzi = 0;
lgInfo("Contapezzi STD disabilitato: modalità {0}", getOptPar("PZCOUNT_MODE"));
}
}
else
{
contapezzi = 0;
lgInfo("Parametro mancante PZCOUNT_MODE");
}
}
catch (Exception exc)
{
lgError(exc, "Errore in contapezzi OMRON");
}
}
#endif
}
}
/// <summary>
/// Vera connessione ad OMRON
/// </summary>
/// <returns></returns>
private short doConnect()
{
// avvio un oggetto di comunicazione OMRON
OMRON_ref = new OmronFinsTCP.Net.EtherNetPLC();
short port = 9600;
short.TryParse(cIobConf.cncPort, out port);
lgInfo($"Chiamata apertura OMRON FINS: {cIobConf.cncIpAddr}:{port}");
short esitoLink = OMRON_ref.Link(cIobConf.cncIpAddr, port, 500);
return esitoLink;
}
/// <summary>
/// Override disconnessione
/// </summary>
public override void tryDisconnect()
{
if (connectionOk)
{
string szStatusConnection = "";
try
{
OMRON_ref.Close();
connectionOk = false;
lgInfo(szStatusConnection);
lgInfo("Effettuata disconnessione adapter OMRON!");
}
catch (Exception exc)
{
lgFatal(exc, "Errore nella disconnessione dall'adapter OMRON");
}
}
else
{
lgError("IMPOSSIBILE effettuare disconnessione OMRON: Connessione non disponibile...");
}
}
/// <summary>
/// Override connessione
/// </summary>
public override void tryConnect()
{
if (!connectionOk)
{
// controllo che il ping sia stato tentato almeno pingTestSec fa...
if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec"))
{
if (verboseLog || periodicLog)
{
lgInfo("OMRON: ConnKO - tryConnect");
}
// in primis salvo data ping...
lastPING = DateTime.Now;
// se passa il ping faccio il resto...
if (testPing == IPStatus.Success)
{
string szStatusConnection = "";
try
{
// ora provo connessione...
parentForm.commPlcActive = true;
short esitoLink = doConnect();
lgInfo($"szStatusConnection OMRON, esitoLink: {esitoLink}");
parentForm.commPlcActive = false;
connectionOk = true;
// refresh stato allarmi!!!
if (connectionOk)
{
if (adpRunning)
{
// carico status allarmi (completo)
lgInfo("Inizio refresh completo stato allarmi...");
forceAlarmCheck();
lgInfo("Completato refresh completo stato allarmi!");
}
else
{
lgInfo("Connessione OK");
}
}
else
{
lgError("Impossibile procedere, connessione mancante...");
}
}
catch (Exception exc)
{
lgFatal($"Errore nella connessione all'adapter OMRON: {szStatusConnection}{Environment.NewLine}{exc}");
connectionOk = false;
lgInfo($"Eccezione in TryConnect, Adapter OMRON NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione");
}
}
else
{
// loggo no risposta ping ...
connectionOk = false;
if (verboseLog || periodicLog)
{
lgInfo($"Attenzione: OMRON controllo PING fallito per IP {cIobConf.cncIpAddr}");
}
}
}
}
else
{
needRefresh = true;
}
// se non è ancora connesso faccio procesisng memoria caso disconnesso...
if (!connectionOk)
{
// processo semafori ed invio...
processMemoryDiscon();
}
}
public override void forceAlarmCheck()
{
//base.forceAlarmCheck();
}
/// <summary>
/// Oggetto per lettura counter pezzi PRELEVATI
/// </summary>
protected int pzPrelevati
{
get
{
int answ = 0;
#if false
if (OMRON_ref.IsConnected)
{
resDataArray = OMRON_ref.command("TYPE i_prelevati", 3000); // num pz prelevati --> "0\r\n"
int.TryParse(resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""), out answ);
}
#endif
return answ;
}
}
/// <summary>
/// Oggetto per lettura/scrittura counter pezzi robot
/// </summary>
protected int pzCounter
{
get
{
int answ = 0;
#if false
if (OMRON_ref.IsConnected)
{
resDataArray = OMRON_ref.command("TYPE i_cicli", 3000); // num cicli depositati/fatti --> " 0\r\n"
int.TryParse(resDataArray[1].ToString().Replace("\n", "").Replace("\r", ""), out answ);
}
#endif
return answ;
}
set
{
#if false
if (OMRON_ref.IsConnected)
{
comando = string.Format("i_cicli={0}", value);
// scrivo valore cicli
resDataArray = OMRON_ref.command(comando, 3000); // imposto cicli depositati/fatti --> " 0\r\n"
}
#endif
}
}
/// <summary>
/// Restituisce stato macchina nel formato (da sx a dx):
/// B0: POWER_ON
/// B1: AUTO
/// B2: RUN
/// B3: ERROR
/// B4: ALLARME
/// B5: EMERGENZA OK
/// B6: PORTA CHIUSA
/// B7: PRONTO AL LOAD
/// </summary>
protected string currBitmapStatus
{
get
{
string answ = "";
#if false
if (OMRON_ref.IsConnected)
{
resDataArray = OMRON_ref.command("TYPE $status", 3000); // status --> "0|0|1|0|0|1|0|0\r\n"
answ = resDataArray[1].ToString().Replace("\n", "").Replace("\r", "").Replace("|", "");
}
#endif
return answ;
}
}
/// <summary>
/// Restituisce SEGNALI macchina nel formato:
/// B0: Transfer in auto
/// B1: Punzonatrice in AUTO
/// B2: Barriera tavola ripristinata
/// B3: Aria in linea OK
/// B4: Console Transfer in fuori ingombro
/// B5: TAV A
/// B6: TAV B
/// B7: Richiesta accesso attiva
/// </summary>
protected string currBitmapSignals
{
get
{
string answ = "";
#if false
if (OMRON_ref.IsConnected)
{
resDataArray = OMRON_ref.command("TYPE $signal", 3000); // segnali --> "1|0|1|1|1|0|0|0\r\n"
answ = resDataArray[1].ToString().Replace("\n", "").Replace("\r", "").Replace("|", "");
}
#endif
return answ;
}
}
#region Metodi specifici (da verificare/completare in implementazione)
/// <summary>
/// Effettua vero processing contapezzi
/// </summary>
public override void processContapezzi()
{
if (utils.CRB("enableContapezzi"))
{
#if false
try
{
// hard coded... !!!FARE!!! rivedere megio conf
lastCountCNC = pzCounter;
// verifico quale modalità sia richiesta: STD (6711) oppure BIT (Custom, con indicazione area)
if (cIobConf.optPar.Count > 0 && getOptPar("PZCOUNT_MODE") != "")
{
}
}
catch (Exception exc)
{
lgError(exc, "Errore in contapezzi OMRON");
}
#endif
}
}
/// <summary>
/// Effettua processing del recupero delle OVERRIDE (spindle, feedrate, rapid)
/// </summary>
public override void processOverride()
{
}
/// <summary>
/// lettura bit semafori
/// </summary>
public override void readSemafori()
{
base.readSemafori();
if (verboseLog)
{
lgInfo("inizio read semafori");
}
parentForm.sIN = Semaforo.SV;
// effettuo TUTTE le letture
cStatus = currBitmapStatus;
cSignals = currBitmapSignals;
lastCountCNC = pzCounter;
// decodifica e gestione
decodeToBaseBitmap();
}
private void readAndLog()
{
#if false
short[] response1;
short[] response2;
short bit1;
short bit2;
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 20, 2, out response1);
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 22, 2, out response2);
// legge delle coppie di valori INT, vanno trasformati in HEX e POI accodati, dove il primo è x 1 e il secondo x 10000 (in pratica va in testa)
// esempio 12540 --> diviso in 1 | 2540 --> in HEX diventa 1 | 9472, ma il 9472 va su byte[0] e 1 su byte[1]
#endif
short[] responseCIO;
short[] responseDM;
short[] responseWR;
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.CIO, 0, 8, out responseCIO);
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 0, 8, out responseDM);
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.WR, 0, 8, out responseWR);
lgInfo("Effettuata lettura dati CIO");
foreach (var item in responseCIO)
{
lgInfo($"Valori: {item} --> {baseUtils.binaryForm(item)}");
}
lgInfo("Effettuata lettura dati DM");
foreach (var item in responseDM)
{
lgInfo($"Valori: {item} --> {baseUtils.binaryForm(item)}");
}
lgInfo("Effettuata lettura dati WR");
foreach (var item in responseWR)
{
lgInfo($"Valori: {item} --> {baseUtils.binaryForm(item)}");
}
short[] respDM20;
short[] respDM22;
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 20, 2, out respDM20);
OMRON_ref.ReadWords(OmronFinsTCP.Net.PlcMemory.DM, 22, 2, out respDM22);
// legge delle coppie di valori INT, vanno trasformati in HEX e POI accodati, dove il primo è x 1 e il secondo x 10000 (in pratica va in testa)
lgInfo("Effettuata lettura dati respDM20");
foreach (var item in respDM20)
{
lgInfo($"Valori: {item} --> {baseUtils.binaryForm(item)}");
}
lgInfo("Effettuata lettura dati respDM22");
foreach (var item in respDM22)
{
lgInfo($"Valori: {item} --> {baseUtils.binaryForm(item)}");
}
}
/// <summary>
/// Effettua decodifica aree memoria alla bitmap usata x MAPO
/// </summary>
private void decodeToBaseBitmap()
{
// init a zero...
B_input = 0;
#if false
/* -----------------------------------------------------
* bitmap MAPO
* B0: POWER_ON
* B1: RUN
* B2: pzCount
* B3: allarme
* B4: manuale
* B5: emergenza
* B6: error prog
* B7: auto mode
----------------------------------------------------- */
// bit 0 (poweron) imposto a 1 SE connected...
B_input = OMRON_ref.IsConnected ? 1 : 0;
// RUN
if (cStatus[2] == '1')
{
B_input += (1 << 1);
}
// ERROR prog/macchina
if (cStatus[3] == '1')
{
B_input += (1 << 6);
}
// allarme
if (cStatus[4] == '1')
{
B_input += (1 << 3);
}
// Automatico (porta chiusa)
if (cStatus[6] == '1' || cStatus[1] == '1')
{
B_input += (1 << 4);
}
// NON EMERGENZA (1=armed, 0=triggered)
if (cStatus[5] == '0')
{
B_input += (1 << 5);
}
// process ODL e contapezzi
string currODL = "";
try
{
currODL = utils.callUrl(urlGetCurrODL);
// solo SE HO un ODL...
if (currODL == "" || currODL == "0")
{
if (periodicLog)
{
lgInfo(string.Format("OMRON | Lettura ODL andata a vuoto: currODL: {0}", currODL));
}
}
else
{ // se variato o scaduto timeout log...
if (periodicLog || (currIdxODL.ToString() != currODL))
{
lgInfo(string.Format("OMRON | Lettura ODL, currODL: {0} --> currIdxODL prec: {1}", currODL, currIdxODL));
}
// provo a salvare nuovo ODL
int.TryParse(currODL, out currIdxODL);
}
}
catch (Exception exc)
{
if (DateTime.Now.Subtract(lastWarnODL).TotalSeconds > 15)
{
lgError(exc, "Errore in fase di chiamata URL x ODL corrente | URL chiamato: {0}", urlGetCurrODL);
lastWarnODL = DateTime.Now;
}
}
if (currODL != null && currODL != "" && currODL != "0")
{
// ora processo il contapezzi...
// controllo se è passato intervallo minimo tra 2 controlli/elaborazioni x distanziare invio e ridurre letture
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
// se sono differenti MOSTRO...
if (lastCountCNC != contapezzi)
{
// registro contapezzi
lgInfo(string.Format("Differenza Contapezzi: READ: {0} | Interno {1}", lastCountCNC, contapezzi));
}
// verifico se variato contapezzi... e se passato ritardo minimo...
if (lastCountCNC > contapezzi)
{
// salvo nuovo contapezzi (incremento di 1...)
contapezzi++;
// salvo in semaforo!
B_input += (1 << 2);
// registro contapezzi
lgInfo(string.Format("Contapezzi OMRON: {0} | Contapezzi interno {1}", lastCountCNC, contapezzi));
}
// invio a server contapezzi (aggiornato)
string retVal = utils.callUrl(urlSetPzCount + contapezzi.ToString());
// verifica se tutto OK
if (retVal != "OK")
{
// errore salvataggio contapezzi
lgInfo(string.Format("Errore salvataggio Contapezzi OMRON {0} | Contapezzi interno {1} | Errore salvataggio: {2}", lastCountCNC, contapezzi, retVal));
}
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
else
{
if (DateTime.Now >= lastPzCountSend.AddMilliseconds(pzCountDelay))
{
lgInfo(string.Format("Attenzione: mancanza ODL non procedo con gestione contapezzi. Contapezzi OMRON {0} | Contapezzi interno {1}", lastCountCNC, contapezzi));
// resetto timer...
lastPzCountSend = DateTime.Now;
}
}
// log opzionale!
if (verboseLog)
{
lgInfo(string.Format("Trasformazione B_input: {0}", B_input));
}
#endif
}
/// <summary>
/// Recupero dati dinamici...
/// </summary>
public override Dictionary<string, string> getDynData()
{
// valore non presente in vers default... se gestito fare override
Dictionary<string, string> outVal = new Dictionary<string, string>();
outVal.Add("NUM_PZ_PREL", pzPrelevati.ToString());
#if false
outVal.Add("NUM_PZ_LAV", pzCounter.ToString());
outVal.Add("CURR_SIGNALS", currBitmapSignals.ToString());
#endif
// leggo e scrivo LOG...
readAndLog();
return outVal;
}
#endregion
}
}