Intouch 9.5 - Variblenaktualisierung in Skripten

RONIN

Level-3
Beiträge
2.529
Reaktionspunkte
773
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe hier ein Intouch v9.5 Project das mittels DASSIDirect-Server an eine 317PN/DP angebunden ist.

Ich lasse Intouch dabei ein paar StoredProcedures aus einer SQL-Datenbank ausführen.
Die SPS bereitet dafür in einem Schnittellen-DB die Parameter vor und setzt dann ein Flag-Bit.

Das Flag-Bit wird mittel Konditinal-Skript überwacht, wenn es 1 ist wird eine die StoredProcedure mit den Parametern aus dem Datenbaustein ausgerufen.
Jetzt hab ich ein hochsporadisch das Problem das wenn das Flag gesetzt und das Konditional-Skript aufgerufen wird, dieses dann beim Zugriff
auf die Dateinbaustein-Variablen alte Werte verwendet.

Am schnellsten ist dieses ersichtlich wenn man einen Auszug aus dem Logfile ansieht das ich nebenbei mitschreibe
Code:
-----------------------------------------------------------------------------------------------------------------------------------

17.03.2015/16:22:48 : Informationen über Einzelmischungsdurchläufe an CMTS senden
Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten
[COLOR=#ff0000]4821   /   1   /   1   /   0 -> Der Eintrag hier ist OK[/COLOR]
SQLEXEC PROCESS_SETBCWEIGHING: 
-----------------------------------------------------------------------------------------------------------------------------------
17.03.2015/16:24:00 : Informationen über Einzel-DOSIERUNGEN an CMTS senden
Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
Stored Procedure 'PROCESS_SETBCPERWEIGHING' vorbereiten
4821   /   1   /   31   /   1   /   105   /   437
PROCESS_SETBCPERWEIGHING: 
-----------------------------------------------------------------------------------------------------------------------------------
17.03.2015/16:26:43 : Informationen über Einzelmischubngsdurchläufe an CMTS senden
Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten
[COLOR=#ff0000]4821   /   1   /   1   /   0 -> Ab hier steht im Datenbaustein schon 4821   /   1   /   [SIZE=3][B]2[/B][/SIZE]   /   60[/COLOR]
SQLEXEC PROCESS_SETBCWEIGHING: 
-----------------------------------------------------------------------------------------------------------------------------------
17.03.2015/16:28:32 : Informationen über Einzelmischubngsdurchläufe an CMTS senden
Verbinde zu CMTS: Provider=SQLOLEDB.1;User ID=+++; Password=+++;Initial Catalog=+++;Data Source=+++;
Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten
[COLOR=#FF0000]4821   /   1   /   1   /   0 -> Hier steht im DB eigentlich [/COLOR][COLOR=#FF0000]4821   /  [/COLOR][SIZE=3][COLOR=#ff0000] [B]2[/B]   [/COLOR][/SIZE][COLOR=#FF0000]/   [/COLOR][SIZE=3][COLOR=#FF0000][B]1[/B][/COLOR][/SIZE][COLOR=#FF0000]   /   [SIZE=3][B]0[/B][/SIZE][/COLOR]
SQLEXEC PROCESS_SETBCWEIGHING:
Wie man sieht wurden die Werte beim 2. rot markierten Event die DB-Werte des ersten und beim 3. die Werte vom 2. verwendet.
Wenn ich beim Skript die Parameter mittels SQLSetParam setze, scheine ich hin und wieder nicht die aktuellen Werte zu haben

Bei WinCC weiß ich ja dass dies problematisch ist. Bei WinCC gabs aber auch GetTagWait.
Gibt es in Intouch auch einen Weg wie man sicherstellen kann dass man aktuelle Werte im Skript hat?

Hier noch das Konditionalskript in Frage
Code:
DIM bOK AS INTEGER;
DIM Itmp AS INTEGER;
DIM sqlResult AS INTEGER;
DIM MsgStr AS MESSAGE;
DIM PcName AS MESSAGE;


bOK = 1;
sql_StatementID = 0;
sql_ConnectionID = 0;


{ Informationen über Einzelmischungsdurchläufe an CMTS senden }
{---------------------------------------------------------------------------------------------------------------------------------------------------}
GetNodeName(PcName, 32);
IF PcName <> "++++" THEN bOK = 0; ENDIF;                                                          { Nur ++++ }
IF ChMi_dbRez_ChgID == 0 THEN bOK = 0; ENDIF;                                                     { Nur für Chargen die von CMTS kommen und eine gültige ID haben }


IF bOK == 1 THEN


    CALL WriteTextLog( "CMTS_CMI_Batch_RUN", "-----------------------------------------------------------------------------------------------------------------------------------");
    CALL WriteTextLog( "CMTS_CMI_Batch_RUN", $DateString + "/" + $TimeString + " : Informationen über Einzelmischungsdurchläufe an CMTS senden");


{--------------------------------------------------------------------------------------------------------------------------------------------------- Verbindung aufbauen }
    CALL WriteTextLog( "CMTS_CMI_Batch_RUN", "Verbinde zu CMTS: " + sql_CMTSConnectionString);
    sqlResult = SQLConnect( sql_ConnectionID, sql_CMTSConnectionString );


    IF sqlResult <> 0 THEN 
        MsgStr = "Fehler: " + SQLErrorMsg(sqlResult);
        CALL WriteTextLog( "CMTS_CMI_Batch_RUN", MsgStr);
        bOK = 0;
    ENDIF;
ENDIF;


{--------------------------------------------------------------------------------------------------------------------------------------------------- RUN Erzeugen/Fertigstellen }
IF bOK == 1 THEN
    Itmp = CommCMTS_SetBCW_BatchID;[COLOR=#ff0000]        {<--------- Hier hatte ich mal versucht die Werte vorher schon mal zu lesen }[/COLOR]
    Itmp = CommCMTS_SetBCW_Run;
    Itmp = CommCMTS_SetBCW_State;
    Itmp = CommCMTS_SetBCW_MxTime;


    CALL WriteTextLog( "CMTS_CMI_Batch_RUN",  "Stored Procedure 'PROCESS_SETBCWEIGHING' vorbereiten");
    SQLSetStatement(sql_ConnectionID, "EXEC PROCESS_SETBCWEIGHING ?,?,?,?" );
    SQLPrepareStatement(sql_ConnectionID, sql_StatementID);
    SQLSetParamLong(sql_StatementID, 1, CommCMTS_SetBCW_BatchID);        [COLOR=#ff0000]{<--------- Hier ensteht dann das Problem}[/COLOR]
    SQLSetParamInt(sql_StatementID, 2, CommCMTS_SetBCW_Run);
    SQLSetParamInt(sql_StatementID, 3, CommCMTS_SetBCW_State);
    SQLSetParamInt(sql_StatementID, 4, CommCMTS_SetBCW_MxTime);


    CALL WriteTextLog("CMTS_CMI_Batch_RUN", Text(CommCMTS_SetBCW_BatchID, "#") + "   /   " + Text(CommCMTS_SetBCW_Run, "#")  + "   /   " + Text(CommCMTS_SetBCW_State, "#")    + "   /   " + Text(CommCMTS_SetBCW_MxTime, "#")  );
    CALL WriteTextLog("CMTS_CMI_Batch_RUN", "SQLEXEC PROCESS_SETBCWEIGHING: " + MsgStr);
    sqlResult = SQLExecute( sql_ConnectionID, "NULL", sql_StatementID );


    IF (sqlResult <> 0) THEN
        CALL WriteTextLog("CMTS_CMI_Batch_RUN", "Fehler:" +  SQLErrorMsg(sqlResult));
        bOK = 0;
    ENDIF;


    CommCMTS_SetBCW_Flag = 0;
ENDIF;


{--------------------------------------------------------------------------------------------------------------------------------------------------- SQL-Zugriff beenden - Verbindung schließen }
IF sql_StatementID  <> 0 THEN SQLClearStatement(sql_ConnectionID, sql_StatementID); ENDIF;


IF sql_ConnectionID <> 0 THEN
    SQLEnd(sql_ConnectionID);
    SQLDisconnect(sql_ConnectionID);
ENDIF;
 
Zuletzt bearbeitet:
Es gibt da noch einige spezielle Items mit denen sich der Zustand der Variablenaktualisierungen abfragen und auch teilweise steuern lässt. Da musst du mal im Handbuch schauen ob man damit etwas anfangen kann. Ich habe die selber noch nicht genutzt.

Zumindest lässt dich damit abfragen, ob alle Items einer Gruppe aktualisiert wurden, bzw. auch ein neues Aktualisieren (z.B. $SYS$PollNow) anfordern.

Ansonsten wäre es je nach Größe des Datensatzes eine Möglichkeit, den Datensatz wie auch das Flag in einen separaten DB in hintereinanderfolgendem Speicherbereichen zu legen. Da der DASSIDirect seine Variablen zwecks Optimierung gepackt abfragt, wird dann womöglich Datensatz und Flag in eine PDU gepackt, und du bekommst alles zusammen. Die Variablengruppen die der DASSIDirect-Server anlegt kann man imho in der Management Console einsehen. Ob das dann garantiert immer funktioniert ist eine andere Frage.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt da noch einige spezielle Items mit denen sich der Zustand der Variablenaktualisierungen abfragen und auch teilweise steuern lässt. Da musst du mal im Handbuch schauen ob man damit etwas anfangen kann. Ich habe die selber noch nicht genutzt.
Sowas wie Akualisierungszeiten hab ich in den Intouch-Handbüchern noch nicht gesehen. Werd mir aber nochmal das Handbung zum DASSIDirect anschauen.

Zumindest lässt dich damit abfragen, ob alle Items einer Gruppe aktualisiert wurden, bzw. auch ein neues Aktualisieren (z.B. $SYS$PollNow) anfordern.
Klingt interessant. Werd mal Google zum Thema $SYS$PollNow anwerfen.

Ansonsten wäre es je nach Größe des Datensatzes eine Möglichkeit, den Datensatz wie auch das Flag in einen separaten DB in hintereinanderfolgendem Speicherbereichen zu legen.
Ist genauso angelegt.

Da der DASSIDirect seine Variablen zwecks Optimierung gepackt abfragt, wird dann womöglich Datensatz und Flag in eine PDU gepackt, und du bekommst alles zusammen. Die Variablengruppen die der DASSIDirect-Server anlegt kann man imho in der Management Console einsehen. Ob das dann garantiert immer funktioniert ist eine andere Frage.
Könnte versuchen eine eigene Gruppe/Topic für die Variablen zu machen, vielleicht hilft's.

Danke schon mal für den Denkanstoss.
 
Wobei die Verzögerung durchaus auch auf der Strecke DAServer - Intouch liegen kann. Da weiß man überhaupt nicht wie dort die Datenaktualisierung organisiert ist.

Wenn es zeitlich möglich ist, könntest du bei Anstehen des Flags einen Timer starten, der sagen wir mal das 1,5 fache der eingestellten Pollzeit läuft, und dann das eigentliche Skript anstößt.
 
Hab die Werte (13 Stück) mal als eigene Topic am DA-Server gelegt.
Da diese hintereinander im DB liegen und in einer Topic sind, ist zumindest mal die Chance recht hoch dass diese in der selben PDU daherkommen.

Ich habe beim Suchen auch herausgefunden das die Topic die ich bisher verwendet hatte mit der Option "Nur aktive Items anmelden" erstellt wurde.
Was ja für eine Gruppe in der alle möglichen Anzeigewerte liegen ja nicht falsch ist, aber sicherlich auch zu meinen Problem beträgt.
Das Bit-Flag ist schließlich aktiv (Es wird ja vom Konditionalskript geprüft), die Werte im Skript sind es aber wahrscheinlich nicht.

Die neue Topic hab ich dann mit "Alle Items anmelden" erstellt. Zusätzlich noch ein $SYS$PollNow auf diese kleine Topic am Beginn des Sktiptes angefordert.
Mal schauen ob das Problem über die nächsten Tage wieder auftritt.

könntest du bei Anstehen des Flags einen Timer starten, der sagen wir mal das 1,5 fache der eingestellten Pollzeit läuft, und dann das eigentliche Skript anstößt.
Sollte das nicht hinhauen werd ich die Variante nehmen, ich will nur nicht gleich mit irgendwelchen Verzögerungszeiten um mich werfen, wenn's vielleicht eleganter geht. :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab die Werte (13 Stück) mal als eigene Topic am DA-Server gelegt.
Da diese hintereinander im DB liegen und in einer Topic sind, ist zumindest mal die Chance recht hoch dass diese in der selben PDU daherkommen.

Die neue Topic hab ich dann mit "Alle Items anmelden" erstellt. Zusätzlich noch ein $SYS$PollNow auf diese kleine Topic am Beginn des Sktiptes angefordert.
Hat gewirkt, weiß zwar nicht ob das $SYS$PollNow nötig ist, ich denke mal der wichtigste Punkt ist die "Alle Items anmelden"-Einstellung und die separate Topic.
Problem tritt jedenfalls nicht mehr auf. Danke. :D
 
Zurück
Oben