Значит, у меня криво реализована синхронизация:
// Mt_GVL
VAR_GLOBAL
DataDefender_ : CAA.BOLT; //
END_VAR// Журнал сообщений
FUNCTION_BLOCK FINAL LoggerActions
VAR CONSTANT
UnlockWaitTimeMax_ : TIME := T#20ms;
END_VAR
VAR
FileHandle_ : SysTypes.RTS_IEC_HANDLE := SysTypes.RTS_INVALID_HANDLE;
END_VARВот так сделано сейчас. Оставил только то, что относится к синхронизации. Если видны какие-либо ошибки -- покажите, пожалуйста.// Добавить в лог сообщение об ошибке.
METHOD MsgError : SysTypes.RTS_IEC_RESULT
VAR
CtValue : CAA.COUNT := 0;
UnlockWaitTime : TIME := T#0ms;
END_VAR
UnlockWaitTime := TIME();
WHILE ((UnlockWaitTime + UnlockWaitTimeMax_) > TIME()) AND_THEN
(Mt_GVL.DataDefender_.Reserve(CtValue) = TRUE)
DO
// Здесь работа с файлом, запись в него форматированной строки и flush по завершении записи.
CtValue := 0;
UnlockWaitTime := T#0ms;
Mt_GVL.DataDefender_.Free();
END_WHILE