Trådsäkra tider och strängar

Tid- och strängattribut i realtidsdatabasen kan inte läsas eller skrivas i en atomisk
operation, och behöver därför speciell hänsyn vid använding om attributet används i flera
olika trådar eller processer. Problemet är att medan en tråd skriver ett tids eller
strängattribut, kan en annan tråd läsa attributet innan skrivninget är avslutat, och därmed
läsa ett värde som innehåller delar av både det gamla och det nya värdet. För att unvika
detta ska läs och skrivoperationer skyddas av ett lås. Det finns två lås, ett för
tidsattribut och ett för strängattribut.

Tidslås

Tidslåset används för attribut av typerna pwr_tTime och pwr_tDeltaTime. Varje gång ett
tidsattribut läses eller skrivs ska låset sättas. Följande plc funktionsobjekt använder
låset för att skydda läsning och skrivning av tidsvärden.
StoATv, StoDTv, CStoATv, CStoDTv, StoDTp, StoATp, CStoDTp, CStoATp, GetATp, GetDTp, GetATv,
GetDTv, CurrentTime.

Notera att andra funktionsobjekt inte är skyddade av låset, Det är inte trådsäkert att
använda utgången från t ex en AtAdd i en annan plctråd eller applikationsprogram. I det här
fallet ska tiden först lagras i ett ATv-objekt.

Applikationer ska använda följande gdh-funktioner för att läsa och skriva tider
void gdh_GetTimeDL( pwr_tTime *atp, pwr_tTime *time);
void gdh_SetTimeDL( pwr_tTime *atp, pwr_tTime *time);
void gdh_GetDeltaTimeDL( pwr_tDeltaTime *dtp, pwr_tDeltaTime *time);
void gdh_SetDeltaTimeDL( pwr_tDeltaTime *dtp, pwr_tDeltaTime *time);
pwr_tStatus gdh_GetObjectInfoTime( char *name, pwr_tTime *time);
pwr_tStatus gdh_SetObjectInfoTime( char *name, pwr_tTime *time);
pwr_tStatus gdh_GetObjectInfoDeltaTime( char *name, pwr_tDeltaTime *time);
pwr_tStatus gdh_SetObjectInfoDeltaTime( char *name, pwr_tDeltaTime *time);

Innan någan av dessa funktioner används, ska tidslåset initieras av applikationen med ett
anrop till lck_Create(), t ex
lck_Create(&sts, lck_eLock_Time);

Stränglås

Stränglåset används för strängattribut. Följande plc-funktionsobjekt använder låset.
StoSv, CStoSv, StoSp, CStoSp, StoNumSp, CStoNumSp, GetSp, GetSv.

Andra funktionsobjekt är inte skyddade av låset och strängvärden från dessa objekt ska
inte läsas eller skrivas från andra plc-trådar eller i applikationsprogram.

Applikationer ska använda dessa gdh-funktioner för att läsa och skriva strängattribut

void gdh_GetStrDL( char *sp, char *str, int size);
void gdh_SetStrDL( char *sp, char *str, int size);
pwr_tStatus gdh_GetObjectInfoStr( char *name, char *str, int size);
pwr_tStatus gdh_SetObjectInfoStr( char *name, char *str, int size);

Innan någon av dessa funktioner används, ska stränglåset initieras av applikationen med ett
anrop till lck_Create(), t ex
lck_Create(&sts, lck_eLock_Str);