Update x decodifica traduzione valori FIMAT...

This commit is contained in:
Samuele Locatelli
2023-03-20 20:08:40 +01:00
parent 4255a813d6
commit b3315ebc7c
11 changed files with 606 additions and 98 deletions
+2 -1
View File
@@ -4,7 +4,7 @@
CNCTYPE=MODBUS_TCP_FIMAT
PING_MS_TIMEOUT=1000
MinDeltaSec=5
IOB_NAME=Tend_Fimat
;IOB_NAME=Tend_Fimat
DIS_EXE_TASK=FALSE
DIS_STATE_CH=FALSE
@@ -33,6 +33,7 @@ SIZE_READ=10
SIZE_WRITE=0
HR_BASE_ADDR=40000
DELTA_BASE=0
INDEX_LUT_CORR=-1
MODBUS_EXT_REG=0
+21 -11
View File
@@ -1,14 +1,5 @@
{
"mMapWrite": {
"setProg": {
"name": "setProg",
"description": "Qty",
"memAddr": "406202",
"tipoMem": "Int",
"index": 6202,
"size": 1
}
},
"mMapWrite": { },
"mMapRead": {
"StatoMacchina": {
"name": "StatoMacchina",
@@ -309,6 +300,25 @@
"AlarmIntCond": "40002|0=2",
"ManualBitCond": "40003.1=1",
"EStopBitCond": "40003.0=1",
"WorkIntCond": "40002|0=3"
"WorkIntCond": "40002|0=3",
"VarInt2Translate": "40002,40008",
"VarBit2Translate": "40004"
},
"itemTranslation": {
"40002_0": "Stato non aggiornato per mancanza comunicazione da computer",
"40002_1": "Stato non aggiornato per mancanza comunicazione da PLC",
"40002_2": "Presenza di anomalie od attivit che limitano il funzionamento",
"40002_3": "Macchina impegnata per attivit normale in corso",
"40002_4": "Macchina libera e pronta al funzionamento",
"40004.0": "Posizione di dosaggio impegnata",
"40004.1": "Bidone con ricetta terminata od annullata da rimuovere da posizione di dosaggio",
"40004.2": "Ricetta in preparazione",
"40004.3": "Lavaggio valvole in corso",
"40004.4": "Avvio caricamento nuova ricetta in corso",
"40008_0": "Nessuno",
"40008_1": "Singola ricetta",
"40008_2": "Coda (modo non ancora avviato)",
"40008_3": "Coda (modo avviato)",
"40008_4": "Correzione"
}
}
@@ -0,0 +1,324 @@
{
"mMapWrite": { },
"mMapRead": {
"StatoMacchina": {
"name": "StatoMacchina",
"description": "Stato della Macchina",
"memAddr": "40001",
"tipoMem": "Int",
"index": 1,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"ElencoAnomalie": {
"name": "ElencoAnomalie",
"description": "Elenco Anomalie",
"memAddr": "40002",
"tipoMem": "Int",
"index": 2,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"ElencoAttivita": {
"name": "ElencoAttivita",
"description": "Elenco Attivita",
"memAddr": "40003",
"tipoMem": "Int",
"index": 3,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"StatoRicircolo": {
"name": "StatoRicircolo",
"description": "Stato Ricircolo Serbatoi",
"memAddr": "40004",
"tipoMem": "Int",
"index": 4,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"NumAllarmi": {
"name": "NumAllarmi",
"description": "NUmero Allarmi Presenti",
"memAddr": "40005",
"tipoMem": "Int",
"index": 5,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"NumAllarmiNR": {
"name": "NumAllarmiNR",
"description": "NUmero Allarmi Non Riconosciuti",
"memAddr": "40006",
"tipoMem": "Int",
"index": 6,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"ModoPreparazione": {
"name": "ModoPreparazione",
"description": "Modo Preparazione Ricetta",
"memAddr": "40007",
"tipoMem": "Int",
"index": 7,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"NumRicette": {
"name": "NumRicette",
"description": "Numero Ricette in coda",
"memAddr": "40008",
"tipoMem": "Int",
"index": 8,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"StatoImport": {
"name": "StatoImport",
"description": "Stato Importazione file ricette XML da esterno",
"memAddr": "40009",
"tipoMem": "Int",
"index": 9,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 10,
"unit": "#"
},
"LivSerb01": {
"name": "LivSerb01",
"description": "Livello Servatoio 01",
"memAddr": "40020",
"tipoMem": "Int",
"index": 20,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb02": {
"name": "LivSerb02",
"description": "Livello Servatoio 02",
"memAddr": "40021",
"tipoMem": "Int",
"index": 21,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb03": {
"name": "LivSerb03",
"description": "Livello Servatoio 03",
"memAddr": "40022",
"tipoMem": "Int",
"index": 22,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb04": {
"name": "LivSerb04",
"description": "Livello Servatoio 04",
"memAddr": "40023",
"tipoMem": "Int",
"index": 23,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb05": {
"name": "LivSerb05",
"description": "Livello Servatoio 05",
"memAddr": "40024",
"tipoMem": "Int",
"index": 24,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb06": {
"name": "LivSerb06",
"description": "Livello Servatoio 06",
"memAddr": "40025",
"tipoMem": "Int",
"index": 25,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb07": {
"name": "LivSerb07",
"description": "Livello Servatoio 07",
"memAddr": "40026",
"tipoMem": "Int",
"index": 26,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb08": {
"name": "LivSerb08",
"description": "Livello Servatoio 08",
"memAddr": "40027",
"tipoMem": "Int",
"index": 27,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb09": {
"name": "LivSerb09",
"description": "Livello Servatoio 09",
"memAddr": "40028",
"tipoMem": "Int",
"index": 28,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb10": {
"name": "LivSerb10",
"description": "Livello Servatoio 10",
"memAddr": "40029",
"tipoMem": "Int",
"index": 29,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb11": {
"name": "LivSerb11",
"description": "Livello Servatoio 11",
"memAddr": "40030",
"tipoMem": "Int",
"index": 30,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
},
"LivSerb12": {
"name": "LivSerb12",
"description": "Livello Servatoio 12",
"memAddr": "40031",
"tipoMem": "Int",
"index": 31,
"size": 1,
"func": "MAX",
"period": 90,
"factor": 1,
"minVal": 0,
"maxVal": 1000,
"unit": "#"
}
},
"optMemPar": {
"AlarmIntCond": "40000|1=2",
"ManualBitCond": "40002.1=1",
"EStopBitCond": "40002.0=1",
"WorkIntCond": "40000|1=3",
"VarInt2Translate": "40001,40007",
"VarBit2Translate": "40003"
},
"itemTranslation": {
"40001_0": "Stato non aggiornato per mancanza comunicazione da computer",
"40001_1": "Stato non aggiornato per mancanza comunicazione da PLC",
"40001_2": "Presenza di anomalie od attività che limitano il funzionamento",
"40001_3": "Macchina impegnata per attività normale in corso",
"40001_4": "Macchina libera e pronta al funzionamento",
"40003.0": "Posizione di dosaggio impegnata",
"40003.1": "Bidone con ricetta terminata od annullata da rimuovere da posizione di dosaggio",
"40003.2": "Ricetta in preparazione",
"40003.3": "Lavaggio valvole in corso",
"40003.4": "Avvio caricamento nuova ricetta in corso",
"40007_0": "Nessuno",
"40007_1": "Singola ricetta",
"40007_2": "Coda (modo non ancora avviato)",
"40007_3": "Coda (modo avviato)",
"40007_4": "Correzione"
}
}
+12 -45
View File
@@ -1,51 +1,18 @@
[
{
"description": "Allarmi Impianto",
"tipoMem": "DInt",
"memAddr": "40000",
"index": 0,
"size": 2,
"description": "Anomalie Macchina",
"tipoMem": "Int",
"memAddr": "40003",
"index": 3,
"size": 1,
"messages": [
"##",
"##",
"##",
"##",
"##",
"##",
"##",
"##",
"##EMERGENZA GENERALE",
"##TERMICO SCATTATO",
"##FAULT INVERTER",
"##FAULT STEPPER",
"##CARTER APERTI",
"##PORTA SX APERTA",
"##PORTA DX APERTA",
"##CARTER APERTI"
]
},
{
"description": "Allarmi Impianto",
"tipoMem": "DInt",
"memAddr": "40002",
"index": 2,
"size": 2,
"messages": [
"##TOUT BF NASTRO 1",
"##TOUT BF NASTRO 2",
"##TOUT BF NASTRO 3",
"##TOUT BF NASTRO 4",
"##TOUT BF NASTRO 5",
"##TOUT BF NASTRO 6",
"##ALL MOTORULLO 1",
"##ALL MOTORULLO 2",
"##ALL MOTORULLO 3",
"##ALL MOTORULLO 4",
"##ALL MOTORULLO 5",
"##ALL MOTORULLO 6",
"##",
"##",
"##",
"Emergenza Premuta",
"##Macchina in Manuale",
"Azzeramento asse non ancora eseguito o anomalia al posizionamento valvole",
"Anomalia alla bilancia (errore, mancanza comunicazione o fuori scala)",
"Anomalia ad elemento di dosaggio",
"##Richiesta Sospensione attività",
"##Azzeramento peso in corso",
"##"
]
}
+3
View File
@@ -327,6 +327,9 @@
<None Include="DATA\CONF\IMI_PAMA_392.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\Tend_FIMAT_01__bck.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="DATA\CONF\Tend_FIMAT_01.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
+5
View File
@@ -70,6 +70,11 @@ namespace IOB_WIN_NEXT
/// </summary>
public string iniFileName { get; set; } = "";
/// <summary>
/// Array degli elementi di traduzione item
/// </summary>
public Dictionary<string, string> itemTranslation { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Valore MAX per countdown segnali blinking
/// </summary>
+158 -36
View File
@@ -270,7 +270,6 @@ namespace IOB_WIN_NEXT
/// </summary>
public DateTime vetoDataSync = DateTime.Now;
/// <summary>
/// Imposta veto chiamata split (durante chiamata, per 60 sec)
/// </summary>
@@ -1138,26 +1137,6 @@ namespace IOB_WIN_NEXT
}
}
/// <summary>
/// URL per chiusura PODL --> ODL corrente (metodo GET)...
/// </summary>
public string urlPODLClose
{
get
{
string answ = "";
try
{
answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/closePODL/{cIobConf.codIOB}?idxPOdl=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlPODLClose");
}
return answ;
}
}
/// <summary>
/// URL per AVVIO PODL corrente (metodo GET)...
/// </summary>
@@ -1178,6 +1157,26 @@ namespace IOB_WIN_NEXT
}
}
/// <summary>
/// URL per chiusura PODL --&gt; ODL corrente (metodo GET)...
/// </summary>
public string urlPODLClose
{
get
{
string answ = "";
try
{
answ = $@"{cIobConf.serverData.TRANSP}://{cIobConf.serverData.MPIP}{cIobConf.serverData.MPURL}{cIobConf.serverData.CMDALIVE}/closePODL/{cIobConf.codIOB}?idxPOdl=";
}
catch (Exception exc)
{
lgError(exc, "Errore in composizione urlPODLClose");
}
return answ;
}
}
/// <summary>
/// URL per segnalazione reboot...
/// </summary>
@@ -4544,6 +4543,17 @@ namespace IOB_WIN_NEXT
/// </summary>
protected Dictionary<string, IntConditionCheck> OptCheckCondInt { get; set; } = new Dictionary<string, IntConditionCheck>();
/// <summary>
/// Elenco di valori da tradurre da valori BIT (es ModBus TCP FIMAT)
/// NB: potrebbero essere contemporaneamente attivi + valori e + traduzioni
/// </summary>
protected Dictionary<string,string> OptVar2TranslBit { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Elenco di valori da tradurre da valori INT esclusivi (es ModBus TCP FIMAT)
/// </summary>
protected Dictionary<string, string> OptVar2TranslInt { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Indica se sia stato resettato un contapezzi
/// </summary>
@@ -4566,20 +4576,6 @@ namespace IOB_WIN_NEXT
return answ;
}
}
/// <summary>
/// Fornisce formato valido x messa in coda nel formato dtEve#value#cont
/// </summary>
protected string getEncodSigLog(DateTime DtEvent, int val2log, int counter)
{
string answ = "";
try
{
answ = $"{DtEvent:yyyyMMddHHmmssfff}#{val2log:X2}#{counter}";
}
catch
{ }
return answ;
}
/// <summary>
/// Indica se vada inviata la key richiesta con lo split/autoODL
@@ -4733,6 +4729,27 @@ namespace IOB_WIN_NEXT
return answ;
}
/// <summary>
/// Classe di base implementazione traduzione di una LUT da memoria come valore BIT a valore
/// esplicito x FLog
/// </summary>
protected virtual void checkTranslateBit()
{
// verifico se devo processare decodifica di qualche valore...
if (OptVar2TranslBit != null && OptVar2TranslBit.Count > 0)
{ }
}
/// <summary>
/// Classe di base implementazione traduzione di una LUT da memoria come valore INT a valore
/// esplicito x FLog
/// </summary>
protected virtual void checkTranslateInt()
{
if (OptVar2TranslInt != null && OptVar2TranslInt.Count > 0)
{ }
}
/// <summary>
/// Restituisce stato allarmi in formato byte[]
/// </summary>
@@ -4820,6 +4837,21 @@ namespace IOB_WIN_NEXT
return answ;
}
/// <summary>
/// Fornisce formato valido x messa in coda nel formato dtEve#value#cont
/// </summary>
protected string getEncodSigLog(DateTime DtEvent, int val2log, int counter)
{
string answ = "";
try
{
answ = $"{DtEvent:yyyyMMddHHmmssfff}#{val2log:X2}#{counter}";
}
catch
{ }
return answ;
}
/// <summary>
/// Recupero dati da FluxLog
/// </summary>
@@ -5134,6 +5166,37 @@ namespace IOB_WIN_NEXT
return answ;
}
/// <summary>
/// Effettua traduzione ITEM da LUT parametrica (key: tipo+id) del file di conf, se non
/// trovo uso key
/// </summary>
/// <param name="tipo"></param>
/// <param name="id"></param>
/// <returns></returns>
protected virtual string itemTranslation(string tipo, string id)
{
string answ = "";
if (cIobConf.itemTranslation != null)
{
string lemma = id;
if (!string.IsNullOrEmpty(tipo))
{
lemma = $"{tipo}_{id}";
}
// cerco nel dizionario delle traduzioni SE esiste un valore e prendo quello,
// altrimenti uso il lemma...
if (cIobConf.itemTranslation.ContainsKey(lemma))
{
answ = cIobConf.itemTranslation[lemma];
}
else
{
answ = lemma;
}
}
return answ;
}
/// <summary>
/// Effettua logging DEBUG corretto impostanto anche la variabile IOB prima di scrivere...
/// </summary>
@@ -6114,6 +6177,29 @@ namespace IOB_WIN_NEXT
addCheckConditionInt(item.Key, item.Value);
}
}
// cerco valori *2Translate
var listVal2Translate = memMap.optMemPar.Where(x => x.Key.Contains("2Translate")).ToList();
if (listVal2Translate != null && listVal2Translate.Count > 0)
{
// cerco solo valori BIT...
var listValBit = listVal2Translate.Where(x => x.Key.StartsWith("VarBit2Translate")).ToList();
if (listValBit != null && listValBit.Count > 0)
{
foreach (var item in listValBit)
{
addVal2TranslBit(item.Value);
}
}
// ...e poi valori INT...
var listValInt = listVal2Translate.Where(x => x.Key.StartsWith("VarInt2Translate")).ToList();
if (listValInt != null && listValInt.Count > 0)
{
foreach (var item in listValInt)
{
addVal2TranslInt(item.Value);
}
}
}
}
}
@@ -6190,7 +6276,7 @@ namespace IOB_WIN_NEXT
}
/// <summary>
/// Effettua chiamata MP-IO per tentare chiusura PODL --> ODL specifico
/// Effettua chiamata MP-IO per tentare chiusura PODL --&gt; ODL specifico
/// </summary>
/// <param name="IdxODL"></param>
/// <returns></returns>
@@ -6554,6 +6640,42 @@ namespace IOB_WIN_NEXT
}
}
/// <summary>
/// Aggiunge in setup memoria l'oggetto tipo valore BIT (NON mutuamente esclusivo) da tradurre
/// </summary>
/// <param name="csvList">Elenco valori da aggiungere formato csv (es "a,b,c")</param>
private void addVal2TranslBit(string csvList)
{
var list2add = csvList.Split(',');
foreach (var memKey in list2add)
{
// cerco x aggiungere...
if (!OptVar2TranslBit.ContainsKey(memKey))
{
// init traduzione vuota
OptVar2TranslBit.Add(memKey,"");
}
}
}
/// <summary>
/// Aggiunge in setup memoria l'oggetto tipo valore INT (mutuamente esclusivo) da tradurre
/// </summary>
/// <param name="csvList">Elenco valori da aggiungere formato csv (es "a,b,c")</param>
private void addVal2TranslInt(string csvList)
{
var list2add = csvList.Split(',');
foreach (var memKey in list2add)
{
// cerco x aggiungere...
if (!OptVar2TranslInt.ContainsKey(memKey))
{
// init traduzione vuota
OptVar2TranslInt.Add(memKey,"");
}
}
}
/// <summary>
/// Verifica se ci sia veto log attivo e gestisce casistiche
/// </summary>
+1 -1
View File
@@ -659,7 +659,7 @@ namespace IOB_WIN_NEXT
/// <param name="tipo"></param>
/// <param name="id"></param>
/// <returns></returns>
protected string itemTranslation(string tipo, string id)
protected override string itemTranslation(string tipo, string id)
{
string answ = "";
string lemma = $"{tipo}_{id}";
+74
View File
@@ -696,6 +696,79 @@ namespace IOB_WIN_NEXT
#region Protected Methods
/// <summary>
/// Classe di base implementazione traduzione di una LUT da memoria come valore BIT (multipli) a valore
/// esplicito x FLog
/// </summary>
protected override void checkTranslateBit()
{
// verifico se devo processare decodifica di qualche valore...
if (OptVar2TranslBit != null && OptVar2TranslBit.Count > 0)
{
// ciclo x ogni valore da tradurre
// cerco valore nella LUT... se è pari cerco "direttamente" altrimenti dal pari inferiore e 2° INT[]
// eseguo trduzione da conf
// se è variato rispetto precedente --> accodo in FLog e salvo...
}
}
/// <summary>
/// Classe di base implementazione traduzione di una LUT da memoria come valore INT a valore
/// esplicito x FLog
/// </summary>
protected override void checkTranslateInt()
{
if (OptVar2TranslInt != null && OptVar2TranslInt.Count > 0)
{
// ciclo x ogni valore da tradurre
foreach (var item in OptVar2TranslInt)
{
int reqAddr = 0;
// traduco in int...
int.TryParse(item.Key, out reqAddr);
int lutAddr = reqAddr + indexLutCorr;
int valInt = 0;
// cerco valore nella LUT... se è pari cerco "direttamente" altrimenti dal pari inferiore e 2° INT[]
if (lutAddr % 2 == 0)
{
}
else
{
lutAddr--;
}
#if false
listInt = HoldingRegisterLUT[OptCheckCondInt[cKey].BaseAddr];
int lutAddress = parametri.holdRegBaseAddr + item.Value.index + deltaBase + indexLutCorr;
// se size = 1 --> devo cambiare modo recupero
if (item.Value.size == 1)
{
//if (item.Value.index % 2 == 0)
if (lutAddress % 2 == 0)
{
Array.Copy(HoldingRegisterLUT[lutAddress], 0, listInt, 0, 1);
}
else
{
lutAddress--;
Array.Copy(HoldingRegisterLUT[lutAddress], 1, listInt, 0, 1);
}
}
#endif
// eseguo trduzione da conf
// se è variato rispetto precedente --> accodo in FLog e salvo...
}
}
}
/// <summary>
/// Decodifica il resto dell'area x i dati accessori (allarmi, ...)
/// </summary>
@@ -1173,6 +1246,7 @@ namespace IOB_WIN_NEXT
// provo anche come stringa intera
lgTrace($"{currMemType} | {baseAddr:000} | Val string: {ModbusClient.ConvertRegistersToString(readTestInt, 0, readTestInt.Length)}");
break;
case modbusMemType.NotDefined:
default:
lgTrace($"Errore: tipo memoria non definitito per {baseAddr} / {numVals}");
+5 -3
View File
@@ -66,7 +66,7 @@ namespace IOB_WIN_NEXT
{
get
{
return testDisInBitCondition("EStopBitCond");
return testBitCondition("EStopBitCond");
}
}
@@ -140,8 +140,7 @@ namespace IOB_WIN_NEXT
if (HoldingRegisterLUT != null && HoldingRegisterLUT.Count > 0)
{
// se emergenza NON premuta (triggered) indico OK (armata...) FARE !!! togliere true
//if (!EStopTriggered)
if (true)
if (!EStopTriggered)
{
byteSignals += (1 << 7);
}
@@ -159,6 +158,9 @@ namespace IOB_WIN_NEXT
{
byteSignals += (1 << 1);
}
checkTranslateBit();
checkTranslateInt();
}
else
{
+1 -1
View File
@@ -1124,7 +1124,7 @@ namespace IOB_WIN_NEXT
/// <param name="tipo"></param>
/// <param name="id"></param>
/// <returns></returns>
protected string itemTranslation(string tipo, string id)
protected override string itemTranslation(string tipo, string id)
{
string answ = "";
string lemma = id;