Added Reset Hours functions

This commit is contained in:
Nicola Carminati
2019-04-03 16:23:29 +00:00
parent 5953306479
commit 16cf7e21f8
5 changed files with 360 additions and 1 deletions
+50
View File
@@ -720,6 +720,56 @@ namespace CMS_CORE_Library.Demo
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeHead(int head, ref uint time)
{
int index = (head - 1) *4;
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address + index, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeHead(int head)
{
int index = (head - 1) * 4;
uint time = 0;
if (head <= 0 || head > MAX_HEADS_NUMBER)
return INCORRECT_PARAMETERS_ERROR;
// Read Worked time
CmsError cmsError = MEM_RWDWord(W, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address + index, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeMachine(ref uint time)
{
// Read Worked time -> ipotizzo sia il contatore 0
CmsError cmsError = MEM_RWDWord(R, 0, COUNTERS.MemType, COUNTERS.Address, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeMachine(uint time)
{
// Write Worked time -> ipotizzo sia il contatore 0
CmsError cmsError = MEM_RWDWord(W, 0, COUNTERS.MemType, COUNTERS.Address, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign)
{
if (id > MAX_HEADS_NUMBER)
+101
View File
@@ -832,6 +832,104 @@ namespace CMS_CORE_Library.Fanuc
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeHead(int head, ref uint time)
{
int index = (head - 1) * 4;
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address + index, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeHead(int head)
{
byte usControlWord = 0;
if (head <= 0 || head > MAX_HEADS_NUMBER)
return INCORRECT_PARAMETERS_ERROR;
// Read status
CmsError cmsError = MEM_RWByte(R, 0, HEAD_RESET_WORKED_TIME.MemType, HEAD_RESET_WORKED_TIME.Address, 0, ref usControlWord);
if (cmsError.IsError())
return cmsError;
// Re-Write it status
usControlWord = Convert.ToByte((usControlWord & 0xE0) | (head & 0X1F));
cmsError = MEM_RWByte(W, 0, HEAD_RESET_WORKED_TIME.MemType, HEAD_RESET_WORKED_TIME.Address, 0, ref usControlWord);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeMachine(ref uint time)
{
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeMachine(uint time)
{
uint actTime = 0;
// Read actual Value
CmsError cmsError = MEM_RWDWord(R, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, ref actTime);
if (cmsError.IsError())
return cmsError;
// Per richiedere l'azzeramento del timer invio 4 volte il segnale velocemente al PLC
// Il PLC resetta il bit e aspetta quello successivo entro 500ms, se no abortisce
// Sfrutto così la velocità dei sw, cosa che un "nemico" a mano se provasse a forzare il bit non avrebbe
bool bitValue = true;
int nTry = 0;
for (int i = 0; i < 4; i++)
{
//Scrivo il bit
cmsError = MEM_RWBoolean(W, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
//Aspetto che venga abbassato
do
{
Thread.Sleep(50);
nTry += 1;
cmsError = MEM_RWBoolean(R, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
} while (!bitValue || nTry > 10);
//se il valore è rimasto a 1 il plc non l'ha preso in carico, e abortisco
if (bitValue)
{
bitValue = true;
cmsError = MEM_RWBoolean(W, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
return PLC_NOT_RUNNING_ERROR;
}
else
{
//Se l'ha abbassato scrivo il nuovo dato
cmsError = MEM_RWDWord(W, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, ref time);
}
}
return NO_ERROR;
}
public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign)
{
@@ -4628,5 +4726,8 @@ namespace CMS_CORE_Library.Fanuc
//old CMS-Control variables
internal static MEMORY_CELL HEADS_WORKED_TIMES = new MEMORY_CELL(MEMORY_TYPE.Fanuc_D, 3060, 4);
internal static MEMORY_CELL HEAD_RESET_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Fanuc_D, 7217, 4);
internal static MEMORY_CELL MACHINE_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Fanuc_D, 7213, 4);
internal static MEMORY_CELL MACHINE_RESET_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Fanuc_D, 7212, 4);
}
}
+6
View File
@@ -566,6 +566,12 @@ namespace CMS_CORE_Library
public abstract CmsError PLC_WScadaValue(string memIndex, SCADA_MEM_TYPE memType, object value);
public abstract CmsError PLC_RWorkedTimeHead(int head, ref uint time);
public abstract CmsError PLC_WResetWorkedTimeHead(int head);
public abstract CmsError PLC_RWorkedTimeMachine(ref uint time);
public abstract CmsError PLC_WResetWorkedTimeMachine(uint time);
public abstract CmsError PLC_RCandy(ref int value);
public abstract CmsError PLC_WCandy(int value);
public abstract CmsError PLC_RExpiredCandy(ref bool value);
+102
View File
@@ -802,6 +802,103 @@ namespace CMS_CORE_Library.Osai
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeHead(int head, ref uint time)
{
int index = (head - 1) * 2;
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address + index, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeHead(int head)
{
ushort usControlWord = 0;
if(head <= 0 || head > MAX_HEADS_NUMBER)
return INCORRECT_PARAMETERS_ERROR;
// Read status
CmsError cmsError = MEM_RWWord(R, 0, HEAD_RESET_WORKED_TIME.MemType, HEAD_RESET_WORKED_TIME.Address, ref usControlWord);
if (cmsError.IsError())
return cmsError;
// Re-Write it status
usControlWord = Convert.ToUInt16((usControlWord & 0xFFE0) | (head & 0X1F));
cmsError = MEM_RWWord(W, 0, HEAD_RESET_WORKED_TIME.MemType, HEAD_RESET_WORKED_TIME.Address, ref usControlWord);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeMachine(ref uint time)
{
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeMachine(uint time)
{
uint actTime = 0;
// Read actual Value
CmsError cmsError = MEM_RWDWord(R, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, ref actTime);
if (cmsError.IsError())
return cmsError;
// Per richiedere l'azzeramento del timer invio 4 volte il segnale velocemente al PLC
// Il PLC resetta il bit e aspetta quello successivo entro 500ms, se no abortisce
// Sfrutto così la velocità dei sw, cosa che un "nemico" a mano se provasse a forzare il bit non avrebbe
bool bitValue = true;
int nTry = 0;
for (int i = 0; i<4; i++)
{
//Scrivo il bit
cmsError = MEM_RWBoolean(W, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address,0, ref bitValue);
if (cmsError.IsError())
return cmsError;
//Aspetto che venga abbassato
do
{
Thread.Sleep(50);
nTry += 1;
cmsError = MEM_RWBoolean(R, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
} while (!bitValue || nTry > 10);
//se il valore è rimasto a 1 il plc non l'ha preso in carico, e abortisco
if (bitValue)
{
bitValue = true;
cmsError = MEM_RWBoolean(W, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
return PLC_NOT_RUNNING_ERROR;
}
else
{
//Se l'ha abbassato scrivo il nuovo dato
cmsError = MEM_RWDWord(W, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, ref time);
}
}
return NO_ERROR;
}
public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign)
{
@@ -4407,6 +4504,11 @@ namespace CMS_CORE_Library.Osai
//old CMS-Control variables
internal static MEMORY_CELL HEADS_WORKED_TIMES = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 2910, 4);
internal static MEMORY_CELL HEAD_RESET_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 3458, 4);
internal static MEMORY_CELL MACHINE_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 3455, 4);
internal static MEMORY_CELL MACHINE_RESET_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Osai_MW, 3454, 4);
}
#endregion Memory addresses
+101 -1
View File
@@ -999,7 +999,7 @@ namespace CMS_CORE_Library.Siemens
readValues = readInts.SelectMany(BitConverter.GetBytes).ToList();
// Read Worked time heads
cmsError = MEM_RWDWordList(R, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address, number, ref readHours);
cmsError = MEM_RWDWordList(R, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address, HEADS_WORKED_TIMES.SubAddress, number, ref readHours);
if (cmsError.IsError())
return cmsError;
@@ -1036,6 +1036,103 @@ namespace CMS_CORE_Library.Siemens
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeHead(int head, ref uint time)
{
int index = (head - 1) * 4;
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, HEADS_WORKED_TIMES.MemType, HEADS_WORKED_TIMES.Address, HEADS_WORKED_TIMES.SubAddress + index, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeHead(int head)
{
byte usControlWord = 0;
if (head <= 0 || head > MAX_HEADS_NUMBER)
return INCORRECT_PARAMETERS_ERROR;
// Read status
CmsError cmsError = MEM_RWByte(R, 0, HEAD_RESET_WORKED_TIME.MemType, HEAD_RESET_WORKED_TIME.Address, HEADS_WORKED_TIMES.SubAddress, 0, ref usControlWord);
if (cmsError.IsError())
return cmsError;
// Re-Write it status
usControlWord = Convert.ToByte((usControlWord & 0xE0) | (head & 0X1F));
cmsError = MEM_RWByte(W, 0, HEAD_RESET_WORKED_TIME.MemType, HEAD_RESET_WORKED_TIME.Address, HEADS_WORKED_TIMES.SubAddress, 0, ref usControlWord);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_RWorkedTimeMachine(ref uint time)
{
// Read Worked time
CmsError cmsError = MEM_RWDWord(R, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, MACHINE_WORKED_TIME.SubAddress, ref time);
if (cmsError.IsError())
return cmsError;
return NO_ERROR;
}
public override CmsError PLC_WResetWorkedTimeMachine(uint time)
{
uint actTime = 0;
// Read actual Value
CmsError cmsError = MEM_RWDWord(R, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, MACHINE_WORKED_TIME.SubAddress, ref actTime);
if (cmsError.IsError())
return cmsError;
// Per richiedere l'azzeramento del timer invio 4 volte il segnale velocemente al PLC
// Il PLC resetta il bit e aspetta quello successivo entro 500ms, se no abortisce
// Sfrutto così la velocità dei sw, cosa che un "nemico" a mano se provasse a forzare il bit non avrebbe
bool bitValue = true;
int nTry = 0;
for (int i = 0; i < 4; i++)
{
//Scrivo il bit
cmsError = MEM_RWBoolean(W, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, MACHINE_RESET_WORKED_TIME.SubAddress, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
//Aspetto che venga abbassato
do
{
Thread.Sleep(50);
nTry += 1;
cmsError = MEM_RWBoolean(R, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, MACHINE_RESET_WORKED_TIME.SubAddress, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
} while (!bitValue || nTry > 10);
//se il valore è rimasto a 1 il plc non l'ha preso in carico, e abortisco
if (bitValue)
{
bitValue = true;
cmsError = MEM_RWBoolean(W, 0, MACHINE_RESET_WORKED_TIME.MemType, MACHINE_RESET_WORKED_TIME.Address, MACHINE_RESET_WORKED_TIME.SubAddress, 0, ref bitValue);
if (cmsError.IsError())
return cmsError;
return PLC_NOT_RUNNING_ERROR;
}
else
{
//Se l'ha abbassato scrivo il nuovo dato
cmsError = MEM_RWDWord(W, 0, MACHINE_WORKED_TIME.MemType, MACHINE_WORKED_TIME.Address, MACHINE_WORKED_TIME.SubAddress, ref time);
}
}
return NO_ERROR;
}
public override CmsError PLC_WHeadOverride(uint id, HEAD_OVERRIDE_SIGN sign)
{
if (id > MAX_HEADS_NUMBER)
@@ -6001,5 +6098,8 @@ namespace CMS_CORE_Library.Siemens
//old CMS-Control variables
internal static MEMORY_CELL HEADS_WORKED_TIMES = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 254, 60, 4);
internal static MEMORY_CELL HEAD_RESET_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 255, 92, 4);
internal static MEMORY_CELL MACHINE_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 255, 94, 4);
internal static MEMORY_CELL MACHINE_RESET_WORKED_TIME = new MEMORY_CELL(MEMORY_TYPE.Siemens_DB, 98, 92, 4);
}
}