TC3: Mit FB_PLCDBCmdEvt in die Datenbank schreiben

HearingSystem

Level-2
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Grüß euch!

Ich bin gerade mittendrin in meiner Diplomarbeit - wir programmieren eine Roboterzelle, welche DuploSteine ein- und auslagert. Das ganze wird mit eine Beckhoff-Steuerung und einer MS SQL-Express Datenbank realisiert.
So weit so gut - ich habe jetzt nur folgendes Problem:

Ich habe den TF6420 im Projekt integriert und konfiguriert - einloggen aus der SPS heraus funktioniert!
Jedoch, immer wenn ich den FB_PLCDBCmdEvt-Baustein abfeuere, weil ich eine Bestellung loggen möchte, schriebt er mir "'PRG_DBcmd.SetOrder.Execute()': Ungültige Parametergröße" raus.
Ich habe jetzt schon alles 10x durchkontrolliert und gegoogelt usw. 😅😅 ich hoffe, ihr könnt mir helfen und seht was, was ich nicht sehe:

Das Design der Tabelle, welche ich beschreiben möchte schaut folgendermaßen aus:
1711738245726.png
ID, Benutzer & Zeitstempel werden von der DB selbst generiert!

Das Programm ist wie Folgt:

//Eingaben in String umwandeln
Prioritaet := UINT_TO_STRING(GVL_Order._i_hmiPiority);
AnzahlWeiss := UINT_TO_STRING(GVL_Order._i_hmiNumberOfWhite);
AnzahlGelb := UINT_TO_STRING(GVL_Order._i_hmiNumberOfYellow);
AnzahlRot := UINT_TO_STRING(GVL_Order._i_hmiNumberOfRed);
AnzahlBlau := UINT_TO_STRING(GVL_Order._i_hmiNumberOfBlue);

//Command zusammenbauen
sCmd := CONCAT('INSERT INTO [dbo].[Bestellung] ( [Auftragsart], [Prioritaet], [Status], [AnzahlWeiss], [AnzahlGelb], [AnzahlRot], [AnzahlBlau]) VALUES ( 20,', Prioritaet);
sCmd := CONCAT(sCmd, ',10,');
sCmd := CONCAT (sCmd, AnzahlWeiss);
sCmd := CONCAT (sCmd, ',');
sCmd := CONCAT (sCmd, AnzahlGelb);
sCmd := CONCAT (sCmd, ',');
sCmd := CONCAT (sCmd, AnzahlRot);
sCmd := CONCAT (sCmd, ',');
sCmd := CONCAT (sCmd, AnzahlBlau);
sCmd := CONCAT (sCmd, ')');

//Paramete setzen
//arrParameter[0].sParaName := 'ID'; arrParameter[0].nParaSize := 4; arrParameter[0].eParaType := E_EXPPARAMETERTYPE.Int32;
arrParameter[0].sParaName := 'Auftragsart'; arrParameter[0].nParaSize := 4; arrParameter[0].eParaType := E_EXPPARAMETERTYPE.UInt32;
arrParameter[1].sParaName := 'Prioritaet'; arrParameter[1].nParaSize := 4; arrParameter[1].eParaType := E_EXPPARAMETERTYPE.UInt32;
arrParameter[2].sParaName := 'Status'; arrParameter[2].nParaSize := 4; arrParameter[2].eParaType := E_EXPPARAMETERTYPE.UInt32;
arrParameter[3].sParaName := 'AnzahlWeiss'; arrParameter[3].nParaSize := 4; arrParameter[3].eParaType := E_EXPPARAMETERTYPE.UInt32;
arrParameter[4].sParaName := 'AnzahlGelb'; arrParameter[4].nParaSize := 4; arrParameter[4].eParaType := E_EXPPARAMETERTYPE.UInt32;
arrParameter[5].sParaName := 'AnzahlRot'; arrParameter[5].nParaSize := 4; arrParameter[5].eParaType := E_EXPPARAMETERTYPE.UInt32;
arrParameter[6].sParaName := 'AnzahlBlau'; arrParameter[6].nParaSize := 4; arrParameter[6].eParaType := E_EXPPARAMETERTYPE.UInt32;
//arrParameter[8].sParaName := 'Benutzer'; arrParameter[8].nParaSize := 100; arrParameter[8].eParaType := E_EXPPARAMETERTYPE.STRING_;
//arrParameter[9].sParaName := 'Zeitstempel'; arrParameter[9].nParaSize := 4; arrParameter[9].eParaType := E_EXPPARAMETERTYPE.DateTime;

//Comand abfeuern
CASE nState OF

1: //init
;
2:
//sCmd := 'INSERT INTO [dbo].[Bestellung] ( [Auftragsart], [Prioritaet], [Status], [AnzahlWeiss], [AnzahlGelb], [AnzahlRot], [AnzahlBlau]) VALUES ( 20, {Prioritaet}, 10, {AnzahlWeiss}, {AnzahlGelb}, {AnzahlRot}, {AnzahlBlau}) ';
SetOrder.Execute(
hDBID:= 2,
pExpression:= ADR(sCmd),
cbExpression:= SIZEOF(sCmd),
pData:= ADR(st_Order),
cbData:= SIZEOF(st_Order) ,
pParameter:= ADR(arrParameter),
cbParameter:= SIZEOF(arrParameter));

IF NOT SetOrder.bBusy THEN
ipTcResult := SetOrder.ipTcResult;
IF NOT SetOrder.bError THEN
nState := 2;
ELSE
nState := 200;
END_IF
END_IF

Jedoch, wenn dies bearbeitet wird kommt dann diese Fehlermeldung:
1711738495564.png

Ich hoffe ihr könnt mir helfen! ...und Danke schon mal im vorraus!


Liebe Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sCmd schaut wie folgt aus:
1711740828009.png
diesen habe ich auch schon im Managment Studio direkt abgefeuert und funktiioniert!

STRLEN nur beim cbExpression warscheinlich?
(sorry, wenn ich da jetzt teilweise blöd nach frage, aber ich gehör so noch nicht zur Kategorie "Profi" 😅)
 
Und noch was, auch wenn es bei Deinem derzeitigen sCmd noch keine Rolle spielt.
CONCAT funktioniert nur bis STRING[255]. Längere Strings musst Du dir händisch zusammenbasteln.
 
Ok, dann bin ich eigentlich raus, weil ich mit der TC2_Database-Lib arbeite. Wäre für ein einfaches INSERT INTO in meinen Augen auch einfacher.
Habe mir den FB_PLCDBCmdEvt aber mal kurz im Infosys angeschaut. Wenn ich das richtig sehe, ersetzt er die sCmd-Werte in {} anhand der Parameterliste mit Werten aus einer Struktur. Kannst Du die mal zeigen?
 
Size ist hier korrekt, Strings sind hier ja nullterminiert und die Null muss auch mit übertragen werden.

Was steckt hinter st_order?
 
Zurück
Oben