TC3 - CX5130 - Database Server

blubbi

Level-2
Beiträge
39
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich hab auf der CX eine MySQL Datenbank.

Der Datenbankzugriff funktioniert schon mal sehr gut. Mit dem SQL Editor bekomme ich 2 Datensätze retour.

1633436776671.png

Auch der Zugriff über die PLC klappt soweit:

Code:
VAR_OUTPUT
    GT_AccessControll: ARRAY [1..40] OF STRING;
    fbSQLDatabase: FB_SQLDatabaseEvt(sNetID:=GV.sNetId, tTimeout:=T#10S);
    fbSQLResult: FB_SQLResultEvt(sNetID:=GV.sNetId, tTimeout:=T#10S);
    fbSQLCommand: FB_SQLCommandEvt(sNetID := GV.sNetId, tTimeout := T#10S);
END_VAR

.....

sCmd := 'SELECT flipAdresse FROM accesscontroll';
....

CASE nState OF
0:(*Idle*)
    ;
1: // Connect to database and create stored procedure instance
    CASE nState_Connect OF
        0:
            IF fbSQLDatabase.Connect(hDBID:= nDBID) THEN
                ipResultEvt := fbSQLDatabase.ipTcResult;
                bConn := NOT fbSQLDatabase.bError;
                IF bConn THEN
                    nState_Connect := 1;
                ELSE
                    nState:=200;
                END_IF
            END_IF
        1:
            IF fbSQLDatabase.CreateCmd(ADR(fbSQLCommand)) THEN
                 IF fbSqlDatabase.bError THEN
                    nState := 200;
                    bError := TRUE;
                ELSE
                    nState := 2;
                END_IF
                 bCmd := NOT fbSQLDatabase.bError;
            END_IF
 
      end_case
2: // call sql command
    IF fbSQLCommand.ExecuteDataReturn(ADR(sCmd), SIZEOF(sCmd), ADR(fbSqlResult)) THEN
        IF fbSQLCommand.bError THEN
            nState := 200;
        ELSE
             ipResultEvt := fbSQLCommand.ipTcResult;
            nState := 3;
        END_IF
    END_IF
 
3:  // Read AccessControl positions
    IF fbSQLResult.Read(0, fbSQLResult.nDataCount, ADR(GT_AccessControll), SIZEOF(GT_AccessControll), FALSE, FALSE) THEN
        ipResultEvt:= fbSQLResult.ipTcResult;
        bData := NOT fbSQLResult.bError;
        nRecs := fbSQLResult.nDataCount;
  
         IF fbSqlResult.bError THEN
            nState := 200;
        ELSE
            nState := 4;
        END_IF                   
    END_IF
4:// Disconnect all
    CASE nState_Disconnect OF
        0:
            IF bData THEN
                IF fbSQLResult.Release() THEN
                    nState_Disconnect := 1;
                END_IF
            ELSE
                nState_Disconnect := 1;
            END_IF
        1:
            IF bConn THEN
                IF fbSQLDatabase.Disconnect() THEN
                    nState_Disconnect := 3;
                END_IF
            ELSE
                nState_Disconnect := 3;
            END_IF
         3:
            bData := FALSE;
            bSP := FALSE;
            bCmd := FALSE;
            bConn := FALSE;
            bResult := FALSE;
            sEventClass := '';
            sEventMsg := '';
            nEventID := 0;
            bError := FALSE;
            nState_Connect := 0;
            nState_Disconnect := 0;
            nState := 0;
    END_CASE
200:
    IF ipResultEvt.RequestEventText(1033, sEventMsg, SIZEOF(sEventMsg)) THEN
        nState := 201;
    END_IF
201:
    IF ipResultEvt.RequestEventClassName(1033, sEventClass, SIZEOF(sEventClass)) THEN

        nEventID := ipResultEvt.nEventId;
    
        bError := (ipResultEvt.eSeverity = TcEventSeverity.Error) OR
                 (ipResultEvt.eSeverity = TcEventSeverity.Critical);

        nState:=0;
    END_IF
END_CASE

Im Debugger sehe ich dann, dass 2 Datensätze gelesen werden, aber im Zielarray landet dann nur eines:

1633437062894.png


Es wird immer nur der erste Datensatz aus der DB gelesen. Es macht auch keinen Unterschied wenn ich das Zielarray von 0..39 erstelle.

Bitte um Ideen, woran das liegen kann.

Thx blubbi
 

Anhänge

  • 1633436528731.png
    1633436528731.png
    22,6 KB · Aufrufe: 3
  • 1633436609363.png
    1633436609363.png
    14,8 KB · Aufrufe: 5
Zuletzt bearbeitet:
Ich habe das Problem selbst gefunden. Die Lösung hat sich aber erst bei mehr als 2 Datensätzen gezeigt. Der String darf nicht die Standardlänge von 80 Zeichen haben, sondern muss genau der Stringlänge aus der DB entsprechen. Dann funktioniert jetzt perfekt.
 
Zurück
Oben