continuata modifica x integrazione vettore memorie BYTE

This commit is contained in:
Samuele E. Locatelli
2017-03-07 18:12:19 +01:00
parent 4e75f28717
commit 85b86965bb
4 changed files with 320 additions and 139 deletions
+195 -96
View File
@@ -31,6 +31,10 @@ namespace MTC_Adapter
/// Configurazione valori da leggere IOT_String
/// </summary>
public otherData[] mapIOT_String;
/// <summary>
/// variabile globale x usare IOT MEMORI (!!! da eliminare alla fine dei test)
/// </summary>
protected bool useIotMem = true;
/// <summary>
/// Carico file conf dati IOT
@@ -88,8 +92,8 @@ namespace MTC_Adapter
/// <param name="memSize">dimensione (in byte) della memoria</param>
protected void loadConfFile(ref otherData[] vettoreConf, string nomeFile, int memSize)
{
// carico dati x Maintenance
if (utils.CRB("verbose")) lg.Info("Inizio caricamento vettore mappa " + nomeFile);
//// carico dati x Maintenance
//if (utils.CRB("verbose")) lg.Info("Inizio caricamento vettore mappa " + nomeFile);
int totRighe = 0;
string linea;
totRighe = File.ReadLines(nomeFile).Count();
@@ -141,7 +145,9 @@ namespace MTC_Adapter
if (utils.CRB("verbose")) lg.Info("step 01: impostato INI File {0}", iniPath);
ncDevice = new thdNcEsaGvKvara(EsaIni);
loadOtherFile();
ncDevice = new thdNcEsaGvKvara(EsaIni, mapIOT_Byte.Length, mapIOT_Word.Length, mapIOT_DWord.Length, mapIOT_String.Length);
if (utils.CRB("verbose")) lg.Info("step 02: avviato thdNcEsaGvKvara da INI File {0}", iniPath);
@@ -211,7 +217,7 @@ namespace MTC_Adapter
// accodo dati path in DataMonitor......
StringBuilder sb = new StringBuilder();
//2017.03 RIVEDERE DA QUI x lettura globale
//2017.03.07 RIVEDERE DA QUI x lettura globale
if (connectionOk)
{
@@ -277,7 +283,7 @@ namespace MTC_Adapter
needSave = procNumCU(needSave);
// per ESA calcolo a mano se ci sia stato impiego assi... salvo le istantanee mov precedenti...
double precVal=0;
double precVal = 0;
DateTime adesso = DateTime.Now;
TimeSpan accumTime = adesso.Subtract(lastChekAccumTimeAxis);
@@ -473,86 +479,177 @@ namespace MTC_Adapter
// HARD CODE: forzo path 1 (indice 0...)
int idxPath = 0;
// verifica macchina accesa...
Byte V73 = ncDevice.PLC_MemoryAreaV[5];
if (((StFlag8)V73).HasFlag(StFlag8.B2))
// 2017.03.07 IN BLOCCO processo TUTTI i valori della memoria BYTE...
if (useIotMem)
{
mPower.Value = "ON";
ncDevice.ReadBufferByte();
// accodo dati path in DataMonitor......
StringBuilder sb = new StringBuilder();
// uno ad uno vado a inserirli nella mappa dei dati dell'adapter...
for (int i = 0; i < mapIOT_Byte.Length; i++)
{
if (mapIOT_Byte[i].varName == "IOT_EXEC")
{
//mProtectionStatus.Value = status;
// 2017.03.07 VERIFICARE!!!: per ora ON = NO EMERGENZA...
if (ncDevice.PLC_MemoryAreaIOT_Byte[i] == 0)
{
mPower.Value = "ON";
}
else
{
mPower.Value = "OFF";
}
}
else if (mapIOT_Byte[i].varName == "IOT_HOLD")
{
if (ncDevice.PLC_MemoryAreaIOT_Byte[i] != 0)
{
vettPath[idxPath].mPathExeMode.Value = "FEED_HOLD"; //"FEEDHOLD";
}
}
else if (mapIOT_Byte[i].varName == "IOT_EMG")
{
// 2017.03.07 controllo bit emergenza...
if (ncDevice.PLC_MemoryAreaIOT_Byte[i] != 0)
{
mEStop.Value = "TRIGGERED";
}
else
{
mEStop.Value = "ARMED";
}
}
else if (mapIOT_Byte[i].varName == "IOT_ALRM")
{
if (ncDevice.PLC_MemoryAreaIOT_Byte[i] != 0)
{
// carico IN BLOCCO memoria allarmi...
// FARE!!!
}
}
else if (mapIOT_Byte[i].varName == "IOT_OVRF")
{
// -------------------------------------------
// recupero dati FeedOverride
// FeedOver: 100% = 213 (il pannello è 0-120 --> 0-255, quindi 100% è 100/120*255=213)
FeedRateOver = Convert.ToInt16((decimal)(ncDevice.PLC_MemoryAreaIOT_Byte[i] * 100) / 213);
sb.AppendLine(string.Format("FeedRateOver: {0} %", FeedRateOver));
}
else if (mapIOT_Byte[i].varName == "IOT_OVRS")
{
// -------------------------------------------
// recupero dati SpeedOverride
// SpeedOver: 50% = 128
SpeedRateOver = Convert.ToInt16((decimal)(ncDevice.PLC_MemoryAreaIOT_Byte[i] * 100) / 255);
sb.AppendLine(string.Format("SpeedRateOver: {0} %", SpeedRateOver));
}
else if (mapIOT_Byte[i].varName == "IOT_LUB_EMPTY")
{
if (ncDevice.PLC_MemoryAreaIOT_Byte[i] != 0)
{
// CREARE allarme serbatoio vuoto... !!!FARE
}
}
else if (mapIOT_Byte[i].varName == "IOT_C_LUB")
{
if (ncDevice.PLC_MemoryAreaIOT_Byte[i] != 0)
{
vettLubro[0].mLubroNum.Value = ncDevice.PLC_MemoryAreaIOT_Byte[i];
}
}
else
{
}
}
}
else
{
mPower.Value = "OFF";
}
// verifica macchina accesa...
Byte V73 = ncDevice.PLC_MemoryAreaV[5];
// switch su EXE mode...
/*
* MODO_X V[70/71] --> byte (2-3)
* V70.2 = Modo RUN 
* V70.3 = Modo FeedHold
* V71.5 = Ready
* */
Byte V70 = ncDevice.PLC_MemoryAreaV[2];
Byte V71 = ncDevice.PLC_MemoryAreaV[3];
if (((StFlag8)V70).HasFlag(StFlag8.B3))
{
vettPath[idxPath].mPathExeMode.Value = "FEED_HOLD"; //"FEEDHOLD";
}
else if (((StFlag8)V70).HasFlag(StFlag8.B2))
{
vettPath[idxPath].mPathExeMode.Value = "ACTIVE";
}
else if (((StFlag8)V71).HasFlag(StFlag8.B5))
{
vettPath[idxPath].mPathExeMode.Value = "READY";
}
//// appunto: modi da creare
//STOPPED/HOLD(da creare)
//INTERRUPTED(da creare)
//OPTIONAL_STOP(da creare)
//PROGRAM_STOPPED(da creare)
//PROGRAM_COMPLETED(da creare)
if (((StFlag8)V73).HasFlag(StFlag8.B2))
{
mPower.Value = "ON";
}
else
{
mPower.Value = "OFF";
}
// switch su EXE mode...
/*
* MODO_X V[70/71] --> byte (2-3)
* V70.2 = Modo RUN 
* V70.3 = Modo FeedHold
* V71.5 = Ready
* */
Byte V70 = ncDevice.PLC_MemoryAreaV[2];
Byte V71 = ncDevice.PLC_MemoryAreaV[3];
if (((StFlag8)V70).HasFlag(StFlag8.B3))
{
vettPath[idxPath].mPathExeMode.Value = "FEED_HOLD"; //"FEEDHOLD";
}
else if (((StFlag8)V70).HasFlag(StFlag8.B2))
{
vettPath[idxPath].mPathExeMode.Value = "ACTIVE";
}
else if (((StFlag8)V71).HasFlag(StFlag8.B5))
{
vettPath[idxPath].mPathExeMode.Value = "READY";
}
//// appunto: modi da creare
//STOPPED/HOLD(da creare)
//INTERRUPTED(da creare)
//OPTIONAL_STOP(da creare)
//PROGRAM_STOPPED(da creare)
//PROGRAM_COMPLETED(da creare)
// switch su run mode...
/*
* MODO_X V[74].W --> byte (6)
* 0 = Modo NESSUNO 
* 1 = Modo MANUALE 
* 2 = Modo AUTOMATICO 
* 3 = Modo POM 
* 4 = Modo MDI 
* 5 = Modo SEMIAUTOMATICO 
* 6 = Modo RAP 
* 7 = Modo TES
* */
uint V74 = ncDevice.PLC_MemoryAreaV[6];
switch (V74)
{
case 1:
vettPath[idxPath].mPathRunMode.Value = "EDIT";
break;
case 2:
vettPath[idxPath].mPathRunMode.Value = "AUTOMATIC";
break;
case 3:
vettPath[idxPath].mPathRunMode.Value = "MANUAL";
break;
case 4:
vettPath[idxPath].mPathRunMode.Value = "MANUAL_DATA_INPUT";
break;
case 5:
vettPath[idxPath].mPathRunMode.Value = "SEMI_AUTOMATIC"; //"SEMIAUTO";
break;
case 6:
vettPath[idxPath].mPathRunMode.Value = "MANUAL"; //"RAP";
break;
case 7:
vettPath[idxPath].mPathRunMode.Value = "MANUAL"; //"TES";
break;
case 0:
default:
vettPath[idxPath].mPathRunMode.Value = "NA";
break;
// switch su run mode...
/*
* MODO_X V[74].W --> byte (6)
* 0 = Modo NESSUNO 
* 1 = Modo MANUALE 
* 2 = Modo AUTOMATICO 
* 3 = Modo POM 
* 4 = Modo MDI 
* 5 = Modo SEMIAUTOMATICO 
* 6 = Modo RAP 
* 7 = Modo TES
* */
uint V74 = ncDevice.PLC_MemoryAreaV[6];
switch (V74)
{
case 1:
vettPath[idxPath].mPathRunMode.Value = "EDIT";
break;
case 2:
vettPath[idxPath].mPathRunMode.Value = "AUTOMATIC";
break;
case 3:
vettPath[idxPath].mPathRunMode.Value = "MANUAL";
break;
case 4:
vettPath[idxPath].mPathRunMode.Value = "MANUAL_DATA_INPUT";
break;
case 5:
vettPath[idxPath].mPathRunMode.Value = "SEMI_AUTOMATIC"; //"SEMIAUTO";
break;
case 6:
vettPath[idxPath].mPathRunMode.Value = "MANUAL"; //"RAP";
break;
case 7:
vettPath[idxPath].mPathRunMode.Value = "MANUAL"; //"TES";
break;
case 0:
default:
vettPath[idxPath].mPathRunMode.Value = "NA";
break;
}
}
}
@@ -682,26 +779,28 @@ namespace MTC_Adapter
public override void processAlarm()
{
base.processAlarm();
// ora controllo "allarmi speciali" se si sono...
if (AlarmFlags != null)
if (!useIotMem)
{
// variabili helper
StFlag32 AlarmBlock = 0;
int eStopCode = utils.CRI("eStopCode") - 1; // è base zero memoria, ma allarmi base 1...
// ora controllo "allarmi speciali" se si sono...
if (AlarmFlags != null)
{
// variabili helper
StFlag32 AlarmBlock = 0;
int eStopCode = utils.CRI("eStopCode") - 1; // è base zero memoria, ma allarmi base 1...
int memStart = (int)Math.Floor((double)eStopCode / 8);
// leggo 32bit alla volta...
AlarmBlock = (StFlag32)BitConverter.ToUInt32(AlarmFlags, memStart);
int eStopIndex = eStopCode - memStart * 8;
// converto! e aggiungo allarmi sollevati al corretto controller allarmi...
if (AlarmBlock.HasFlag((StFlag32)Math.Pow(2, eStopIndex)))
{
mEStop.Value = "TRIGGERED";
}
else
{
mEStop.Value = "ARMED";
int memStart = (int)Math.Floor((double)eStopCode / 8);
// leggo 32bit alla volta...
AlarmBlock = (StFlag32)BitConverter.ToUInt32(AlarmFlags, memStart);
int eStopIndex = eStopCode - memStart * 8;
// converto! e aggiungo allarmi sollevati al corretto controller allarmi...
if (AlarmBlock.HasFlag((StFlag32)Math.Pow(2, eStopIndex)))
{
mEStop.Value = "TRIGGERED";
}
else
{
mEStop.Value = "ARMED";
}
}
}
}
+1 -1
View File
@@ -1311,7 +1311,7 @@ namespace MTC_Adapter
{
contDistMovAssi[i] = getStoredValUInt(string.Format("Axis_{0:00}_DistDone", i + 1));
contNumInvAssi[i] = getStoredValUInt(string.Format("Axis_{0:00}_InvDDone", i + 1));
contAccTimeAssi[i] = getStoredValUInt(string.Format("Axis_{0:00}_AccTime", i + 1));
contAccTimeAssi[i] = getStoredValDouble(string.Format("Axis_{0:00}_AccTime", i + 1));
}
for (int i = 0; i < currAdpConf.nVacuumPump; i++)
@@ -79,6 +79,15 @@ SysDefCn=C:\KVARA\DISCOI
; modo sincronizzato con il plc
;PlcSyncAddress=2103
;CONFIGURAZIONE DELLE AREE DI MEMORIA IOT (dimensioni vari array...)
IOT_AreaAddressByte=IOT.BYTE
IOT_AreaAddressWord=IOT.WORD
IOT_AreaAddressDWord=IOT.DWORD
IOT_AreaAddressString=IOT.STRING
;IOT_ByteAreaByteSize=20
;IOT_WordAreaByteSize=38
;IOT_DWordAreaByteSize=70
;IOT_StringAreaByteSize=4
[XILOG]
Enable=1
+115 -42
View File
@@ -38,10 +38,10 @@ namespace SCMCncLib
private UInt16 ETKAreaByteSize;
private UInt16 AlarmByteSize;
private UInt16 IOTByteAreaByteSize;
private UInt16 IOTWordAreaByteSize;
private UInt16 IOTDWordAreaByteSize;
private UInt16 IOTStringAreaByteSize;
private UInt16 IOT_ByteAreaByteSize;
private UInt16 IOT_WordAreaByteSize;
private UInt16 IOT_DWordAreaByteSize;
private UInt16 IOT_StringAreaByteSize;
private string SysLink = "";
@@ -61,7 +61,7 @@ namespace SCMCncLib
private string EOKAreaAddressName;
private TS_REG EOKAreaAddress;
private string ETKAreaAddressName;
private TS_REG ETKAreaAddress;
@@ -69,17 +69,17 @@ namespace SCMCncLib
private TS_REG PlcErrAreaAddress;
private string IOTByteAreaAddressName;
private TS_REG IOTByteAreaAddress;
private string IOT_ByteAreaAddressName;
private TS_REG IOT_ByteAreaAddress;
private string IOTWordAreaAddressName;
private TS_REG IOTWordAreaAddress;
private string IOT_WordAreaAddressName;
private TS_REG IOT_WordAreaAddress;
private string IOTDWordAreaAddressName;
private TS_REG IOTDWordAreaAddress;
private string IOT_DWordAreaAddressName;
private TS_REG IOT_DWordAreaAddress;
private string IOTStringAreaAddressName;
private TS_REG IOTStringAreaAddress;
private string IOT_StringAreaAddressName;
private TS_REG IOT_StringAreaAddress;
/// <summary>
/// Memorie a 4 byte (32 bit)
@@ -111,23 +111,35 @@ namespace SCMCncLib
/// memorie a 1 byte (8 bit) x area Allarmi (V[300] - 256 bit)
/// </summary>
public Byte[] PLC_MemoryAreaAllarmi;
#region memorie IOT NUOVE
/// <summary>
/// Area IOT_Byte: memoria temp di UINT di 4 byte (32 bit)
/// </summary>
public UInt32[] PLC_MemoryAreaIOT_Byte_tmp;
/// <summary>
/// Area IOT_Word: memoria temp di UINT di 4 byte (32 bit)
/// </summary>
public UInt32[] PLC_MemoryAreaIOT_Word_tmp;
/// <summary>
/// memorie a 1 byte (8 bit) x area IOT.Byte
/// </summary>
public UInt32[] PLC_MemoryAreaIOTByte;
public Byte[] PLC_MemoryAreaIOT_Byte;
/// <summary>
/// memorie a 2 byte (16 bit) x area IOT.Word
/// </summary>
public uint[] PLC_MemoryAreaIOTWord;
public UInt16[] PLC_MemoryAreaIOT_Word;
/// <summary>
/// memorie a 4 byte (32 bit) x area IOT.DWord
/// </summary>
public UInt32[] PLC_MemoryAreaIOTDWord;
public UInt32[] PLC_MemoryAreaIOT_DWord;
/// <summary>
/// memorie stringa x area IOT.String
/// </summary>
public UInt32[] PLC_MemoryAreaIOTString;
public string[] PLC_MemoryAreaIOT_String;
#endregion
// esa constants
#region ESA_PLC_CONSTANTS
@@ -149,7 +161,7 @@ namespace SCMCncLib
[DllImport("KvCom3x", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "_read_regbuffer@16")]
private static extern int read_regbuffer(ref TS_REG pReg, UInt16 Offset, UInt16 Count, [MarshalAs(UnmanagedType.LPArray)] UInt32[] pDst);
[DllImport("KvCom3x", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "_write_regbuffer@16")]
private static extern int write_regbuffer(ref TS_REG pReg, UInt16 Offset, UInt16 Count, [MarshalAs(UnmanagedType.LPArray)] UInt32[] pSrc);
@@ -183,7 +195,7 @@ namespace SCMCncLib
/// Initializes a new instance of the <see cref="thdNcEsaGvKvara"/> class.
/// </summary>
/// <param name="fIni">The f ini.</param>
public thdNcEsaGvKvara(IniFile fIni) : base(fIni)
public thdNcEsaGvKvara(IniFile fIni, int IAS_Byte, int IAS_Word, int IAS_DWord, int IAS_String) : base(fIni)
{
DeviceType = NC_DEVICE_TYPE.ESAGV_KVARA;
@@ -206,15 +218,18 @@ namespace SCMCncLib
DefCn = tempS.ToString() + "\\defcn";
//StrCat(DefCn, "\\defcn");
ReadNumber = 265;
WriteNumber = 265;
VAreaByteSize = 32;
ETKAreaByteSize = 8;
ETKAreaByteSize = 8;
EOKAreaByteSize = 32; // era 14aggiunto sino a 31 x avere 91...
AlarmByteSize = 32;
// nuove aree: definisco al SIZE in base ai files di configurazione letti...
// nuove aree: da init mi passa le dimensioni delle memorie
IOT_ByteAreaByteSize = Convert.ToUInt16(IAS_Byte);
IOT_WordAreaByteSize = Convert.ToUInt16(IAS_Word);
IOT_DWordAreaByteSize = Convert.ToUInt16(IAS_DWord);
IOT_StringAreaByteSize = Convert.ToUInt16(IAS_String);
CommandsAddressName = fIni.ReadString("NC", "CommandsAddress", "SIMREAD[0]");
@@ -224,6 +239,12 @@ namespace SCMCncLib
StatusAddressName = fIni.ReadString("NC", "StatusAddress", "SIMWRITE[0]");
VAreaAddressName = fIni.ReadString("NC", "VAreaAddress", "V");
// indirizzo area IOT...
IOT_ByteAreaAddressName = fIni.ReadString("NC", "IOT_AreaAddressByte", "IOT.BYTE");
IOT_WordAreaAddressName = fIni.ReadString("NC", "IOT_AreaAddressWord", "IOT.WORD");
IOT_DWordAreaAddressName = fIni.ReadString("NC", "IOT_AreaAddressDWord", "IOT.DWORD");
IOT_StringAreaAddressName = fIni.ReadString("NC", "IOT_AreaAddressString", "IOT");
/**************************************************
* Creazione buffers letture memoria
**************************************************/
@@ -246,6 +267,14 @@ namespace SCMCncLib
PLC_MemoryAreaEOK = new uint[EOKAreaByteSize];
PLC_MemoryAreaETK = new UInt32[ETKAreaByteSize];
// creo array x aree memoria IOT...
PLC_MemoryAreaIOT_Byte_tmp = new UInt32[(int)Math.Ceiling((decimal)IOT_ByteAreaByteSize / 4)];
PLC_MemoryAreaIOT_Word_tmp = new UInt32[(int)Math.Ceiling((decimal)IOT_WordAreaByteSize / 2)];
PLC_MemoryAreaIOT_Byte = new Byte[IOT_ByteAreaByteSize];
PLC_MemoryAreaIOT_Word = new UInt16[IOT_WordAreaByteSize];
PLC_MemoryAreaIOT_DWord = new UInt32[IOT_DWordAreaByteSize];
PLC_MemoryAreaIOT_String = new string[IOT_StringAreaByteSize];
if (!Connect())
Disconnect();
}
@@ -279,13 +308,64 @@ namespace SCMCncLib
Finished = true;
}
/// <summary>
/// Leggo il buffer di memorie BYTE
/// </summary>
public void ReadBufferByte()
{
// 2017.02: modifiche x nuova versione PLC: leggo intero buffer BYTE
iError = read_regbuffer(ref IOT_ByteAreaAddress, 0, IOT_ByteAreaByteSize, PLC_MemoryAreaIOT_Byte_tmp);
// ...e copio in array a byte...
try
{
Buffer.BlockCopy(PLC_MemoryAreaIOT_Byte_tmp, 0, PLC_MemoryAreaIOT_Byte, 0, IOT_ByteAreaByteSize);
}
catch
{ }
}
/// <summary>
/// Leggo il buffer di memorie WORD
/// </summary>
public void ReadBufferWord()
{
// 2017.02: modifiche x nuova versione PLC: leggo intero buffer WORD
iError = read_regbuffer(ref IOT_WordAreaAddress, 0, IOT_WordAreaByteSize, PLC_MemoryAreaIOT_Word_tmp);
try
{
Buffer.BlockCopy(PLC_MemoryAreaIOT_Word_tmp, 0, PLC_MemoryAreaIOT_Word, 0, IOT_WordAreaByteSize);
}
catch
{ }
}
/// <summary>
/// Leggo il buffer di memorie DWORD
/// </summary>
public void ReadBufferDWord()
{
// leggo intero buffer DWORD
iError = read_regbuffer(ref IOT_DWordAreaAddress, 0, IOT_DWordAreaByteSize, PLC_MemoryAreaIOT_DWord);
}
/// <summary>
/// Leggo il buffer di memorie STRING
/// </summary>
public void ReadBufferString()
{
#if false
// leggo intero buffer STRING
iError = read_regbuffer(ref IOT_StringAreaAddress, 0, IOT_StringAreaByteSize, PLC_MemoryAreaIOT_String);
#endif
}
/// <summary>
/// Reads the buffer.
/// </summary>
public void ReadBuffer()
{
// leggo da posizione memorie V/allarmi come TS_REG
iError = read_regbuffer(ref PlcErrAreaAddress, 300, AlarmByteSize, PLC_MemAreaAlarm_tmp);
iError = read_regbuffer(ref PlcErrAreaAddress, 300, AlarmByteSize, PLC_MemAreaAlarm_tmp);
// lettura buffer dal CN
iError = read_regbuffer(ref StatusAddress, 0, ReadNumber, PLC_MemoryRead);
@@ -296,23 +376,6 @@ namespace SCMCncLib
// leggo da posizione memorie EOK TS_REG
iError = read_regbuffer(ref EOKAreaAddress, 60, EOKAreaByteSize, PLC_MemoryAreaEOK);
// 2017.02: modifiche x nuova versione PLC
// leggo intero buffer BYTE
iError = read_regbuffer(ref IOTByteAreaAddress, 0, IOTByteAreaByteSize, PLC_MemoryAreaIOTByte);
// leggo intero buffer WORD
iError = read_regbuffer(ref IOTWordAreaAddress, 0, IOTWordAreaByteSize, PLC_MemoryAreaIOTWord);
// leggo intero buffer DWORD
iError = read_regbuffer(ref IOTDWordAreaAddress, 0, IOTDWordAreaByteSize, PLC_MemoryAreaIOTDWord);
// leggo intero buffer STRING
iError = read_regbuffer(ref IOTStringAreaAddress, 0, IOTStringAreaByteSize, PLC_MemoryAreaIOTString);
// copio in array a byte...
try
{
@@ -328,7 +391,7 @@ namespace SCMCncLib
catch
{ }
}
/// <summary>
/// Connects to device.
/// </summary>
@@ -350,6 +413,16 @@ namespace SCMCncLib
if (iError == 0)
iError = get_reg_by_name(VAreaAddressName, ref VAreaAddress);
if (iError == 0)
iError = get_reg_by_name(IOT_ByteAreaAddressName, ref IOT_ByteAreaAddress);
if (iError == 0)
iError = get_reg_by_name(IOT_WordAreaAddressName, ref IOT_WordAreaAddress);
if (iError == 0)
iError = get_reg_by_name(IOT_DWordAreaAddressName, ref IOT_DWordAreaAddress);
if (iError == 0)
iError = get_reg_by_name(IOT_StringAreaAddressName, ref IOT_StringAreaAddress);
Connected = (iError == 0);
return Connected;
}